Built motion from commit (unavailable).|2.5.15
[motion2.git] / server / api / squareMessage / squareMessage.controller.js
index db88112..f547a33 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0x5c2d=['json','count','offset','limit','set','Content-Range','reject','then','destroy','error','stack','name','send','index','map','rawAttributes','fieldName','key','model','query','keys','filters','intersection','attributes','fields','length','nolimit','order','sort','where','pick','filter','type','VIRTUAL','merge','options','SquareMessage','includeAll','include','findAll','rows','show','params','find','catch','create','body','update','html-pdf','eml-format','rimraf','fast-json-patch','request-promise','bluebird','mustache','util','sox','to-csv','ejs','squel','crypto','desk.js','papaparse','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/logger','api','../../config/utils','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','status','end'];(function(_0x19f764,_0x1a230b){var _0x17b88f=function(_0x41bafc){while(--_0x41bafc){_0x19f764['push'](_0x19f764['shift']());}};_0x17b88f(++_0x1a230b);}(_0x5c2d,0xc4));var _0xd5c2=function(_0x2a3857,_0x22fb1d){_0x2a3857=_0x2a3857-0x0;var _0x1ac734=_0x5c2d[_0x2a3857];return _0x1ac734;};'use strict';var pdf=require(_0xd5c2('0x0'));var emlformat=require(_0xd5c2('0x1'));var rimraf=require(_0xd5c2('0x2'));var zipdir=require('zip-dir');var jsonpatch=require(_0xd5c2('0x3'));var rp=require(_0xd5c2('0x4'));var moment=require('moment');var BPromise=require(_0xd5c2('0x5'));var Mustache=require(_0xd5c2('0x6'));var util=require(_0xd5c2('0x7'));var path=require('path');var sox=require(_0xd5c2('0x8'));var csv=require(_0xd5c2('0x9'));var ejs=require(_0xd5c2('0xa'));var fs=require('fs');var _=require('lodash');var squel=require(_0xd5c2('0xb'));var crypto=require(_0xd5c2('0xc'));var jsforce=require('jsforce');var deskjs=require(_0xd5c2('0xd'));var toCsv=require(_0xd5c2('0x9'));var querystring=require('querystring');var Papa=require(_0xd5c2('0xe'));var Redis=require('ioredis');var authService=require('../../components/auth/service');var qs=require(_0xd5c2('0xf'));var as=require(_0xd5c2('0x10'));var hardwareService=require('../../config/license/hardware');var logger=require(_0xd5c2('0x11'))(_0xd5c2('0x12'));var utils=require(_0xd5c2('0x13'));var config=require(_0xd5c2('0x14'));var licenseUtil=require(_0xd5c2('0x15'));var db=require(_0xd5c2('0x16'))['db'];function respondWithStatusCode(_0x261cb8,_0x48e301){_0x48e301=_0x48e301||0xcc;return function(_0x176003){if(_0x176003){return _0x261cb8[_0xd5c2('0x17')](_0x48e301);}return _0x261cb8[_0xd5c2('0x18')](_0x48e301)[_0xd5c2('0x19')]();};}function respondWithResult(_0x3ec029,_0x38db84){_0x38db84=_0x38db84||0xc8;return function(_0x188bff){if(_0x188bff){return _0x3ec029[_0xd5c2('0x18')](_0x38db84)[_0xd5c2('0x1a')](_0x188bff);}};}function respondWithFilteredResult(_0x3e031a,_0x6d5d14){return function(_0x4c6d6d){if(_0x4c6d6d){var _0x559b10=_0x4c6d6d[_0xd5c2('0x1b')],_0x462d60=_0x6d5d14[_0xd5c2('0x1c')],_0x57e0ba=_0x6d5d14['offset']+_0x6d5d14[_0xd5c2('0x1d')],_0x365ab8;if(_0x57e0ba>=_0x559b10){_0x57e0ba=_0x559b10;_0x365ab8=0xc8;}else{_0x365ab8=0xce;}_0x3e031a[_0xd5c2('0x18')](_0x365ab8);return _0x3e031a[_0xd5c2('0x1e')](_0xd5c2('0x1f'),_0x462d60+'-'+_0x57e0ba+'/'+_0x559b10)[_0xd5c2('0x1a')](_0x4c6d6d);}return null;};}function patchUpdates(_0x445b28){return function(_0x45838b){try{jsonpatch['apply'](_0x45838b,_0x445b28,!![]);}catch(_0xf4d2ca){return BPromise[_0xd5c2('0x20')](_0xf4d2ca);}return _0x45838b['save']();};}function saveUpdates(_0x338b02,_0x1a8fcd){return function(_0x26a140){if(_0x26a140){return _0x26a140['update'](_0x338b02)[_0xd5c2('0x21')](function(_0x276042){return _0x276042;});}return null;};}function removeEntity(_0x4be5b7,_0x59d967){return function(_0x2ceb61){if(_0x2ceb61){return _0x2ceb61[_0xd5c2('0x22')]()['then'](function(){_0x4be5b7[_0xd5c2('0x18')](0xcc)[_0xd5c2('0x19')]();});}};}function handleEntityNotFound(_0x455f89,_0x3b5c2d){return function(_0x5a98df){if(!_0x5a98df){_0x455f89['sendStatus'](0x194);}return _0x5a98df;};}function handleError(_0x161b85,_0x52b7e1){_0x52b7e1=_0x52b7e1||0x1f4;return function(_0x203d49){logger[_0xd5c2('0x23')](_0x203d49[_0xd5c2('0x24')]);if(_0x203d49['name']){delete _0x203d49[_0xd5c2('0x25')];}_0x161b85[_0xd5c2('0x18')](_0x52b7e1)[_0xd5c2('0x26')](_0x203d49);};}exports[_0xd5c2('0x27')]=function(_0x5c2366,_0x2fac9a){var _0xdd4eab={},_0x1cdc94={},_0x2a2fc4={'count':0x0,'rows':[]};var _0x26aa9f=_[_0xd5c2('0x28')](db['SquareMessage'][_0xd5c2('0x29')],function(_0x5b2699){return{'name':_0x5b2699[_0xd5c2('0x2a')],'type':_0x5b2699['type'][_0xd5c2('0x2b')]};});_0x1cdc94[_0xd5c2('0x2c')]=_[_0xd5c2('0x28')](_0x26aa9f,_0xd5c2('0x25'));_0x1cdc94[_0xd5c2('0x2d')]=_[_0xd5c2('0x2e')](_0x5c2366[_0xd5c2('0x2d')]);_0x1cdc94[_0xd5c2('0x2f')]=_[_0xd5c2('0x30')](_0x1cdc94['model'],_0x1cdc94[_0xd5c2('0x2d')]);_0xdd4eab[_0xd5c2('0x31')]=_[_0xd5c2('0x30')](_0x1cdc94[_0xd5c2('0x2c')],qs[_0xd5c2('0x32')](_0x5c2366[_0xd5c2('0x2d')][_0xd5c2('0x32')]));_0xdd4eab['attributes']=_0xdd4eab['attributes'][_0xd5c2('0x33')]?_0xdd4eab['attributes']:_0x1cdc94[_0xd5c2('0x2c')];if(!_0x5c2366['query']['hasOwnProperty'](_0xd5c2('0x34'))){_0xdd4eab['limit']=qs[_0xd5c2('0x1d')](_0x5c2366[_0xd5c2('0x2d')]['limit']);_0xdd4eab[_0xd5c2('0x1c')]=qs[_0xd5c2('0x1c')](_0x5c2366[_0xd5c2('0x2d')]['offset']);}_0xdd4eab[_0xd5c2('0x35')]=qs['sort'](_0x5c2366[_0xd5c2('0x2d')][_0xd5c2('0x36')]);_0xdd4eab[_0xd5c2('0x37')]=qs[_0xd5c2('0x2f')](_[_0xd5c2('0x38')](_0x5c2366[_0xd5c2('0x2d')],_0x1cdc94[_0xd5c2('0x2f')]),_0x26aa9f);if(_0x5c2366[_0xd5c2('0x2d')][_0xd5c2('0x39')]){_0xdd4eab[_0xd5c2('0x37')]=_['merge'](_0xdd4eab[_0xd5c2('0x37')],{'$or':_[_0xd5c2('0x28')](_0x26aa9f,function(_0x587da2){if(_0x587da2[_0xd5c2('0x3a')]!==_0xd5c2('0x3b')){var _0x42d91f={};_0x42d91f[_0x587da2[_0xd5c2('0x25')]]={'$like':'%'+_0x5c2366[_0xd5c2('0x2d')]['filter']+'%'};return _0x42d91f;}})});}_0xdd4eab=_[_0xd5c2('0x3c')]({},_0xdd4eab,_0x5c2366[_0xd5c2('0x3d')]);var _0x458931={'where':_0xdd4eab['where']};return db[_0xd5c2('0x3e')]['count'](_0x458931)['then'](function(_0x5dd154){_0x2a2fc4[_0xd5c2('0x1b')]=_0x5dd154;if(_0x5c2366[_0xd5c2('0x2d')][_0xd5c2('0x3f')]){_0xdd4eab[_0xd5c2('0x40')]=[{'all':!![]}];}return db['SquareMessage'][_0xd5c2('0x41')](_0xdd4eab);})[_0xd5c2('0x21')](function(_0x592db6){_0x2a2fc4[_0xd5c2('0x42')]=_0x592db6;return _0x2a2fc4;})['then'](respondWithFilteredResult(_0x2fac9a,_0xdd4eab))['catch'](handleError(_0x2fac9a,null));};exports[_0xd5c2('0x43')]=function(_0x57ca7d,_0x2bb09f){var _0x3f9614={'raw':!![],'where':{'id':_0x57ca7d[_0xd5c2('0x44')]['id']}},_0x41cd87={};_0x41cd87[_0xd5c2('0x2c')]=_[_0xd5c2('0x2e')](db[_0xd5c2('0x3e')][_0xd5c2('0x29')]);_0x41cd87['query']=_[_0xd5c2('0x2e')](_0x57ca7d[_0xd5c2('0x2d')]);_0x41cd87['filters']=_['intersection'](_0x41cd87['model'],_0x41cd87[_0xd5c2('0x2d')]);_0x3f9614['attributes']=_['intersection'](_0x41cd87[_0xd5c2('0x2c')],qs[_0xd5c2('0x32')](_0x57ca7d[_0xd5c2('0x2d')][_0xd5c2('0x32')]));_0x3f9614[_0xd5c2('0x31')]=_0x3f9614[_0xd5c2('0x31')][_0xd5c2('0x33')]?_0x3f9614[_0xd5c2('0x31')]:_0x41cd87[_0xd5c2('0x2c')];if(_0x57ca7d[_0xd5c2('0x2d')][_0xd5c2('0x3f')]){_0x3f9614[_0xd5c2('0x40')]=[{'all':!![]}];}_0x3f9614=_[_0xd5c2('0x3c')]({},_0x3f9614,_0x57ca7d[_0xd5c2('0x3d')]);return db[_0xd5c2('0x3e')][_0xd5c2('0x45')](_0x3f9614)[_0xd5c2('0x21')](handleEntityNotFound(_0x2bb09f,null))['then'](respondWithResult(_0x2bb09f,null))[_0xd5c2('0x46')](handleError(_0x2bb09f,null));};exports['create']=function(_0x48e113,_0x33809d){return db[_0xd5c2('0x3e')][_0xd5c2('0x47')](_0x48e113[_0xd5c2('0x48')],{})['then'](respondWithResult(_0x33809d,0xc9))[_0xd5c2('0x46')](handleError(_0x33809d,null));};exports[_0xd5c2('0x49')]=function(_0x24c0e0,_0x515c63){if(_0x24c0e0[_0xd5c2('0x48')]['id']){delete _0x24c0e0[_0xd5c2('0x48')]['id'];}return db[_0xd5c2('0x3e')][_0xd5c2('0x45')]({'where':{'id':_0x24c0e0[_0xd5c2('0x44')]['id']}})['then'](handleEntityNotFound(_0x515c63,null))[_0xd5c2('0x21')](saveUpdates(_0x24c0e0['body'],null))['then'](respondWithResult(_0x515c63,null))['catch'](handleError(_0x515c63,null));};exports[_0xd5c2('0x22')]=function(_0x5f9c70,_0x188e74){return db['SquareMessage'][_0xd5c2('0x45')]({'where':{'id':_0x5f9c70[_0xd5c2('0x44')]['id']}})[_0xd5c2('0x21')](handleEntityNotFound(_0x188e74,null))[_0xd5c2('0x21')](removeEntity(_0x188e74,null))[_0xd5c2('0x46')](handleError(_0x188e74,null));};
\ No newline at end of file
+var _0x26b0=['options','find','create','body','eml-format','rimraf','zip-dir','fast-json-patch','moment','bluebird','mustache','util','path','sox','to-csv','ejs','crypto','jsforce','querystring','papaparse','ioredis','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','../../config/utils','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','status','end','json','count','offset','limit','set','Content-Range','apply','reject','save','update','destroy','then','error','name','send','index','rawAttributes','fieldName','key','model','map','keys','filters','attributes','intersection','fields','query','length','hasOwnProperty','nolimit','order','where','filter','merge','type','VIRTUAL','SquareMessage','includeAll','include','findAll','rows','catch','show','params'];(function(_0x3a1953,_0x440442){var _0x51c757=function(_0x7846eb){while(--_0x7846eb){_0x3a1953['push'](_0x3a1953['shift']());}};_0x51c757(++_0x440442);}(_0x26b0,0x134));var _0x026b=function(_0x59f691,_0x1b656d){_0x59f691=_0x59f691-0x0;var _0x1f80bb=_0x26b0[_0x59f691];return _0x1f80bb;};'use strict';var pdf=require('html-pdf');var emlformat=require(_0x026b('0x0'));var rimraf=require(_0x026b('0x1'));var zipdir=require(_0x026b('0x2'));var jsonpatch=require(_0x026b('0x3'));var rp=require('request-promise');var moment=require(_0x026b('0x4'));var BPromise=require(_0x026b('0x5'));var Mustache=require(_0x026b('0x6'));var util=require(_0x026b('0x7'));var path=require(_0x026b('0x8'));var sox=require(_0x026b('0x9'));var csv=require(_0x026b('0xa'));var ejs=require(_0x026b('0xb'));var fs=require('fs');var _=require('lodash');var squel=require('squel');var crypto=require(_0x026b('0xc'));var jsforce=require(_0x026b('0xd'));var deskjs=require('desk.js');var toCsv=require(_0x026b('0xa'));var querystring=require(_0x026b('0xe'));var Papa=require(_0x026b('0xf'));var Redis=require(_0x026b('0x10'));var authService=require('../../components/auth/service');var qs=require(_0x026b('0x11'));var as=require(_0x026b('0x12'));var hardwareService=require(_0x026b('0x13'));var logger=require(_0x026b('0x14'))('api');var utils=require(_0x026b('0x15'));var config=require(_0x026b('0x16'));var licenseUtil=require(_0x026b('0x17'));var db=require(_0x026b('0x18'))['db'];function respondWithStatusCode(_0x29e30f,_0x56e90e){_0x56e90e=_0x56e90e||0xcc;return function(_0x25fd77){if(_0x25fd77){return _0x29e30f[_0x026b('0x19')](_0x56e90e);}return _0x29e30f[_0x026b('0x1a')](_0x56e90e)[_0x026b('0x1b')]();};}function respondWithResult(_0x3e8e04,_0x3040d1){_0x3040d1=_0x3040d1||0xc8;return function(_0x5e5c8a){if(_0x5e5c8a){return _0x3e8e04[_0x026b('0x1a')](_0x3040d1)[_0x026b('0x1c')](_0x5e5c8a);}};}function respondWithFilteredResult(_0x13c239,_0x22b86e){return function(_0x56eec1){if(_0x56eec1){var _0x34b058=_0x56eec1[_0x026b('0x1d')],_0x38f1d3=_0x22b86e['offset'],_0x215eff=_0x22b86e[_0x026b('0x1e')]+_0x22b86e[_0x026b('0x1f')],_0x59bfd2;if(_0x215eff>=_0x34b058){_0x215eff=_0x34b058;_0x59bfd2=0xc8;}else{_0x59bfd2=0xce;}_0x13c239[_0x026b('0x1a')](_0x59bfd2);return _0x13c239[_0x026b('0x20')](_0x026b('0x21'),_0x38f1d3+'-'+_0x215eff+'/'+_0x34b058)['json'](_0x56eec1);}return null;};}function patchUpdates(_0x2fdd64){return function(_0x2380f8){try{jsonpatch[_0x026b('0x22')](_0x2380f8,_0x2fdd64,!![]);}catch(_0x21f31c){return BPromise[_0x026b('0x23')](_0x21f31c);}return _0x2380f8[_0x026b('0x24')]();};}function saveUpdates(_0x511851,_0xe190a2){return function(_0x2601a2){if(_0x2601a2){return _0x2601a2[_0x026b('0x25')](_0x511851)['then'](function(_0x5d6f6c){return _0x5d6f6c;});}return null;};}function removeEntity(_0x584168,_0x2b640c){return function(_0x1a73ca){if(_0x1a73ca){return _0x1a73ca[_0x026b('0x26')]()[_0x026b('0x27')](function(){_0x584168[_0x026b('0x1a')](0xcc)[_0x026b('0x1b')]();});}};}function handleEntityNotFound(_0x32d3b7,_0x231d3){return function(_0x1b5214){if(!_0x1b5214){_0x32d3b7['sendStatus'](0x194);}return _0x1b5214;};}function handleError(_0x5e3edc,_0x392c39){_0x392c39=_0x392c39||0x1f4;return function(_0x5d7f73){logger[_0x026b('0x28')](_0x5d7f73['stack']);if(_0x5d7f73[_0x026b('0x29')]){delete _0x5d7f73[_0x026b('0x29')];}_0x5e3edc[_0x026b('0x1a')](_0x392c39)[_0x026b('0x2a')](_0x5d7f73);};}exports[_0x026b('0x2b')]=function(_0x47c6d7,_0x2b6adc){var _0x4034fd={},_0x387d53={},_0x36ef57={'count':0x0,'rows':[]};var _0xc44a58=_['map'](db['SquareMessage'][_0x026b('0x2c')],function(_0x53bc3f){return{'name':_0x53bc3f[_0x026b('0x2d')],'type':_0x53bc3f['type'][_0x026b('0x2e')]};});_0x387d53[_0x026b('0x2f')]=_[_0x026b('0x30')](_0xc44a58,_0x026b('0x29'));_0x387d53['query']=_[_0x026b('0x31')](_0x47c6d7['query']);_0x387d53[_0x026b('0x32')]=_['intersection'](_0x387d53['model'],_0x387d53['query']);_0x4034fd[_0x026b('0x33')]=_[_0x026b('0x34')](_0x387d53[_0x026b('0x2f')],qs[_0x026b('0x35')](_0x47c6d7[_0x026b('0x36')]['fields']));_0x4034fd[_0x026b('0x33')]=_0x4034fd[_0x026b('0x33')][_0x026b('0x37')]?_0x4034fd[_0x026b('0x33')]:_0x387d53[_0x026b('0x2f')];if(!_0x47c6d7[_0x026b('0x36')][_0x026b('0x38')](_0x026b('0x39'))){_0x4034fd[_0x026b('0x1f')]=qs[_0x026b('0x1f')](_0x47c6d7[_0x026b('0x36')]['limit']);_0x4034fd[_0x026b('0x1e')]=qs['offset'](_0x47c6d7[_0x026b('0x36')][_0x026b('0x1e')]);}_0x4034fd[_0x026b('0x3a')]=qs['sort'](_0x47c6d7[_0x026b('0x36')]['sort']);_0x4034fd[_0x026b('0x3b')]=qs[_0x026b('0x32')](_['pick'](_0x47c6d7[_0x026b('0x36')],_0x387d53[_0x026b('0x32')]),_0xc44a58);if(_0x47c6d7[_0x026b('0x36')][_0x026b('0x3c')]){_0x4034fd['where']=_[_0x026b('0x3d')](_0x4034fd[_0x026b('0x3b')],{'$or':_[_0x026b('0x30')](_0xc44a58,function(_0x5420c8){if(_0x5420c8[_0x026b('0x3e')]!==_0x026b('0x3f')){var _0x27978f={};_0x27978f[_0x5420c8[_0x026b('0x29')]]={'$like':'%'+_0x47c6d7[_0x026b('0x36')]['filter']+'%'};return _0x27978f;}})});}_0x4034fd=_[_0x026b('0x3d')]({},_0x4034fd,_0x47c6d7['options']);var _0x33275f={'where':_0x4034fd[_0x026b('0x3b')]};return db[_0x026b('0x40')][_0x026b('0x1d')](_0x33275f)[_0x026b('0x27')](function(_0xe9f09f){_0x36ef57[_0x026b('0x1d')]=_0xe9f09f;if(_0x47c6d7[_0x026b('0x36')][_0x026b('0x41')]){_0x4034fd[_0x026b('0x42')]=[{'all':!![]}];}return db[_0x026b('0x40')][_0x026b('0x43')](_0x4034fd);})[_0x026b('0x27')](function(_0x17a5a0){_0x36ef57[_0x026b('0x44')]=_0x17a5a0;return _0x36ef57;})[_0x026b('0x27')](respondWithFilteredResult(_0x2b6adc,_0x4034fd))[_0x026b('0x45')](handleError(_0x2b6adc,null));};exports[_0x026b('0x46')]=function(_0x3eeb9c,_0x446aa7){var _0x41f7e3={'raw':!![],'where':{'id':_0x3eeb9c[_0x026b('0x47')]['id']}},_0xd6ccb9={};_0xd6ccb9[_0x026b('0x2f')]=_[_0x026b('0x31')](db['SquareMessage'][_0x026b('0x2c')]);_0xd6ccb9[_0x026b('0x36')]=_['keys'](_0x3eeb9c['query']);_0xd6ccb9[_0x026b('0x32')]=_['intersection'](_0xd6ccb9[_0x026b('0x2f')],_0xd6ccb9[_0x026b('0x36')]);_0x41f7e3['attributes']=_[_0x026b('0x34')](_0xd6ccb9['model'],qs[_0x026b('0x35')](_0x3eeb9c[_0x026b('0x36')][_0x026b('0x35')]));_0x41f7e3[_0x026b('0x33')]=_0x41f7e3[_0x026b('0x33')][_0x026b('0x37')]?_0x41f7e3[_0x026b('0x33')]:_0xd6ccb9[_0x026b('0x2f')];if(_0x3eeb9c[_0x026b('0x36')][_0x026b('0x41')]){_0x41f7e3[_0x026b('0x42')]=[{'all':!![]}];}_0x41f7e3=_[_0x026b('0x3d')]({},_0x41f7e3,_0x3eeb9c[_0x026b('0x48')]);return db[_0x026b('0x40')][_0x026b('0x49')](_0x41f7e3)[_0x026b('0x27')](handleEntityNotFound(_0x446aa7,null))[_0x026b('0x27')](respondWithResult(_0x446aa7,null))[_0x026b('0x45')](handleError(_0x446aa7,null));};exports[_0x026b('0x4a')]=function(_0x389953,_0x1a7257){return db[_0x026b('0x40')]['create'](_0x389953[_0x026b('0x4b')],{})['then'](respondWithResult(_0x1a7257,0xc9))['catch'](handleError(_0x1a7257,null));};exports[_0x026b('0x25')]=function(_0x49647f,_0x4af2f3){if(_0x49647f[_0x026b('0x4b')]['id']){delete _0x49647f[_0x026b('0x4b')]['id'];}return db[_0x026b('0x40')][_0x026b('0x49')]({'where':{'id':_0x49647f[_0x026b('0x47')]['id']}})[_0x026b('0x27')](handleEntityNotFound(_0x4af2f3,null))[_0x026b('0x27')](saveUpdates(_0x49647f[_0x026b('0x4b')],null))[_0x026b('0x27')](respondWithResult(_0x4af2f3,null))[_0x026b('0x45')](handleError(_0x4af2f3,null));};exports[_0x026b('0x26')]=function(_0x55a80f,_0xa16c67){return db[_0x026b('0x40')][_0x026b('0x49')]({'where':{'id':_0x55a80f[_0x026b('0x47')]['id']}})[_0x026b('0x27')](handleEntityNotFound(_0xa16c67,null))[_0x026b('0x27')](removeEntity(_0xa16c67,null))['catch'](handleError(_0xa16c67,null));};
\ No newline at end of file