Built motion from commit e0fa946e.|2.6.5
[motion2.git] / server / api / whatsappTransferReport / whatsappTransferReport.controller.js
index e52730a..bf51275 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0x354b=['fs-extra','lodash','squel','desk.js','querystring','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','sendStatus','status','end','json','offset','undefined','limit','Content-Range','apply','update','then','destroy','stack','name','send','index','map','rawAttributes','model','keys','query','filters','attributes','intersection','fields','length','hasOwnProperty','nolimit','order','sort','pick','filter','where','type','VIRTUAL','merge','options','WhatsappTransferReport','count','includeAll','include','rows','catch','show','params','find','create','body','describe','eml-format','rimraf','zip-dir','fast-json-patch','request-promise','moment','bluebird','mustache','util','path','to-csv'];(function(_0x4b8dea,_0x4acbd1){var _0x4774be=function(_0x2ed461){while(--_0x2ed461){_0x4b8dea['push'](_0x4b8dea['shift']());}};_0x4774be(++_0x4acbd1);}(_0x354b,0x85));var _0xb354=function(_0x3e44bb,_0x4f32af){_0x3e44bb=_0x3e44bb-0x0;var _0x6bd5a7=_0x354b[_0x3e44bb];return _0x6bd5a7;};'use strict';var emlformat=require(_0xb354('0x0'));var rimraf=require(_0xb354('0x1'));var zipdir=require(_0xb354('0x2'));var jsonpatch=require(_0xb354('0x3'));var rp=require(_0xb354('0x4'));var moment=require(_0xb354('0x5'));var BPromise=require(_0xb354('0x6'));var Mustache=require(_0xb354('0x7'));var util=require(_0xb354('0x8'));var path=require(_0xb354('0x9'));var sox=require('sox');var csv=require(_0xb354('0xa'));var ejs=require('ejs');var fs=require('fs');var fs_extra=require(_0xb354('0xb'));var _=require(_0xb354('0xc'));var squel=require(_0xb354('0xd'));var crypto=require('crypto');var jsforce=require('jsforce');var deskjs=require(_0xb354('0xe'));var toCsv=require('to-csv');var querystring=require(_0xb354('0xf'));var Papa=require('papaparse');var Redis=require(_0xb354('0x10'));var authService=require(_0xb354('0x11'));var qs=require(_0xb354('0x12'));var as=require(_0xb354('0x13'));var hardwareService=require(_0xb354('0x14'));var logger=require(_0xb354('0x15'))(_0xb354('0x16'));var utils=require('../../config/utils');var config=require('../../config/environment');var licenseUtil=require('../../config/license/util');var db=require('../../mysqldb')['db'];function respondWithStatusCode(_0x4007ef,_0x247e4f){_0x247e4f=_0x247e4f||0xcc;return function(_0x4692dd){if(_0x4692dd){return _0x4007ef[_0xb354('0x17')](_0x247e4f);}return _0x4007ef[_0xb354('0x18')](_0x247e4f)[_0xb354('0x19')]();};}function respondWithResult(_0x101557,_0xe9f288){_0xe9f288=_0xe9f288||0xc8;return function(_0x2ad35a){if(_0x2ad35a){return _0x101557[_0xb354('0x18')](_0xe9f288)[_0xb354('0x1a')](_0x2ad35a);}};}function respondWithFilteredResult(_0x5e52a8,_0x3ed643){return function(_0x3cefac){if(_0x3cefac){var _0x20b146=typeof _0x3ed643[_0xb354('0x1b')]===_0xb354('0x1c')&&typeof _0x3ed643[_0xb354('0x1d')]===_0xb354('0x1c');var _0x1e2d64=_0x3cefac['count'];var _0x222d86=_0x20b146?0x0:_0x3ed643['offset'];var _0x19893d=_0x20b146?_0x3cefac['count']:_0x3ed643[_0xb354('0x1b')]+_0x3ed643[_0xb354('0x1d')];var _0x1175e5;if(_0x19893d>=_0x1e2d64){_0x19893d=_0x1e2d64;_0x1175e5=0xc8;}else{_0x1175e5=0xce;}_0x5e52a8['status'](_0x1175e5);return _0x5e52a8['set'](_0xb354('0x1e'),_0x222d86+'-'+_0x19893d+'/'+_0x1e2d64)[_0xb354('0x1a')](_0x3cefac);}return null;};}function patchUpdates(_0x3dfa50){return function(_0x92f7a4){try{jsonpatch[_0xb354('0x1f')](_0x92f7a4,_0x3dfa50,!![]);}catch(_0x35ad2d){return BPromise['reject'](_0x35ad2d);}return _0x92f7a4['save']();};}function saveUpdates(_0x378047,_0x227915){return function(_0x36b37c){if(_0x36b37c){return _0x36b37c[_0xb354('0x20')](_0x378047)[_0xb354('0x21')](function(_0x1d0c1a){return _0x1d0c1a;});}return null;};}function removeEntity(_0x566ef2,_0x5ec3bb){return function(_0x8b791e){if(_0x8b791e){return _0x8b791e[_0xb354('0x22')]()[_0xb354('0x21')](function(){_0x566ef2[_0xb354('0x18')](0xcc)[_0xb354('0x19')]();});}};}function handleEntityNotFound(_0x106396,_0x332ed7){return function(_0x59ca56){if(!_0x59ca56){_0x106396[_0xb354('0x17')](0x194);}return _0x59ca56;};}function handleError(_0x53a616,_0x574220){_0x574220=_0x574220||0x1f4;return function(_0x50bade){logger['error'](_0x50bade[_0xb354('0x23')]);if(_0x50bade[_0xb354('0x24')]){delete _0x50bade['name'];}_0x53a616[_0xb354('0x18')](_0x574220)[_0xb354('0x25')](_0x50bade);};}exports[_0xb354('0x26')]=function(_0x1f3d0d,_0x434687){var _0x152135={},_0x2e7b4b={},_0x501f08={'count':0x0,'rows':[]};var _0x22a670=_[_0xb354('0x27')](db['WhatsappTransferReport'][_0xb354('0x28')],function(_0xe5f1ec){return{'name':_0xe5f1ec['fieldName'],'type':_0xe5f1ec['type']['key']};});_0x2e7b4b[_0xb354('0x29')]=_[_0xb354('0x27')](_0x22a670,_0xb354('0x24'));_0x2e7b4b['query']=_[_0xb354('0x2a')](_0x1f3d0d[_0xb354('0x2b')]);_0x2e7b4b[_0xb354('0x2c')]=_['intersection'](_0x2e7b4b[_0xb354('0x29')],_0x2e7b4b[_0xb354('0x2b')]);_0x152135[_0xb354('0x2d')]=_[_0xb354('0x2e')](_0x2e7b4b[_0xb354('0x29')],qs[_0xb354('0x2f')](_0x1f3d0d[_0xb354('0x2b')][_0xb354('0x2f')]));_0x152135[_0xb354('0x2d')]=_0x152135['attributes'][_0xb354('0x30')]?_0x152135[_0xb354('0x2d')]:_0x2e7b4b[_0xb354('0x29')];if(!_0x1f3d0d['query'][_0xb354('0x31')](_0xb354('0x32'))){_0x152135[_0xb354('0x1d')]=qs[_0xb354('0x1d')](_0x1f3d0d['query'][_0xb354('0x1d')]);_0x152135[_0xb354('0x1b')]=qs[_0xb354('0x1b')](_0x1f3d0d[_0xb354('0x2b')]['offset']);}_0x152135[_0xb354('0x33')]=qs[_0xb354('0x34')](_0x1f3d0d[_0xb354('0x2b')][_0xb354('0x34')]);_0x152135['where']=qs['filters'](_[_0xb354('0x35')](_0x1f3d0d['query'],_0x2e7b4b['filters']),_0x22a670);if(_0x1f3d0d[_0xb354('0x2b')][_0xb354('0x36')]){_0x152135[_0xb354('0x37')]=_['merge'](_0x152135[_0xb354('0x37')],{'$or':_[_0xb354('0x27')](_0x22a670,function(_0x3917e3){if(_0x3917e3[_0xb354('0x38')]!==_0xb354('0x39')){var _0x3fa573={};_0x3fa573[_0x3917e3[_0xb354('0x24')]]={'$like':'%'+_0x1f3d0d[_0xb354('0x2b')][_0xb354('0x36')]+'%'};return _0x3fa573;}})});}_0x152135=_[_0xb354('0x3a')]({},_0x152135,_0x1f3d0d[_0xb354('0x3b')]);var _0x39d372={'where':_0x152135[_0xb354('0x37')]};return db[_0xb354('0x3c')]['count'](_0x39d372)[_0xb354('0x21')](function(_0x134157){_0x501f08[_0xb354('0x3d')]=_0x134157;if(_0x1f3d0d[_0xb354('0x2b')][_0xb354('0x3e')]){_0x152135[_0xb354('0x3f')]=[{'all':!![]}];}return db['WhatsappTransferReport']['findAll'](_0x152135);})[_0xb354('0x21')](function(_0x131aee){_0x501f08[_0xb354('0x40')]=_0x131aee;return _0x501f08;})[_0xb354('0x21')](respondWithFilteredResult(_0x434687,_0x152135))[_0xb354('0x41')](handleError(_0x434687,null));};exports[_0xb354('0x42')]=function(_0x3bcdcd,_0x1825a5){var _0x3713fb={'raw':!![],'where':{'id':_0x3bcdcd[_0xb354('0x43')]['id']}},_0x243423={};_0x243423['model']=_[_0xb354('0x2a')](db[_0xb354('0x3c')][_0xb354('0x28')]);_0x243423[_0xb354('0x2b')]=_['keys'](_0x3bcdcd[_0xb354('0x2b')]);_0x243423[_0xb354('0x2c')]=_[_0xb354('0x2e')](_0x243423[_0xb354('0x29')],_0x243423['query']);_0x3713fb[_0xb354('0x2d')]=_['intersection'](_0x243423['model'],qs[_0xb354('0x2f')](_0x3bcdcd[_0xb354('0x2b')][_0xb354('0x2f')]));_0x3713fb['attributes']=_0x3713fb[_0xb354('0x2d')][_0xb354('0x30')]?_0x3713fb['attributes']:_0x243423[_0xb354('0x29')];if(_0x3bcdcd[_0xb354('0x2b')]['includeAll']){_0x3713fb[_0xb354('0x3f')]=[{'all':!![]}];}_0x3713fb=_['merge']({},_0x3713fb,_0x3bcdcd['options']);return db[_0xb354('0x3c')][_0xb354('0x44')](_0x3713fb)['then'](handleEntityNotFound(_0x1825a5,null))[_0xb354('0x21')](respondWithResult(_0x1825a5,null))[_0xb354('0x41')](handleError(_0x1825a5,null));};exports[_0xb354('0x45')]=function(_0x5316e2,_0x7bea7d){return db[_0xb354('0x3c')][_0xb354('0x45')](_0x5316e2[_0xb354('0x46')],{})[_0xb354('0x21')](respondWithResult(_0x7bea7d,0xc9))[_0xb354('0x41')](handleError(_0x7bea7d,null));};exports[_0xb354('0x20')]=function(_0x2b2043,_0x15e55a){if(_0x2b2043[_0xb354('0x46')]['id']){delete _0x2b2043['body']['id'];}return db[_0xb354('0x3c')]['find']({'where':{'id':_0x2b2043[_0xb354('0x43')]['id']}})[_0xb354('0x21')](handleEntityNotFound(_0x15e55a,null))[_0xb354('0x21')](saveUpdates(_0x2b2043['body'],null))[_0xb354('0x21')](respondWithResult(_0x15e55a,null))[_0xb354('0x41')](handleError(_0x15e55a,null));};exports['destroy']=function(_0x3c2085,_0x170cf9){return db[_0xb354('0x3c')][_0xb354('0x44')]({'where':{'id':_0x3c2085[_0xb354('0x43')]['id']}})[_0xb354('0x21')](handleEntityNotFound(_0x170cf9,null))[_0xb354('0x21')](removeEntity(_0x170cf9,null))[_0xb354('0x41')](handleError(_0x170cf9,null));};exports[_0xb354('0x47')]=function(_0x31e76d,_0x444d69){return db[_0xb354('0x3c')][_0xb354('0x47')]()['then'](respondWithResult(_0x444d69,null))[_0xb354('0x41')](handleError(_0x444d69,null));};
\ No newline at end of file
+var _0x4173=['type','key','query','keys','intersection','model','attributes','fields','length','order','sort','where','filters','VIRTUAL','filter','merge','options','includeAll','include','findAll','rows','catch','show','params','find','create','body','update','describe','eml-format','rimraf','zip-dir','fast-json-patch','request-promise','moment','mustache','util','path','fs-extra','lodash','squel','crypto','desk.js','querystring','papaparse','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','api','../../config/utils','sendStatus','status','end','json','undefined','limit','offset','count','set','Content-Range','apply','reject','save','then','destroy','error','stack','name','send','index','map','WhatsappTransferReport','rawAttributes','fieldName'];(function(_0x542847,_0x3e4da5){var _0x30c2b6=function(_0x187e14){while(--_0x187e14){_0x542847['push'](_0x542847['shift']());}};_0x30c2b6(++_0x3e4da5);}(_0x4173,0x101));var _0x3417=function(_0x3ef4f1,_0x5f0f9b){_0x3ef4f1=_0x3ef4f1-0x0;var _0x69953c=_0x4173[_0x3ef4f1];return _0x69953c;};'use strict';var emlformat=require(_0x3417('0x0'));var rimraf=require(_0x3417('0x1'));var zipdir=require(_0x3417('0x2'));var jsonpatch=require(_0x3417('0x3'));var rp=require(_0x3417('0x4'));var moment=require(_0x3417('0x5'));var BPromise=require('bluebird');var Mustache=require(_0x3417('0x6'));var util=require(_0x3417('0x7'));var path=require(_0x3417('0x8'));var sox=require('sox');var csv=require('to-csv');var ejs=require('ejs');var fs=require('fs');var fs_extra=require(_0x3417('0x9'));var _=require(_0x3417('0xa'));var squel=require(_0x3417('0xb'));var crypto=require(_0x3417('0xc'));var jsforce=require('jsforce');var deskjs=require(_0x3417('0xd'));var toCsv=require('to-csv');var querystring=require(_0x3417('0xe'));var Papa=require(_0x3417('0xf'));var Redis=require(_0x3417('0x10'));var authService=require(_0x3417('0x11'));var qs=require(_0x3417('0x12'));var as=require(_0x3417('0x13'));var hardwareService=require(_0x3417('0x14'));var logger=require('../../config/logger')(_0x3417('0x15'));var utils=require(_0x3417('0x16'));var config=require('../../config/environment');var licenseUtil=require('../../config/license/util');var db=require('../../mysqldb')['db'];function respondWithStatusCode(_0x2f9726,_0x547d88){_0x547d88=_0x547d88||0xcc;return function(_0x2fca7c){if(_0x2fca7c){return _0x2f9726[_0x3417('0x17')](_0x547d88);}return _0x2f9726[_0x3417('0x18')](_0x547d88)[_0x3417('0x19')]();};}function respondWithResult(_0x43bfe1,_0x56ad34){_0x56ad34=_0x56ad34||0xc8;return function(_0x549bca){if(_0x549bca){return _0x43bfe1['status'](_0x56ad34)[_0x3417('0x1a')](_0x549bca);}};}function respondWithFilteredResult(_0x52cd91,_0x593a67){return function(_0x505523){if(_0x505523){var _0x59ea65=typeof _0x593a67['offset']===_0x3417('0x1b')&&typeof _0x593a67[_0x3417('0x1c')]===_0x3417('0x1b');var _0x3430b3=_0x505523['count'];var _0x2de3b5=_0x59ea65?0x0:_0x593a67[_0x3417('0x1d')];var _0x43191d=_0x59ea65?_0x505523[_0x3417('0x1e')]:_0x593a67[_0x3417('0x1d')]+_0x593a67[_0x3417('0x1c')];var _0x54e56b;if(_0x43191d>=_0x3430b3){_0x43191d=_0x3430b3;_0x54e56b=0xc8;}else{_0x54e56b=0xce;}_0x52cd91[_0x3417('0x18')](_0x54e56b);return _0x52cd91[_0x3417('0x1f')](_0x3417('0x20'),_0x2de3b5+'-'+_0x43191d+'/'+_0x3430b3)[_0x3417('0x1a')](_0x505523);}return null;};}function patchUpdates(_0x20c9af){return function(_0x89397d){try{jsonpatch[_0x3417('0x21')](_0x89397d,_0x20c9af,!![]);}catch(_0xf0e6f6){return BPromise[_0x3417('0x22')](_0xf0e6f6);}return _0x89397d[_0x3417('0x23')]();};}function saveUpdates(_0xe26c2b,_0x2c2ff0){return function(_0x396c57){if(_0x396c57){return _0x396c57['update'](_0xe26c2b)[_0x3417('0x24')](function(_0x24ee33){return _0x24ee33;});}return null;};}function removeEntity(_0x158a0b,_0x393766){return function(_0x1920b9){if(_0x1920b9){return _0x1920b9[_0x3417('0x25')]()[_0x3417('0x24')](function(){_0x158a0b[_0x3417('0x18')](0xcc)[_0x3417('0x19')]();});}};}function handleEntityNotFound(_0x149bf0,_0x8ed410){return function(_0x30219b){if(!_0x30219b){_0x149bf0[_0x3417('0x17')](0x194);}return _0x30219b;};}function handleError(_0x36da94,_0x248605){_0x248605=_0x248605||0x1f4;return function(_0x16dd70){logger[_0x3417('0x26')](_0x16dd70[_0x3417('0x27')]);if(_0x16dd70['name']){delete _0x16dd70[_0x3417('0x28')];}_0x36da94[_0x3417('0x18')](_0x248605)[_0x3417('0x29')](_0x16dd70);};}exports[_0x3417('0x2a')]=function(_0x3013ef,_0x30aecb){var _0xc145a9={},_0x1627fc={},_0x32496e={'count':0x0,'rows':[]};var _0x4f32cf=_[_0x3417('0x2b')](db[_0x3417('0x2c')][_0x3417('0x2d')],function(_0x9c7a3e){return{'name':_0x9c7a3e[_0x3417('0x2e')],'type':_0x9c7a3e[_0x3417('0x2f')][_0x3417('0x30')]};});_0x1627fc['model']=_['map'](_0x4f32cf,_0x3417('0x28'));_0x1627fc[_0x3417('0x31')]=_[_0x3417('0x32')](_0x3013ef['query']);_0x1627fc['filters']=_[_0x3417('0x33')](_0x1627fc[_0x3417('0x34')],_0x1627fc[_0x3417('0x31')]);_0xc145a9[_0x3417('0x35')]=_[_0x3417('0x33')](_0x1627fc[_0x3417('0x34')],qs['fields'](_0x3013ef[_0x3417('0x31')][_0x3417('0x36')]));_0xc145a9[_0x3417('0x35')]=_0xc145a9[_0x3417('0x35')][_0x3417('0x37')]?_0xc145a9['attributes']:_0x1627fc[_0x3417('0x34')];if(!_0x3013ef[_0x3417('0x31')]['hasOwnProperty']('nolimit')){_0xc145a9[_0x3417('0x1c')]=qs[_0x3417('0x1c')](_0x3013ef['query']['limit']);_0xc145a9['offset']=qs['offset'](_0x3013ef[_0x3417('0x31')][_0x3417('0x1d')]);}_0xc145a9[_0x3417('0x38')]=qs[_0x3417('0x39')](_0x3013ef[_0x3417('0x31')][_0x3417('0x39')]);_0xc145a9[_0x3417('0x3a')]=qs[_0x3417('0x3b')](_['pick'](_0x3013ef[_0x3417('0x31')],_0x1627fc[_0x3417('0x3b')]),_0x4f32cf);if(_0x3013ef[_0x3417('0x31')]['filter']){_0xc145a9['where']=_['merge'](_0xc145a9[_0x3417('0x3a')],{'$or':_[_0x3417('0x2b')](_0x4f32cf,function(_0x131547){if(_0x131547['type']!==_0x3417('0x3c')){var _0x459484={};_0x459484[_0x131547[_0x3417('0x28')]]={'$like':'%'+_0x3013ef[_0x3417('0x31')][_0x3417('0x3d')]+'%'};return _0x459484;}})});}_0xc145a9=_[_0x3417('0x3e')]({},_0xc145a9,_0x3013ef[_0x3417('0x3f')]);var _0x575f2={'where':_0xc145a9[_0x3417('0x3a')]};return db[_0x3417('0x2c')][_0x3417('0x1e')](_0x575f2)[_0x3417('0x24')](function(_0x473cc9){_0x32496e['count']=_0x473cc9;if(_0x3013ef['query'][_0x3417('0x40')]){_0xc145a9[_0x3417('0x41')]=[{'all':!![]}];}return db['WhatsappTransferReport'][_0x3417('0x42')](_0xc145a9);})[_0x3417('0x24')](function(_0x1f22d2){_0x32496e[_0x3417('0x43')]=_0x1f22d2;return _0x32496e;})[_0x3417('0x24')](respondWithFilteredResult(_0x30aecb,_0xc145a9))[_0x3417('0x44')](handleError(_0x30aecb,null));};exports[_0x3417('0x45')]=function(_0x2a5834,_0x19637a){var _0x1b1ff7={'raw':!![],'where':{'id':_0x2a5834[_0x3417('0x46')]['id']}},_0x1c52b5={};_0x1c52b5[_0x3417('0x34')]=_[_0x3417('0x32')](db[_0x3417('0x2c')][_0x3417('0x2d')]);_0x1c52b5[_0x3417('0x31')]=_[_0x3417('0x32')](_0x2a5834['query']);_0x1c52b5[_0x3417('0x3b')]=_['intersection'](_0x1c52b5[_0x3417('0x34')],_0x1c52b5[_0x3417('0x31')]);_0x1b1ff7[_0x3417('0x35')]=_[_0x3417('0x33')](_0x1c52b5[_0x3417('0x34')],qs[_0x3417('0x36')](_0x2a5834[_0x3417('0x31')][_0x3417('0x36')]));_0x1b1ff7['attributes']=_0x1b1ff7[_0x3417('0x35')][_0x3417('0x37')]?_0x1b1ff7[_0x3417('0x35')]:_0x1c52b5[_0x3417('0x34')];if(_0x2a5834[_0x3417('0x31')]['includeAll']){_0x1b1ff7[_0x3417('0x41')]=[{'all':!![]}];}_0x1b1ff7=_[_0x3417('0x3e')]({},_0x1b1ff7,_0x2a5834['options']);return db[_0x3417('0x2c')][_0x3417('0x47')](_0x1b1ff7)[_0x3417('0x24')](handleEntityNotFound(_0x19637a,null))[_0x3417('0x24')](respondWithResult(_0x19637a,null))[_0x3417('0x44')](handleError(_0x19637a,null));};exports[_0x3417('0x48')]=function(_0x1caeb4,_0x4cc4ec){return db[_0x3417('0x2c')][_0x3417('0x48')](_0x1caeb4[_0x3417('0x49')],{})[_0x3417('0x24')](respondWithResult(_0x4cc4ec,0xc9))['catch'](handleError(_0x4cc4ec,null));};exports[_0x3417('0x4a')]=function(_0x4314d6,_0x79c019){if(_0x4314d6[_0x3417('0x49')]['id']){delete _0x4314d6[_0x3417('0x49')]['id'];}return db[_0x3417('0x2c')][_0x3417('0x47')]({'where':{'id':_0x4314d6['params']['id']}})['then'](handleEntityNotFound(_0x79c019,null))[_0x3417('0x24')](saveUpdates(_0x4314d6[_0x3417('0x49')],null))[_0x3417('0x24')](respondWithResult(_0x79c019,null))['catch'](handleError(_0x79c019,null));};exports['destroy']=function(_0x3f2144,_0xb91a29){return db[_0x3417('0x2c')]['find']({'where':{'id':_0x3f2144[_0x3417('0x46')]['id']}})[_0x3417('0x24')](handleEntityNotFound(_0xb91a29,null))[_0x3417('0x24')](removeEntity(_0xb91a29,null))['catch'](handleError(_0xb91a29,null));};exports[_0x3417('0x4b')]=function(_0x3f2475,_0x518145){return db[_0x3417('0x2c')][_0x3417('0x4b')]()[_0x3417('0x24')](respondWithResult(_0x518145,null))[_0x3417('0x44')](handleError(_0x518145,null));};
\ No newline at end of file