Built motion from commit 092f8824.|2.5.49
[motion2.git] / server / api / cmHopperHistory / cmHopperHistory.controller.js
index e659b92..ae7326b 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0x08b3=['../../components/parsers/advancedSearch','api','../../config/environment','../../config/license/util','sendStatus','status','offset','undefined','limit','count','Content-Range','json','apply','reject','save','update','then','destroy','end','error','stack','index','map','CmHopperHistory','rawAttributes','fieldName','type','model','name','query','keys','filters','intersection','attributes','fields','hasOwnProperty','nolimit','order','sort','where','pick','filter','VIRTUAL','merge','include','findAll','show','params','find','create','catch','describe','body','uniqueid','eml-format','rimraf','zip-dir','fast-json-patch','moment','bluebird','mustache','util','to-csv','ejs','fs-extra','lodash','squel','crypto','jsforce','papaparse','ioredis','../../components/auth/service','../../components/parsers/qs'];(function(_0x3b4c33,_0x363e9c){var _0x37731c=function(_0x35720b){while(--_0x35720b){_0x3b4c33['push'](_0x3b4c33['shift']());}};_0x37731c(++_0x363e9c);}(_0x08b3,0x111));var _0x308b=function(_0x2ba352,_0x119b39){_0x2ba352=_0x2ba352-0x0;var _0x403139=_0x08b3[_0x2ba352];return _0x403139;};'use strict';var emlformat=require(_0x308b('0x0'));var rimraf=require(_0x308b('0x1'));var zipdir=require(_0x308b('0x2'));var jsonpatch=require(_0x308b('0x3'));var rp=require('request-promise');var moment=require(_0x308b('0x4'));var BPromise=require(_0x308b('0x5'));var Mustache=require(_0x308b('0x6'));var util=require(_0x308b('0x7'));var path=require('path');var sox=require('sox');var csv=require(_0x308b('0x8'));var ejs=require(_0x308b('0x9'));var fs=require('fs');var fs_extra=require(_0x308b('0xa'));var _=require(_0x308b('0xb'));var squel=require(_0x308b('0xc'));var crypto=require(_0x308b('0xd'));var jsforce=require(_0x308b('0xe'));var deskjs=require('desk.js');var toCsv=require('to-csv');var querystring=require('querystring');var Papa=require(_0x308b('0xf'));var Redis=require(_0x308b('0x10'));var authService=require(_0x308b('0x11'));var qs=require(_0x308b('0x12'));var as=require(_0x308b('0x13'));var hardwareService=require('../../config/license/hardware');var logger=require('../../config/logger')(_0x308b('0x14'));var utils=require('../../config/utils');var config=require(_0x308b('0x15'));var licenseUtil=require(_0x308b('0x16'));var db=require('../../mysqldb')['db'];function respondWithStatusCode(_0x41fde2,_0x1c6d92){_0x1c6d92=_0x1c6d92||0xcc;return function(_0x192866){if(_0x192866){return _0x41fde2[_0x308b('0x17')](_0x1c6d92);}return _0x41fde2[_0x308b('0x18')](_0x1c6d92)['end']();};}function respondWithResult(_0x37e0dc,_0x535469){_0x535469=_0x535469||0xc8;return function(_0x42d96f){if(_0x42d96f){return _0x37e0dc['status'](_0x535469)['json'](_0x42d96f);}};}function respondWithFilteredResult(_0x2166db,_0x2de9e6){return function(_0x1136d7){if(_0x1136d7){var _0xf217bd=typeof _0x2de9e6[_0x308b('0x19')]===_0x308b('0x1a')&&typeof _0x2de9e6[_0x308b('0x1b')]===_0x308b('0x1a');var _0x2bae9e=_0x1136d7[_0x308b('0x1c')];var _0x44d310=_0xf217bd?0x0:_0x2de9e6[_0x308b('0x19')];var _0x521e37=_0xf217bd?_0x1136d7[_0x308b('0x1c')]:_0x2de9e6['offset']+_0x2de9e6[_0x308b('0x1b')];var _0xd9fee4;if(_0x521e37>=_0x2bae9e){_0x521e37=_0x2bae9e;_0xd9fee4=0xc8;}else{_0xd9fee4=0xce;}_0x2166db['status'](_0xd9fee4);return _0x2166db['set'](_0x308b('0x1d'),_0x44d310+'-'+_0x521e37+'/'+_0x2bae9e)[_0x308b('0x1e')](_0x1136d7);}return null;};}function patchUpdates(_0x3b7239){return function(_0x2d3813){try{jsonpatch[_0x308b('0x1f')](_0x2d3813,_0x3b7239,!![]);}catch(_0x31e5e3){return BPromise[_0x308b('0x20')](_0x31e5e3);}return _0x2d3813[_0x308b('0x21')]();};}function saveUpdates(_0x3bc430,_0x56a741){return function(_0x22d3bf){if(_0x22d3bf){return _0x22d3bf[_0x308b('0x22')](_0x3bc430)[_0x308b('0x23')](function(_0x36d30){return _0x36d30;});}return null;};}function removeEntity(_0x3d4fb9,_0x37e328){return function(_0x13ba52){if(_0x13ba52){return _0x13ba52[_0x308b('0x24')]()[_0x308b('0x23')](function(){_0x3d4fb9[_0x308b('0x18')](0xcc)[_0x308b('0x25')]();});}};}function handleEntityNotFound(_0x4123cb,_0x56268d){return function(_0xb4f280){if(!_0xb4f280){_0x4123cb[_0x308b('0x17')](0x194);}return _0xb4f280;};}function handleError(_0x160ddd,_0x5ae2b1){_0x5ae2b1=_0x5ae2b1||0x1f4;return function(_0x382564){logger[_0x308b('0x26')](_0x382564[_0x308b('0x27')]);if(_0x382564['name']){delete _0x382564['name'];}_0x160ddd[_0x308b('0x18')](_0x5ae2b1)['send'](_0x382564);};}exports[_0x308b('0x28')]=function(_0x4b760d,_0x128251){var _0x1b8143={},_0x424573={},_0x41e939={'count':0x0,'rows':[]};var _0x36274e=_[_0x308b('0x29')](db[_0x308b('0x2a')][_0x308b('0x2b')],function(_0x41339a){return{'name':_0x41339a[_0x308b('0x2c')],'type':_0x41339a[_0x308b('0x2d')]['key']};});_0x424573[_0x308b('0x2e')]=_[_0x308b('0x29')](_0x36274e,_0x308b('0x2f'));_0x424573[_0x308b('0x30')]=_[_0x308b('0x31')](_0x4b760d[_0x308b('0x30')]);_0x424573[_0x308b('0x32')]=_[_0x308b('0x33')](_0x424573[_0x308b('0x2e')],_0x424573['query']);_0x1b8143[_0x308b('0x34')]=_[_0x308b('0x33')](_0x424573[_0x308b('0x2e')],qs[_0x308b('0x35')](_0x4b760d[_0x308b('0x30')]['fields']));_0x1b8143['attributes']=_0x1b8143['attributes']['length']?_0x1b8143[_0x308b('0x34')]:_0x424573[_0x308b('0x2e')];if(!_0x4b760d[_0x308b('0x30')][_0x308b('0x36')](_0x308b('0x37'))){_0x1b8143[_0x308b('0x1b')]=qs[_0x308b('0x1b')](_0x4b760d[_0x308b('0x30')]['limit']);_0x1b8143[_0x308b('0x19')]=qs['offset'](_0x4b760d[_0x308b('0x30')][_0x308b('0x19')]);}_0x1b8143[_0x308b('0x38')]=qs[_0x308b('0x39')](_0x4b760d[_0x308b('0x30')][_0x308b('0x39')]);_0x1b8143[_0x308b('0x3a')]=qs[_0x308b('0x32')](_[_0x308b('0x3b')](_0x4b760d['query'],_0x424573[_0x308b('0x32')]),_0x36274e);if(_0x4b760d[_0x308b('0x30')][_0x308b('0x3c')]){_0x1b8143[_0x308b('0x3a')]=_['merge'](_0x1b8143[_0x308b('0x3a')],{'$or':_[_0x308b('0x29')](_0x36274e,function(_0x55e0e6){if(_0x55e0e6['type']!==_0x308b('0x3d')){var _0x587796={};_0x587796[_0x55e0e6[_0x308b('0x2f')]]={'$like':'%'+_0x4b760d[_0x308b('0x30')]['filter']+'%'};return _0x587796;}})});}_0x1b8143=_[_0x308b('0x3e')]({},_0x1b8143,_0x4b760d['options']);var _0x35c022={'where':_0x1b8143['where']};return db[_0x308b('0x2a')]['count'](_0x35c022)[_0x308b('0x23')](function(_0x238b27){_0x41e939[_0x308b('0x1c')]=_0x238b27;if(_0x4b760d[_0x308b('0x30')]['includeAll']){_0x1b8143[_0x308b('0x3f')]=[{'all':!![]}];}return db[_0x308b('0x2a')][_0x308b('0x40')](_0x1b8143);})[_0x308b('0x23')](function(_0x6ba805){_0x41e939['rows']=_0x6ba805;return _0x41e939;})[_0x308b('0x23')](respondWithFilteredResult(_0x128251,_0x1b8143))['catch'](handleError(_0x128251,null));};exports[_0x308b('0x41')]=function(_0x238aa8,_0x18a46f){var _0x18b43a={'raw':!![],'where':{'id':_0x238aa8[_0x308b('0x42')]['id']}},_0x161b51={};_0x161b51[_0x308b('0x2e')]=_['keys'](db[_0x308b('0x2a')][_0x308b('0x2b')]);_0x161b51['query']=_[_0x308b('0x31')](_0x238aa8['query']);_0x161b51[_0x308b('0x32')]=_[_0x308b('0x33')](_0x161b51[_0x308b('0x2e')],_0x161b51[_0x308b('0x30')]);_0x18b43a['attributes']=_[_0x308b('0x33')](_0x161b51[_0x308b('0x2e')],qs[_0x308b('0x35')](_0x238aa8[_0x308b('0x30')][_0x308b('0x35')]));_0x18b43a[_0x308b('0x34')]=_0x18b43a[_0x308b('0x34')]['length']?_0x18b43a[_0x308b('0x34')]:_0x161b51['model'];if(_0x238aa8['query']['includeAll']){_0x18b43a[_0x308b('0x3f')]=[{'all':!![]}];}_0x18b43a=_[_0x308b('0x3e')]({},_0x18b43a,_0x238aa8['options']);return db[_0x308b('0x2a')][_0x308b('0x43')](_0x18b43a)[_0x308b('0x23')](handleEntityNotFound(_0x18a46f,null))[_0x308b('0x23')](respondWithResult(_0x18a46f,null))['catch'](handleError(_0x18a46f,null));};exports[_0x308b('0x44')]=function(_0x9055d1,_0x58223f){return db[_0x308b('0x2a')][_0x308b('0x44')](_0x9055d1['body'],{})[_0x308b('0x23')](respondWithResult(_0x58223f,0xc9))[_0x308b('0x45')](handleError(_0x58223f,null));};exports[_0x308b('0x46')]=function(_0x2bd121,_0x4e6f1d){return db[_0x308b('0x2a')][_0x308b('0x46')]()['then'](respondWithResult(_0x4e6f1d,null))[_0x308b('0x45')](handleError(_0x4e6f1d,null));};exports[_0x308b('0x22')]=function(_0x4f4e15,_0x374fca){if(_0x4f4e15[_0x308b('0x47')][_0x308b('0x48')]){delete _0x4f4e15['body'][_0x308b('0x48')];}return db[_0x308b('0x2a')][_0x308b('0x43')]({'where':{'uniqueid':_0x4f4e15[_0x308b('0x42')]['id']}})['then'](handleEntityNotFound(_0x374fca,null))[_0x308b('0x23')](saveUpdates(_0x4f4e15[_0x308b('0x47')],null))[_0x308b('0x23')](respondWithResult(_0x374fca,null))[_0x308b('0x45')](handleError(_0x374fca,null));};
\ No newline at end of file
+var _0xb1cc=['bluebird','util','path','sox','ejs','fs-extra','lodash','squel','jsforce','querystring','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/utils','../../config/environment','../../mysqldb','sendStatus','status','end','json','undefined','offset','count','limit','set','Content-Range','reject','save','update','then','destroy','error','stack','name','send','index','map','CmHopperHistory','rawAttributes','fieldName','type','key','model','keys','query','intersection','fields','attributes','length','hasOwnProperty','order','sort','where','pick','merge','VIRTUAL','filter','includeAll','findAll','rows','catch','show','params','options','find','create','body','describe','uniqueid','eml-format','rimraf','fast-json-patch','request-promise','moment'];(function(_0x2cea2d,_0x4e7846){var _0x160369=function(_0x234d95){while(--_0x234d95){_0x2cea2d['push'](_0x2cea2d['shift']());}};_0x160369(++_0x4e7846);}(_0xb1cc,0x97));var _0xcb1c=function(_0x3c2a69,_0x4c8b41){_0x3c2a69=_0x3c2a69-0x0;var _0x596bc8=_0xb1cc[_0x3c2a69];return _0x596bc8;};'use strict';var emlformat=require(_0xcb1c('0x0'));var rimraf=require(_0xcb1c('0x1'));var zipdir=require('zip-dir');var jsonpatch=require(_0xcb1c('0x2'));var rp=require(_0xcb1c('0x3'));var moment=require(_0xcb1c('0x4'));var BPromise=require(_0xcb1c('0x5'));var Mustache=require('mustache');var util=require(_0xcb1c('0x6'));var path=require(_0xcb1c('0x7'));var sox=require(_0xcb1c('0x8'));var csv=require('to-csv');var ejs=require(_0xcb1c('0x9'));var fs=require('fs');var fs_extra=require(_0xcb1c('0xa'));var _=require(_0xcb1c('0xb'));var squel=require(_0xcb1c('0xc'));var crypto=require('crypto');var jsforce=require(_0xcb1c('0xd'));var deskjs=require('desk.js');var toCsv=require('to-csv');var querystring=require(_0xcb1c('0xe'));var Papa=require('papaparse');var Redis=require(_0xcb1c('0xf'));var authService=require(_0xcb1c('0x10'));var qs=require(_0xcb1c('0x11'));var as=require(_0xcb1c('0x12'));var hardwareService=require(_0xcb1c('0x13'));var logger=require(_0xcb1c('0x14'))(_0xcb1c('0x15'));var utils=require(_0xcb1c('0x16'));var config=require(_0xcb1c('0x17'));var licenseUtil=require('../../config/license/util');var db=require(_0xcb1c('0x18'))['db'];function respondWithStatusCode(_0x2064d1,_0x33bef4){_0x33bef4=_0x33bef4||0xcc;return function(_0x309a0f){if(_0x309a0f){return _0x2064d1[_0xcb1c('0x19')](_0x33bef4);}return _0x2064d1[_0xcb1c('0x1a')](_0x33bef4)[_0xcb1c('0x1b')]();};}function respondWithResult(_0x505c30,_0x21ac7e){_0x21ac7e=_0x21ac7e||0xc8;return function(_0x2df70a){if(_0x2df70a){return _0x505c30[_0xcb1c('0x1a')](_0x21ac7e)[_0xcb1c('0x1c')](_0x2df70a);}};}function respondWithFilteredResult(_0x1325dd,_0x1fb452){return function(_0x2015ad){if(_0x2015ad){var _0x5c1c6d=typeof _0x1fb452['offset']==='undefined'&&typeof _0x1fb452['limit']===_0xcb1c('0x1d');var _0x1f59bf=_0x2015ad['count'];var _0x21b8d5=_0x5c1c6d?0x0:_0x1fb452[_0xcb1c('0x1e')];var _0x479ae6=_0x5c1c6d?_0x2015ad[_0xcb1c('0x1f')]:_0x1fb452[_0xcb1c('0x1e')]+_0x1fb452[_0xcb1c('0x20')];var _0x55bd03;if(_0x479ae6>=_0x1f59bf){_0x479ae6=_0x1f59bf;_0x55bd03=0xc8;}else{_0x55bd03=0xce;}_0x1325dd[_0xcb1c('0x1a')](_0x55bd03);return _0x1325dd[_0xcb1c('0x21')](_0xcb1c('0x22'),_0x21b8d5+'-'+_0x479ae6+'/'+_0x1f59bf)[_0xcb1c('0x1c')](_0x2015ad);}return null;};}function patchUpdates(_0x5811b3){return function(_0x44d184){try{jsonpatch['apply'](_0x44d184,_0x5811b3,!![]);}catch(_0x1b9422){return BPromise[_0xcb1c('0x23')](_0x1b9422);}return _0x44d184[_0xcb1c('0x24')]();};}function saveUpdates(_0x213656,_0x11ae80){return function(_0x3aed25){if(_0x3aed25){return _0x3aed25[_0xcb1c('0x25')](_0x213656)[_0xcb1c('0x26')](function(_0x4bc1d5){return _0x4bc1d5;});}return null;};}function removeEntity(_0x5ee427,_0x9927c){return function(_0x4df4eb){if(_0x4df4eb){return _0x4df4eb[_0xcb1c('0x27')]()[_0xcb1c('0x26')](function(){_0x5ee427[_0xcb1c('0x1a')](0xcc)[_0xcb1c('0x1b')]();});}};}function handleEntityNotFound(_0x3a4d8f,_0x501e49){return function(_0x41891f){if(!_0x41891f){_0x3a4d8f[_0xcb1c('0x19')](0x194);}return _0x41891f;};}function handleError(_0x440420,_0x15f503){_0x15f503=_0x15f503||0x1f4;return function(_0x270243){logger[_0xcb1c('0x28')](_0x270243[_0xcb1c('0x29')]);if(_0x270243[_0xcb1c('0x2a')]){delete _0x270243['name'];}_0x440420[_0xcb1c('0x1a')](_0x15f503)[_0xcb1c('0x2b')](_0x270243);};}exports[_0xcb1c('0x2c')]=function(_0x146f5f,_0x53cf12){var _0x407839={},_0x27c87b={},_0x3859b6={'count':0x0,'rows':[]};var _0x36a720=_[_0xcb1c('0x2d')](db[_0xcb1c('0x2e')][_0xcb1c('0x2f')],function(_0x5bbb5b){return{'name':_0x5bbb5b[_0xcb1c('0x30')],'type':_0x5bbb5b[_0xcb1c('0x31')][_0xcb1c('0x32')]};});_0x27c87b[_0xcb1c('0x33')]=_[_0xcb1c('0x2d')](_0x36a720,_0xcb1c('0x2a'));_0x27c87b['query']=_[_0xcb1c('0x34')](_0x146f5f[_0xcb1c('0x35')]);_0x27c87b['filters']=_[_0xcb1c('0x36')](_0x27c87b[_0xcb1c('0x33')],_0x27c87b['query']);_0x407839['attributes']=_[_0xcb1c('0x36')](_0x27c87b[_0xcb1c('0x33')],qs['fields'](_0x146f5f[_0xcb1c('0x35')][_0xcb1c('0x37')]));_0x407839[_0xcb1c('0x38')]=_0x407839[_0xcb1c('0x38')][_0xcb1c('0x39')]?_0x407839['attributes']:_0x27c87b['model'];if(!_0x146f5f[_0xcb1c('0x35')][_0xcb1c('0x3a')]('nolimit')){_0x407839['limit']=qs[_0xcb1c('0x20')](_0x146f5f[_0xcb1c('0x35')][_0xcb1c('0x20')]);_0x407839[_0xcb1c('0x1e')]=qs[_0xcb1c('0x1e')](_0x146f5f['query'][_0xcb1c('0x1e')]);}_0x407839[_0xcb1c('0x3b')]=qs['sort'](_0x146f5f[_0xcb1c('0x35')][_0xcb1c('0x3c')]);_0x407839[_0xcb1c('0x3d')]=qs['filters'](_[_0xcb1c('0x3e')](_0x146f5f[_0xcb1c('0x35')],_0x27c87b['filters']),_0x36a720);if(_0x146f5f[_0xcb1c('0x35')]['filter']){_0x407839[_0xcb1c('0x3d')]=_[_0xcb1c('0x3f')](_0x407839[_0xcb1c('0x3d')],{'$or':_[_0xcb1c('0x2d')](_0x36a720,function(_0x297899){if(_0x297899[_0xcb1c('0x31')]!==_0xcb1c('0x40')){var _0x5e3e1f={};_0x5e3e1f[_0x297899[_0xcb1c('0x2a')]]={'$like':'%'+_0x146f5f[_0xcb1c('0x35')][_0xcb1c('0x41')]+'%'};return _0x5e3e1f;}})});}_0x407839=_[_0xcb1c('0x3f')]({},_0x407839,_0x146f5f['options']);var _0x13949d={'where':_0x407839[_0xcb1c('0x3d')]};return db[_0xcb1c('0x2e')][_0xcb1c('0x1f')](_0x13949d)[_0xcb1c('0x26')](function(_0x1a9e79){_0x3859b6[_0xcb1c('0x1f')]=_0x1a9e79;if(_0x146f5f['query'][_0xcb1c('0x42')]){_0x407839['include']=[{'all':!![]}];}return db['CmHopperHistory'][_0xcb1c('0x43')](_0x407839);})[_0xcb1c('0x26')](function(_0x2b5939){_0x3859b6[_0xcb1c('0x44')]=_0x2b5939;return _0x3859b6;})['then'](respondWithFilteredResult(_0x53cf12,_0x407839))[_0xcb1c('0x45')](handleError(_0x53cf12,null));};exports[_0xcb1c('0x46')]=function(_0x53d1c6,_0x14fb22){var _0x283f03={'raw':!![],'where':{'id':_0x53d1c6[_0xcb1c('0x47')]['id']}},_0x4d33c4={};_0x4d33c4[_0xcb1c('0x33')]=_[_0xcb1c('0x34')](db[_0xcb1c('0x2e')][_0xcb1c('0x2f')]);_0x4d33c4[_0xcb1c('0x35')]=_[_0xcb1c('0x34')](_0x53d1c6[_0xcb1c('0x35')]);_0x4d33c4['filters']=_[_0xcb1c('0x36')](_0x4d33c4[_0xcb1c('0x33')],_0x4d33c4[_0xcb1c('0x35')]);_0x283f03[_0xcb1c('0x38')]=_['intersection'](_0x4d33c4[_0xcb1c('0x33')],qs[_0xcb1c('0x37')](_0x53d1c6[_0xcb1c('0x35')]['fields']));_0x283f03[_0xcb1c('0x38')]=_0x283f03[_0xcb1c('0x38')][_0xcb1c('0x39')]?_0x283f03[_0xcb1c('0x38')]:_0x4d33c4[_0xcb1c('0x33')];if(_0x53d1c6[_0xcb1c('0x35')][_0xcb1c('0x42')]){_0x283f03['include']=[{'all':!![]}];}_0x283f03=_['merge']({},_0x283f03,_0x53d1c6[_0xcb1c('0x48')]);return db[_0xcb1c('0x2e')][_0xcb1c('0x49')](_0x283f03)[_0xcb1c('0x26')](handleEntityNotFound(_0x14fb22,null))['then'](respondWithResult(_0x14fb22,null))[_0xcb1c('0x45')](handleError(_0x14fb22,null));};exports['create']=function(_0x20afc2,_0x573a13){return db[_0xcb1c('0x2e')][_0xcb1c('0x4a')](_0x20afc2[_0xcb1c('0x4b')],{})[_0xcb1c('0x26')](respondWithResult(_0x573a13,0xc9))[_0xcb1c('0x45')](handleError(_0x573a13,null));};exports[_0xcb1c('0x4c')]=function(_0x93c027,_0x362431){return db[_0xcb1c('0x2e')][_0xcb1c('0x4c')]()[_0xcb1c('0x26')](respondWithResult(_0x362431,null))[_0xcb1c('0x45')](handleError(_0x362431,null));};exports[_0xcb1c('0x25')]=function(_0x7d343c,_0x827d70){if(_0x7d343c[_0xcb1c('0x4b')][_0xcb1c('0x4d')]){delete _0x7d343c[_0xcb1c('0x4b')][_0xcb1c('0x4d')];}return db[_0xcb1c('0x2e')][_0xcb1c('0x49')]({'where':{'uniqueid':_0x7d343c[_0xcb1c('0x47')]['id']}})[_0xcb1c('0x26')](handleEntityNotFound(_0x827d70,null))[_0xcb1c('0x26')](saveUpdates(_0x7d343c['body'],null))[_0xcb1c('0x26')](respondWithResult(_0x827d70,null))[_0xcb1c('0x45')](handleError(_0x827d70,null));};
\ No newline at end of file