Built motion from commit 10af8726.|2.6.34
[motion2.git] / server / api / memberReport / memberReport.controller.js
index d908483..ec4184a 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xdce0=['MemberReport','catch','show','keys','create','body','find','params','describe','html-pdf','eml-format','rimraf','zip-dir','request-promise','path','sox','lodash','squel','crypto','jsforce','desk.js','to-csv','papaparse','../../components/auth/service','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/license/util','../../mysqldb','sendStatus','status','end','json','count','offset','set','apply','save','update','then','error','name','send','index','map','rawAttributes','fieldName','type','key','model','query','filters','intersection','attributes','fields','length','hasOwnProperty','nolimit','limit','sort','where','pick','merge','VIRTUAL','filter','includeAll','include'];(function(_0x8bb4c1,_0x2d6e53){var _0x67a6e1=function(_0x1155e5){while(--_0x1155e5){_0x8bb4c1['push'](_0x8bb4c1['shift']());}};_0x67a6e1(++_0x2d6e53);}(_0xdce0,0x1e5));var _0x0dce=function(_0x317167,_0xe66b42){_0x317167=_0x317167-0x0;var _0xac3f2=_0xdce0[_0x317167];return _0xac3f2;};'use strict';var pdf=require(_0x0dce('0x0'));var emlformat=require(_0x0dce('0x1'));var rimraf=require(_0x0dce('0x2'));var zipdir=require(_0x0dce('0x3'));var jsonpatch=require('fast-json-patch');var rp=require(_0x0dce('0x4'));var moment=require('moment');var BPromise=require('bluebird');var Mustache=require('mustache');var util=require('util');var path=require(_0x0dce('0x5'));var sox=require(_0x0dce('0x6'));var csv=require('to-csv');var ejs=require('ejs');var fs=require('fs');var _=require(_0x0dce('0x7'));var squel=require(_0x0dce('0x8'));var crypto=require(_0x0dce('0x9'));var jsforce=require(_0x0dce('0xa'));var deskjs=require(_0x0dce('0xb'));var toCsv=require(_0x0dce('0xc'));var querystring=require('querystring');var Papa=require(_0x0dce('0xd'));var Redis=require('ioredis');var authService=require(_0x0dce('0xe'));var qs=require('../../components/parsers/qs');var as=require(_0x0dce('0xf'));var hardwareService=require(_0x0dce('0x10'));var logger=require(_0x0dce('0x11'))(_0x0dce('0x12'));var utils=require('../../config/utils');var config=require('../../config/environment');var licenseUtil=require(_0x0dce('0x13'));var db=require(_0x0dce('0x14'))['db'];function respondWithStatusCode(_0x3c7888,_0x212bd2){_0x212bd2=_0x212bd2||0xcc;return function(_0x1ba075){if(_0x1ba075){return _0x3c7888[_0x0dce('0x15')](_0x212bd2);}return _0x3c7888[_0x0dce('0x16')](_0x212bd2)[_0x0dce('0x17')]();};}function respondWithResult(_0x1ea822,_0x1d5e8f){_0x1d5e8f=_0x1d5e8f||0xc8;return function(_0x2e0e75){if(_0x2e0e75){return _0x1ea822['status'](_0x1d5e8f)[_0x0dce('0x18')](_0x2e0e75);}};}function respondWithFilteredResult(_0x25677a,_0x480894){return function(_0x4b3777){if(_0x4b3777){var _0x4da93c=_0x4b3777[_0x0dce('0x19')],_0x18e092=_0x480894[_0x0dce('0x1a')],_0x6c6aa6=_0x480894['offset']+_0x480894['limit'],_0x503dfc;if(_0x6c6aa6>=_0x4da93c){_0x6c6aa6=_0x4da93c;_0x503dfc=0xc8;}else{_0x503dfc=0xce;}_0x25677a[_0x0dce('0x16')](_0x503dfc);return _0x25677a[_0x0dce('0x1b')]('Content-Range',_0x18e092+'-'+_0x6c6aa6+'/'+_0x4da93c)['json'](_0x4b3777);}return null;};}function patchUpdates(_0x2d42c8){return function(_0x19c28d){try{jsonpatch[_0x0dce('0x1c')](_0x19c28d,_0x2d42c8,!![]);}catch(_0xecb0a4){return BPromise['reject'](_0xecb0a4);}return _0x19c28d[_0x0dce('0x1d')]();};}function saveUpdates(_0x4479f6,_0x55f1d6){return function(_0x11a61b){if(_0x11a61b){return _0x11a61b[_0x0dce('0x1e')](_0x4479f6)[_0x0dce('0x1f')](function(_0x16faa6){return _0x16faa6;});}return null;};}function removeEntity(_0x331194,_0x111bd0){return function(_0x144f3c){if(_0x144f3c){return _0x144f3c['destroy']()[_0x0dce('0x1f')](function(){_0x331194[_0x0dce('0x16')](0xcc)[_0x0dce('0x17')]();});}};}function handleEntityNotFound(_0x17b27c,_0xdcdb58){return function(_0x22948b){if(!_0x22948b){_0x17b27c[_0x0dce('0x15')](0x194);}return _0x22948b;};}function handleError(_0x1d5dfb,_0x4bc7f6){_0x4bc7f6=_0x4bc7f6||0x1f4;return function(_0x3b6953){logger[_0x0dce('0x20')](_0x3b6953['stack']);if(_0x3b6953['name']){delete _0x3b6953[_0x0dce('0x21')];}_0x1d5dfb['status'](_0x4bc7f6)[_0x0dce('0x22')](_0x3b6953);};}exports[_0x0dce('0x23')]=function(_0x166294,_0x5776b5){var _0x925dee={},_0x55b5a1={},_0x5a9d2b={'count':0x0,'rows':[]};var _0x436d46=_[_0x0dce('0x24')](db['MemberReport'][_0x0dce('0x25')],function(_0x1dbc73){return{'name':_0x1dbc73[_0x0dce('0x26')],'type':_0x1dbc73[_0x0dce('0x27')][_0x0dce('0x28')]};});_0x55b5a1[_0x0dce('0x29')]=_[_0x0dce('0x24')](_0x436d46,'name');_0x55b5a1['query']=_['keys'](_0x166294[_0x0dce('0x2a')]);_0x55b5a1[_0x0dce('0x2b')]=_[_0x0dce('0x2c')](_0x55b5a1['model'],_0x55b5a1['query']);_0x925dee[_0x0dce('0x2d')]=_[_0x0dce('0x2c')](_0x55b5a1[_0x0dce('0x29')],qs[_0x0dce('0x2e')](_0x166294[_0x0dce('0x2a')][_0x0dce('0x2e')]));_0x925dee[_0x0dce('0x2d')]=_0x925dee[_0x0dce('0x2d')][_0x0dce('0x2f')]?_0x925dee[_0x0dce('0x2d')]:_0x55b5a1[_0x0dce('0x29')];if(!_0x166294[_0x0dce('0x2a')][_0x0dce('0x30')](_0x0dce('0x31'))){_0x925dee[_0x0dce('0x32')]=qs[_0x0dce('0x32')](_0x166294[_0x0dce('0x2a')][_0x0dce('0x32')]);_0x925dee['offset']=qs[_0x0dce('0x1a')](_0x166294[_0x0dce('0x2a')][_0x0dce('0x1a')]);}_0x925dee['order']=qs[_0x0dce('0x33')](_0x166294[_0x0dce('0x2a')]['sort']);_0x925dee[_0x0dce('0x34')]=qs[_0x0dce('0x2b')](_[_0x0dce('0x35')](_0x166294['query'],_0x55b5a1['filters']),_0x436d46);if(_0x166294[_0x0dce('0x2a')]['filter']){_0x925dee[_0x0dce('0x34')]=_[_0x0dce('0x36')](_0x925dee[_0x0dce('0x34')],{'$or':_[_0x0dce('0x24')](_0x436d46,function(_0x47840d){if(_0x47840d[_0x0dce('0x27')]!==_0x0dce('0x37')){var _0x15e5b9={};_0x15e5b9[_0x47840d[_0x0dce('0x21')]]={'$like':'%'+_0x166294[_0x0dce('0x2a')][_0x0dce('0x38')]+'%'};return _0x15e5b9;}})});}_0x925dee=_[_0x0dce('0x36')]({},_0x925dee,_0x166294['options']);var _0x2293df={'where':_0x925dee[_0x0dce('0x34')]};return db['MemberReport'][_0x0dce('0x19')](_0x2293df)[_0x0dce('0x1f')](function(_0x36538f){_0x5a9d2b['count']=_0x36538f;if(_0x166294[_0x0dce('0x2a')][_0x0dce('0x39')]){_0x925dee[_0x0dce('0x3a')]=[{'all':!![]}];}return db[_0x0dce('0x3b')]['findAll'](_0x925dee);})['then'](function(_0x5c9111){_0x5a9d2b['rows']=_0x5c9111;return _0x5a9d2b;})[_0x0dce('0x1f')](respondWithFilteredResult(_0x5776b5,_0x925dee))[_0x0dce('0x3c')](handleError(_0x5776b5,null));};exports[_0x0dce('0x3d')]=function(_0x263b8c,_0x4ca086){var _0xf66c72={'raw':!![],'where':{'id':_0x263b8c['params']['id']}},_0x2f7ada={};_0x2f7ada[_0x0dce('0x29')]=_[_0x0dce('0x3e')](db[_0x0dce('0x3b')]['rawAttributes']);_0x2f7ada[_0x0dce('0x2a')]=_[_0x0dce('0x3e')](_0x263b8c[_0x0dce('0x2a')]);_0x2f7ada[_0x0dce('0x2b')]=_[_0x0dce('0x2c')](_0x2f7ada[_0x0dce('0x29')],_0x2f7ada[_0x0dce('0x2a')]);_0xf66c72[_0x0dce('0x2d')]=_[_0x0dce('0x2c')](_0x2f7ada[_0x0dce('0x29')],qs[_0x0dce('0x2e')](_0x263b8c[_0x0dce('0x2a')]['fields']));_0xf66c72[_0x0dce('0x2d')]=_0xf66c72[_0x0dce('0x2d')]['length']?_0xf66c72['attributes']:_0x2f7ada[_0x0dce('0x29')];if(_0x263b8c['query'][_0x0dce('0x39')]){_0xf66c72['include']=[{'all':!![]}];}_0xf66c72=_[_0x0dce('0x36')]({},_0xf66c72,_0x263b8c['options']);return db[_0x0dce('0x3b')]['find'](_0xf66c72)[_0x0dce('0x1f')](handleEntityNotFound(_0x4ca086,null))[_0x0dce('0x1f')](respondWithResult(_0x4ca086,null))[_0x0dce('0x3c')](handleError(_0x4ca086,null));};exports[_0x0dce('0x3f')]=function(_0x15b5d4,_0x58e198){return db[_0x0dce('0x3b')][_0x0dce('0x3f')](_0x15b5d4[_0x0dce('0x40')],{})['then'](respondWithResult(_0x58e198,0xc9))[_0x0dce('0x3c')](handleError(_0x58e198,null));};exports[_0x0dce('0x1e')]=function(_0x4d2b30,_0x57897f){if(_0x4d2b30['body']['id']){delete _0x4d2b30['body']['id'];}return db[_0x0dce('0x3b')][_0x0dce('0x41')]({'where':{'id':_0x4d2b30[_0x0dce('0x42')]['id']}})[_0x0dce('0x1f')](handleEntityNotFound(_0x57897f,null))[_0x0dce('0x1f')](saveUpdates(_0x4d2b30[_0x0dce('0x40')],null))[_0x0dce('0x1f')](respondWithResult(_0x57897f,null))[_0x0dce('0x3c')](handleError(_0x57897f,null));};exports['destroy']=function(_0x58491a,_0x57decd){return db[_0x0dce('0x3b')]['find']({'where':{'id':_0x58491a[_0x0dce('0x42')]['id']}})[_0x0dce('0x1f')](handleEntityNotFound(_0x57decd,null))[_0x0dce('0x1f')](removeEntity(_0x57decd,null))['catch'](handleError(_0x57decd,null));};exports[_0x0dce('0x43')]=function(_0xe89e5a,_0x46a377){return db[_0x0dce('0x3b')][_0x0dce('0x43')]()[_0x0dce('0x1f')](respondWithResult(_0x46a377,null))['catch'](handleError(_0x46a377,null));};
\ No newline at end of file
+var _0x3e74=['show','params','options','find','catch','create','body','describe','eml-format','zip-dir','fast-json-patch','request-promise','mustache','path','sox','to-csv','ejs','fs-extra','squel','crypto','jsforce','desk.js','papaparse','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/logger','../../config/utils','../../config/environment','../../mysqldb','end','json','undefined','limit','offset','count','status','set','Content-Range','apply','save','update','then','destroy','sendStatus','name','send','index','map','MemberReport','rawAttributes','fieldName','type','key','model','keys','query','filters','intersection','attributes','fields','length','hasOwnProperty','order','sort','where','pick','filter','merge','VIRTUAL','includeAll','include','findAll','rows'];(function(_0x4bc95e,_0x1b645a){var _0x4c3419=function(_0x48f367){while(--_0x48f367){_0x4bc95e['push'](_0x4bc95e['shift']());}};_0x4c3419(++_0x1b645a);}(_0x3e74,0x175));var _0x43e7=function(_0x4bfaaa,_0x3d1489){_0x4bfaaa=_0x4bfaaa-0x0;var _0x37e186=_0x3e74[_0x4bfaaa];return _0x37e186;};'use strict';var emlformat=require(_0x43e7('0x0'));var rimraf=require('rimraf');var zipdir=require(_0x43e7('0x1'));var jsonpatch=require(_0x43e7('0x2'));var rp=require(_0x43e7('0x3'));var moment=require('moment');var BPromise=require('bluebird');var Mustache=require(_0x43e7('0x4'));var util=require('util');var path=require(_0x43e7('0x5'));var sox=require(_0x43e7('0x6'));var csv=require(_0x43e7('0x7'));var ejs=require(_0x43e7('0x8'));var fs=require('fs');var fs_extra=require(_0x43e7('0x9'));var _=require('lodash');var squel=require(_0x43e7('0xa'));var crypto=require(_0x43e7('0xb'));var jsforce=require(_0x43e7('0xc'));var deskjs=require(_0x43e7('0xd'));var toCsv=require(_0x43e7('0x7'));var querystring=require('querystring');var Papa=require(_0x43e7('0xe'));var Redis=require('ioredis');var authService=require('../../components/auth/service');var qs=require(_0x43e7('0xf'));var as=require(_0x43e7('0x10'));var hardwareService=require('../../config/license/hardware');var logger=require(_0x43e7('0x11'))('api');var utils=require(_0x43e7('0x12'));var config=require(_0x43e7('0x13'));var licenseUtil=require('../../config/license/util');var db=require(_0x43e7('0x14'))['db'];function respondWithStatusCode(_0xc960ea,_0x2718d3){_0x2718d3=_0x2718d3||0xcc;return function(_0x3bb83f){if(_0x3bb83f){return _0xc960ea['sendStatus'](_0x2718d3);}return _0xc960ea['status'](_0x2718d3)[_0x43e7('0x15')]();};}function respondWithResult(_0x21fdd3,_0x44b0bd){_0x44b0bd=_0x44b0bd||0xc8;return function(_0x51b974){if(_0x51b974){return _0x21fdd3['status'](_0x44b0bd)[_0x43e7('0x16')](_0x51b974);}};}function respondWithFilteredResult(_0x14c146,_0x203378){return function(_0x328445){if(_0x328445){var _0x4de324=typeof _0x203378['offset']===_0x43e7('0x17')&&typeof _0x203378[_0x43e7('0x18')]===_0x43e7('0x17');var _0x5d346f=_0x328445['count'];var _0x446986=_0x4de324?0x0:_0x203378[_0x43e7('0x19')];var _0x9037d3=_0x4de324?_0x328445[_0x43e7('0x1a')]:_0x203378[_0x43e7('0x19')]+_0x203378[_0x43e7('0x18')];var _0x619236;if(_0x9037d3>=_0x5d346f){_0x9037d3=_0x5d346f;_0x619236=0xc8;}else{_0x619236=0xce;}_0x14c146[_0x43e7('0x1b')](_0x619236);return _0x14c146[_0x43e7('0x1c')](_0x43e7('0x1d'),_0x446986+'-'+_0x9037d3+'/'+_0x5d346f)[_0x43e7('0x16')](_0x328445);}return null;};}function patchUpdates(_0x177ee1){return function(_0x4b5d64){try{jsonpatch[_0x43e7('0x1e')](_0x4b5d64,_0x177ee1,!![]);}catch(_0x3c6625){return BPromise['reject'](_0x3c6625);}return _0x4b5d64[_0x43e7('0x1f')]();};}function saveUpdates(_0x3e281e,_0x3945bb){return function(_0x28aacc){if(_0x28aacc){return _0x28aacc[_0x43e7('0x20')](_0x3e281e)[_0x43e7('0x21')](function(_0x54a9e7){return _0x54a9e7;});}return null;};}function removeEntity(_0x454359,_0x4eea52){return function(_0x4c9df3){if(_0x4c9df3){return _0x4c9df3[_0x43e7('0x22')]()[_0x43e7('0x21')](function(){_0x454359['status'](0xcc)[_0x43e7('0x15')]();});}};}function handleEntityNotFound(_0x4ca5cf,_0x326dab){return function(_0x5c5e67){if(!_0x5c5e67){_0x4ca5cf[_0x43e7('0x23')](0x194);}return _0x5c5e67;};}function handleError(_0x1b5f50,_0x20888b){_0x20888b=_0x20888b||0x1f4;return function(_0x405f85){logger['error'](_0x405f85['stack']);if(_0x405f85[_0x43e7('0x24')]){delete _0x405f85['name'];}_0x1b5f50[_0x43e7('0x1b')](_0x20888b)[_0x43e7('0x25')](_0x405f85);};}exports[_0x43e7('0x26')]=function(_0xb1fc63,_0x5087d7){var _0x33a1a5={},_0x4690a6={},_0x45b675={'count':0x0,'rows':[]};var _0x50f9f5=_[_0x43e7('0x27')](db[_0x43e7('0x28')][_0x43e7('0x29')],function(_0x31b2a6){return{'name':_0x31b2a6[_0x43e7('0x2a')],'type':_0x31b2a6[_0x43e7('0x2b')][_0x43e7('0x2c')]};});_0x4690a6[_0x43e7('0x2d')]=_[_0x43e7('0x27')](_0x50f9f5,_0x43e7('0x24'));_0x4690a6['query']=_[_0x43e7('0x2e')](_0xb1fc63[_0x43e7('0x2f')]);_0x4690a6[_0x43e7('0x30')]=_[_0x43e7('0x31')](_0x4690a6[_0x43e7('0x2d')],_0x4690a6['query']);_0x33a1a5[_0x43e7('0x32')]=_[_0x43e7('0x31')](_0x4690a6[_0x43e7('0x2d')],qs[_0x43e7('0x33')](_0xb1fc63['query']['fields']));_0x33a1a5['attributes']=_0x33a1a5[_0x43e7('0x32')][_0x43e7('0x34')]?_0x33a1a5[_0x43e7('0x32')]:_0x4690a6[_0x43e7('0x2d')];if(!_0xb1fc63[_0x43e7('0x2f')][_0x43e7('0x35')]('nolimit')){_0x33a1a5['limit']=qs['limit'](_0xb1fc63['query']['limit']);_0x33a1a5['offset']=qs['offset'](_0xb1fc63[_0x43e7('0x2f')]['offset']);}_0x33a1a5[_0x43e7('0x36')]=qs[_0x43e7('0x37')](_0xb1fc63[_0x43e7('0x2f')][_0x43e7('0x37')]);_0x33a1a5[_0x43e7('0x38')]=qs[_0x43e7('0x30')](_[_0x43e7('0x39')](_0xb1fc63['query'],_0x4690a6['filters']),_0x50f9f5);if(_0xb1fc63['query'][_0x43e7('0x3a')]){_0x33a1a5[_0x43e7('0x38')]=_[_0x43e7('0x3b')](_0x33a1a5[_0x43e7('0x38')],{'$or':_[_0x43e7('0x27')](_0x50f9f5,function(_0x1ed538){if(_0x1ed538[_0x43e7('0x2b')]!==_0x43e7('0x3c')){var _0x55c798={};_0x55c798[_0x1ed538[_0x43e7('0x24')]]={'$like':'%'+_0xb1fc63[_0x43e7('0x2f')]['filter']+'%'};return _0x55c798;}})});}_0x33a1a5=_[_0x43e7('0x3b')]({},_0x33a1a5,_0xb1fc63['options']);var _0x44d8e4={'where':_0x33a1a5[_0x43e7('0x38')]};return db[_0x43e7('0x28')][_0x43e7('0x1a')](_0x44d8e4)[_0x43e7('0x21')](function(_0x234d8f){_0x45b675['count']=_0x234d8f;if(_0xb1fc63['query'][_0x43e7('0x3d')]){_0x33a1a5[_0x43e7('0x3e')]=[{'all':!![]}];}return db[_0x43e7('0x28')][_0x43e7('0x3f')](_0x33a1a5);})[_0x43e7('0x21')](function(_0x4a4a85){_0x45b675[_0x43e7('0x40')]=_0x4a4a85;return _0x45b675;})[_0x43e7('0x21')](respondWithFilteredResult(_0x5087d7,_0x33a1a5))['catch'](handleError(_0x5087d7,null));};exports[_0x43e7('0x41')]=function(_0x51a69c,_0x2ad8ef){var _0x504101={'raw':!![],'where':{'id':_0x51a69c[_0x43e7('0x42')]['id']}},_0x3d81ae={};_0x3d81ae[_0x43e7('0x2d')]=_[_0x43e7('0x2e')](db['MemberReport']['rawAttributes']);_0x3d81ae[_0x43e7('0x2f')]=_[_0x43e7('0x2e')](_0x51a69c[_0x43e7('0x2f')]);_0x3d81ae[_0x43e7('0x30')]=_['intersection'](_0x3d81ae['model'],_0x3d81ae['query']);_0x504101[_0x43e7('0x32')]=_['intersection'](_0x3d81ae[_0x43e7('0x2d')],qs['fields'](_0x51a69c['query'][_0x43e7('0x33')]));_0x504101['attributes']=_0x504101[_0x43e7('0x32')][_0x43e7('0x34')]?_0x504101[_0x43e7('0x32')]:_0x3d81ae[_0x43e7('0x2d')];if(_0x51a69c['query'][_0x43e7('0x3d')]){_0x504101[_0x43e7('0x3e')]=[{'all':!![]}];}_0x504101=_[_0x43e7('0x3b')]({},_0x504101,_0x51a69c[_0x43e7('0x43')]);return db[_0x43e7('0x28')][_0x43e7('0x44')](_0x504101)['then'](handleEntityNotFound(_0x2ad8ef,null))['then'](respondWithResult(_0x2ad8ef,null))[_0x43e7('0x45')](handleError(_0x2ad8ef,null));};exports[_0x43e7('0x46')]=function(_0x212841,_0x4c00a8){return db['MemberReport']['create'](_0x212841[_0x43e7('0x47')],{})[_0x43e7('0x21')](respondWithResult(_0x4c00a8,0xc9))['catch'](handleError(_0x4c00a8,null));};exports[_0x43e7('0x20')]=function(_0x47686e,_0x3c96fe){if(_0x47686e['body']['id']){delete _0x47686e['body']['id'];}return db['MemberReport']['find']({'where':{'id':_0x47686e[_0x43e7('0x42')]['id']}})[_0x43e7('0x21')](handleEntityNotFound(_0x3c96fe,null))['then'](saveUpdates(_0x47686e[_0x43e7('0x47')],null))[_0x43e7('0x21')](respondWithResult(_0x3c96fe,null))[_0x43e7('0x45')](handleError(_0x3c96fe,null));};exports[_0x43e7('0x22')]=function(_0x4a0ce5,_0x2718d5){return db['MemberReport']['find']({'where':{'id':_0x4a0ce5[_0x43e7('0x42')]['id']}})[_0x43e7('0x21')](handleEntityNotFound(_0x2718d5,null))[_0x43e7('0x21')](removeEntity(_0x2718d5,null))[_0x43e7('0x45')](handleError(_0x2718d5,null));};exports[_0x43e7('0x48')]=function(_0x2351cf,_0x1cd87c){return db[_0x43e7('0x28')][_0x43e7('0x48')]()[_0x43e7('0x21')](respondWithResult(_0x1cd87c,null))['catch'](handleError(_0x1cd87c,null));};
\ No newline at end of file