Built motion from commit 0900f080.|2.5.45
[motion2.git] / server / api / smsApplication / smsApplication.controller.js
index b564076..57ac33b 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xef7c=['../../config/environment','../../mysqldb','status','end','count','offset','limit','set','Content-Range','json','apply','update','then','destroy','sendStatus','error','stack','name','send','SmsApplication','rawAttributes','fieldName','type','key','model','query','keys','filters','attributes','fields','length','hasOwnProperty','nolimit','order','sort','where','filter','map','merge','options','includeAll','include','findAll','rows','catch','params','intersection','find','create','body','html-pdf','eml-format','fast-json-patch','moment','bluebird','mustache','util','path','sox','to-csv','ejs','lodash','crypto','jsforce','desk.js','querystring','papaparse','ioredis','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','../../config/utils'];(function(_0x3f965b,_0x24cb2d){var _0x12061d=function(_0x325e06){while(--_0x325e06){_0x3f965b['push'](_0x3f965b['shift']());}};_0x12061d(++_0x24cb2d);}(_0xef7c,0x19a));var _0xcef7=function(_0x525188,_0x3716e2){_0x525188=_0x525188-0x0;var _0xb4d67d=_0xef7c[_0x525188];return _0xb4d67d;};'use strict';var pdf=require(_0xcef7('0x0'));var emlformat=require(_0xcef7('0x1'));var rimraf=require('rimraf');var zipdir=require('zip-dir');var jsonpatch=require(_0xcef7('0x2'));var rp=require('request-promise');var moment=require(_0xcef7('0x3'));var BPromise=require(_0xcef7('0x4'));var Mustache=require(_0xcef7('0x5'));var util=require(_0xcef7('0x6'));var path=require(_0xcef7('0x7'));var sox=require(_0xcef7('0x8'));var csv=require(_0xcef7('0x9'));var ejs=require(_0xcef7('0xa'));var fs=require('fs');var _=require(_0xcef7('0xb'));var squel=require('squel');var crypto=require(_0xcef7('0xc'));var jsforce=require(_0xcef7('0xd'));var deskjs=require(_0xcef7('0xe'));var toCsv=require('to-csv');var querystring=require(_0xcef7('0xf'));var Papa=require(_0xcef7('0x10'));var Redis=require(_0xcef7('0x11'));var authService=require('../../components/auth/service');var qs=require('../../components/parsers/qs');var as=require(_0xcef7('0x12'));var hardwareService=require(_0xcef7('0x13'));var logger=require(_0xcef7('0x14'))('api');var utils=require(_0xcef7('0x15'));var config=require(_0xcef7('0x16'));var licenseUtil=require('../../config/license/util');var db=require(_0xcef7('0x17'))['db'];function respondWithStatusCode(_0x32217d,_0x33f7b4){_0x33f7b4=_0x33f7b4||0xcc;return function(_0x2ece1a){if(_0x2ece1a){return _0x32217d['sendStatus'](_0x33f7b4);}return _0x32217d[_0xcef7('0x18')](_0x33f7b4)[_0xcef7('0x19')]();};}function respondWithResult(_0x466835,_0x271769){_0x271769=_0x271769||0xc8;return function(_0x55f5c8){if(_0x55f5c8){return _0x466835['status'](_0x271769)['json'](_0x55f5c8);}};}function respondWithFilteredResult(_0x4982c3,_0x27be27){return function(_0x2c5227){if(_0x2c5227){var _0x5b2103=_0x2c5227[_0xcef7('0x1a')],_0x2e0c04=_0x27be27[_0xcef7('0x1b')],_0x586739=_0x27be27['offset']+_0x27be27[_0xcef7('0x1c')],_0x3b77bf;if(_0x586739>=_0x5b2103){_0x586739=_0x5b2103;_0x3b77bf=0xc8;}else{_0x3b77bf=0xce;}_0x4982c3[_0xcef7('0x18')](_0x3b77bf);return _0x4982c3[_0xcef7('0x1d')](_0xcef7('0x1e'),_0x2e0c04+'-'+_0x586739+'/'+_0x5b2103)[_0xcef7('0x1f')](_0x2c5227);}return null;};}function patchUpdates(_0x40012f){return function(_0x2a7a10){try{jsonpatch[_0xcef7('0x20')](_0x2a7a10,_0x40012f,!![]);}catch(_0x377b7b){return BPromise['reject'](_0x377b7b);}return _0x2a7a10['save']();};}function saveUpdates(_0x568194,_0x45d7e2){return function(_0x5671e4){if(_0x5671e4){return _0x5671e4[_0xcef7('0x21')](_0x568194)[_0xcef7('0x22')](function(_0x115b05){return _0x115b05;});}return null;};}function removeEntity(_0x901ba8,_0x388c21){return function(_0x3b8bdc){if(_0x3b8bdc){return _0x3b8bdc[_0xcef7('0x23')]()[_0xcef7('0x22')](function(){_0x901ba8[_0xcef7('0x18')](0xcc)[_0xcef7('0x19')]();});}};}function handleEntityNotFound(_0x535dcf,_0x10bce8){return function(_0x5eeb4b){if(!_0x5eeb4b){_0x535dcf[_0xcef7('0x24')](0x194);}return _0x5eeb4b;};}function handleError(_0x302906,_0x5ecc48){_0x5ecc48=_0x5ecc48||0x1f4;return function(_0x381541){logger[_0xcef7('0x25')](_0x381541[_0xcef7('0x26')]);if(_0x381541[_0xcef7('0x27')]){delete _0x381541[_0xcef7('0x27')];}_0x302906['status'](_0x5ecc48)[_0xcef7('0x28')](_0x381541);};}exports['index']=function(_0x44fb41,_0x5b7768){var _0x345fa3={},_0x5951dd={},_0x572e8e={'count':0x0,'rows':[]};var _0x57b38f=_['map'](db[_0xcef7('0x29')][_0xcef7('0x2a')],function(_0x37e307){return{'name':_0x37e307[_0xcef7('0x2b')],'type':_0x37e307[_0xcef7('0x2c')][_0xcef7('0x2d')]};});_0x5951dd[_0xcef7('0x2e')]=_['map'](_0x57b38f,_0xcef7('0x27'));_0x5951dd[_0xcef7('0x2f')]=_[_0xcef7('0x30')](_0x44fb41[_0xcef7('0x2f')]);_0x5951dd[_0xcef7('0x31')]=_['intersection'](_0x5951dd['model'],_0x5951dd[_0xcef7('0x2f')]);_0x345fa3[_0xcef7('0x32')]=_['intersection'](_0x5951dd[_0xcef7('0x2e')],qs['fields'](_0x44fb41['query'][_0xcef7('0x33')]));_0x345fa3[_0xcef7('0x32')]=_0x345fa3['attributes'][_0xcef7('0x34')]?_0x345fa3['attributes']:_0x5951dd[_0xcef7('0x2e')];if(!_0x44fb41[_0xcef7('0x2f')][_0xcef7('0x35')](_0xcef7('0x36'))){_0x345fa3[_0xcef7('0x1c')]=qs['limit'](_0x44fb41[_0xcef7('0x2f')][_0xcef7('0x1c')]);_0x345fa3[_0xcef7('0x1b')]=qs[_0xcef7('0x1b')](_0x44fb41[_0xcef7('0x2f')]['offset']);}_0x345fa3[_0xcef7('0x37')]=qs['sort'](_0x44fb41[_0xcef7('0x2f')][_0xcef7('0x38')]);_0x345fa3[_0xcef7('0x39')]=qs[_0xcef7('0x31')](_['pick'](_0x44fb41[_0xcef7('0x2f')],_0x5951dd[_0xcef7('0x31')]),_0x57b38f);if(_0x44fb41[_0xcef7('0x2f')][_0xcef7('0x3a')]){_0x345fa3[_0xcef7('0x39')]=_['merge'](_0x345fa3[_0xcef7('0x39')],{'$or':_[_0xcef7('0x3b')](_0x57b38f,function(_0x5d89b1){if(_0x5d89b1[_0xcef7('0x2c')]!=='VIRTUAL'){var _0x26f6ac={};_0x26f6ac[_0x5d89b1[_0xcef7('0x27')]]={'$like':'%'+_0x44fb41[_0xcef7('0x2f')][_0xcef7('0x3a')]+'%'};return _0x26f6ac;}})});}_0x345fa3=_[_0xcef7('0x3c')]({},_0x345fa3,_0x44fb41[_0xcef7('0x3d')]);var _0x308cc9={'where':_0x345fa3[_0xcef7('0x39')]};return db[_0xcef7('0x29')][_0xcef7('0x1a')](_0x308cc9)['then'](function(_0x34c7ad){_0x572e8e[_0xcef7('0x1a')]=_0x34c7ad;if(_0x44fb41[_0xcef7('0x2f')][_0xcef7('0x3e')]){_0x345fa3[_0xcef7('0x3f')]=[{'all':!![]}];}return db['SmsApplication'][_0xcef7('0x40')](_0x345fa3);})['then'](function(_0x182784){_0x572e8e[_0xcef7('0x41')]=_0x182784;return _0x572e8e;})[_0xcef7('0x22')](respondWithFilteredResult(_0x5b7768,_0x345fa3))[_0xcef7('0x42')](handleError(_0x5b7768,null));};exports['show']=function(_0x3b07be,_0x30c57e){var _0x297aa1={'raw':!![],'where':{'id':_0x3b07be[_0xcef7('0x43')]['id']}},_0x38f325={};_0x38f325[_0xcef7('0x2e')]=_[_0xcef7('0x30')](db[_0xcef7('0x29')][_0xcef7('0x2a')]);_0x38f325[_0xcef7('0x2f')]=_[_0xcef7('0x30')](_0x3b07be[_0xcef7('0x2f')]);_0x38f325['filters']=_[_0xcef7('0x44')](_0x38f325['model'],_0x38f325[_0xcef7('0x2f')]);_0x297aa1[_0xcef7('0x32')]=_[_0xcef7('0x44')](_0x38f325[_0xcef7('0x2e')],qs[_0xcef7('0x33')](_0x3b07be[_0xcef7('0x2f')]['fields']));_0x297aa1['attributes']=_0x297aa1['attributes'][_0xcef7('0x34')]?_0x297aa1['attributes']:_0x38f325[_0xcef7('0x2e')];if(_0x3b07be[_0xcef7('0x2f')][_0xcef7('0x3e')]){_0x297aa1[_0xcef7('0x3f')]=[{'all':!![]}];}_0x297aa1=_[_0xcef7('0x3c')]({},_0x297aa1,_0x3b07be['options']);return db[_0xcef7('0x29')][_0xcef7('0x45')](_0x297aa1)[_0xcef7('0x22')](handleEntityNotFound(_0x30c57e,null))[_0xcef7('0x22')](respondWithResult(_0x30c57e,null))[_0xcef7('0x42')](handleError(_0x30c57e,null));};exports['create']=function(_0x7ff28b,_0x15b97e){return db[_0xcef7('0x29')][_0xcef7('0x46')](_0x7ff28b[_0xcef7('0x47')],{})['then'](respondWithResult(_0x15b97e,0xc9))[_0xcef7('0x42')](handleError(_0x15b97e,null));};exports[_0xcef7('0x21')]=function(_0x5e53ed,_0x18528d){if(_0x5e53ed[_0xcef7('0x47')]['id']){delete _0x5e53ed[_0xcef7('0x47')]['id'];}return db[_0xcef7('0x29')][_0xcef7('0x45')]({'where':{'id':_0x5e53ed[_0xcef7('0x43')]['id']}})[_0xcef7('0x22')](handleEntityNotFound(_0x18528d,null))[_0xcef7('0x22')](saveUpdates(_0x5e53ed['body'],null))[_0xcef7('0x22')](respondWithResult(_0x18528d,null))[_0xcef7('0x42')](handleError(_0x18528d,null));};exports[_0xcef7('0x23')]=function(_0x232a5a,_0x39cb8d){return db['SmsApplication']['find']({'where':{'id':_0x232a5a[_0xcef7('0x43')]['id']}})[_0xcef7('0x22')](handleEntityNotFound(_0x39cb8d,null))[_0xcef7('0x22')](removeEntity(_0x39cb8d,null))[_0xcef7('0x42')](handleError(_0x39cb8d,null));};
\ No newline at end of file
+var _0x5ab2=['desk.js','querystring','papaparse','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/logger','api','../../config/environment','../../config/license/util','../../mysqldb','status','end','offset','undefined','limit','count','set','json','reject','save','update','then','destroy','sendStatus','error','name','send','index','SmsApplication','fieldName','type','model','map','keys','query','intersection','fields','attributes','length','hasOwnProperty','order','sort','filters','pick','filter','where','merge','VIRTUAL','options','findAll','rows','catch','show','params','includeAll','find','body','eml-format','rimraf','zip-dir','fast-json-patch','request-promise','moment','bluebird','mustache','util','sox','to-csv','ejs','crypto','jsforce'];(function(_0x41037b,_0x1593b5){var _0xf1f5a3=function(_0x6df698){while(--_0x6df698){_0x41037b['push'](_0x41037b['shift']());}};_0xf1f5a3(++_0x1593b5);}(_0x5ab2,0x1f1));var _0x25ab=function(_0xc67d4,_0x1f3d6b){_0xc67d4=_0xc67d4-0x0;var _0x5434bf=_0x5ab2[_0xc67d4];return _0x5434bf;};'use strict';var emlformat=require(_0x25ab('0x0'));var rimraf=require(_0x25ab('0x1'));var zipdir=require(_0x25ab('0x2'));var jsonpatch=require(_0x25ab('0x3'));var rp=require(_0x25ab('0x4'));var moment=require(_0x25ab('0x5'));var BPromise=require(_0x25ab('0x6'));var Mustache=require(_0x25ab('0x7'));var util=require(_0x25ab('0x8'));var path=require('path');var sox=require(_0x25ab('0x9'));var csv=require(_0x25ab('0xa'));var ejs=require(_0x25ab('0xb'));var fs=require('fs');var fs_extra=require('fs-extra');var _=require('lodash');var squel=require('squel');var crypto=require(_0x25ab('0xc'));var jsforce=require(_0x25ab('0xd'));var deskjs=require(_0x25ab('0xe'));var toCsv=require(_0x25ab('0xa'));var querystring=require(_0x25ab('0xf'));var Papa=require(_0x25ab('0x10'));var Redis=require(_0x25ab('0x11'));var authService=require(_0x25ab('0x12'));var qs=require(_0x25ab('0x13'));var as=require(_0x25ab('0x14'));var hardwareService=require('../../config/license/hardware');var logger=require(_0x25ab('0x15'))(_0x25ab('0x16'));var utils=require('../../config/utils');var config=require(_0x25ab('0x17'));var licenseUtil=require(_0x25ab('0x18'));var db=require(_0x25ab('0x19'))['db'];function respondWithStatusCode(_0x46f905,_0x2654c5){_0x2654c5=_0x2654c5||0xcc;return function(_0x229088){if(_0x229088){return _0x46f905['sendStatus'](_0x2654c5);}return _0x46f905[_0x25ab('0x1a')](_0x2654c5)[_0x25ab('0x1b')]();};}function respondWithResult(_0x58804c,_0x6704fa){_0x6704fa=_0x6704fa||0xc8;return function(_0x1e88df){if(_0x1e88df){return _0x58804c[_0x25ab('0x1a')](_0x6704fa)['json'](_0x1e88df);}};}function respondWithFilteredResult(_0x1f2f38,_0x21fc21){return function(_0x520a4d){if(_0x520a4d){var _0x5958e8=typeof _0x21fc21[_0x25ab('0x1c')]===_0x25ab('0x1d')&&typeof _0x21fc21[_0x25ab('0x1e')]===_0x25ab('0x1d');var _0x3ff144=_0x520a4d[_0x25ab('0x1f')];var _0x84d305=_0x5958e8?0x0:_0x21fc21['offset'];var _0x4d41d6=_0x5958e8?_0x520a4d[_0x25ab('0x1f')]:_0x21fc21[_0x25ab('0x1c')]+_0x21fc21[_0x25ab('0x1e')];var _0xf22fc2;if(_0x4d41d6>=_0x3ff144){_0x4d41d6=_0x3ff144;_0xf22fc2=0xc8;}else{_0xf22fc2=0xce;}_0x1f2f38[_0x25ab('0x1a')](_0xf22fc2);return _0x1f2f38[_0x25ab('0x20')]('Content-Range',_0x84d305+'-'+_0x4d41d6+'/'+_0x3ff144)[_0x25ab('0x21')](_0x520a4d);}return null;};}function patchUpdates(_0x2bffe1){return function(_0x2a6f8d){try{jsonpatch['apply'](_0x2a6f8d,_0x2bffe1,!![]);}catch(_0x439937){return BPromise[_0x25ab('0x22')](_0x439937);}return _0x2a6f8d[_0x25ab('0x23')]();};}function saveUpdates(_0x3f00f3,_0x43263e){return function(_0x212c0f){if(_0x212c0f){return _0x212c0f[_0x25ab('0x24')](_0x3f00f3)[_0x25ab('0x25')](function(_0x31e616){return _0x31e616;});}return null;};}function removeEntity(_0x3d9c26,_0x235d8f){return function(_0xe712f8){if(_0xe712f8){return _0xe712f8[_0x25ab('0x26')]()[_0x25ab('0x25')](function(){_0x3d9c26[_0x25ab('0x1a')](0xcc)[_0x25ab('0x1b')]();});}};}function handleEntityNotFound(_0x35611c,_0x833eed){return function(_0x234870){if(!_0x234870){_0x35611c[_0x25ab('0x27')](0x194);}return _0x234870;};}function handleError(_0x24799c,_0x20e7f5){_0x20e7f5=_0x20e7f5||0x1f4;return function(_0x1e6376){logger[_0x25ab('0x28')](_0x1e6376['stack']);if(_0x1e6376[_0x25ab('0x29')]){delete _0x1e6376[_0x25ab('0x29')];}_0x24799c[_0x25ab('0x1a')](_0x20e7f5)[_0x25ab('0x2a')](_0x1e6376);};}exports[_0x25ab('0x2b')]=function(_0x16e433,_0x3e9225){var _0x346fbe={},_0x8278c3={},_0x124974={'count':0x0,'rows':[]};var _0x1806b7=_['map'](db[_0x25ab('0x2c')]['rawAttributes'],function(_0x1b7a2b){return{'name':_0x1b7a2b[_0x25ab('0x2d')],'type':_0x1b7a2b[_0x25ab('0x2e')]['key']};});_0x8278c3[_0x25ab('0x2f')]=_[_0x25ab('0x30')](_0x1806b7,_0x25ab('0x29'));_0x8278c3['query']=_[_0x25ab('0x31')](_0x16e433[_0x25ab('0x32')]);_0x8278c3['filters']=_[_0x25ab('0x33')](_0x8278c3[_0x25ab('0x2f')],_0x8278c3[_0x25ab('0x32')]);_0x346fbe['attributes']=_[_0x25ab('0x33')](_0x8278c3[_0x25ab('0x2f')],qs[_0x25ab('0x34')](_0x16e433[_0x25ab('0x32')][_0x25ab('0x34')]));_0x346fbe[_0x25ab('0x35')]=_0x346fbe['attributes'][_0x25ab('0x36')]?_0x346fbe['attributes']:_0x8278c3[_0x25ab('0x2f')];if(!_0x16e433[_0x25ab('0x32')][_0x25ab('0x37')]('nolimit')){_0x346fbe[_0x25ab('0x1e')]=qs[_0x25ab('0x1e')](_0x16e433['query'][_0x25ab('0x1e')]);_0x346fbe[_0x25ab('0x1c')]=qs[_0x25ab('0x1c')](_0x16e433[_0x25ab('0x32')][_0x25ab('0x1c')]);}_0x346fbe[_0x25ab('0x38')]=qs['sort'](_0x16e433[_0x25ab('0x32')][_0x25ab('0x39')]);_0x346fbe['where']=qs[_0x25ab('0x3a')](_[_0x25ab('0x3b')](_0x16e433[_0x25ab('0x32')],_0x8278c3[_0x25ab('0x3a')]),_0x1806b7);if(_0x16e433[_0x25ab('0x32')][_0x25ab('0x3c')]){_0x346fbe[_0x25ab('0x3d')]=_[_0x25ab('0x3e')](_0x346fbe[_0x25ab('0x3d')],{'$or':_[_0x25ab('0x30')](_0x1806b7,function(_0x47669e){if(_0x47669e[_0x25ab('0x2e')]!==_0x25ab('0x3f')){var _0x21fda={};_0x21fda[_0x47669e[_0x25ab('0x29')]]={'$like':'%'+_0x16e433[_0x25ab('0x32')][_0x25ab('0x3c')]+'%'};return _0x21fda;}})});}_0x346fbe=_['merge']({},_0x346fbe,_0x16e433[_0x25ab('0x40')]);var _0x39324e={'where':_0x346fbe['where']};return db[_0x25ab('0x2c')][_0x25ab('0x1f')](_0x39324e)[_0x25ab('0x25')](function(_0x50041e){_0x124974[_0x25ab('0x1f')]=_0x50041e;if(_0x16e433[_0x25ab('0x32')]['includeAll']){_0x346fbe['include']=[{'all':!![]}];}return db[_0x25ab('0x2c')][_0x25ab('0x41')](_0x346fbe);})['then'](function(_0x40b935){_0x124974[_0x25ab('0x42')]=_0x40b935;return _0x124974;})[_0x25ab('0x25')](respondWithFilteredResult(_0x3e9225,_0x346fbe))[_0x25ab('0x43')](handleError(_0x3e9225,null));};exports[_0x25ab('0x44')]=function(_0x7c19e7,_0xa58e75){var _0x5e8570={'raw':!![],'where':{'id':_0x7c19e7[_0x25ab('0x45')]['id']}},_0x307392={};_0x307392[_0x25ab('0x2f')]=_['keys'](db['SmsApplication']['rawAttributes']);_0x307392[_0x25ab('0x32')]=_['keys'](_0x7c19e7[_0x25ab('0x32')]);_0x307392[_0x25ab('0x3a')]=_[_0x25ab('0x33')](_0x307392['model'],_0x307392[_0x25ab('0x32')]);_0x5e8570[_0x25ab('0x35')]=_[_0x25ab('0x33')](_0x307392[_0x25ab('0x2f')],qs[_0x25ab('0x34')](_0x7c19e7[_0x25ab('0x32')][_0x25ab('0x34')]));_0x5e8570[_0x25ab('0x35')]=_0x5e8570[_0x25ab('0x35')][_0x25ab('0x36')]?_0x5e8570[_0x25ab('0x35')]:_0x307392[_0x25ab('0x2f')];if(_0x7c19e7[_0x25ab('0x32')][_0x25ab('0x46')]){_0x5e8570['include']=[{'all':!![]}];}_0x5e8570=_[_0x25ab('0x3e')]({},_0x5e8570,_0x7c19e7[_0x25ab('0x40')]);return db['SmsApplication'][_0x25ab('0x47')](_0x5e8570)['then'](handleEntityNotFound(_0xa58e75,null))[_0x25ab('0x25')](respondWithResult(_0xa58e75,null))[_0x25ab('0x43')](handleError(_0xa58e75,null));};exports['create']=function(_0x3c6f8c,_0x2c3cbf){return db[_0x25ab('0x2c')]['create'](_0x3c6f8c[_0x25ab('0x48')],{})[_0x25ab('0x25')](respondWithResult(_0x2c3cbf,0xc9))[_0x25ab('0x43')](handleError(_0x2c3cbf,null));};exports[_0x25ab('0x24')]=function(_0x5adf36,_0x3cae32){if(_0x5adf36['body']['id']){delete _0x5adf36[_0x25ab('0x48')]['id'];}return db[_0x25ab('0x2c')][_0x25ab('0x47')]({'where':{'id':_0x5adf36[_0x25ab('0x45')]['id']}})[_0x25ab('0x25')](handleEntityNotFound(_0x3cae32,null))['then'](saveUpdates(_0x5adf36[_0x25ab('0x48')],null))[_0x25ab('0x25')](respondWithResult(_0x3cae32,null))['catch'](handleError(_0x3cae32,null));};exports[_0x25ab('0x26')]=function(_0x32533b,_0x257405){return db[_0x25ab('0x2c')][_0x25ab('0x47')]({'where':{'id':_0x32533b['params']['id']}})[_0x25ab('0x25')](handleEntityNotFound(_0x257405,null))[_0x25ab('0x25')](removeEntity(_0x257405,null))[_0x25ab('0x43')](handleError(_0x257405,null));};
\ No newline at end of file