--------------------------------------------------------------------------------------------------------------- INITIALIZING VIDBOT, v1.7.1... --------------------------------------------------------------------------------------------------------------- [10:22:29.426] Vidbot :: start() [10:22:29.426] Vidbot :: _next(), _stepIndex:0 of 4 [10:22:29.427] index :: _onStepStarted_vidbot(), step: 1 [10:22:29.428] Vidbot :: step[0], label:Initializing Core [10:22:29.441] index :: _onStepProgress_vidbot(), percent: 20 [10:22:29.441] Vidbot :: _parse() [10:22:29.443] index :: _onStepProgress_vidbot(), percent: 40 [10:22:29.443] Vidbot :: _validate() [10:22:29.444] index :: _onStepProgress_vidbot(), percent: 60 [10:22:29.444] Vidbot :: _fonts() [10:22:29.444] FabricFontManager :: add(), id: SourceSansPro-Bold [10:22:29.444] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Bold.ttf [10:22:29.453] FabricFontManager :: add(), id: SourceSansPro-Light [10:22:29.453] src: /var/app/Vidbot-V2/assets/fonts/SourceSansPro/SourceSansPro-Light.ttf [10:22:29.454] FabricFontManager :: add(), id: DINOT-Bold [10:22:29.454] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Bold.otf [10:22:29.455] FabricFontManager :: add(), id: DINOT-Light [10:22:29.455] src: /var/app/Vidbot-V2/assets/fonts/DINOT/DINOT-Light.otf [10:22:29.456] FabricFontManager :: add(), id: TradeGothicLTStd-Regular [10:22:29.456] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Regular.otf [10:22:29.457] FabricFontManager :: add(), id: TradeGothicLTStd-Bold [10:22:29.457] src: /var/app/Vidbot-V2/assets/fonts/TradeGothicCond/TradeGothicLTStd-Bold.otf [10:22:29.458] index :: _onStepProgress_vidbot(), percent: 80 [10:22:29.458] Vidbot :: _clips() [10:22:29.459] StreamManager :: add(), id:audio_vo, type:audio [10:22:29.459] AudioClip[audio_vo] :: constructor() [10:22:29.460] InputStream[audio_vo] :: constructor() [10:22:29.460] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'audio_vo', clipId: null } [10:22:29.463] StreamManager :: add(), id:bg_music, type:audio [10:22:29.463] AudioClip[bg_music] :: constructor() [10:22:29.463] InputStream[bg_music] :: constructor() [10:22:29.463] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'bg_music', clipId: null } [10:22:29.463] StreamManager :: add(), id:mira, type:canvas [10:22:29.464] CanvasStream[canvas_222274857596] :: constructor() [10:22:29.464] InputStream[canvas_222274857596] :: constructor() [10:22:29.548] MiraSlideshow[mira] :: constructor() [10:22:29.548] Mira[mira] :: constructor() [10:22:29.548] Overlay[mira] :: constructor() [10:22:29.549] CanvasClip[mira] :: constructor() [10:22:29.549] Clip[mira] :: constructor() [10:22:29.549] clip:"mira" added to stream:"canvas_222274857596" [10:22:29.549] Vidbot :: StreamMgr.on( 'ADDED' ), data: { streamID: 'canvas_222274857596', clipId: 'mira' } [10:22:29.549] all added... [10:22:29.549] Vidbot :: _next(), _stepIndex:1 of 4 [10:22:29.549] index :: _onStepCompleted_vidbot(), step: 1 [10:22:29.550] index :: _onStepStarted_vidbot(), step: 2 [10:22:29.550] Vidbot :: step[1], label:Initializing Input Streams [10:22:29.551] StreamManager :: init() [10:22:29.551] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'audio_vo', progress: 0.3333333333333333 } [10:22:29.551] index :: _onStepProgress_vidbot(), percent: 33 [10:22:29.551] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'bg_music', progress: 0.6666666666666666 } [10:22:29.551] index :: _onStepProgress_vidbot(), percent: 67 [10:22:29.552] CanvasStream[canvas_222274857596] :: _init(), BEGIN [10:22:29.552] i:0, c.id:mira [10:22:29.552] MiraSlideshow[mira] :: _init(), BEGIN [10:22:29.553] MiraSlideshow[mira] :: _validate() [10:22:29.555] MiraSlideshow :: _validateSlides() [10:22:29.555] i:0, s.type: title [10:22:29.555] i:1, s.type: info [10:22:29.555] i:2, s.type: image [10:22:29.555] i:3, s.type: image [10:22:29.555] i:4, s.type: image [10:22:29.555] i:5, s.type: image [10:22:29.555] i:6, s.type: image [10:22:29.555] i:7, s.type: image [10:22:29.555] i:8, s.type: image [10:22:29.556] i:9, s.type: image [10:22:29.556] i:10, s.type: image [10:22:29.556] i:11, s.type: image [10:22:29.556] i:12, s.type: image [10:22:29.556] i:13, s.type: image [10:22:29.556] i:14, s.type: image [10:22:29.556] i:15, s.type: image [10:22:29.556] i:16, s.type: image [10:22:29.560] MiraSlideshow[mira] :: _build(), BEGIN [10:22:29.565] MiraTitlecard[titlecard] :: constructor() [10:22:29.565] Mira[titlecard] :: constructor() [10:22:29.565] Overlay[titlecard] :: constructor() [10:22:29.565] CanvasClip[titlecard] :: constructor() [10:22:29.565] Clip[titlecard] :: constructor() [10:22:29.566] MiraTitlecard[titlecard] :: _init() [10:22:29.566] MiraTitlecard[titlecard] :: _validate() [10:22:29.567] MiraTitlecard[titlecard] :: _build() [10:22:29.595] Overlay[titlecard] :: _animate() [10:22:29.597] MiraTitlecard[titlecard] :: _animate() [10:22:29.599] AnimatedImageFrame[aiftitle] :: constructor() [10:22:29.601] AnimatedImageFrame[aiftitle] :: _init(), BEGIN [10:22:29.601] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_1.jpg [10:22:29.665] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:29.669] AnimatedImageFrame[aiftitle] :: _init(), END [10:22:29.674] MiraInfosheet[info] :: constructor() [10:22:29.674] Mira[info] :: constructor() [10:22:29.674] Overlay[info] :: constructor() [10:22:29.674] CanvasClip[info] :: constructor() [10:22:29.674] Clip[info] :: constructor() [10:22:29.675] MiraInfosheet[info] :: _init() [10:22:29.675] MiraInfosheet[info] :: _validate() [10:22:29.677] MiraInfosheet[info] :: _build() [10:22:29.691] RenOptions[info] :: _animate() [10:22:29.691] Overlay[info] :: _animate() [10:22:29.693] AnimatedImageFrame[info1] :: constructor() [10:22:29.693] AnimatedImageFrame[info2] :: constructor() [10:22:29.693] AnimatedImageFrame[info3] :: constructor() [10:22:29.694] AnimatedImageFrame[info1] :: _init(), BEGIN [10:22:29.694] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_13.jpg [10:22:29.739] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:29.741] AnimatedImageFrame[info1] :: _init(), END [10:22:29.742] AnimatedImageFrame[info2] :: _init(), BEGIN [10:22:29.742] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_15.jpg [10:22:29.782] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:29.783] AnimatedImageFrame[info2] :: _init(), END [10:22:29.784] AnimatedImageFrame[info3] :: _init(), BEGIN [10:22:29.784] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_19.jpg [10:22:29.820] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:29.821] AnimatedImageFrame[info3] :: _init(), END [10:22:29.822] AnimatedImageFrame[image] :: constructor() [10:22:29.823] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:29.823] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_1.jpg [10:22:29.864] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:29.866] AnimatedImageFrame[image] :: _init(), END [10:22:29.866] AnimatedImageFrame[image] :: constructor() [10:22:29.866] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:29.866] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_2.jpg [10:22:29.907] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:29.908] AnimatedImageFrame[image] :: _init(), END [10:22:29.909] AnimatedImageFrame[image] :: constructor() [10:22:29.909] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:29.909] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_3.jpg [10:22:29.948] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:29.949] AnimatedImageFrame[image] :: _init(), END [10:22:29.949] AnimatedImageFrame[image] :: constructor() [10:22:29.949] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:29.949] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_4.jpg [10:22:29.995] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:29.996] AnimatedImageFrame[image] :: _init(), END [10:22:29.996] AnimatedImageFrame[image] :: constructor() [10:22:29.997] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:29.997] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_5.jpg [10:22:30.029] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.030] AnimatedImageFrame[image] :: _init(), END [10:22:30.031] AnimatedImageFrame[image] :: constructor() [10:22:30.031] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:30.031] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_6.jpg [10:22:30.064] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.065] AnimatedImageFrame[image] :: _init(), END [10:22:30.065] AnimatedImageFrame[image] :: constructor() [10:22:30.065] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:30.065] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_7.jpg [10:22:30.098] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.099] AnimatedImageFrame[image] :: _init(), END [10:22:30.099] AnimatedImageFrame[image] :: constructor() [10:22:30.099] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:30.100] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_8.jpg [10:22:30.135] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.136] AnimatedImageFrame[image] :: _init(), END [10:22:30.136] AnimatedImageFrame[image] :: constructor() [10:22:30.137] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:30.137] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_9.jpg [10:22:30.177] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.178] AnimatedImageFrame[image] :: _init(), END [10:22:30.178] AnimatedImageFrame[image] :: constructor() [10:22:30.178] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:30.178] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_10.jpg [10:22:30.253] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.255] AnimatedImageFrame[image] :: _init(), END [10:22:30.255] AnimatedImageFrame[image] :: constructor() [10:22:30.256] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:30.256] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_11.jpg [10:22:30.292] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.293] AnimatedImageFrame[image] :: _init(), END [10:22:30.294] AnimatedImageFrame[image] :: constructor() [10:22:30.294] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:30.294] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_12.jpg [10:22:30.328] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.329] AnimatedImageFrame[image] :: _init(), END [10:22:30.330] AnimatedImageFrame[image] :: constructor() [10:22:30.330] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:30.330] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_13.jpg [10:22:30.369] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.370] AnimatedImageFrame[image] :: _init(), END [10:22:30.370] AnimatedImageFrame[image] :: constructor() [10:22:30.371] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:30.371] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_14.jpg [10:22:30.406] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.407] AnimatedImageFrame[image] :: _init(), END [10:22:30.408] AnimatedImageFrame[image] :: constructor() [10:22:30.408] AnimatedImageFrame[image] :: _init(), BEGIN [10:22:30.408] CanvasClip :: LoadImageWithPromise(), src: CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6_15.jpg [10:22:30.459] CanvasClip :: LoadImageWithPromise(), loaded, isError: false [10:22:30.460] AnimatedImageFrame[image] :: _init(), END [10:22:30.460] MiraSlideshow[mira] :: _build(), END [10:22:30.460] Overlay[mira] :: _animate() [10:22:30.461] MiraSlideshow[mira] :: _init(), END [10:22:30.461] CanvasStream[mira] :: _init(), p.then() [10:22:30.461] CanvasStream[canvas_222274857596] :: _init(), promise.all.then() [10:22:30.463] CanvasStream[canvas_222274857596] :: _init(), END [10:22:30.463] StreamMangaer :: init(), stream[canvas_222274857596].then() [10:22:30.463] Vidbot :: StreamMgr.on( 'STREAM_INITED' ), data: { streamID: 'canvas_222274857596', progress: 1 } [10:22:30.463] index :: _onStepProgress_vidbot(), percent: 100 [10:22:30.463] StreamManager :: init(), promise.all.then... [10:22:30.464] Vidbot :: StreamMgr.on( 'INITED' ) [10:22:30.464] Vidbot :: _next(), _stepIndex:2 of 4 [10:22:30.464] index :: _onStepCompleted_vidbot(), step: 2 [10:22:30.464] index :: _onStepStarted_vidbot(), step: 3 [10:22:30.464] Vidbot :: step[2], label:Rendering Canvas Streams [10:22:30.464] Vidbot :: StreamMgr.on( 'RENDER_STARTED' ), data: undefined [10:22:30.465] StreamManager :: render() [10:22:30.465] CanvasStream[canvas_222274857596] :: render() [10:22:30.524] index :: _onStepProgress_vidbot(), percent: 0 [10:23:06.007] index :: _onStepProgress_vidbot(), percent: 5 [10:23:31.666] index :: _onStepProgress_vidbot(), percent: 10 [10:24:11.106] index :: _onStepProgress_vidbot(), percent: 15 [10:24:55.671] index :: _onStepProgress_vidbot(), percent: 20 [10:25:34.649] index :: _onStepProgress_vidbot(), percent: 25 [10:26:12.309] index :: _onStepProgress_vidbot(), percent: 30 [10:26:54.235] index :: _onStepProgress_vidbot(), percent: 35 [10:27:36.217] index :: _onStepProgress_vidbot(), percent: 40 [10:28:18.448] index :: _onStepProgress_vidbot(), percent: 45 [10:28:59.342] index :: _onStepProgress_vidbot(), percent: 50 [10:29:42.339] index :: _onStepProgress_vidbot(), percent: 55 [10:30:26.298] index :: _onStepProgress_vidbot(), percent: 60 [10:31:02.980] index :: _onStepProgress_vidbot(), percent: 65 [10:31:40.800] index :: _onStepProgress_vidbot(), percent: 70 [10:32:17.979] index :: _onStepProgress_vidbot(), percent: 75 [10:32:56.339] index :: _onStepProgress_vidbot(), percent: 80 [10:33:33.230] index :: _onStepProgress_vidbot(), percent: 85 [10:34:11.114] index :: _onStepProgress_vidbot(), percent: 90 [10:34:51.228] index :: _onStepProgress_vidbot(), percent: 95 [10:35:36.210] index :: _onStepProgress_vidbot(), percent: 100 [10:35:39.838] StreamManager :: render(), Promise.all.then... [10:35:39.838] Vidbot :: StreamMgr.on( 'RENDER_COMPLETED' ), data: undefined [10:35:39.838] Vidbot :: _next(), _stepIndex:3 of 4 [10:35:39.839] index :: _onStepCompleted_vidbot(), step: 3 [10:35:39.839] index :: _onStepStarted_vidbot(), step: 4 [10:35:39.840] Vidbot :: step[3], label:Encoding Media [10:35:39.843] CanvasFilters :: Overlay() [10:35:39.843] AudioStream[audio_vo] :: inputOptions() [10:35:39.843] AudioFilters :: Volume() [10:35:39.843] filter: [2:a]volume=1[2_vol] [10:35:39.844] AudioFilters :: Delay() [10:35:39.844] filter: [2_vol]adelay=0|0[2_del] [10:35:39.844] AudioStream[bg_music] :: inputOptions() [10:35:39.844] AudioFilters :: Volume() [10:35:39.844] filter: [3:a]volume=0.15[3_vol] [10:35:39.844] AudioFilters :: FadeOut() [10:35:39.844] filter: [3_vol]afade=t=out:st=57:d=1[3_fadeout] [10:35:39.844] AudioFilters :: Delay() [10:35:39.844] filter: [3_fadeout]adelay=0|0[3_del] [10:35:39.844] AudioFilters :: Mix() [10:35:39.845] filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [10:35:39.845] mixed filter: [2_del][3_del]amix=inputs=2:duration=longest[a_out] [10:35:39.847] hang.time: 60 [10:35:39.993] Vidbot :: ffmpeg.on( 'start' ) [10:35:39.993] ffmpeg -f lavfi -i color=c=000000:s=960x540:r=30:duration=57 -r 30 -i ./tmp/canvas_222274857596_%05d.png -to 00:00:57.000 -i file:///var/www/html/clie [10:35:39.993] nts/21670/audio/CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6.mp3 -to 00:00:57.000 -i file:///var/app/video_pre_processor/assets/vidbot/_files/audio/RF12_Funky [10:35:39.993] _2.mp3 -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 [10:35:39.994] =57:d=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_o [10:35:39.994] ut] -map [1_out] -preset veryfast -crf 18 -movflags frag_keyframe+empty_moov -pix_fmt yuv420p /var/www/html/clients/21670/video/CE8BEDDB-E5AE-A5EE-544 [10:35:39.994] F-B76EFE8F60A6.mp4 [10:35:40.271] index :: _onStepProgress_vidbot(), percent: -3644295539 [10:35:40.648] index :: _onStepProgress_vidbot(), percent: 1 [10:35:42.180] index :: _onStepProgress_vidbot(), percent: 5 [10:35:43.705] index :: _onStepProgress_vidbot(), percent: 11 [10:35:44.725] index :: _onStepProgress_vidbot(), percent: 15 [10:35:46.764] index :: _onStepProgress_vidbot(), percent: 21 [10:35:48.280] index :: _onStepProgress_vidbot(), percent: 25 [10:35:49.791] index :: _onStepProgress_vidbot(), percent: 31 [10:35:51.342] index :: _onStepProgress_vidbot(), percent: 35 [10:35:52.862] index :: _onStepProgress_vidbot(), percent: 40 [10:35:54.384] index :: _onStepProgress_vidbot(), percent: 45 [10:35:55.907] index :: _onStepProgress_vidbot(), percent: 51 [10:35:56.909] index :: _onStepProgress_vidbot(), percent: 55 [10:35:57.920] index :: _onStepProgress_vidbot(), percent: 60 [10:35:59.432] index :: _onStepProgress_vidbot(), percent: 66 [10:36:00.446] index :: _onStepProgress_vidbot(), percent: 70 [10:36:01.970] index :: _onStepProgress_vidbot(), percent: 76 [10:36:02.973] index :: _onStepProgress_vidbot(), percent: 80 [10:36:03.989] index :: _onStepProgress_vidbot(), percent: 85 [10:36:04.996] index :: _onStepProgress_vidbot(), percent: 90 [10:36:05.999] index :: _onStepProgress_vidbot(), percent: 95 [10:36:07.005] index :: _onStepProgress_vidbot(), percent: 100 [10:36:07.197] Vidbot :: ffmpeg.on( 'end' ), Done! [10:36:07.197] StreamManager :: dispose() [10:36:07.198] CanvasStream[canvas_222274857596] :: dispose() [10:36:07.203] Vidbot :: fflog.on( 'finish' ) [10:36:07.203] fflog.path: /var/www/html/clients/21670/video/CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6.mp4.fflog [10:36:07.203] Vidbot :: _next(), _stepIndex:4 of 4 [10:36:07.203] index :: _onStepCompleted_vidbot(), step: 4 [10:36:07.204] index :: _onComplete_vidbot(), data: { stepTime: 0.001, appTime: 817.799, output: '/var/www/html/clients/21670/video/CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6.mp4', duration: 57 } --------------------------------------------------------------------------------------------------------------- Output File : /var/app/video_pre_processor/jobs/postp//var/www/html/clients/21670/video/CE8BEDDB-E5AE-A5EE-544F-B76EFE8F60A6.mp4 Media Duration : 00:00:57.000 Generation Time : 00:13:37.798 ---------------------------------------------------------------------------------------------------------------