Built motion from commit b5996064.|2.6.21
[motion2.git] / server / api / smsTransferReport / smsTransferReport.controller.js
index 6b5aab0..3d972ff 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0x850f=['rawAttributes','fieldName','type','key','query','filters','intersection','model','fields','attributes','length','nolimit','order','sort','where','filter','merge','VIRTUAL','includeAll','include','findAll','rows','catch','show','params','keys','options','find','create','body','update','describe','eml-format','zip-dir','moment','util','path','sox','to-csv','fs-extra','lodash','crypto','jsforce','desk.js','papaparse','ioredis','../../components/auth/service','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','../../config/utils','../../config/environment','../../config/license/util','../../mysqldb','end','status','json','offset','undefined','limit','count','set','Content-Range','apply','reject','save','then','sendStatus','error','name','send','index','map','SmsTransferReport'];(function(_0x4c0622,_0x5dacaf){var _0x1799d8=function(_0x2ba801){while(--_0x2ba801){_0x4c0622['push'](_0x4c0622['shift']());}};_0x1799d8(++_0x5dacaf);}(_0x850f,0xfe));var _0xf850=function(_0x2785f2,_0x170dce){_0x2785f2=_0x2785f2-0x0;var _0x39ad95=_0x850f[_0x2785f2];return _0x39ad95;};'use strict';var emlformat=require(_0xf850('0x0'));var rimraf=require('rimraf');var zipdir=require(_0xf850('0x1'));var jsonpatch=require('fast-json-patch');var rp=require('request-promise');var moment=require(_0xf850('0x2'));var BPromise=require('bluebird');var Mustache=require('mustache');var util=require(_0xf850('0x3'));var path=require(_0xf850('0x4'));var sox=require(_0xf850('0x5'));var csv=require(_0xf850('0x6'));var ejs=require('ejs');var fs=require('fs');var fs_extra=require(_0xf850('0x7'));var _=require(_0xf850('0x8'));var squel=require('squel');var crypto=require(_0xf850('0x9'));var jsforce=require(_0xf850('0xa'));var deskjs=require(_0xf850('0xb'));var toCsv=require('to-csv');var querystring=require('querystring');var Papa=require(_0xf850('0xc'));var Redis=require(_0xf850('0xd'));var authService=require(_0xf850('0xe'));var qs=require('../../components/parsers/qs');var as=require(_0xf850('0xf'));var hardwareService=require(_0xf850('0x10'));var logger=require(_0xf850('0x11'))('api');var utils=require(_0xf850('0x12'));var config=require(_0xf850('0x13'));var licenseUtil=require(_0xf850('0x14'));var db=require(_0xf850('0x15'))['db'];function respondWithStatusCode(_0x452615,_0x8955a2){_0x8955a2=_0x8955a2||0xcc;return function(_0x47d06a){if(_0x47d06a){return _0x452615['sendStatus'](_0x8955a2);}return _0x452615['status'](_0x8955a2)[_0xf850('0x16')]();};}function respondWithResult(_0x100c7,_0x48dea0){_0x48dea0=_0x48dea0||0xc8;return function(_0xef7535){if(_0xef7535){return _0x100c7[_0xf850('0x17')](_0x48dea0)[_0xf850('0x18')](_0xef7535);}};}function respondWithFilteredResult(_0xfefdb3,_0x197b3b){return function(_0x1ecd6c){if(_0x1ecd6c){var _0xb6d1d3=typeof _0x197b3b[_0xf850('0x19')]===_0xf850('0x1a')&&typeof _0x197b3b[_0xf850('0x1b')]===_0xf850('0x1a');var _0x111f96=_0x1ecd6c[_0xf850('0x1c')];var _0x2eff22=_0xb6d1d3?0x0:_0x197b3b[_0xf850('0x19')];var _0x45a7ae=_0xb6d1d3?_0x1ecd6c[_0xf850('0x1c')]:_0x197b3b[_0xf850('0x19')]+_0x197b3b[_0xf850('0x1b')];var _0x1c0f5c;if(_0x45a7ae>=_0x111f96){_0x45a7ae=_0x111f96;_0x1c0f5c=0xc8;}else{_0x1c0f5c=0xce;}_0xfefdb3['status'](_0x1c0f5c);return _0xfefdb3[_0xf850('0x1d')](_0xf850('0x1e'),_0x2eff22+'-'+_0x45a7ae+'/'+_0x111f96)[_0xf850('0x18')](_0x1ecd6c);}return null;};}function patchUpdates(_0x56da0b){return function(_0x25f9b2){try{jsonpatch[_0xf850('0x1f')](_0x25f9b2,_0x56da0b,!![]);}catch(_0x30b1a2){return BPromise[_0xf850('0x20')](_0x30b1a2);}return _0x25f9b2[_0xf850('0x21')]();};}function saveUpdates(_0x8f5daa,_0x53ce2f){return function(_0x3d7ab5){if(_0x3d7ab5){return _0x3d7ab5['update'](_0x8f5daa)[_0xf850('0x22')](function(_0xf1e8d1){return _0xf1e8d1;});}return null;};}function removeEntity(_0xd04532,_0xf9ed7d){return function(_0x474a51){if(_0x474a51){return _0x474a51['destroy']()[_0xf850('0x22')](function(){_0xd04532[_0xf850('0x17')](0xcc)['end']();});}};}function handleEntityNotFound(_0x3360de,_0x1bca50){return function(_0x2b893d){if(!_0x2b893d){_0x3360de[_0xf850('0x23')](0x194);}return _0x2b893d;};}function handleError(_0x21fa45,_0x219e36){_0x219e36=_0x219e36||0x1f4;return function(_0x339767){logger[_0xf850('0x24')](_0x339767['stack']);if(_0x339767[_0xf850('0x25')]){delete _0x339767[_0xf850('0x25')];}_0x21fa45[_0xf850('0x17')](_0x219e36)[_0xf850('0x26')](_0x339767);};}exports[_0xf850('0x27')]=function(_0x310fd4,_0x47e7d9){var _0x313d74={},_0x21ab43={},_0x565c5d={'count':0x0,'rows':[]};var _0x37faad=_[_0xf850('0x28')](db[_0xf850('0x29')][_0xf850('0x2a')],function(_0x44950d){return{'name':_0x44950d[_0xf850('0x2b')],'type':_0x44950d[_0xf850('0x2c')][_0xf850('0x2d')]};});_0x21ab43['model']=_[_0xf850('0x28')](_0x37faad,_0xf850('0x25'));_0x21ab43[_0xf850('0x2e')]=_['keys'](_0x310fd4[_0xf850('0x2e')]);_0x21ab43[_0xf850('0x2f')]=_[_0xf850('0x30')](_0x21ab43[_0xf850('0x31')],_0x21ab43[_0xf850('0x2e')]);_0x313d74['attributes']=_['intersection'](_0x21ab43[_0xf850('0x31')],qs[_0xf850('0x32')](_0x310fd4[_0xf850('0x2e')][_0xf850('0x32')]));_0x313d74[_0xf850('0x33')]=_0x313d74['attributes'][_0xf850('0x34')]?_0x313d74[_0xf850('0x33')]:_0x21ab43[_0xf850('0x31')];if(!_0x310fd4['query']['hasOwnProperty'](_0xf850('0x35'))){_0x313d74[_0xf850('0x1b')]=qs[_0xf850('0x1b')](_0x310fd4[_0xf850('0x2e')]['limit']);_0x313d74[_0xf850('0x19')]=qs[_0xf850('0x19')](_0x310fd4[_0xf850('0x2e')][_0xf850('0x19')]);}_0x313d74[_0xf850('0x36')]=qs[_0xf850('0x37')](_0x310fd4['query']['sort']);_0x313d74[_0xf850('0x38')]=qs[_0xf850('0x2f')](_['pick'](_0x310fd4[_0xf850('0x2e')],_0x21ab43['filters']),_0x37faad);if(_0x310fd4['query'][_0xf850('0x39')]){_0x313d74[_0xf850('0x38')]=_[_0xf850('0x3a')](_0x313d74[_0xf850('0x38')],{'$or':_[_0xf850('0x28')](_0x37faad,function(_0xbbf648){if(_0xbbf648[_0xf850('0x2c')]!==_0xf850('0x3b')){var _0xa9ed47={};_0xa9ed47[_0xbbf648[_0xf850('0x25')]]={'$like':'%'+_0x310fd4[_0xf850('0x2e')][_0xf850('0x39')]+'%'};return _0xa9ed47;}})});}_0x313d74=_[_0xf850('0x3a')]({},_0x313d74,_0x310fd4['options']);var _0x115caf={'where':_0x313d74[_0xf850('0x38')]};return db['SmsTransferReport']['count'](_0x115caf)[_0xf850('0x22')](function(_0x94e2d5){_0x565c5d[_0xf850('0x1c')]=_0x94e2d5;if(_0x310fd4['query'][_0xf850('0x3c')]){_0x313d74[_0xf850('0x3d')]=[{'all':!![]}];}return db[_0xf850('0x29')][_0xf850('0x3e')](_0x313d74);})['then'](function(_0x3e0d88){_0x565c5d[_0xf850('0x3f')]=_0x3e0d88;return _0x565c5d;})[_0xf850('0x22')](respondWithFilteredResult(_0x47e7d9,_0x313d74))[_0xf850('0x40')](handleError(_0x47e7d9,null));};exports[_0xf850('0x41')]=function(_0x23f217,_0x25c9f1){var _0x2e76d2={'raw':!![],'where':{'id':_0x23f217[_0xf850('0x42')]['id']}},_0x51d10b={};_0x51d10b[_0xf850('0x31')]=_[_0xf850('0x43')](db[_0xf850('0x29')]['rawAttributes']);_0x51d10b[_0xf850('0x2e')]=_[_0xf850('0x43')](_0x23f217[_0xf850('0x2e')]);_0x51d10b[_0xf850('0x2f')]=_[_0xf850('0x30')](_0x51d10b[_0xf850('0x31')],_0x51d10b[_0xf850('0x2e')]);_0x2e76d2[_0xf850('0x33')]=_[_0xf850('0x30')](_0x51d10b[_0xf850('0x31')],qs[_0xf850('0x32')](_0x23f217[_0xf850('0x2e')]['fields']));_0x2e76d2[_0xf850('0x33')]=_0x2e76d2[_0xf850('0x33')][_0xf850('0x34')]?_0x2e76d2[_0xf850('0x33')]:_0x51d10b['model'];if(_0x23f217[_0xf850('0x2e')][_0xf850('0x3c')]){_0x2e76d2[_0xf850('0x3d')]=[{'all':!![]}];}_0x2e76d2=_[_0xf850('0x3a')]({},_0x2e76d2,_0x23f217[_0xf850('0x44')]);return db['SmsTransferReport'][_0xf850('0x45')](_0x2e76d2)['then'](handleEntityNotFound(_0x25c9f1,null))[_0xf850('0x22')](respondWithResult(_0x25c9f1,null))[_0xf850('0x40')](handleError(_0x25c9f1,null));};exports['create']=function(_0xfd72cc,_0x276d50){return db[_0xf850('0x29')][_0xf850('0x46')](_0xfd72cc[_0xf850('0x47')],{})[_0xf850('0x22')](respondWithResult(_0x276d50,0xc9))[_0xf850('0x40')](handleError(_0x276d50,null));};exports[_0xf850('0x48')]=function(_0x400b87,_0x4d7721){if(_0x400b87[_0xf850('0x47')]['id']){delete _0x400b87['body']['id'];}return db['SmsTransferReport'][_0xf850('0x45')]({'where':{'id':_0x400b87[_0xf850('0x42')]['id']}})[_0xf850('0x22')](handleEntityNotFound(_0x4d7721,null))['then'](saveUpdates(_0x400b87['body'],null))[_0xf850('0x22')](respondWithResult(_0x4d7721,null))[_0xf850('0x40')](handleError(_0x4d7721,null));};exports['destroy']=function(_0x3876a0,_0xbf345){return db['SmsTransferReport'][_0xf850('0x45')]({'where':{'id':_0x3876a0[_0xf850('0x42')]['id']}})[_0xf850('0x22')](handleEntityNotFound(_0xbf345,null))['then'](removeEntity(_0xbf345,null))[_0xf850('0x40')](handleError(_0xbf345,null));};exports['describe']=function(_0x5d73ad,_0x3e2c3f){return db[_0xf850('0x29')][_0xf850('0x49')]()[_0xf850('0x22')](respondWithResult(_0x3e2c3f,null))['catch'](handleError(_0x3e2c3f,null));};
\ No newline at end of file
+var _0x30f3=['key','model','keys','query','filters','intersection','attributes','fields','length','hasOwnProperty','order','sort','merge','where','VIRTUAL','filter','options','then','SmsTransferReport','findAll','rows','catch','show','params','include','find','create','body','update','describe','eml-format','rimraf','zip-dir','fast-json-patch','moment','bluebird','mustache','util','sox','to-csv','ejs','lodash','squel','crypto','jsforce','querystring','papaparse','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/utils','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','status','offset','limit','undefined','count','set','Content-Range','apply','reject','save','destroy','error','stack','name','send','index','map','rawAttributes','type'];(function(_0x2d53ce,_0x33c348){var _0x322a86=function(_0x40b2a5){while(--_0x40b2a5){_0x2d53ce['push'](_0x2d53ce['shift']());}};_0x322a86(++_0x33c348);}(_0x30f3,0x1e0));var _0x330f=function(_0x3cafb8,_0x32860e){_0x3cafb8=_0x3cafb8-0x0;var _0x4b7f85=_0x30f3[_0x3cafb8];return _0x4b7f85;};'use strict';var emlformat=require(_0x330f('0x0'));var rimraf=require(_0x330f('0x1'));var zipdir=require(_0x330f('0x2'));var jsonpatch=require(_0x330f('0x3'));var rp=require('request-promise');var moment=require(_0x330f('0x4'));var BPromise=require(_0x330f('0x5'));var Mustache=require(_0x330f('0x6'));var util=require(_0x330f('0x7'));var path=require('path');var sox=require(_0x330f('0x8'));var csv=require(_0x330f('0x9'));var ejs=require(_0x330f('0xa'));var fs=require('fs');var fs_extra=require('fs-extra');var _=require(_0x330f('0xb'));var squel=require(_0x330f('0xc'));var crypto=require(_0x330f('0xd'));var jsforce=require(_0x330f('0xe'));var deskjs=require('desk.js');var toCsv=require(_0x330f('0x9'));var querystring=require(_0x330f('0xf'));var Papa=require(_0x330f('0x10'));var Redis=require('ioredis');var authService=require('../../components/auth/service');var qs=require('../../components/parsers/qs');var as=require(_0x330f('0x11'));var hardwareService=require(_0x330f('0x12'));var logger=require(_0x330f('0x13'))(_0x330f('0x14'));var utils=require(_0x330f('0x15'));var config=require(_0x330f('0x16'));var licenseUtil=require(_0x330f('0x17'));var db=require(_0x330f('0x18'))['db'];function respondWithStatusCode(_0x9717ed,_0x476f13){_0x476f13=_0x476f13||0xcc;return function(_0x14bfb8){if(_0x14bfb8){return _0x9717ed[_0x330f('0x19')](_0x476f13);}return _0x9717ed[_0x330f('0x1a')](_0x476f13)['end']();};}function respondWithResult(_0x42d615,_0x5461c0){_0x5461c0=_0x5461c0||0xc8;return function(_0x4756be){if(_0x4756be){return _0x42d615[_0x330f('0x1a')](_0x5461c0)['json'](_0x4756be);}};}function respondWithFilteredResult(_0x45d252,_0x193f86){return function(_0xfc4e4b){if(_0xfc4e4b){var _0x42e080=typeof _0x193f86[_0x330f('0x1b')]==='undefined'&&typeof _0x193f86[_0x330f('0x1c')]===_0x330f('0x1d');var _0x2136fd=_0xfc4e4b[_0x330f('0x1e')];var _0x44a8bf=_0x42e080?0x0:_0x193f86['offset'];var _0x7281dc=_0x42e080?_0xfc4e4b[_0x330f('0x1e')]:_0x193f86[_0x330f('0x1b')]+_0x193f86['limit'];var _0x1d7995;if(_0x7281dc>=_0x2136fd){_0x7281dc=_0x2136fd;_0x1d7995=0xc8;}else{_0x1d7995=0xce;}_0x45d252['status'](_0x1d7995);return _0x45d252[_0x330f('0x1f')](_0x330f('0x20'),_0x44a8bf+'-'+_0x7281dc+'/'+_0x2136fd)['json'](_0xfc4e4b);}return null;};}function patchUpdates(_0x1182b5){return function(_0x42c4c8){try{jsonpatch[_0x330f('0x21')](_0x42c4c8,_0x1182b5,!![]);}catch(_0x9d669a){return BPromise[_0x330f('0x22')](_0x9d669a);}return _0x42c4c8[_0x330f('0x23')]();};}function saveUpdates(_0x60595,_0x143856){return function(_0x5e907e){if(_0x5e907e){return _0x5e907e['update'](_0x60595)['then'](function(_0x4714c1){return _0x4714c1;});}return null;};}function removeEntity(_0xfc3d65,_0x3a147f){return function(_0x541d96){if(_0x541d96){return _0x541d96[_0x330f('0x24')]()['then'](function(){_0xfc3d65[_0x330f('0x1a')](0xcc)['end']();});}};}function handleEntityNotFound(_0x1f1b45,_0x3257fc){return function(_0x25f67f){if(!_0x25f67f){_0x1f1b45[_0x330f('0x19')](0x194);}return _0x25f67f;};}function handleError(_0x59d082,_0x216be8){_0x216be8=_0x216be8||0x1f4;return function(_0x1e1e24){logger[_0x330f('0x25')](_0x1e1e24[_0x330f('0x26')]);if(_0x1e1e24[_0x330f('0x27')]){delete _0x1e1e24[_0x330f('0x27')];}_0x59d082[_0x330f('0x1a')](_0x216be8)[_0x330f('0x28')](_0x1e1e24);};}exports[_0x330f('0x29')]=function(_0x164ba1,_0x134205){var _0xb474e8={},_0x17944f={},_0x59db4a={'count':0x0,'rows':[]};var _0x42183c=_[_0x330f('0x2a')](db['SmsTransferReport'][_0x330f('0x2b')],function(_0x2126c3){return{'name':_0x2126c3['fieldName'],'type':_0x2126c3[_0x330f('0x2c')][_0x330f('0x2d')]};});_0x17944f[_0x330f('0x2e')]=_['map'](_0x42183c,_0x330f('0x27'));_0x17944f['query']=_[_0x330f('0x2f')](_0x164ba1[_0x330f('0x30')]);_0x17944f[_0x330f('0x31')]=_[_0x330f('0x32')](_0x17944f[_0x330f('0x2e')],_0x17944f[_0x330f('0x30')]);_0xb474e8[_0x330f('0x33')]=_[_0x330f('0x32')](_0x17944f[_0x330f('0x2e')],qs[_0x330f('0x34')](_0x164ba1['query'][_0x330f('0x34')]));_0xb474e8[_0x330f('0x33')]=_0xb474e8[_0x330f('0x33')][_0x330f('0x35')]?_0xb474e8['attributes']:_0x17944f[_0x330f('0x2e')];if(!_0x164ba1[_0x330f('0x30')][_0x330f('0x36')]('nolimit')){_0xb474e8[_0x330f('0x1c')]=qs[_0x330f('0x1c')](_0x164ba1[_0x330f('0x30')][_0x330f('0x1c')]);_0xb474e8[_0x330f('0x1b')]=qs[_0x330f('0x1b')](_0x164ba1[_0x330f('0x30')][_0x330f('0x1b')]);}_0xb474e8[_0x330f('0x37')]=qs[_0x330f('0x38')](_0x164ba1['query']['sort']);_0xb474e8['where']=qs[_0x330f('0x31')](_['pick'](_0x164ba1[_0x330f('0x30')],_0x17944f[_0x330f('0x31')]),_0x42183c);if(_0x164ba1[_0x330f('0x30')]['filter']){_0xb474e8['where']=_[_0x330f('0x39')](_0xb474e8[_0x330f('0x3a')],{'$or':_[_0x330f('0x2a')](_0x42183c,function(_0x4fc6e3){if(_0x4fc6e3['type']!==_0x330f('0x3b')){var _0xfac51f={};_0xfac51f[_0x4fc6e3[_0x330f('0x27')]]={'$like':'%'+_0x164ba1[_0x330f('0x30')][_0x330f('0x3c')]+'%'};return _0xfac51f;}})});}_0xb474e8=_['merge']({},_0xb474e8,_0x164ba1[_0x330f('0x3d')]);var _0x2e63c6={'where':_0xb474e8['where']};return db['SmsTransferReport'][_0x330f('0x1e')](_0x2e63c6)[_0x330f('0x3e')](function(_0x2a2b0a){_0x59db4a[_0x330f('0x1e')]=_0x2a2b0a;if(_0x164ba1[_0x330f('0x30')]['includeAll']){_0xb474e8['include']=[{'all':!![]}];}return db[_0x330f('0x3f')][_0x330f('0x40')](_0xb474e8);})['then'](function(_0x52a8f0){_0x59db4a[_0x330f('0x41')]=_0x52a8f0;return _0x59db4a;})[_0x330f('0x3e')](respondWithFilteredResult(_0x134205,_0xb474e8))[_0x330f('0x42')](handleError(_0x134205,null));};exports[_0x330f('0x43')]=function(_0x15bbfe,_0x2bacb3){var _0x337fff={'raw':!![],'where':{'id':_0x15bbfe[_0x330f('0x44')]['id']}},_0x56e277={};_0x56e277[_0x330f('0x2e')]=_[_0x330f('0x2f')](db[_0x330f('0x3f')][_0x330f('0x2b')]);_0x56e277['query']=_[_0x330f('0x2f')](_0x15bbfe[_0x330f('0x30')]);_0x56e277[_0x330f('0x31')]=_[_0x330f('0x32')](_0x56e277['model'],_0x56e277['query']);_0x337fff[_0x330f('0x33')]=_[_0x330f('0x32')](_0x56e277['model'],qs[_0x330f('0x34')](_0x15bbfe[_0x330f('0x30')][_0x330f('0x34')]));_0x337fff['attributes']=_0x337fff['attributes'][_0x330f('0x35')]?_0x337fff[_0x330f('0x33')]:_0x56e277[_0x330f('0x2e')];if(_0x15bbfe[_0x330f('0x30')]['includeAll']){_0x337fff[_0x330f('0x45')]=[{'all':!![]}];}_0x337fff=_['merge']({},_0x337fff,_0x15bbfe['options']);return db['SmsTransferReport'][_0x330f('0x46')](_0x337fff)[_0x330f('0x3e')](handleEntityNotFound(_0x2bacb3,null))[_0x330f('0x3e')](respondWithResult(_0x2bacb3,null))['catch'](handleError(_0x2bacb3,null));};exports[_0x330f('0x47')]=function(_0x4ced47,_0x2921b2){return db[_0x330f('0x3f')][_0x330f('0x47')](_0x4ced47[_0x330f('0x48')],{})[_0x330f('0x3e')](respondWithResult(_0x2921b2,0xc9))[_0x330f('0x42')](handleError(_0x2921b2,null));};exports[_0x330f('0x49')]=function(_0x4c29e6,_0x148327){if(_0x4c29e6[_0x330f('0x48')]['id']){delete _0x4c29e6[_0x330f('0x48')]['id'];}return db[_0x330f('0x3f')][_0x330f('0x46')]({'where':{'id':_0x4c29e6[_0x330f('0x44')]['id']}})[_0x330f('0x3e')](handleEntityNotFound(_0x148327,null))[_0x330f('0x3e')](saveUpdates(_0x4c29e6['body'],null))[_0x330f('0x3e')](respondWithResult(_0x148327,null))['catch'](handleError(_0x148327,null));};exports['destroy']=function(_0xe2d07b,_0x3e0741){return db['SmsTransferReport']['find']({'where':{'id':_0xe2d07b[_0x330f('0x44')]['id']}})['then'](handleEntityNotFound(_0x3e0741,null))[_0x330f('0x3e')](removeEntity(_0x3e0741,null))[_0x330f('0x42')](handleError(_0x3e0741,null));};exports[_0x330f('0x4a')]=function(_0x28c290,_0x216b84){return db[_0x330f('0x3f')][_0x330f('0x4a')]()[_0x330f('0x3e')](respondWithResult(_0x216b84,null))[_0x330f('0x42')](handleError(_0x216b84,null));};
\ No newline at end of file