--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.1... --------------------------------------------------------------------------------------------------------------- [05:09:24.355] Vidbot :: start() [05:09:24.356] Vidbot :: _next(), _stepIndex:0 of 4 [05:09:24.356] index :: _onStepStarted_vidbot(), step: 1 [05:09:24.357] Vidbot :: step[0], label:Initializing Core [05:09:24.365] index :: _onStepProgress_vidbot(), percent: 20 [05:09:24.366] Vidbot :: _parse() [05:09:24.367] index :: _onStepProgress_vidbot(), percent: 40 [05:09:24.367] Vidbot :: _validate() [05:09:24.368] index :: _onStepProgress_vidbot(), percent: 60 [05:09:24.368] Vidbot :: _fonts() [05:09:24.368] FabricFontManager :: add(), id: SourceSansPro-Bold [05:09:24.368] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [05:09:24.376] FabricFontManager :: add(), id: SourceSansPro-Light [05:09:24.376] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [05:09:24.377] FabricFontManager :: add(), id: DINOT-Bold [05:09:24.377] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [05:09:24.378] FabricFontManager :: add(), id: DINOT-Light [05:09:24.378] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [05:09:24.379] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [05:09:24.379] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [05:09:24.380] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [05:09:24.380] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [05:09:24.381] index :: _onStepProgress_vidbot(), percent: 80 [05:09:24.381] Vidbot :: _clips() [05:09:24.382] StreamManager :: add(), id:audio_vo, type:audio [05:09:24.382] AudioClip[audio_vo] :: constructor() [05:09:24.383] InputStream[audio_vo] :: constructor() [05:09:24.383] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [05:09:24.385] StreamManager :: add(), id:bg_music, type:audio [05:09:24.386] AudioClip[bg_music] :: constructor() [05:09:24.386] InputStream[bg_music] :: constructor() [05:09:24.386] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [05:09:24.386] StreamManager :: add(), id:mira, type:canvas [05:09:24.386] CanvasStream[canvas_202556983470] :: constructor() [05:09:24.387] InputStream[canvas_202556983470] :: constructor() [05:09:24.462] MiraSlideshow[mira] :: constructor() [05:09:24.462] Mira[mira] :: constructor() [05:09:24.462] Overlay[mira] :: constructor() [05:09:24.462] CanvasClip[mira] :: constructor() [05:09:24.462] Clip[mira] :: constructor() [05:09:24.463] clip:"mira" added to stream:"canvas_202556983470" [05:09:24.463] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_202556983470', clipId: 'mira' } [05:09:24.463] all added... [05:09:24.463] Vidbot :: _next(), _stepIndex:1 of 4 [05:09:24.463] index :: _onStepCompleted_vidbot(), step: 1 [05:09:24.463] index :: _onStepStarted_vidbot(), step: 2 [05:09:24.464] Vidbot :: step[1], label:Initializing Input Streams [05:09:24.464] StreamManager :: init() [05:09:24.464] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.3333333333333333 } [05:09:24.465] index :: _onStepProgress_vidbot(), percent: 33 [05:09:24.465] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.6666666666666666 } [05:09:24.465] index :: _onStepProgress_vidbot(), percent: 67 [05:09:24.465] CanvasStream[canvas_202556983470] :: _init(), BEGIN [05:09:24.465] i:0, c.id:mira [05:09:24.466] MiraSlideshow[mira] :: _init(), BEGIN [05:09:24.466] MiraSlideshow[mira] :: _validate() [05:09:24.468] MiraSlideshow :: _validateSlides() [05:09:24.468] i:0, s.type: title [05:09:24.468] i:1, s.type: info [05:09:24.468] i:2, s.type: image [05:09:24.468] i:3, s.type: image [05:09:24.468] i:4, s.type: image [05:09:24.468] i:5, s.type: image [05:09:24.468] i:6, s.type: image [05:09:24.468] i:7, s.type: image [05:09:24.468] i:8, s.type: image [05:09:24.468] i:9, s.type: image [05:09:24.468] i:10, s.type: image [05:09:24.468] i:11, s.type: image [05:09:24.468] i:12, s.type: image [05:09:24.468] i:13, s.type: image [05:09:24.468] i:14, s.type: image [05:09:24.468] i:15, s.type: image [05:09:24.469] i:16, s.type: image [05:09:24.472] MiraSlideshow[mira] :: _build(), BEGIN [05:09:24.476] MiraTitlecard[titlecard] :: constructor() [05:09:24.476] Mira[titlecard] :: constructor() [05:09:24.477] Overlay[titlecard] :: constructor() [05:09:24.477] CanvasClip[titlecard] :: constructor() [05:09:24.477] Clip[titlecard] :: constructor() [05:09:24.477] MiraTitlecard[titlecard] :: _init() [05:09:24.477] MiraTitlecard[titlecard] :: _validate() [05:09:24.478] MiraTitlecard[titlecard] :: _build() [05:09:24.498] Overlay[titlecard] :: _animate() [05:09:24.500] MiraTitlecard[titlecard] :: _animate() [05:09:24.502] AnimatedImageFrame[aiftitle] :: constructor() [05:09:24.504] AnimatedImageFrame[aiftitle] :: _init(), BEGIN [05:09:24.504] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_1.jpg [05:09:24.546] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.550] AnimatedImageFrame[aiftitle] :: _init(), END [05:09:24.555] MiraInfosheet[info] :: constructor() [05:09:24.555] Mira[info] :: constructor() [05:09:24.555] Overlay[info] :: constructor() [05:09:24.555] CanvasClip[info] :: constructor() [05:09:24.555] Clip[info] :: constructor() [05:09:24.555] MiraInfosheet[info] :: _init() [05:09:24.555] MiraInfosheet[info] :: _validate() [05:09:24.557] MiraInfosheet[info] :: _build() [05:09:24.568] RenOptions[info] :: _animate() [05:09:24.568] Overlay[info] :: _animate() [05:09:24.569] AnimatedImageFrame[info1] :: constructor() [05:09:24.570] AnimatedImageFrame[info2] :: constructor() [05:09:24.570] AnimatedImageFrame[info3] :: constructor() [05:09:24.570] AnimatedImageFrame[info1] :: _init(), BEGIN [05:09:24.570] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_2.jpg [05:09:24.601] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.603] AnimatedImageFrame[info1] :: _init(), END [05:09:24.603] AnimatedImageFrame[info2] :: _init(), BEGIN [05:09:24.603] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_8.jpg [05:09:24.635] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.637] AnimatedImageFrame[info2] :: _init(), END [05:09:24.637] AnimatedImageFrame[info3] :: _init(), BEGIN [05:09:24.637] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_9.jpg [05:09:24.663] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.664] AnimatedImageFrame[info3] :: _init(), END [05:09:24.665] AnimatedImageFrame[image] :: constructor() [05:09:24.665] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.666] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_1.jpg [05:09:24.693] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.694] AnimatedImageFrame[image] :: _init(), END [05:09:24.695] AnimatedImageFrame[image] :: constructor() [05:09:24.695] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.695] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_2.jpg [05:09:24.722] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.723] AnimatedImageFrame[image] :: _init(), END [05:09:24.723] AnimatedImageFrame[image] :: constructor() [05:09:24.723] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.723] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_3.jpg [05:09:24.750] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.751] AnimatedImageFrame[image] :: _init(), END [05:09:24.752] AnimatedImageFrame[image] :: constructor() [05:09:24.752] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.752] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_4.jpg [05:09:24.780] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.781] AnimatedImageFrame[image] :: _init(), END [05:09:24.781] AnimatedImageFrame[image] :: constructor() [05:09:24.782] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.782] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_5.jpg [05:09:24.808] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.810] AnimatedImageFrame[image] :: _init(), END [05:09:24.810] AnimatedImageFrame[image] :: constructor() [05:09:24.810] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.811] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_6.jpg [05:09:24.844] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.845] AnimatedImageFrame[image] :: _init(), END [05:09:24.845] AnimatedImageFrame[image] :: constructor() [05:09:24.845] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.846] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_7.jpg [05:09:24.875] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.876] AnimatedImageFrame[image] :: _init(), END [05:09:24.876] AnimatedImageFrame[image] :: constructor() [05:09:24.876] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.876] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_8.jpg [05:09:24.904] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.905] AnimatedImageFrame[image] :: _init(), END [05:09:24.906] AnimatedImageFrame[image] :: constructor() [05:09:24.906] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.906] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_9.jpg [05:09:24.932] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.933] AnimatedImageFrame[image] :: _init(), END [05:09:24.934] AnimatedImageFrame[image] :: constructor() [05:09:24.934] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.934] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_10.jpg [05:09:24.969] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:24.970] AnimatedImageFrame[image] :: _init(), END [05:09:24.970] AnimatedImageFrame[image] :: constructor() [05:09:24.970] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:24.970] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_11.jpg [05:09:25.015] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:25.017] AnimatedImageFrame[image] :: _init(), END [05:09:25.017] AnimatedImageFrame[image] :: constructor() [05:09:25.018] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:25.019] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_12.jpg [05:09:25.049] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:25.050] AnimatedImageFrame[image] :: _init(), END [05:09:25.050] AnimatedImageFrame[image] :: constructor() [05:09:25.050] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:25.050] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_13.jpg [05:09:25.079] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:25.080] AnimatedImageFrame[image] :: _init(), END [05:09:25.081] AnimatedImageFrame[image] :: constructor() [05:09:25.081] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:25.081] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_14.jpg [05:09:25.111] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:25.112] AnimatedImageFrame[image] :: _init(), END [05:09:25.112] AnimatedImageFrame[image] :: constructor() [05:09:25.112] AnimatedImageFrame[image] :: _init(), BEGIN [05:09:25.112] CanvasClip :: LoadImageWithPromise(), src: 4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA_15.jpg [05:09:25.143] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [05:09:25.144] AnimatedImageFrame[image] :: _init(), END [05:09:25.144] MiraSlideshow[mira] :: _build(), END [05:09:25.144] Overlay[mira] :: _animate() [05:09:25.145] MiraSlideshow[mira] :: _init(), END [05:09:25.145] CanvasStream[mira] :: _init(), p.then() [05:09:25.145] CanvasStream[canvas_202556983470] :: _init(), promise.all.then() [05:09:25.147] CanvasStream[canvas_202556983470] :: _init(), END [05:09:25.147] StreamMangaer :: init(), stream[canvas_202556983470].then() [05:09:25.147] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_202556983470', progress: 1 } [05:09:25.147] index :: _onStepProgress_vidbot(), percent: 100 [05:09:25.148] StreamManager :: init(), promise.all.then... [05:09:25.148] Vidbot :: StreamMgr.on( 'INITED' ) [05:09:25.148] Vidbot :: _next(), _stepIndex:2 of 4 [05:09:25.148] index :: _onStepCompleted_vidbot(), step: 2 [05:09:25.148] index :: _onStepStarted_vidbot(), step: 3 [05:09:25.148] Vidbot :: step[2], label:Rendering Canvas Streams [05:09:25.149] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [05:09:25.149] StreamManager :: render() [05:09:25.149] CanvasStream[canvas_202556983470] :: render() [05:09:25.213] index :: _onStepProgress_vidbot(), percent: 0 [05:09:51.737] index :: _onStepProgress_vidbot(), percent: 5 [05:10:12.175] index :: _onStepProgress_vidbot(), percent: 10 [05:10:35.028] index :: _onStepProgress_vidbot(), percent: 15 [05:10:58.388] index :: _onStepProgress_vidbot(), percent: 20 [05:11:22.282] index :: _onStepProgress_vidbot(), percent: 25 [05:11:45.766] index :: _onStepProgress_vidbot(), percent: 30 [05:12:10.052] index :: _onStepProgress_vidbot(), percent: 35 [05:12:34.246] index :: _onStepProgress_vidbot(), percent: 40 [05:12:59.033] index :: _onStepProgress_vidbot(), percent: 45 [05:13:31.132] index :: _onStepProgress_vidbot(), percent: 50 [05:14:05.213] index :: _onStepProgress_vidbot(), percent: 55 [05:14:37.804] index :: _onStepProgress_vidbot(), percent: 60 [05:15:07.468] index :: _onStepProgress_vidbot(), percent: 65 [05:15:34.918] index :: _onStepProgress_vidbot(), percent: 70 [05:16:03.266] index :: _onStepProgress_vidbot(), percent: 75 [05:16:30.170] index :: _onStepProgress_vidbot(), percent: 80 [05:17:00.542] index :: _onStepProgress_vidbot(), percent: 85 [05:17:32.426] index :: _onStepProgress_vidbot(), percent: 90 [05:18:00.110] index :: _onStepProgress_vidbot(), percent: 95 [05:18:37.527] index :: _onStepProgress_vidbot(), percent: 100 [05:18:41.072] StreamManager :: render(), Promise.all.then... [05:18:41.072] Vidbot :: StreamMgr.on( 'RENDER_COMPLETED' ), data: undefined [05:18:41.072] Vidbot :: _next(), _stepIndex:3 of 4 [05:18:41.073] index :: _onStepCompleted_vidbot(), step: 3 [05:18:41.073] index :: _onStepStarted_vidbot(), step: 4 [05:18:41.074] Vidbot :: step[3], label:Encoding Media [05:18:41.076] CanvasFilters :: Overlay() [05:18:41.077] AudioStream[audio_vo] :: inputOptions() [05:18:41.077] AudioFilters :: Volume() [05:18:41.077] filter: [2:a]volume=1[2_vol] [05:18:41.077] AudioFilters :: Delay() [05:18:41.077] filter: [2_vol]adelay=0|0[2_del] [05:18:41.077] AudioStream[bg_music] :: inputOptions() [05:18:41.078] AudioFilters :: Volume() [05:18:41.078] filter: [3:a]volume=0.15[3_vol] [05:18:41.078] AudioFilters :: FadeOut() [05:18:41.078] filter: [3_vol]afade=t=out:st=60:d=1[3_fadeout] [05:18:41.078] AudioFilters :: Delay() [05:18:41.078] filter: [3_fadeout]adelay=0|0[3_del] [05:18:41.078] AudioFilters :: Mix() [05:18:41.078] filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [05:18:41.078] mixed filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [05:18:41.081] hang.time: 60 [05:18:41.219] Vidbot :: ffmpeg.on( 'start' ) [05:18:41.220] ffmpeg -f lavfi -i color=c=000000:s=960x540:r=30:duration=60 -r 30 -i ./tmp/canvas_202556983470_%05d.png -to 00:01:00.000 -i file:///var/www/html/clie [05:18:41.220] nts/21916/audio/4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA.mp3 -to 00:01:00.000 -i file:///var/app/video_pre_processor/assets/vidbot/_files/audio/Hip Hop.mp [05:18:41.220] 3 -y -filter_complex [0:v][1:v]overlay=x=0:y=0[1_out];[2:a]volume=1[2_vol];[2_vol]adelay=0|0[2_del];[3:a]volume=0.15[3_vol];[3_vol]afade=t=out:st=60:d [05:18:41.220] =1[3_fadeout];[3_fadeout]adelay=0|0[3_del];[2_del][3_del]amix=inputs=2:duration=longest[a_out] -acodec aac -vcodec libx264 -r 30 -f mp4 -map [a_out] - [05:18:41.220] map [1_out] -preset veryfast -crf 18 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p /var/www/html/clients/21916/video/4C5BB039-5471-B4BA-CFF7-7F9 [05:18:41.220] D46C6EFCA.mp4 [05:18:41.506] index :: _onStepProgress_vidbot(), percent: -3462080762 [05:18:41.903] index :: _onStepProgress_vidbot(), percent: 1 [05:18:43.425] index :: _onStepProgress_vidbot(), percent: 6 [05:18:44.951] index :: _onStepProgress_vidbot(), percent: 10 [05:18:46.465] index :: _onStepProgress_vidbot(), percent: 15 [05:18:47.984] index :: _onStepProgress_vidbot(), percent: 20 [05:18:49.494] index :: _onStepProgress_vidbot(), percent: 25 [05:18:51.014] index :: _onStepProgress_vidbot(), percent: 30 [05:18:52.538] index :: _onStepProgress_vidbot(), percent: 35 [05:18:54.053] index :: _onStepProgress_vidbot(), percent: 40 [05:18:55.577] index :: _onStepProgress_vidbot(), percent: 45 [05:18:57.124] index :: _onStepProgress_vidbot(), percent: 51 [05:18:58.142] index :: _onStepProgress_vidbot(), percent: 55 [05:18:59.150] index :: _onStepProgress_vidbot(), percent: 60 [05:19:00.163] index :: _onStepProgress_vidbot(), percent: 65 [05:19:01.175] index :: _onStepProgress_vidbot(), percent: 70 [05:19:02.695] index :: _onStepProgress_vidbot(), percent: 75 [05:19:04.245] index :: _onStepProgress_vidbot(), percent: 80 [05:19:05.760] index :: _onStepProgress_vidbot(), percent: 86 [05:19:06.765] index :: _onStepProgress_vidbot(), percent: 90 [05:19:07.767] index :: _onStepProgress_vidbot(), percent: 95 [05:19:09.299] index :: _onStepProgress_vidbot(), percent: 100 [05:19:09.373] Vidbot :: ffmpeg.on( 'end' ), Done! [05:19:09.373] StreamManager :: dispose() [05:19:09.373] CanvasStream[canvas_202556983470] :: dispose() [05:19:09.388] Vidbot :: fflog.on( 'finish' ) [05:19:09.388] fflog.path: /var/www/html/clients/21916/video/4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA.mp4.fflog [05:19:09.389] Vidbot :: _next(), _stepIndex:4 of 4 [05:19:09.389] index :: _onStepCompleted_vidbot(), step: 4 [05:19:09.389] index :: _onComplete_vidbot(), data: { stepTime: 0, appTime: 585.052, output: '/var/www/html/clients/21916/video/4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA.mp4', duration: 60 } --------------------------------------------------------------------------------------------------------------- Output File : /var/app/video_pre_processor/jobs/postp//var/www/html/clients/21916/video/4C5BB039-5471-B4BA-CFF7-7F9D46C6EFCA.mp4 Media Duration : 00:01:00.000 Generation Time : 00:09:45.052 ---------------------------------------------------------------------------------------------------------------