clientnode 4.0.1427 → 4.0.1429

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/Lock.js +100 -1
  2. package/dist/Logger.js +185 -1
  3. package/dist/Semaphore.js +65 -1
  4. package/dist/array.js +452 -1
  5. package/dist/cli.js +51 -1
  6. package/dist/constants.js +126 -1
  7. package/dist/context.js +40 -1
  8. package/dist/cookie.js +84 -1
  9. package/dist/data-transfer.js +216 -1
  10. package/dist/datetime.js +282 -1
  11. package/dist/domNode.js +331 -1
  12. package/dist/expression/evaluators.js +273 -1
  13. package/dist/expression/helper.js +97 -1
  14. package/dist/expression/index.js +26 -1
  15. package/dist/expression/indicator-functions.js +37 -1
  16. package/dist/expression/type.js +20 -0
  17. package/dist/filesystem.js +410 -1
  18. package/dist/function.js +75 -1
  19. package/dist/index.js +43 -1
  20. package/dist/indicators.js +121 -1
  21. package/dist/number.js +61 -1
  22. package/dist/object.js +934 -1
  23. package/dist/process.js +69 -1
  24. package/dist/property-types.js +115 -1
  25. package/dist/require.js +82 -1
  26. package/dist/scope.js +85 -1
  27. package/dist/string.js +806 -1
  28. package/dist/test-helper.js +341 -1
  29. package/dist/type.js +21 -1
  30. package/dist/utility.js +139 -1
  31. package/package.json +23 -21
  32. package/dist/Lock.d.ts +0 -39
  33. package/dist/Logger.d.ts +0 -102
  34. package/dist/Semaphore.d.ts +0 -29
  35. package/dist/array.d.ts +0 -150
  36. package/dist/bundle/Lock.js +0 -1
  37. package/dist/bundle/Logger.js +0 -1
  38. package/dist/bundle/Semaphore.js +0 -1
  39. package/dist/bundle/array.js +0 -1
  40. package/dist/bundle/cli.js +0 -1
  41. package/dist/bundle/constants.js +0 -1
  42. package/dist/bundle/context.js +0 -1
  43. package/dist/bundle/cookie.js +0 -1
  44. package/dist/bundle/data-transfer.js +0 -1
  45. package/dist/bundle/datetime.js +0 -1
  46. package/dist/bundle/domNode.js +0 -1
  47. package/dist/bundle/expression/evaluators.js +0 -1
  48. package/dist/bundle/expression/helper.js +0 -1
  49. package/dist/bundle/expression/index.js +0 -1
  50. package/dist/bundle/expression/indicator-functions.js +0 -1
  51. package/dist/bundle/expression/types.js +0 -1
  52. package/dist/bundle/filesystem.js +0 -1
  53. package/dist/bundle/function.js +0 -1
  54. package/dist/bundle/index.js +0 -1
  55. package/dist/bundle/indicators.js +0 -1
  56. package/dist/bundle/number.js +0 -1
  57. package/dist/bundle/object.js +0 -1
  58. package/dist/bundle/process.js +0 -1
  59. package/dist/bundle/property-types.js +0 -1
  60. package/dist/bundle/require.js +0 -1
  61. package/dist/bundle/scope.js +0 -1
  62. package/dist/bundle/string.js +0 -1
  63. package/dist/bundle/test-helper.js +0 -1
  64. package/dist/bundle/type.js +0 -1
  65. package/dist/bundle/utility.js +0 -1
  66. package/dist/cli.d.ts +0 -31
  67. package/dist/compatible/Lock.js +0 -1
  68. package/dist/compatible/Logger.js +0 -1
  69. package/dist/compatible/Semaphore.js +0 -1
  70. package/dist/compatible/array.js +0 -1
  71. package/dist/compatible/cli.js +0 -1
  72. package/dist/compatible/constants.js +0 -1
  73. package/dist/compatible/context.js +0 -1
  74. package/dist/compatible/cookie.js +0 -1
  75. package/dist/compatible/data-transfer.js +0 -1
  76. package/dist/compatible/datetime.js +0 -1
  77. package/dist/compatible/domNode.js +0 -1
  78. package/dist/compatible/expression/evaluators.js +0 -1
  79. package/dist/compatible/expression/helper.js +0 -1
  80. package/dist/compatible/expression/index.js +0 -1
  81. package/dist/compatible/expression/indicator-functions.js +0 -1
  82. package/dist/compatible/expression/types.js +0 -1
  83. package/dist/compatible/filesystem.js +0 -1
  84. package/dist/compatible/function.js +0 -1
  85. package/dist/compatible/index.js +0 -1
  86. package/dist/compatible/indicators.js +0 -1
  87. package/dist/compatible/number.js +0 -1
  88. package/dist/compatible/object.js +0 -1
  89. package/dist/compatible/process.js +0 -1
  90. package/dist/compatible/property-types.js +0 -1
  91. package/dist/compatible/require.js +0 -1
  92. package/dist/compatible/scope.js +0 -1
  93. package/dist/compatible/string.js +0 -1
  94. package/dist/compatible/test-helper.js +0 -1
  95. package/dist/compatible/type.js +0 -1
  96. package/dist/compatible/utility.js +0 -1
  97. package/dist/constants.d.ts +0 -99
  98. package/dist/context.d.ts +0 -9
  99. package/dist/cookie.d.ts +0 -31
  100. package/dist/data-transfer.d.ts +0 -45
  101. package/dist/datetime.d.ts +0 -37
  102. package/dist/domNode.d.ts +0 -82
  103. package/dist/expression/evaluators.d.ts +0 -55
  104. package/dist/expression/helper.d.ts +0 -4
  105. package/dist/expression/index.d.ts +0 -7
  106. package/dist/expression/indicator-functions.d.ts +0 -14
  107. package/dist/expression/types.d.ts +0 -70
  108. package/dist/expression/types.js +0 -1
  109. package/dist/filesystem.d.ts +0 -138
  110. package/dist/function.d.ts +0 -20
  111. package/dist/index.d.ts +0 -23
  112. package/dist/indicators.d.ts +0 -68
  113. package/dist/number.d.ts +0 -35
  114. package/dist/object.d.ts +0 -213
  115. package/dist/process.d.ts +0 -22
  116. package/dist/property-types.d.ts +0 -460
  117. package/dist/require.d.ts +0 -6
  118. package/dist/scope.d.ts +0 -44
  119. package/dist/string.d.ts +0 -299
  120. package/dist/test/Lock.d.ts +0 -1
  121. package/dist/test/Logger.d.ts +0 -1
  122. package/dist/test/Semaphore.d.ts +0 -1
  123. package/dist/test/array.d.ts +0 -1
  124. package/dist/test/cookie.d.ts +0 -1
  125. package/dist/test/data-transfer.d.ts +0 -1
  126. package/dist/test/datetime.d.ts +0 -1
  127. package/dist/test/domNode.d.ts +0 -1
  128. package/dist/test/expression/evaluators.d.ts +0 -1
  129. package/dist/test/expression/helper.d.ts +0 -1
  130. package/dist/test/expression/indicator-functions.d.ts +0 -1
  131. package/dist/test/filesystem.d.ts +0 -1
  132. package/dist/test/function.d.ts +0 -1
  133. package/dist/test/indicators.d.ts +0 -1
  134. package/dist/test/number.d.ts +0 -1
  135. package/dist/test/object.d.ts +0 -1
  136. package/dist/test/process.d.ts +0 -1
  137. package/dist/test/property-types.d.ts +0 -1
  138. package/dist/test/scope.d.ts +0 -1
  139. package/dist/test/string.d.ts +0 -1
  140. package/dist/test/utility.d.ts +0 -1
  141. package/dist/test-helper.d.ts +0 -143
  142. package/dist/type.d.ts +0 -211
  143. package/dist/utility.d.ts +0 -44
@@ -1 +1,410 @@
1
- "use strict";if("undefined"!=typeof module&&null!==module&&"undefined"!==eval("typeof require")&&null!==eval("require")&&"main"in eval("require")&&"undefined"!==eval("typeof require.main")&&null!==eval("require.main")){var ORIGINAL_MAIN_MODULE=module;module!==eval("require.main")&&"paths"in module&&"paths"in eval("require.main")&&"undefined"!=typeof __dirname&&null!==__dirname&&(module.paths=eval("require.main.paths").concat(module.paths.filter(function(path){return eval("require.main.paths").includes(path)})))}if(null==window)var window="undefined"==typeof global||null===global?{}:global;!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("@babel/runtime/helpers/extends"),require("@babel/runtime/helpers/asyncToGenerator"),require("@babel/runtime/regenerator"));else if("function"==typeof define&&define.amd)define(["@babel/runtime/helpers/extends","@babel/runtime/helpers/asyncToGenerator","@babel/runtime/regenerator"],r);else{var n="object"==typeof exports?r(require("@babel/runtime/helpers/extends"),require("@babel/runtime/helpers/asyncToGenerator"),require("@babel/runtime/regenerator")):r(e["@babel/runtime/helpers/extends"],e["@babel/runtime/helpers/asyncToGenerator"],e["@babel/runtime/regenerator"]);for(var t in n)("object"==typeof exports?exports:e)[t]=n[t]}}(this,function(__WEBPACK_EXTERNAL_MODULE__3__,__WEBPACK_EXTERNAL_MODULE__11__,__WEBPACK_EXTERNAL_MODULE__12__){return function(){var __webpack_modules__=[function(e,r,n){n.d(r,{DEFAULT_ENCODING:function(){return t}});var t="utf8";Symbol.for("clientnodeValue"),Symbol.for("clientnodeIgnoreNullAndUndefined"),Object.prototype},function(e,r,n){n.d(r,{NOOP:function(){return a}});var t,o,i=n(5);e=n.hmd(e);var u="undefined"==typeof globalThis?void 0===window?void 0===n.g?e:Object.prototype.hasOwnProperty.call(n.g,"window")?n.g.window:n.g:window:globalThis;u.fetch=u.fetch?u.fetch.bind(u):null!==(t=null==(o=(0,i.optionalRequire)("node-fetch"))?void 0:o.default)&&void 0!==t?t:function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return i.currentImport?(0,i.currentImport)("node-fetch").then(function(e){var n;return(n=e).default.apply(n,r)}):null};var a=function(){}},,function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__3__},,function(module,__webpack_exports__,__webpack_require__){__webpack_require__.d(__webpack_exports__,{currentImport:function(){return currentImport},optionalRequire:function(){return optionalRequire}});var currentRequire=eval("typeof require === 'undefined' ? null : require"),currentOptionalImport=null;try{currentOptionalImport=eval("typeof import === 'undefined' ? null : import")}catch(e){}var currentImport=currentOptionalImport,optionalRequire=function(e){try{return currentRequire?currentRequire(e):null}catch(e){return null}},clearRequireCache=function(e){void 0===e&&(e=(null==currentRequire?void 0:currentRequire.cache)||__webpack_require__.c);for(var r={},n=0,t=Object.entries(e);n<t.length;n++){var o=t[n],i=o[0],u=o[1];r[i]=u,delete e[i]}return r},restoreRequireCache=function(e,r){void 0===e&&(e=(null==currentRequire?void 0:currentRequire.cache)||__webpack_require__.c),clearRequireCache();for(var n=0,t=Object.entries(r);n<t.length;n++){var o=t[n],i=o[0],u=o[1];e[i]=u}},isolatedRequire=function(e,r){void 0===r&&(r=currentRequire||__webpack_require__(6));var n=clearRequireCache(r.cache);try{return r(e)}catch(e){throw e}finally{restoreRequireCache(r.cache,n)}}},function(e){function r(e){var r=new Error("Cannot find module '"+e+"'");throw r.code="MODULE_NOT_FOUND",r}r.keys=function(){return[]},r.resolve=r,r.id=6,e.exports=r},,,,,function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__11__},function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__12__},,function(e,r,n){n.r(r),n.d(r,{copyDirectoryRecursive:function(){return B},copyDirectoryRecursiveSync:function(){return K},copyFile:function(){return W},copyFileSync:function(){return V},isDirectory:function(){return $},isDirectorySync:function(){return z},isFile:function(){return H},isFileSync:function(){return J},mkdirSync:function(){return y},readFileSync:function(){return m},readdirSync:function(){return h},statSync:function(){return x},walkDirectoryRecursively:function(){return Q},walkDirectoryRecursivelySync:function(){return Y},writeFileSync:function(){return g}});var t=n(3),o=n.n(t),i=n(11),u=n.n(i),a=n(12),c=n.n(a),l=n(0),s=n(1),f=n(5);function d(e,r){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,r){if(e){if("string"==typeof e)return _(e,r);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){n&&(e=n);var t=0;return function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _(e,r){(null==r||r>e.length)&&(r=e.length);for(var n=0,t=Array(r);n<r;n++)t[n]=e[n];return t}var p=(0,f.optionalRequire)("fs")||{},b=p.mkdirSync,y=void 0===b?null:b,v=p.readdirSync,h=void 0===v?null:v,w=p.readFileSync,m=void 0===w?null:w,E=p.statSync,x=void 0===E?null:E,k=p.writeFileSync,g=void 0===k?null:k,O=(0,f.optionalRequire)("fs/promises")||{},q=O.mkdir,D=void 0===q?null:q,N=O.readdir,T=void 0===N?null:N,R=O.readFile,S=void 0===R?null:R,C=O.stat,I=void 0===C?null:C,A=O.writeFile,F=void 0===A?null:A,j=(0,f.optionalRequire)("path")||{},L=j.basename,P=void 0===L?null:L,U=j.join,M=void 0===U?null:U,G=j.resolve,X=void 0===G?null:G,B=function(){var e=u()(c().mark(function e(r,n,t,o,i,u){var a,f,_,p,b,y,v,h,w;return c().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0===t&&(t=!1),void 0===o&&(o=s.NOOP),void 0===i&&(i={encoding:null,flag:"r"}),void 0===u&&(u={encoding:l.DEFAULT_ENCODING,flag:"w",mode:438}),P&&M&&D&&X){e.next=1;break}throw new Error("Could not load filesystem functions.");case 1:if(r=X(r),!(y=!t)){e.next=3;break}return e.next=2,$(n);case 2:y=e.sent;case 3:if(!y){e.next=4;break}n=X(n,P(r));case 4:return e.prev=4,e.next=5,D(n);case 5:e.next=7;break;case 6:if(e.prev=6,"EEXIST"===(v=e.catch(4)).code){e.next=7;break}throw v;case 7:return h=d,e.next=8,Q(r,o);case 8:a=h(e.sent);case 9:if((f=a()).done){e.next=16;break}if(p=f.value,b=M(n,p.path.substring(r.length)),null==(_=p.stats)||!_.isDirectory()){e.next=14;break}return e.prev=10,e.next=11,D(b);case 11:e.next=13;break;case 12:if(e.prev=12,"EEXIST"===(w=e.catch(10)).code){e.next=13;break}throw w;case 13:e.next=15;break;case 14:return e.next=15,W(p.path,b,i,u);case 15:e.next=9;break;case 16:return e.abrupt("return",n);case 17:case"end":return e.stop()}},e,null,[[4,6],[10,12]])}));return function(r,n,t,o,i,u){return e.apply(this,arguments)}}(),K=function(e,r,n,t,o,i){if(void 0===n&&(n=!1),void 0===t&&(t=s.NOOP),void 0===o&&(o={encoding:null,flag:"r"}),void 0===i&&(i={encoding:l.DEFAULT_ENCODING,flag:"w",mode:438}),!(P&&M&&y&&X))throw new Error("Could not load filesystem functions.");e=X(e),!n&&z(r)&&(r=X(r,P(e)));try{y(r)}catch(e){if("EEXIST"!==e.code)throw e}for(var u=0,a=Y(e,t);u<a.length;u++){var c,f=a[u],d=M(r,f.path.substring(e.length));if(null!=(c=f.stats)&&c.isDirectory())try{y(d)}catch(e){if("EEXIST"!==e.code)throw e}else V(f.path,d,o,i)}return r},W=function(){var e=u()(c().mark(function e(r,n,t,o){var i,u;return c().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0===t&&(t={encoding:null,flag:"r"}),void 0===o&&(o={encoding:l.DEFAULT_ENCODING,flag:"w",mode:438}),P&&S&&X&&F){e.next=1;break}throw new Error("Could not load filesystem functions.");case 1:return e.next=2,$(n);case 2:if(!e.sent){e.next=3;break}n=X(n,P(r));case 3:return i=F,u=n,e.next=4,S(r,t);case 4:return e.next=5,i(u,e.sent,o);case 5:return e.abrupt("return",n);case 6:case"end":return e.stop()}},e)}));return function(r,n,t,o){return e.apply(this,arguments)}}(),V=function(e,r,n,t){if(void 0===n&&(n={encoding:null,flag:"r"}),void 0===t&&(t={encoding:l.DEFAULT_ENCODING,flag:"w",mode:438}),!(P&&m&&X&&g))throw new Error("Could not load filesystem functions.");return z(r)&&(r=X(r,P(e))),g(r,m(e,n),t),r},$=function(){var e=u()(c().mark(function e(r){var n;return c().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(I){e.next=1;break}throw new Error("Could not load filesystem functions.");case 1:return e.prev=1,e.next=2,I(r);case 2:return e.abrupt("return",e.sent.isDirectory());case 3:if(e.prev=3,n=e.catch(1),!Object.prototype.hasOwnProperty.call(n,"code")||!["ENOENT","ENOTDIR"].includes(n.code)){e.next=4;break}return e.abrupt("return",!1);case 4:throw n;case 5:case"end":return e.stop()}},e,null,[[1,3]])}));return function(r){return e.apply(this,arguments)}}(),z=function(e){if(!x)throw new Error("Could not load filesystem functions.");try{return x(e).isDirectory()}catch(e){if(Object.prototype.hasOwnProperty.call(e,"code")&&["ENOENT","ENOTDIR"].includes(e.code))return!1;throw e}},H=function(){var e=u()(c().mark(function e(r){var n;return c().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(I){e.next=1;break}throw new Error("Could not load filesystem functions.");case 1:return e.prev=1,e.next=2,I(r);case 2:return e.abrupt("return",e.sent.isFile());case 3:if(e.prev=3,n=e.catch(1),!Object.prototype.hasOwnProperty.call(n,"code")||!["ENOENT","ENOTDIR"].includes(n.code)){e.next=4;break}return e.abrupt("return",!1);case 4:throw n;case 5:case"end":return e.stop()}},e,null,[[1,3]])}));return function(r){return e.apply(this,arguments)}}(),J=function(e){if(!x)throw new Error("Could not load filesystem functions.");try{return x(e).isFile()}catch(e){if(Object.prototype.hasOwnProperty.call(e,"code")&&["ENOENT","ENOTDIR"].includes(e.code))return!1;throw e}},Q=function(){var e=u()(c().mark(function e(r,n,t){var i,u,a,s,f,_,p,b,y,v,h,w,m,E,x;return c().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0===n&&(n=null),void 0===t&&(t=l.DEFAULT_ENCODING),T&&X&&I){e.next=1;break}throw new Error("Could not load filesystem functions.");case 1:return i=[],m=d,e.next=2,T(r,"string"==typeof t?{encoding:t,withFileTypes:!0}:o()({},t,{withFileTypes:!0}));case 2:u=m(e.sent);case 3:if((a=u()).done){e.next=9;break}return s=a.value,f=X(r,s.name),_={directoryPath:r,directoryEntry:s,error:null,name:s.name,path:f,stats:null},e.prev=4,e.next=5,I(f);case 5:_.stats=e.sent,e.next=7;break;case 6:e.prev=6,E=e.catch(4),_.error=E;case 7:i.push(_);case 8:e.next=3;break;case 9:n&&i.sort(function(e,r){var n,t,o;return null!=(n=e.stats)&&n.isDirectory()?null!=(o=r.stats)&&o.isDirectory()?0:-1:null!=(t=r.stats)&&t.isDirectory()?1:0}),p=[],b=0,y=i;case 10:if(!(b<y.length)){e.next=17;break}if(h=y[b],p.push(h),null!==(w=n?n(h):void 0)){e.next=11;break}return e.abrupt("continue",17);case 11:if("object"!=typeof w||!("then"in w)){e.next=13;break}return e.next=12,w;case 12:w=e.sent;case 13:if(null!==w){e.next=14;break}return e.abrupt("continue",17);case 14:if(!1===w||null==(v=h.stats)||!v.isDirectory()){e.next=16;break}return x=p,e.next=15,Q(h.path,n,t);case 15:p=x.concat.call(x,e.sent);case 16:b++,e.next=10;break;case 17:return e.abrupt("return",p);case 18:case"end":return e.stop()}},e,null,[[4,6]])}));return function(r,n,t){return e.apply(this,arguments)}}(),Y=function(e,r,n){if(void 0===r&&(r=s.NOOP),void 0===n&&(n=l.DEFAULT_ENCODING),!(h&&X&&x))throw new Error("Could not load filesystem functions.");for(var t,i=[],u=d(h(e,"string"==typeof n?{encoding:n,withFileTypes:!0}:o()({},n,{withFileTypes:!0})));!(t=u()).done;){var a=t.value,c=X(e,a.name),f={directoryPath:e,directoryEntry:a,error:null,name:a.name,path:c,stats:null};try{f.stats=x(c)}catch(e){f.error=e}i.push(f)}var _=[];if(r){i.sort(function(e,r){var n,t,o;return null!=(n=e.stats)&&n.isDirectory()?null!=(o=r.stats)&&o.isDirectory()?0:-1:null!=(t=r.stats)&&t.isDirectory()?1:0});for(var p,b=d(i);!(p=b()).done;){var y,v=p.value;_.push(v);var w=r(v);if(null===w)break;!1!==w&&null!=(y=v.stats)&&y.isDirectory()&&(_=_.concat(Y(v.path,r,n)))}}return _}}],__webpack_module_cache__={};function __webpack_require__(e){var r=__webpack_module_cache__[e];if(void 0!==r)return r.exports;var n=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](n,n.exports,__webpack_require__),n.loaded=!0,n.exports}__webpack_require__.c=__webpack_module_cache__,__webpack_require__.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return __webpack_require__.d(r,{a:r}),r},__webpack_require__.d=function(e,r){for(var n in r)__webpack_require__.o(r,n)&&!__webpack_require__.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},__webpack_require__.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(14);return __webpack_exports__}()});
1
+ // #!/usr/bin/env babel-node
2
+ // -*- coding: utf-8 -*-
3
+ /** @module filesystem */
4
+ 'use strict';
5
+
6
+ /* !
7
+ region header
8
+ [Project page](https://torben.website/clientnode)
9
+
10
+ Copyright Torben Sickert (info["~at~"]torben.website) 16.12.2012
11
+
12
+ License
13
+ -------
14
+
15
+ This library written by Torben Sickert stands under a creative commons
16
+ naming 3.0 unported license.
17
+ See https://creativecommons.org/licenses/by/3.0/deed.de
18
+ endregion
19
+ */
20
+ import "core-js/modules/es.array.includes.js";
21
+ import "core-js/modules/es.array.push.js";
22
+ import { DEFAULT_ENCODING } from "./constants.js";
23
+ import { NOOP } from "./context.js";
24
+ import { optionalImport } from "./require.js";
25
+ export const imports = {
26
+ fs: null,
27
+ fsPromises: null,
28
+ path: null
29
+ };
30
+ let mkdirSync;
31
+ let readdirSync;
32
+ let readFileSync;
33
+ let statSync;
34
+ let writeFileSync;
35
+ const fsImportPromise = optionalImport('fs');
36
+ fsImportPromise.then(module => {
37
+ imports.fs = module;
38
+ if (module) {
39
+ mkdirSync = module.mkdirSync;
40
+ readdirSync = module.readdirSync;
41
+ readFileSync = module.readFileSync;
42
+ statSync = module.statSync;
43
+ writeFileSync = module.writeFileSync;
44
+ } else {
45
+ mkdirSync = null;
46
+ readdirSync = null;
47
+ readFileSync = null;
48
+ statSync = null;
49
+ writeFileSync = null;
50
+ }
51
+ });
52
+ let mkdir;
53
+ let readdir;
54
+ let readFile;
55
+ let stat;
56
+ let writeFile;
57
+ const fsPromisesImportPromise = optionalImport('fs/promises');
58
+ fsPromisesImportPromise.then(module => {
59
+ imports.fsPromises = module;
60
+ if (module) {
61
+ mkdir = module.mkdir;
62
+ readdir = module.readdir;
63
+ readFile = module.readFile;
64
+ stat = module.stat;
65
+ writeFile = module.writeFile;
66
+ } else {
67
+ mkdir = null;
68
+ readdir = null;
69
+ readFile = null;
70
+ stat = null;
71
+ writeFile = null;
72
+ }
73
+ });
74
+ let basename;
75
+ let join;
76
+ let resolve;
77
+ const pathImportPromise = optionalImport('path');
78
+ pathImportPromise.then(module => {
79
+ imports.path = module;
80
+ if (module) {
81
+ basename = module.basename;
82
+ join = module.join;
83
+ resolve = module.resolve;
84
+ } else {
85
+ basename = null;
86
+ join = null;
87
+ resolve = null;
88
+ }
89
+ });
90
+ export const importsPromise = Promise.all([fsImportPromise, fsPromisesImportPromise, pathImportPromise]);
91
+
92
+ /**
93
+ * Copies given source directory via path to given target directory location
94
+ * with same target name as source file has or copy to given complete target
95
+ * directory path.
96
+ * @param sourcePath - Path to directory to copy.
97
+ * @param targetPath - Target directory or complete directory location to copy
98
+ * in.
99
+ * @param contents - Indicates whether we only want to copy content of source
100
+ * path without recreating the sourcefile itself on target location.
101
+ * @param callback - Function to invoke for each traversed file.
102
+ * @param readOptions - Options to use for reading source file.
103
+ * @param writeOptions - Options to use for writing to target file.
104
+ * @returns Promise holding the determined target directory path.
105
+ */
106
+ export const copyDirectoryRecursive = async (sourcePath, targetPath, contents = false, callback = NOOP, readOptions = {
107
+ encoding: null,
108
+ flag: 'r'
109
+ }, writeOptions = {
110
+ encoding: DEFAULT_ENCODING,
111
+ flag: 'w',
112
+ mode: 0o666
113
+ }) => {
114
+ if (!(basename && join && mkdir && resolve)) throw new Error('Could not load filesystem functions.');
115
+ sourcePath = resolve(sourcePath);
116
+ if (!contents && (await isDirectory(targetPath))) targetPath = resolve(targetPath, basename(sourcePath));
117
+
118
+ // NOTE: Check if folder needs to be created or integrated.
119
+ try {
120
+ await mkdir(targetPath);
121
+ } catch (error) {
122
+ if (error.code !== 'EEXIST') throw error;
123
+ }
124
+ for (const currentSourceFile of await walkDirectoryRecursively(sourcePath, callback)) {
125
+ const currentTargetPath = join(targetPath, currentSourceFile.path.substring(sourcePath.length));
126
+ if (currentSourceFile.stats?.isDirectory()) try {
127
+ await mkdir(currentTargetPath);
128
+ } catch (error) {
129
+ if (error.code !== 'EEXIST') throw error;
130
+ } else await copyFile(currentSourceFile.path, currentTargetPath, readOptions, writeOptions);
131
+ }
132
+ return targetPath;
133
+ };
134
+ /**
135
+ * Copies given source directory via path to given target directory location
136
+ * with same target name as source file has or copy to given complete target
137
+ * directory path.
138
+ * @param sourcePath - Path to directory to copy.
139
+ * @param targetPath - Target directory or complete directory location to copy
140
+ * in.
141
+ * @param contents - Indicates whether we only want to copy content of source
142
+ * path without recreating the sourcefile itself on target location.
143
+ * @param callback - Function to invoke for each traversed file.
144
+ * @param readOptions - Options to use for reading source file.
145
+ * @param writeOptions - Options to use for writing to target file.
146
+ * @returns Determined target directory path.
147
+ */
148
+ export const copyDirectoryRecursiveSync = (sourcePath, targetPath, contents = false, callback = NOOP, readOptions = {
149
+ encoding: null,
150
+ flag: 'r'
151
+ }, writeOptions = {
152
+ encoding: DEFAULT_ENCODING,
153
+ flag: 'w',
154
+ mode: 0o666
155
+ }) => {
156
+ if (!(basename && join && mkdirSync && resolve)) throw new Error('Could not load filesystem functions.');
157
+ sourcePath = resolve(sourcePath);
158
+ if (!contents && isDirectorySync(targetPath)) targetPath = resolve(targetPath, basename(sourcePath));
159
+
160
+ // NOTE: Try/Check if target folder needs to be created.
161
+ try {
162
+ mkdirSync(targetPath);
163
+ } catch (error) {
164
+ if (error.code !== 'EEXIST') throw error;
165
+ }
166
+ for (const currentSourceFile of walkDirectoryRecursivelySync(sourcePath, callback)) {
167
+ const currentTargetPath = join(targetPath, currentSourceFile.path.substring(sourcePath.length));
168
+ if (currentSourceFile.stats?.isDirectory()) try {
169
+ mkdirSync(currentTargetPath);
170
+ } catch (error) {
171
+ if (error.code !== 'EEXIST') throw error;
172
+ } else copyFileSync(currentSourceFile.path, currentTargetPath, readOptions, writeOptions);
173
+ }
174
+ return targetPath;
175
+ };
176
+ /**
177
+ * Copies given source file via path to given target directory location with
178
+ * same target name as source file has or copy to given complete target file
179
+ * path.
180
+ * @param sourcePath - Path to file to copy.
181
+ * @param targetPath - Target directory or complete file location to copy to.
182
+ * @param readOptions - Options to use for reading source file.
183
+ * @param writeOptions - Options to use for writing to target file.
184
+ * @returns Determined target file path.
185
+ */
186
+ export const copyFile = async (sourcePath, targetPath, readOptions = {
187
+ encoding: null,
188
+ flag: 'r'
189
+ }, writeOptions = {
190
+ encoding: DEFAULT_ENCODING,
191
+ flag: 'w',
192
+ mode: 0o666
193
+ }) => {
194
+ if (!(basename && readFile && resolve && writeFile)) throw new Error('Could not load filesystem functions.');
195
+
196
+ /*
197
+ NOTE: If target path references a directory a new file with the same
198
+ name will be created.
199
+ */
200
+ if (await isDirectory(targetPath)) targetPath = resolve(targetPath, basename(sourcePath));
201
+ await writeFile(targetPath, await readFile(sourcePath, readOptions), writeOptions);
202
+ return targetPath;
203
+ };
204
+ /**
205
+ * Copies given source file via path to given target directory location with
206
+ * same target name as source file has or copy to given complete target file
207
+ * path.
208
+ * @param sourcePath - Path to file to copy.
209
+ * @param targetPath - Target directory or complete file location to copy to.
210
+ * @param readOptions - Options to use for reading source file.
211
+ * @param writeOptions - Options to use for writing to target file.
212
+ * @returns Determined target file path.
213
+ */
214
+ export const copyFileSync = (sourcePath, targetPath, readOptions = {
215
+ encoding: null,
216
+ flag: 'r'
217
+ }, writeOptions = {
218
+ encoding: DEFAULT_ENCODING,
219
+ flag: 'w',
220
+ mode: 0o666
221
+ }) => {
222
+ if (!(basename && readFileSync && resolve && writeFileSync)) throw new Error('Could not load filesystem functions.');
223
+
224
+ /*
225
+ NOTE: If target path references a directory a new file with the same
226
+ name will be created.
227
+ */
228
+ if (isDirectorySync(targetPath)) targetPath = resolve(targetPath, basename(sourcePath));
229
+ writeFileSync(targetPath, readFileSync(sourcePath, readOptions), writeOptions);
230
+ return targetPath;
231
+ };
232
+ /**
233
+ * Checks if given path points to a valid directory.
234
+ * @param filePath - Path to directory.
235
+ * @returns A promise holding a boolean which indicates directory existence.
236
+ */
237
+ export const isDirectory = async filePath => {
238
+ if (!stat) throw new Error('Could not load filesystem functions.');
239
+ try {
240
+ return (await stat(filePath)).isDirectory();
241
+ } catch (error) {
242
+ if (Object.prototype.hasOwnProperty.call(error, 'code') && ['ENOENT', 'ENOTDIR'].includes(error.code)) return false;
243
+ throw error;
244
+ }
245
+ };
246
+ /**
247
+ * Checks if given path points to a valid directory.
248
+ * @param filePath - Path to directory.
249
+ * @returns A boolean which indicates directory existence.
250
+ */
251
+ export const isDirectorySync = filePath => {
252
+ if (!statSync) throw new Error('Could not load filesystem functions.');
253
+ try {
254
+ return statSync(filePath).isDirectory();
255
+ } catch (error) {
256
+ if (Object.prototype.hasOwnProperty.call(error, 'code') && ['ENOENT', 'ENOTDIR'].includes(error.code)) return false;
257
+ throw error;
258
+ }
259
+ };
260
+ /**
261
+ * Checks if given path points to a valid file.
262
+ * @param filePath - Path to directory.
263
+ * @returns A promise holding a boolean which indicates directory existence.
264
+ */
265
+ export const isFile = async filePath => {
266
+ if (!stat) throw new Error('Could not load filesystem functions.');
267
+ try {
268
+ return (await stat(filePath)).isFile();
269
+ } catch (error) {
270
+ if (Object.prototype.hasOwnProperty.call(error, 'code') && ['ENOENT', 'ENOTDIR'].includes(error.code)) return false;
271
+ throw error;
272
+ }
273
+ };
274
+ /**
275
+ * Checks if given path points to a valid file.
276
+ * @param filePath - Path to file.
277
+ * @returns A boolean which indicates file existence.
278
+ */
279
+ export const isFileSync = filePath => {
280
+ if (!statSync) throw new Error('Could not load filesystem functions.');
281
+ try {
282
+ return statSync(filePath).isFile();
283
+ } catch (error) {
284
+ if (Object.prototype.hasOwnProperty.call(error, 'code') && ['ENOENT', 'ENOTDIR'].includes(error.code)) return false;
285
+ throw error;
286
+ }
287
+ };
288
+ /**
289
+ * Iterates through given directory structure recursively and calls given
290
+ * callback for each found file. Callback gets file path and corresponding stat
291
+ * object as argument.
292
+ * @param directoryPath - Path to directory structure to traverse.
293
+ * @param callback - Function to invoke for each traversed file and potentially
294
+ * manipulate further traversing in alphabetical sorted order.
295
+ * If it returns "null" or a promise resolving to "null", no further files
296
+ * will be traversed afterward.
297
+ * If it handles a directory and returns "false" or a promise resolving to
298
+ * "false" no traversing into that directory will occur.
299
+ * @param options - Options to use for nested "readdir" calls.
300
+ * @returns A promise holding the determined files.
301
+ */
302
+ export const walkDirectoryRecursively = async (directoryPath, callback = null, options = DEFAULT_ENCODING) => {
303
+ if (!(readdir && resolve && stat)) throw new Error('Could not load filesystem functions.');
304
+ const files = [];
305
+ for (const directoryEntry of await readdir(directoryPath, typeof options === 'string' ? {
306
+ encoding: options,
307
+ withFileTypes: true
308
+ } : {
309
+ ...options,
310
+ withFileTypes: true
311
+ })) {
312
+ const filePath = resolve(directoryPath, directoryEntry.name);
313
+ const file = {
314
+ directoryPath,
315
+ directoryEntry,
316
+ error: null,
317
+ name: directoryEntry.name,
318
+ path: filePath,
319
+ stats: null
320
+ };
321
+ try {
322
+ file.stats = await stat(filePath);
323
+ } catch (error) {
324
+ file.error = error;
325
+ }
326
+ files.push(file);
327
+ }
328
+ if (callback)
329
+ /*
330
+ NOTE: Directories and have to be iterated first to be able to
331
+ avoid deeper unwanted traversing.
332
+ */
333
+ files.sort((firstFile, secondFile) => {
334
+ if (firstFile.stats?.isDirectory()) {
335
+ if (secondFile.stats?.isDirectory()) return 0;
336
+ return -1;
337
+ }
338
+ if (secondFile.stats?.isDirectory()) return 1;
339
+ return 0;
340
+ });
341
+ let finalFiles = [];
342
+ for (const file of files) {
343
+ finalFiles.push(file);
344
+ let result = callback ? callback(file) : undefined;
345
+ if (result === null) break;
346
+ if (typeof result === 'object' && 'then' in result) result = await result;
347
+ if (result === null) break;
348
+ if (result !== false && file.stats?.isDirectory()) finalFiles = finalFiles.concat(await walkDirectoryRecursively(file.path, callback, options));
349
+ }
350
+ return finalFiles;
351
+ };
352
+ /**
353
+ * Iterates through given directory structure recursively and calls given
354
+ * callback for each found file. Callback gets file path and corresponding
355
+ * stats object as argument.
356
+ * @param directoryPath - Path to directory structure to traverse.
357
+ * @param callback - Function to invoke for each traversed file.
358
+ * @param options - Options to use for nested "readdir" calls.
359
+ * @returns Determined list if all files.
360
+ */
361
+ export const walkDirectoryRecursivelySync = (directoryPath, callback = NOOP, options = DEFAULT_ENCODING) => {
362
+ if (!(readdirSync && resolve && statSync)) throw new Error('Could not load filesystem functions.');
363
+ const files = [];
364
+ for (const directoryEntry of readdirSync(directoryPath, typeof options === 'string' ? {
365
+ encoding: options,
366
+ withFileTypes: true
367
+ } : {
368
+ ...options,
369
+ withFileTypes: true
370
+ })) {
371
+ const filePath = resolve(directoryPath, directoryEntry.name);
372
+ const file = {
373
+ directoryPath,
374
+ directoryEntry,
375
+ error: null,
376
+ name: directoryEntry.name,
377
+ path: filePath,
378
+ stats: null
379
+ };
380
+ try {
381
+ file.stats = statSync(filePath);
382
+ } catch (error) {
383
+ file.error = error;
384
+ }
385
+ files.push(file);
386
+ }
387
+ let finalFiles = [];
388
+ if (callback) {
389
+ /*
390
+ NOTE: Directories have to be iterated first to potentially
391
+ avoid deeper iterations.
392
+ */
393
+ files.sort((firstFile, secondFile) => {
394
+ if (firstFile.stats?.isDirectory()) {
395
+ if (secondFile.stats?.isDirectory()) return 0;
396
+ return -1;
397
+ }
398
+ if (secondFile.stats?.isDirectory()) return 1;
399
+ return 0;
400
+ });
401
+ for (const file of files) {
402
+ finalFiles.push(file);
403
+ const result = callback(file);
404
+ if (result === null) break;
405
+ if (result !== false && file.stats?.isDirectory()) finalFiles = finalFiles.concat(walkDirectoryRecursivelySync(file.path, callback, options));
406
+ }
407
+ }
408
+ return finalFiles;
409
+ };
410
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2ZpbGVzeXN0ZW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gIyEvdXNyL2Jpbi9lbnYgYmFiZWwtbm9kZVxuLy8gLSotIGNvZGluZzogdXRmLTggLSotXG4vKiogQG1vZHVsZSBmaWxlc3lzdGVtICovXG4ndXNlIHN0cmljdCdcbi8qICFcbiAgICByZWdpb24gaGVhZGVyXG4gICAgW1Byb2plY3QgcGFnZV0oaHR0cHM6Ly90b3JiZW4ud2Vic2l0ZS9jbGllbnRub2RlKVxuXG4gICAgQ29weXJpZ2h0IFRvcmJlbiBTaWNrZXJ0IChpbmZvW1wifmF0flwiXXRvcmJlbi53ZWJzaXRlKSAxNi4xMi4yMDEyXG5cbiAgICBMaWNlbnNlXG4gICAgLS0tLS0tLVxuXG4gICAgVGhpcyBsaWJyYXJ5IHdyaXR0ZW4gYnkgVG9yYmVuIFNpY2tlcnQgc3RhbmRzIHVuZGVyIGEgY3JlYXRpdmUgY29tbW9uc1xuICAgIG5hbWluZyAzLjAgdW5wb3J0ZWQgbGljZW5zZS5cbiAgICBTZWUgaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC9kZWVkLmRlXG4gICAgZW5kcmVnaW9uXG4qL1xuaW1wb3J0IHR5cGUge1xuICAgIE9iamVjdEVuY29kaW5nT3B0aW9ucyxcbiAgICBta2RpclN5bmMgYXMgbWtkaXJTeW5jVHlwZSxcbiAgICByZWFkZGlyU3luYyBhcyByZWFkZGlyU3luY1R5cGUsXG4gICAgcmVhZEZpbGVTeW5jIGFzIHJlYWRGaWxlU3luY1R5cGUsXG4gICAgc3RhdFN5bmMgYXMgc3RhdFN5bmNUeXBlLFxuICAgIHdyaXRlRmlsZVN5bmMgYXMgd3JpdGVGaWxlU3luY1R5cGUsXG59IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgdHlwZSB7XG4gICAgbWtkaXIgYXMgbWtkaXJUeXBlLFxuICAgIHJlYWRkaXIgYXMgcmVhZGRpclR5cGUsXG4gICAgcmVhZEZpbGUgYXMgcmVhZEZpbGVUeXBlLFxuICAgIHN0YXQgYXMgc3RhdFR5cGUsXG4gICAgd3JpdGVGaWxlIGFzIHdyaXRlRmlsZVR5cGVcbn0gZnJvbSAnZnMvcHJvbWlzZXMnXG5pbXBvcnQgdHlwZSB7XG4gICAgYmFzZW5hbWUgYXMgYmFzZW5hbWVUeXBlLFxuICAgIGpvaW4gYXMgam9pblR5cGUsXG4gICAgcmVzb2x2ZSBhcyByZXNvbHZlVHlwZVxufSBmcm9tICdwYXRoJ1xuXG5pbXBvcnQgdHlwZSB7QW55RnVuY3Rpb24sIEVuY29kaW5nLCBGaWxlLCBGaWxlVHJhdmVyc2VSZXN1bHR9IGZyb20gJy4vdHlwZSdcblxuaW1wb3J0IHtERUZBVUxUX0VOQ09ESU5HfSBmcm9tICcuL2NvbnN0YW50cydcbmltcG9ydCB7Tk9PUH0gZnJvbSAnLi9jb250ZXh0J1xuaW1wb3J0IHtvcHRpb25hbEltcG9ydH0gZnJvbSAnLi9yZXF1aXJlJ1xuXG5leHBvcnQgY29uc3QgaW1wb3J0czoge1xuICAgIGZzOiBudWxsIHwgdHlwZW9mIGltcG9ydCgnZnMnKVxuICAgIGZzUHJvbWlzZXM6IG51bGwgfCB0eXBlb2YgaW1wb3J0KCdmcy9wcm9taXNlcycpXG4gICAgcGF0aDogbnVsbCB8IHR5cGVvZiBpbXBvcnQoJ3BhdGgnKVxufSA9IHtcbiAgICBmczogbnVsbCxcbiAgICBmc1Byb21pc2VzOiBudWxsLFxuICAgIHBhdGg6IG51bGxcbn1cblxubGV0IG1rZGlyU3luYzogbnVsbCB8IHR5cGVvZiBta2RpclN5bmNUeXBlXG5sZXQgcmVhZGRpclN5bmM6IG51bGwgfCB0eXBlb2YgcmVhZGRpclN5bmNUeXBlXG5sZXQgcmVhZEZpbGVTeW5jOiBudWxsIHwgdHlwZW9mIHJlYWRGaWxlU3luY1R5cGVcbmxldCBzdGF0U3luYzogbnVsbCB8IHR5cGVvZiBzdGF0U3luY1R5cGVcbmxldCB3cml0ZUZpbGVTeW5jOiBudWxsIHwgdHlwZW9mIHdyaXRlRmlsZVN5bmNUeXBlXG5jb25zdCBmc0ltcG9ydFByb21pc2UgPSBvcHRpb25hbEltcG9ydDx0eXBlb2YgaW1wb3J0KCdmcycpPignZnMnKVxuZnNJbXBvcnRQcm9taXNlLnRoZW4oKG1vZHVsZSkgPT4ge1xuICAgIGltcG9ydHMuZnMgPSBtb2R1bGVcblxuICAgIGlmIChtb2R1bGUpIHtcbiAgICAgICAgbWtkaXJTeW5jID0gbW9kdWxlLm1rZGlyU3luY1xuICAgICAgICByZWFkZGlyU3luYyA9IG1vZHVsZS5yZWFkZGlyU3luY1xuICAgICAgICByZWFkRmlsZVN5bmMgPSBtb2R1bGUucmVhZEZpbGVTeW5jXG4gICAgICAgIHN0YXRTeW5jID0gbW9kdWxlLnN0YXRTeW5jXG4gICAgICAgIHdyaXRlRmlsZVN5bmMgPSBtb2R1bGUud3JpdGVGaWxlU3luY1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG1rZGlyU3luYyA9IG51bGxcbiAgICAgICAgcmVhZGRpclN5bmMgPSBudWxsXG4gICAgICAgIHJlYWRGaWxlU3luYyA9IG51bGxcbiAgICAgICAgc3RhdFN5bmMgPSBudWxsXG4gICAgICAgIHdyaXRlRmlsZVN5bmMgPSBudWxsXG4gICAgfVxufSlcblxubGV0IG1rZGlyOiBudWxsIHwgdHlwZW9mIG1rZGlyVHlwZVxubGV0IHJlYWRkaXI6IG51bGwgfCB0eXBlb2YgcmVhZGRpclR5cGVcbmxldCByZWFkRmlsZTogbnVsbCB8IHR5cGVvZiByZWFkRmlsZVR5cGVcbmxldCBzdGF0OiBudWxsIHwgdHlwZW9mIHN0YXRUeXBlXG5sZXQgd3JpdGVGaWxlOiBudWxsIHwgdHlwZW9mIHdyaXRlRmlsZVR5cGVcbmNvbnN0IGZzUHJvbWlzZXNJbXBvcnRQcm9taXNlID1cbiAgICBvcHRpb25hbEltcG9ydDx0eXBlb2YgaW1wb3J0KCdmcy9wcm9taXNlcycpPignZnMvcHJvbWlzZXMnKVxuZnNQcm9taXNlc0ltcG9ydFByb21pc2UudGhlbigobW9kdWxlKSA9PiB7XG4gICAgaW1wb3J0cy5mc1Byb21pc2VzID0gbW9kdWxlXG5cbiAgICBpZiAobW9kdWxlKSB7XG4gICAgICAgIG1rZGlyID0gbW9kdWxlLm1rZGlyXG4gICAgICAgIHJlYWRkaXIgPSBtb2R1bGUucmVhZGRpclxuICAgICAgICByZWFkRmlsZSA9IG1vZHVsZS5yZWFkRmlsZVxuICAgICAgICBzdGF0ID0gbW9kdWxlLnN0YXRcbiAgICAgICAgd3JpdGVGaWxlID0gbW9kdWxlLndyaXRlRmlsZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG1rZGlyID0gbnVsbFxuICAgICAgICByZWFkZGlyID0gbnVsbFxuICAgICAgICByZWFkRmlsZSA9IG51bGxcbiAgICAgICAgc3RhdCA9IG51bGxcbiAgICAgICAgd3JpdGVGaWxlID0gbnVsbFxuICAgIH1cbn0pXG5cbmxldCBiYXNlbmFtZTogbnVsbCB8IHR5cGVvZiBiYXNlbmFtZVR5cGVcbmxldCBqb2luOiBudWxsIHwgdHlwZW9mIGpvaW5UeXBlXG5sZXQgcmVzb2x2ZTogbnVsbCB8IHR5cGVvZiByZXNvbHZlVHlwZVxuY29uc3QgcGF0aEltcG9ydFByb21pc2UgPSBvcHRpb25hbEltcG9ydDx0eXBlb2YgaW1wb3J0KCdwYXRoJyk+KCdwYXRoJylcbnBhdGhJbXBvcnRQcm9taXNlLnRoZW4oKG1vZHVsZSkgPT4ge1xuICAgIGltcG9ydHMucGF0aCA9IG1vZHVsZVxuXG4gICAgaWYgKG1vZHVsZSkge1xuICAgICAgICBiYXNlbmFtZSA9IG1vZHVsZS5iYXNlbmFtZVxuICAgICAgICBqb2luID0gbW9kdWxlLmpvaW5cbiAgICAgICAgcmVzb2x2ZSA9IG1vZHVsZS5yZXNvbHZlXG4gICAgfSBlbHNlIHtcbiAgICAgICAgYmFzZW5hbWUgPSBudWxsXG4gICAgICAgIGpvaW4gPSBudWxsXG4gICAgICAgIHJlc29sdmUgPSBudWxsXG4gICAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGltcG9ydHNQcm9taXNlID0gUHJvbWlzZS5hbGwoW1xuICAgIGZzSW1wb3J0UHJvbWlzZSwgZnNQcm9taXNlc0ltcG9ydFByb21pc2UsIHBhdGhJbXBvcnRQcm9taXNlXG5dKVxuXG4vKipcbiAqIENvcGllcyBnaXZlbiBzb3VyY2UgZGlyZWN0b3J5IHZpYSBwYXRoIHRvIGdpdmVuIHRhcmdldCBkaXJlY3RvcnkgbG9jYXRpb25cbiAqIHdpdGggc2FtZSB0YXJnZXQgbmFtZSBhcyBzb3VyY2UgZmlsZSBoYXMgb3IgY29weSB0byBnaXZlbiBjb21wbGV0ZSB0YXJnZXRcbiAqIGRpcmVjdG9yeSBwYXRoLlxuICogQHBhcmFtIHNvdXJjZVBhdGggLSBQYXRoIHRvIGRpcmVjdG9yeSB0byBjb3B5LlxuICogQHBhcmFtIHRhcmdldFBhdGggLSBUYXJnZXQgZGlyZWN0b3J5IG9yIGNvbXBsZXRlIGRpcmVjdG9yeSBsb2NhdGlvbiB0byBjb3B5XG4gKiBpbi5cbiAqIEBwYXJhbSBjb250ZW50cyAtIEluZGljYXRlcyB3aGV0aGVyIHdlIG9ubHkgd2FudCB0byBjb3B5IGNvbnRlbnQgb2Ygc291cmNlXG4gKiBwYXRoIHdpdGhvdXQgcmVjcmVhdGluZyB0aGUgc291cmNlZmlsZSBpdHNlbGYgb24gdGFyZ2V0IGxvY2F0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gaW52b2tlIGZvciBlYWNoIHRyYXZlcnNlZCBmaWxlLlxuICogQHBhcmFtIHJlYWRPcHRpb25zIC0gT3B0aW9ucyB0byB1c2UgZm9yIHJlYWRpbmcgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gd3JpdGVPcHRpb25zIC0gT3B0aW9ucyB0byB1c2UgZm9yIHdyaXRpbmcgdG8gdGFyZ2V0IGZpbGUuXG4gKiBAcmV0dXJucyBQcm9taXNlIGhvbGRpbmcgdGhlIGRldGVybWluZWQgdGFyZ2V0IGRpcmVjdG9yeSBwYXRoLlxuICovXG5leHBvcnQgY29uc3QgY29weURpcmVjdG9yeVJlY3Vyc2l2ZSA9IGFzeW5jIChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgdGFyZ2V0UGF0aDogc3RyaW5nLFxuICAgIGNvbnRlbnRzID0gZmFsc2UsXG4gICAgY2FsbGJhY2s6IEFueUZ1bmN0aW9uID0gTk9PUCxcbiAgICByZWFkT3B0aW9ucyA9IHtlbmNvZGluZzogbnVsbCwgZmxhZzogJ3InfSxcbiAgICB3cml0ZU9wdGlvbnMgPSB7ZW5jb2Rpbmc6IERFRkFVTFRfRU5DT0RJTkcsIGZsYWc6ICd3JywgbW9kZTogMG82NjZ9XG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGlmICghKGJhc2VuYW1lICYmIGpvaW4gJiYgbWtkaXIgJiYgcmVzb2x2ZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgZmlsZXN5c3RlbSBmdW5jdGlvbnMuJylcblxuICAgIHNvdXJjZVBhdGggPSByZXNvbHZlKHNvdXJjZVBhdGgpXG4gICAgaWYgKCFjb250ZW50cyAmJiBhd2FpdCBpc0RpcmVjdG9yeSh0YXJnZXRQYXRoKSlcbiAgICAgICAgdGFyZ2V0UGF0aCA9IHJlc29sdmUodGFyZ2V0UGF0aCwgYmFzZW5hbWUoc291cmNlUGF0aCkpXG5cbiAgICAvLyBOT1RFOiBDaGVjayBpZiBmb2xkZXIgbmVlZHMgdG8gYmUgY3JlYXRlZCBvciBpbnRlZ3JhdGVkLlxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKHRhcmdldFBhdGgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFRVhJU1QnKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBmb3IgKFxuICAgICAgICBjb25zdCBjdXJyZW50U291cmNlRmlsZSBvZlxuICAgICAgICBhd2FpdCB3YWxrRGlyZWN0b3J5UmVjdXJzaXZlbHkoc291cmNlUGF0aCwgY2FsbGJhY2spXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXRQYXRoOiBzdHJpbmcgPSBqb2luKFxuICAgICAgICAgICAgdGFyZ2V0UGF0aCwgY3VycmVudFNvdXJjZUZpbGUucGF0aC5zdWJzdHJpbmcoc291cmNlUGF0aC5sZW5ndGgpXG4gICAgICAgIClcblxuICAgICAgICBpZiAoY3VycmVudFNvdXJjZUZpbGUuc3RhdHM/LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG1rZGlyKGN1cnJlbnRUYXJnZXRQYXRoKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VFWElTVCcpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGF3YWl0IGNvcHlGaWxlKFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2VGaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldFBhdGgsXG4gICAgICAgICAgICAgICAgcmVhZE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgd3JpdGVPcHRpb25zXG4gICAgICAgICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFBhdGhcbn1cbi8qKlxuICogQ29waWVzIGdpdmVuIHNvdXJjZSBkaXJlY3RvcnkgdmlhIHBhdGggdG8gZ2l2ZW4gdGFyZ2V0IGRpcmVjdG9yeSBsb2NhdGlvblxuICogd2l0aCBzYW1lIHRhcmdldCBuYW1lIGFzIHNvdXJjZSBmaWxlIGhhcyBvciBjb3B5IHRvIGdpdmVuIGNvbXBsZXRlIHRhcmdldFxuICogZGlyZWN0b3J5IHBhdGguXG4gKiBAcGFyYW0gc291cmNlUGF0aCAtIFBhdGggdG8gZGlyZWN0b3J5IHRvIGNvcHkuXG4gKiBAcGFyYW0gdGFyZ2V0UGF0aCAtIFRhcmdldCBkaXJlY3Rvcnkgb3IgY29tcGxldGUgZGlyZWN0b3J5IGxvY2F0aW9uIHRvIGNvcHlcbiAqIGluLlxuICogQHBhcmFtIGNvbnRlbnRzIC0gSW5kaWNhdGVzIHdoZXRoZXIgd2Ugb25seSB3YW50IHRvIGNvcHkgY29udGVudCBvZiBzb3VyY2VcbiAqIHBhdGggd2l0aG91dCByZWNyZWF0aW5nIHRoZSBzb3VyY2VmaWxlIGl0c2VsZiBvbiB0YXJnZXQgbG9jYXRpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggdHJhdmVyc2VkIGZpbGUuXG4gKiBAcGFyYW0gcmVhZE9wdGlvbnMgLSBPcHRpb25zIHRvIHVzZSBmb3IgcmVhZGluZyBzb3VyY2UgZmlsZS5cbiAqIEBwYXJhbSB3cml0ZU9wdGlvbnMgLSBPcHRpb25zIHRvIHVzZSBmb3Igd3JpdGluZyB0byB0YXJnZXQgZmlsZS5cbiAqIEByZXR1cm5zIERldGVybWluZWQgdGFyZ2V0IGRpcmVjdG9yeSBwYXRoLlxuICovXG5leHBvcnQgY29uc3QgY29weURpcmVjdG9yeVJlY3Vyc2l2ZVN5bmMgPSAoXG4gICAgc291cmNlUGF0aDogc3RyaW5nLFxuICAgIHRhcmdldFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50cyA9IGZhbHNlLFxuICAgIGNhbGxiYWNrOiBBbnlGdW5jdGlvbiA9IE5PT1AsXG4gICAgcmVhZE9wdGlvbnMgPSB7ZW5jb2Rpbmc6IG51bGwsIGZsYWc6ICdyJ30sXG4gICAgd3JpdGVPcHRpb25zID0ge2VuY29kaW5nOiBERUZBVUxUX0VOQ09ESU5HLCBmbGFnOiAndycsIG1vZGU6IDBvNjY2fVxuKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIShiYXNlbmFtZSAmJiBqb2luICYmIG1rZGlyU3luYyAmJiByZXNvbHZlKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBmaWxlc3lzdGVtIGZ1bmN0aW9ucy4nKVxuXG4gICAgc291cmNlUGF0aCA9IHJlc29sdmUoc291cmNlUGF0aClcbiAgICBpZiAoIWNvbnRlbnRzICYmIGlzRGlyZWN0b3J5U3luYyh0YXJnZXRQYXRoKSlcbiAgICAgICAgdGFyZ2V0UGF0aCA9IHJlc29sdmUodGFyZ2V0UGF0aCwgYmFzZW5hbWUoc291cmNlUGF0aCkpXG5cbiAgICAvLyBOT1RFOiBUcnkvQ2hlY2sgaWYgdGFyZ2V0IGZvbGRlciBuZWVkcyB0byBiZSBjcmVhdGVkLlxuICAgIHRyeSB7XG4gICAgICAgIG1rZGlyU3luYyh0YXJnZXRQYXRoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRUVYSVNUJylcbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgZm9yIChcbiAgICAgICAgY29uc3QgY3VycmVudFNvdXJjZUZpbGUgb2ZcbiAgICAgICAgd2Fsa0RpcmVjdG9yeVJlY3Vyc2l2ZWx5U3luYyhzb3VyY2VQYXRoLCBjYWxsYmFjaylcbiAgICApIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhcmdldFBhdGg6IHN0cmluZyA9IGpvaW4oXG4gICAgICAgICAgICB0YXJnZXRQYXRoLCBjdXJyZW50U291cmNlRmlsZS5wYXRoLnN1YnN0cmluZyhzb3VyY2VQYXRoLmxlbmd0aClcbiAgICAgICAgKVxuICAgICAgICBpZiAoY3VycmVudFNvdXJjZUZpbGUuc3RhdHM/LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG1rZGlyU3luYyhjdXJyZW50VGFyZ2V0UGF0aClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFRVhJU1QnKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb3B5RmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgY3VycmVudFNvdXJjZUZpbGUucGF0aCxcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0UGF0aCxcbiAgICAgICAgICAgICAgICByZWFkT3B0aW9ucyxcbiAgICAgICAgICAgICAgICB3cml0ZU9wdGlvbnNcbiAgICAgICAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0UGF0aFxufVxuLyoqXG4gKiBDb3BpZXMgZ2l2ZW4gc291cmNlIGZpbGUgdmlhIHBhdGggdG8gZ2l2ZW4gdGFyZ2V0IGRpcmVjdG9yeSBsb2NhdGlvbiB3aXRoXG4gKiBzYW1lIHRhcmdldCBuYW1lIGFzIHNvdXJjZSBmaWxlIGhhcyBvciBjb3B5IHRvIGdpdmVuIGNvbXBsZXRlIHRhcmdldCBmaWxlXG4gKiBwYXRoLlxuICogQHBhcmFtIHNvdXJjZVBhdGggLSBQYXRoIHRvIGZpbGUgdG8gY29weS5cbiAqIEBwYXJhbSB0YXJnZXRQYXRoIC0gVGFyZ2V0IGRpcmVjdG9yeSBvciBjb21wbGV0ZSBmaWxlIGxvY2F0aW9uIHRvIGNvcHkgdG8uXG4gKiBAcGFyYW0gcmVhZE9wdGlvbnMgLSBPcHRpb25zIHRvIHVzZSBmb3IgcmVhZGluZyBzb3VyY2UgZmlsZS5cbiAqIEBwYXJhbSB3cml0ZU9wdGlvbnMgLSBPcHRpb25zIHRvIHVzZSBmb3Igd3JpdGluZyB0byB0YXJnZXQgZmlsZS5cbiAqIEByZXR1cm5zIERldGVybWluZWQgdGFyZ2V0IGZpbGUgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvcHlGaWxlID0gYXN5bmMgKFxuICAgIHNvdXJjZVBhdGg6IHN0cmluZyxcbiAgICB0YXJnZXRQYXRoOiBzdHJpbmcsXG4gICAgcmVhZE9wdGlvbnMgPSB7ZW5jb2Rpbmc6IG51bGwsIGZsYWc6ICdyJ30sXG4gICAgd3JpdGVPcHRpb25zID0ge2VuY29kaW5nOiBERUZBVUxUX0VOQ09ESU5HLCBmbGFnOiAndycsIG1vZGU6IDBvNjY2fVxuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBpZiAoIShiYXNlbmFtZSAmJiByZWFkRmlsZSAmJiByZXNvbHZlICYmIHdyaXRlRmlsZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgZmlsZXN5c3RlbSBmdW5jdGlvbnMuJylcblxuICAgIC8qXG4gICAgICAgIE5PVEU6IElmIHRhcmdldCBwYXRoIHJlZmVyZW5jZXMgYSBkaXJlY3RvcnkgYSBuZXcgZmlsZSB3aXRoIHRoZSBzYW1lXG4gICAgICAgIG5hbWUgd2lsbCBiZSBjcmVhdGVkLlxuICAgICovXG4gICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KHRhcmdldFBhdGgpKVxuICAgICAgICB0YXJnZXRQYXRoID0gcmVzb2x2ZSh0YXJnZXRQYXRoLCBiYXNlbmFtZShzb3VyY2VQYXRoKSlcblxuICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgICAgdGFyZ2V0UGF0aCwgYXdhaXQgcmVhZEZpbGUoc291cmNlUGF0aCwgcmVhZE9wdGlvbnMpLCB3cml0ZU9wdGlvbnNcbiAgICApXG5cbiAgICByZXR1cm4gdGFyZ2V0UGF0aFxufVxuLyoqXG4gKiBDb3BpZXMgZ2l2ZW4gc291cmNlIGZpbGUgdmlhIHBhdGggdG8gZ2l2ZW4gdGFyZ2V0IGRpcmVjdG9yeSBsb2NhdGlvbiB3aXRoXG4gKiBzYW1lIHRhcmdldCBuYW1lIGFzIHNvdXJjZSBmaWxlIGhhcyBvciBjb3B5IHRvIGdpdmVuIGNvbXBsZXRlIHRhcmdldCBmaWxlXG4gKiBwYXRoLlxuICogQHBhcmFtIHNvdXJjZVBhdGggLSBQYXRoIHRvIGZpbGUgdG8gY29weS5cbiAqIEBwYXJhbSB0YXJnZXRQYXRoIC0gVGFyZ2V0IGRpcmVjdG9yeSBvciBjb21wbGV0ZSBmaWxlIGxvY2F0aW9uIHRvIGNvcHkgdG8uXG4gKiBAcGFyYW0gcmVhZE9wdGlvbnMgLSBPcHRpb25zIHRvIHVzZSBmb3IgcmVhZGluZyBzb3VyY2UgZmlsZS5cbiAqIEBwYXJhbSB3cml0ZU9wdGlvbnMgLSBPcHRpb25zIHRvIHVzZSBmb3Igd3JpdGluZyB0byB0YXJnZXQgZmlsZS5cbiAqIEByZXR1cm5zIERldGVybWluZWQgdGFyZ2V0IGZpbGUgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvcHlGaWxlU3luYyA9IChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgdGFyZ2V0UGF0aDogc3RyaW5nLFxuICAgIHJlYWRPcHRpb25zID0ge2VuY29kaW5nOiBudWxsLCBmbGFnOiAncid9LFxuICAgIHdyaXRlT3B0aW9ucyA9IHtlbmNvZGluZzogREVGQVVMVF9FTkNPRElORywgZmxhZzogJ3cnLCBtb2RlOiAwbzY2Nn1cbik6IHN0cmluZyA9PiB7XG4gICAgaWYgKCEoYmFzZW5hbWUgJiYgcmVhZEZpbGVTeW5jICYmIHJlc29sdmUgJiYgd3JpdGVGaWxlU3luYykpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgZmlsZXN5c3RlbSBmdW5jdGlvbnMuJylcblxuICAgIC8qXG4gICAgICAgIE5PVEU6IElmIHRhcmdldCBwYXRoIHJlZmVyZW5jZXMgYSBkaXJlY3RvcnkgYSBuZXcgZmlsZSB3aXRoIHRoZSBzYW1lXG4gICAgICAgIG5hbWUgd2lsbCBiZSBjcmVhdGVkLlxuICAgICovXG4gICAgaWYgKGlzRGlyZWN0b3J5U3luYyh0YXJnZXRQYXRoKSlcbiAgICAgICAgdGFyZ2V0UGF0aCA9IHJlc29sdmUodGFyZ2V0UGF0aCwgYmFzZW5hbWUoc291cmNlUGF0aCkpXG5cbiAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICB0YXJnZXRQYXRoLCByZWFkRmlsZVN5bmMoc291cmNlUGF0aCwgcmVhZE9wdGlvbnMpLCB3cml0ZU9wdGlvbnNcbiAgICApXG5cbiAgICByZXR1cm4gdGFyZ2V0UGF0aFxufVxuLyoqXG4gKiBDaGVja3MgaWYgZ2l2ZW4gcGF0aCBwb2ludHMgdG8gYSB2YWxpZCBkaXJlY3RvcnkuXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBQYXRoIHRvIGRpcmVjdG9yeS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSBob2xkaW5nIGEgYm9vbGVhbiB3aGljaCBpbmRpY2F0ZXMgZGlyZWN0b3J5IGV4aXN0ZW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzRGlyZWN0b3J5ID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAoIXN0YXQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgZmlsZXN5c3RlbSBmdW5jdGlvbnMuJylcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgc3RhdChmaWxlUGF0aCkpLmlzRGlyZWN0b3J5KClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3IsICdjb2RlJykgJiZcbiAgICAgICAgICAgIFsnRU5PRU5UJywgJ0VOT1RESVInXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlIGFzIHN0cmluZ1xuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbn1cbi8qKlxuICogQ2hlY2tzIGlmIGdpdmVuIHBhdGggcG9pbnRzIHRvIGEgdmFsaWQgZGlyZWN0b3J5LlxuICogQHBhcmFtIGZpbGVQYXRoIC0gUGF0aCB0byBkaXJlY3RvcnkuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gd2hpY2ggaW5kaWNhdGVzIGRpcmVjdG9yeSBleGlzdGVuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0RpcmVjdG9yeVN5bmMgPSAoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghc3RhdFN5bmMpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgZmlsZXN5c3RlbSBmdW5jdGlvbnMuJylcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzdGF0U3luYyhmaWxlUGF0aCkuaXNEaXJlY3RvcnkoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlcnJvciwgJ2NvZGUnKSAmJlxuICAgICAgICAgICAgWydFTk9FTlQnLCAnRU5PVERJUiddLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgIChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgYXMgc3RyaW5nXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuLyoqXG4gKiBDaGVja3MgaWYgZ2l2ZW4gcGF0aCBwb2ludHMgdG8gYSB2YWxpZCBmaWxlLlxuICogQHBhcmFtIGZpbGVQYXRoIC0gUGF0aCB0byBkaXJlY3RvcnkuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgaG9sZGluZyBhIGJvb2xlYW4gd2hpY2ggaW5kaWNhdGVzIGRpcmVjdG9yeSBleGlzdGVuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGlmICghc3RhdClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBmaWxlc3lzdGVtIGZ1bmN0aW9ucy4nKVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBzdGF0KGZpbGVQYXRoKSkuaXNGaWxlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3IsICdjb2RlJykgJiZcbiAgICAgICAgICAgIFsnRU5PRU5UJywgJ0VOT1RESVInXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlIGFzIHN0cmluZ1xuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbn1cbi8qKlxuICogQ2hlY2tzIGlmIGdpdmVuIHBhdGggcG9pbnRzIHRvIGEgdmFsaWQgZmlsZS5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIFBhdGggdG8gZmlsZS5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiB3aGljaCBpbmRpY2F0ZXMgZmlsZSBleGlzdGVuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVTeW5jID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXN0YXRTeW5jKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGZpbGVzeXN0ZW0gZnVuY3Rpb25zLicpXG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAnY29kZScpICYmXG4gICAgICAgICAgICBbJ0VOT0VOVCcsICdFTk9URElSJ10uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSBhcyBzdHJpbmdcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59XG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggZ2l2ZW4gZGlyZWN0b3J5IHN0cnVjdHVyZSByZWN1cnNpdmVseSBhbmQgY2FsbHMgZ2l2ZW5cbiAqIGNhbGxiYWNrIGZvciBlYWNoIGZvdW5kIGZpbGUuIENhbGxiYWNrIGdldHMgZmlsZSBwYXRoIGFuZCBjb3JyZXNwb25kaW5nIHN0YXRcbiAqIG9iamVjdCBhcyBhcmd1bWVudC5cbiAqIEBwYXJhbSBkaXJlY3RvcnlQYXRoIC0gUGF0aCB0byBkaXJlY3Rvcnkgc3RydWN0dXJlIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gaW52b2tlIGZvciBlYWNoIHRyYXZlcnNlZCBmaWxlIGFuZCBwb3RlbnRpYWxseVxuICogbWFuaXB1bGF0ZSBmdXJ0aGVyIHRyYXZlcnNpbmcgaW4gYWxwaGFiZXRpY2FsIHNvcnRlZCBvcmRlci5cbiAqIElmIGl0IHJldHVybnMgXCJudWxsXCIgb3IgYSBwcm9taXNlIHJlc29sdmluZyB0byBcIm51bGxcIiwgbm8gZnVydGhlciBmaWxlc1xuICogd2lsbCBiZSB0cmF2ZXJzZWQgYWZ0ZXJ3YXJkLlxuICogSWYgaXQgaGFuZGxlcyBhIGRpcmVjdG9yeSBhbmQgcmV0dXJucyBcImZhbHNlXCIgb3IgYSBwcm9taXNlIHJlc29sdmluZyB0b1xuICogXCJmYWxzZVwiIG5vIHRyYXZlcnNpbmcgaW50byB0aGF0IGRpcmVjdG9yeSB3aWxsIG9jY3VyLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHVzZSBmb3IgbmVzdGVkIFwicmVhZGRpclwiIGNhbGxzLlxuICogQHJldHVybnMgQSBwcm9taXNlIGhvbGRpbmcgdGhlIGRldGVybWluZWQgZmlsZXMuXG4gKi9cbmV4cG9ydCBjb25zdCB3YWxrRGlyZWN0b3J5UmVjdXJzaXZlbHkgPSBhc3luYyAoXG4gICAgZGlyZWN0b3J5UGF0aDogc3RyaW5nLFxuICAgIGNhbGxiYWNrOiBudWxsIHwgKChmaWxlOiBGaWxlKSA9PiBGaWxlVHJhdmVyc2VSZXN1bHQpID0gbnVsbCxcbiAgICBvcHRpb25zOiAoXG4gICAgICAgIEVuY29kaW5nIHxcbiAgICAgICAgKE9iamVjdEVuY29kaW5nT3B0aW9ucyAmIHt3aXRoRmlsZVR5cGVzPzogZmFsc2U7IHJlY3Vyc2l2ZT86IGJvb2xlYW59KVxuICAgICkgPSBERUZBVUxUX0VOQ09ESU5HXG4pOiBQcm9taXNlPEFycmF5PEZpbGU+PiA9PiB7XG4gICAgaWYgKCEocmVhZGRpciAmJiByZXNvbHZlICYmIHN0YXQpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGZpbGVzeXN0ZW0gZnVuY3Rpb25zLicpXG5cbiAgICBjb25zdCBmaWxlczogQXJyYXk8RmlsZT4gPSBbXVxuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5RW50cnkgb2YgYXdhaXQgcmVhZGRpcihcbiAgICAgICAgZGlyZWN0b3J5UGF0aCxcbiAgICAgICAgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICB7ZW5jb2Rpbmc6IG9wdGlvbnMsIHdpdGhGaWxlVHlwZXM6IHRydWV9IDpcbiAgICAgICAgICAgIHsuLi5vcHRpb25zLCB3aXRoRmlsZVR5cGVzOiB0cnVlfVxuICAgICAgICApXG4gICAgKSkge1xuICAgICAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gcmVzb2x2ZShcbiAgICAgICAgICAgIGRpcmVjdG9yeVBhdGgsIGRpcmVjdG9yeUVudHJ5Lm5hbWVcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBmaWxlOiBGaWxlID0ge1xuICAgICAgICAgICAgZGlyZWN0b3J5UGF0aCxcbiAgICAgICAgICAgIGRpcmVjdG9yeUVudHJ5LFxuICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICBuYW1lOiBkaXJlY3RvcnlFbnRyeS5uYW1lLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBzdGF0czogbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpbGUuc3RhdHMgPSBhd2FpdCBzdGF0KGZpbGVQYXRoKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZmlsZS5lcnJvciA9IGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgZmlsZXMucHVzaChmaWxlKVxuICAgIH1cblxuICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgLypcbiAgICAgICAgICAgIE5PVEU6IERpcmVjdG9yaWVzIGFuZCBoYXZlIHRvIGJlIGl0ZXJhdGVkIGZpcnN0IHRvIGJlIGFibGUgdG9cbiAgICAgICAgICAgIGF2b2lkIGRlZXBlciB1bndhbnRlZCB0cmF2ZXJzaW5nLlxuICAgICAgICAqL1xuICAgICAgICBmaWxlcy5zb3J0KChmaXJzdEZpbGU6IEZpbGUsIHNlY29uZEZpbGU6IEZpbGUpOiAtMSB8IDB8MSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlyc3RGaWxlLnN0YXRzPy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlY29uZEZpbGUuc3RhdHM/LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNlY29uZEZpbGUuc3RhdHM/LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDFcblxuICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfSlcblxuICAgIGxldCBmaW5hbEZpbGVzOiBBcnJheTxGaWxlPiA9IFtdXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGZpbmFsRmlsZXMucHVzaChmaWxlKVxuXG4gICAgICAgIGxldCByZXN1bHQ6IEZpbGVUcmF2ZXJzZVJlc3VsdCA9XG4gICAgICAgICAgICBjYWxsYmFjayA/IGNhbGxiYWNrKGZpbGUpIDogdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmICd0aGVuJyBpbiByZXN1bHQpXG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZXN1bHRcblxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKVxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiBmaWxlLnN0YXRzPy5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgZmluYWxGaWxlcyA9IGZpbmFsRmlsZXMuY29uY2F0KFxuICAgICAgICAgICAgICAgIGF3YWl0IHdhbGtEaXJlY3RvcnlSZWN1cnNpdmVseShmaWxlLnBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKVxuICAgICAgICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBmaW5hbEZpbGVzXG59XG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggZ2l2ZW4gZGlyZWN0b3J5IHN0cnVjdHVyZSByZWN1cnNpdmVseSBhbmQgY2FsbHMgZ2l2ZW5cbiAqIGNhbGxiYWNrIGZvciBlYWNoIGZvdW5kIGZpbGUuIENhbGxiYWNrIGdldHMgZmlsZSBwYXRoIGFuZCBjb3JyZXNwb25kaW5nXG4gKiBzdGF0cyBvYmplY3QgYXMgYXJndW1lbnQuXG4gKiBAcGFyYW0gZGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gZGlyZWN0b3J5IHN0cnVjdHVyZSB0byB0cmF2ZXJzZS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCB0cmF2ZXJzZWQgZmlsZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB1c2UgZm9yIG5lc3RlZCBcInJlYWRkaXJcIiBjYWxscy5cbiAqIEByZXR1cm5zIERldGVybWluZWQgbGlzdCBpZiBhbGwgZmlsZXMuXG4gKi9cbmV4cG9ydCBjb25zdCB3YWxrRGlyZWN0b3J5UmVjdXJzaXZlbHlTeW5jID0gKFxuICAgIGRpcmVjdG9yeVBhdGg6IHN0cmluZyxcbiAgICBjYWxsYmFjazogQW55RnVuY3Rpb24gfCBudWxsID0gTk9PUCxcbiAgICBvcHRpb25zOiAoXG4gICAgICAgIEVuY29kaW5nIHxcbiAgICAgICAgKE9iamVjdEVuY29kaW5nT3B0aW9ucyAmIHt3aXRoRmlsZVR5cGVzPzogZmFsc2U7IHJlY3Vyc2l2ZT86IGJvb2xlYW59KVxuICAgICkgPSBERUZBVUxUX0VOQ09ESU5HXG4pOiBBcnJheTxGaWxlPiA9PiB7XG4gICAgaWYgKCEocmVhZGRpclN5bmMgJiYgcmVzb2x2ZSAmJiBzdGF0U3luYykpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgZmlsZXN5c3RlbSBmdW5jdGlvbnMuJylcblxuICAgIGNvbnN0IGZpbGVzOiBBcnJheTxGaWxlPiA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGRpcmVjdG9yeUVudHJ5IG9mIHJlYWRkaXJTeW5jKFxuICAgICAgICBkaXJlY3RvcnlQYXRoLFxuICAgICAgICB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAge2VuY29kaW5nOiBvcHRpb25zLCB3aXRoRmlsZVR5cGVzOiB0cnVlfSA6XG4gICAgICAgICAgICB7Li4ub3B0aW9ucywgd2l0aEZpbGVUeXBlczogdHJ1ZX1cbiAgICApKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoOiBzdHJpbmcgPVxuICAgICAgICAgICAgcmVzb2x2ZShkaXJlY3RvcnlQYXRoLCBkaXJlY3RvcnlFbnRyeS5uYW1lKVxuICAgICAgICBjb25zdCBmaWxlOiBGaWxlID0ge1xuICAgICAgICAgICAgZGlyZWN0b3J5UGF0aCxcbiAgICAgICAgICAgIGRpcmVjdG9yeUVudHJ5LFxuICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICBuYW1lOiBkaXJlY3RvcnlFbnRyeS5uYW1lLFxuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBzdGF0czogbnVsbFxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaWxlLnN0YXRzID0gc3RhdFN5bmMoZmlsZVBhdGgpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBmaWxlLmVycm9yID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uXG4gICAgICAgIH1cbiAgICAgICAgZmlsZXMucHVzaChmaWxlKVxuICAgIH1cblxuICAgIGxldCBmaW5hbEZpbGVzOiBBcnJheTxGaWxlPiA9IFtdXG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgLypcbiAgICAgICAgICAgIE5PVEU6IERpcmVjdG9yaWVzIGhhdmUgdG8gYmUgaXRlcmF0ZWQgZmlyc3QgdG8gcG90ZW50aWFsbHlcbiAgICAgICAgICAgIGF2b2lkIGRlZXBlciBpdGVyYXRpb25zLlxuICAgICAgICAqL1xuICAgICAgICBmaWxlcy5zb3J0KChmaXJzdEZpbGU6IEZpbGUsIHNlY29uZEZpbGU6IEZpbGUpOiBudW1iZXIgPT4ge1xuICAgICAgICAgICAgaWYgKGZpcnN0RmlsZS5zdGF0cz8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWNvbmRGaWxlLnN0YXRzPy5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWNvbmRGaWxlLnN0YXRzPy5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiAxXG5cbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH0pXG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBmaW5hbEZpbGVzLnB1c2goZmlsZSlcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB1bmtub3duID0gY2FsbGJhY2soZmlsZSlcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiBmaWxlLnN0YXRzPy5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgICAgIGZpbmFsRmlsZXMgPSBmaW5hbEZpbGVzLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0RpcmVjdG9yeVJlY3Vyc2l2ZWx5U3luYyhmaWxlLnBhdGgsIGNhbGxiYWNrLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaW5hbEZpbGVzXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWJBO0FBQUE7QUFxQ0EsU0FBUSxnQkFBZ0I7QUFDeEIsU0FBUSxJQUFJO0FBQ1osU0FBUSxjQUFjO0FBRXRCLE9BQU8sTUFBTSxPQUlaLEdBQUc7RUFDQSxFQUFFLEVBQUUsSUFBSTtFQUNSLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLElBQUksRUFBRTtBQUNWLENBQUM7QUFFRCxJQUFJLFNBQXNDO0FBQzFDLElBQUksV0FBMEM7QUFDOUMsSUFBSSxZQUE0QztBQUNoRCxJQUFJLFFBQW9DO0FBQ3hDLElBQUksYUFBOEM7QUFDbEQsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFzQixJQUFJLENBQUM7QUFDakUsZUFBZSxDQUFDLElBQUksQ0FBRSxNQUFNLElBQUs7RUFDN0IsT0FBTyxDQUFDLEVBQUUsR0FBRyxNQUFNO0VBRW5CLElBQUksTUFBTSxFQUFFO0lBQ1IsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTO0lBQzVCLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVztJQUNoQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVk7SUFDbEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRO0lBQzFCLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYTtFQUN4QyxDQUFDLE1BQU07SUFDSCxTQUFTLEdBQUcsSUFBSTtJQUNoQixXQUFXLEdBQUcsSUFBSTtJQUNsQixZQUFZLEdBQUcsSUFBSTtJQUNuQixRQUFRLEdBQUcsSUFBSTtJQUNmLGFBQWEsR0FBRyxJQUFJO0VBQ3hCO0FBQ0osQ0FBQyxDQUFDO0FBRUYsSUFBSSxLQUE4QjtBQUNsQyxJQUFJLE9BQWtDO0FBQ3RDLElBQUksUUFBb0M7QUFDeEMsSUFBSSxJQUE0QjtB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
package/dist/function.js CHANGED
@@ -1 +1,75 @@
1
- "use strict";if("undefined"!=typeof module&&null!==module&&"undefined"!==eval("typeof require")&&null!==eval("require")&&"main"in eval("require")&&"undefined"!==eval("typeof require.main")&&null!==eval("require.main")){var ORIGINAL_MAIN_MODULE=module;module!==eval("require.main")&&"paths"in module&&"paths"in eval("require.main")&&"undefined"!=typeof __dirname&&null!==__dirname&&(module.paths=eval("require.main.paths").concat(module.paths.filter(function(path){return eval("require.main.paths").includes(path)})))}if(null==window)var window="undefined"==typeof global||null===global?{}:global;!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r();else if("function"==typeof define&&define.amd)define([],r);else{var n=r();for(var t in n)("object"==typeof exports?exports:e)[t]=n[t]}}(this,function(){return function(){var e={d:function(r,n){for(var t in n)e.o(n,t)&&!e.o(r,t)&&Object.defineProperty(r,t,{enumerable:!0,get:n[t]})},o:function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},r={};function n(e,r){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,r){if(e){if("string"==typeof e)return t(e,r);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?t(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function t(e,r){(null==r||r>e.length)&&(r=e.length);for(var n=0,t=Array(r);n<r;n++)t[n]=e[n];return t}e.r(r),e.d(r,{getParameterNames:function(){return o},identity:function(){return i},invertArrayFilter:function(){return a}});var o=function(e){var r=("string"==typeof e?e:e.toString()).replace(/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,"");if(r.startsWith("class"))return o("function "+r.replace(/.*(constructor\([^)]+\))/m,"$1"));var t=/^function\s*[^(]*\(\s*([^)]*)\)/m.exec(r);null===t&&(t=/^[^(]*\(\s*([^)]*)\) *=>.*/m.exec(r)),null===t&&(t=/([^= ]+) *=>.*/m.exec(r));var i=[];if(t&&t.length>1&&t[1].trim().length){for(var a,u=n(t[1].split(","));!(a=u()).done;){var l=a.value;i.push(l.replace(/=.+$/g,"").trim())}return i}return i},i=function(e){return e},a=function(e){return function(r){if(Array.isArray(r)){for(var t=arguments.length,o=new Array(t>1?t-1:0),i=1;i<t;i++)o[i-1]=arguments[i];var a=e.apply(void 0,[r].concat(o)),u=[];if(a.length)for(var l,f=n(r);!(l=f()).done;){var c=l.value;a.includes(c)||u.push(c)}else u=r;return u}return r}};return r}()});
1
+ // #!/usr/bin/env babel-node
2
+ // -*- coding: utf-8 -*-
3
+ /** @module function */
4
+ 'use strict';
5
+
6
+ /* !
7
+ region header
8
+ [Project page](https://torben.website/clientnode)
9
+
10
+ Copyright Torben Sickert (info["~at~"]torben.website) 16.12.2012
11
+
12
+ License
13
+ -------
14
+
15
+ This library written by Torben Sickert stands under a creative commons
16
+ naming 3.0 unported license.
17
+ See https://creativecommons.org/licenses/by/3.0/deed.de
18
+ endregion
19
+ */
20
+ import "core-js/modules/es.array.includes.js";
21
+ import "core-js/modules/es.array.push.js";
22
+ /**
23
+ * Determines all parameter names from given callable (function or class,
24
+ * ...).
25
+ * @param callable - Function or function code to inspect.
26
+ * @returns List of parameter names.
27
+ */
28
+ export const getParameterNames = callable => {
29
+ const functionCode = (typeof callable === 'string' ? callable :
30
+ // Strip comments.
31
+ callable.toString()).replace(/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg, '');
32
+ if (functionCode.startsWith('class')) return getParameterNames('function ' + functionCode.replace(/.*(constructor\([^)]+\))/m, '$1'));
33
+
34
+ // Try classic function declaration.
35
+ let parameter = /^function\s*[^(]*\(\s*([^)]*)\)/m.exec(functionCode);
36
+ if (parameter === null)
37
+ // Try arrow function declaration.
38
+ parameter = /^[^(]*\(\s*([^)]*)\) *=>.*/m.exec(functionCode);
39
+ if (parameter === null)
40
+ // Try one argument and without brackets arrow function declaration.
41
+ parameter = /([^= ]+) *=>.*/m.exec(functionCode);
42
+ const names = [];
43
+ if (parameter && parameter.length > 1 && parameter[1].trim().length) {
44
+ for (const name of parameter[1].split(','))
45
+ // Remove default parameter values.
46
+ names.push(name.replace(/=.+$/g, '').trim());
47
+ return names;
48
+ }
49
+ return names;
50
+ };
51
+ /**
52
+ * Implements the identity function.
53
+ * @param value - A value to return.
54
+ * @returns Returns the given value.
55
+ */
56
+ export const identity = value => value;
57
+ /**
58
+ * Inverted filter helper to inverse each given filter.
59
+ * @param filter - A function that filters an array.
60
+ * @returns The inverted filter.
61
+ */
62
+ export const invertArrayFilter = filter => {
63
+ return (data, ...additionalParameter) => {
64
+ if (Array.isArray(data)) {
65
+ const filteredData = filter(data, ...additionalParameter);
66
+ let result = [];
67
+ if (filteredData.length) {
68
+ for (const date of data) if (!filteredData.includes(date)) result.push(date);
69
+ } else result = data;
70
+ return result;
71
+ }
72
+ return data;
73
+ };
74
+ };
75
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2Z1bmN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vICMhL3Vzci9iaW4vZW52IGJhYmVsLW5vZGVcbi8vIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLVxuLyoqIEBtb2R1bGUgZnVuY3Rpb24gKi9cbid1c2Ugc3RyaWN0J1xuLyogIVxuICAgIHJlZ2lvbiBoZWFkZXJcbiAgICBbUHJvamVjdCBwYWdlXShodHRwczovL3RvcmJlbi53ZWJzaXRlL2NsaWVudG5vZGUpXG5cbiAgICBDb3B5cmlnaHQgVG9yYmVuIFNpY2tlcnQgKGluZm9bXCJ+YXR+XCJddG9yYmVuLndlYnNpdGUpIDE2LjEyLjIwMTJcblxuICAgIExpY2Vuc2VcbiAgICAtLS0tLS0tXG5cbiAgICBUaGlzIGxpYnJhcnkgd3JpdHRlbiBieSBUb3JiZW4gU2lja2VydCBzdGFuZHMgdW5kZXIgYSBjcmVhdGl2ZSBjb21tb25zXG4gICAgbmFtaW5nIDMuMCB1bnBvcnRlZCBsaWNlbnNlLlxuICAgIFNlZSBodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wL2RlZWQuZGVcbiAgICBlbmRyZWdpb25cbiovXG5pbXBvcnQgdHlwZSB7QW55RnVuY3Rpb24sIEFycmF5VHJhbnNmb3JtZXJ9IGZyb20gJy4vdHlwZSdcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGFsbCBwYXJhbWV0ZXIgbmFtZXMgZnJvbSBnaXZlbiBjYWxsYWJsZSAoZnVuY3Rpb24gb3IgY2xhc3MsXG4gKiAuLi4pLlxuICogQHBhcmFtIGNhbGxhYmxlIC0gRnVuY3Rpb24gb3IgZnVuY3Rpb24gY29kZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgTGlzdCBvZiBwYXJhbWV0ZXIgbmFtZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQYXJhbWV0ZXJOYW1lcyA9IChcbiAgICBjYWxsYWJsZTogQW55RnVuY3Rpb24gfCBzdHJpbmdcbik6IEFycmF5PHN0cmluZz4gPT4ge1xuICAgIGNvbnN0IGZ1bmN0aW9uQ29kZTogc3RyaW5nID0gKFxuICAgICAgICAodHlwZW9mIGNhbGxhYmxlID09PSAnc3RyaW5nJykgP1xuICAgICAgICAgICAgY2FsbGFibGUgOlxuICAgICAgICAgICAgLy8gU3RyaXAgY29tbWVudHMuXG4gICAgICAgICAgICBjYWxsYWJsZS50b1N0cmluZygpXG4gICAgKS5yZXBsYWNlKC8oKFxcL1xcLy4qJCl8KFxcL1xcKltcXHNcXFNdKj9cXCpcXC8pKS9tZywgJycpXG5cbiAgICBpZiAoZnVuY3Rpb25Db2RlLnN0YXJ0c1dpdGgoJ2NsYXNzJykpXG4gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJOYW1lcyhcbiAgICAgICAgICAgICdmdW5jdGlvbiAnICtcbiAgICAgICAgICAgIGZ1bmN0aW9uQ29kZS5yZXBsYWNlKC8uKihjb25zdHJ1Y3RvclxcKFteKV0rXFwpKS9tLCAnJDEnKVxuICAgICAgICApXG5cbiAgICAvLyBUcnkgY2xhc3NpYyBmdW5jdGlvbiBkZWNsYXJhdGlvbi5cbiAgICBsZXQgcGFyYW1ldGVyOiBBcnJheTxzdHJpbmc+IHwgbnVsbCA9XG4gICAgICAgIC9eZnVuY3Rpb25cXHMqW14oXSpcXChcXHMqKFteKV0qKVxcKS9tLmV4ZWMoZnVuY3Rpb25Db2RlKVxuICAgIGlmIChwYXJhbWV0ZXIgPT09IG51bGwpXG4gICAgICAgIC8vIFRyeSBhcnJvdyBmdW5jdGlvbiBkZWNsYXJhdGlvbi5cbiAgICAgICAgcGFyYW1ldGVyID0gL15bXihdKlxcKFxccyooW14pXSopXFwpICo9Pi4qL20uZXhlYyhmdW5jdGlvbkNvZGUpXG4gICAgaWYgKHBhcmFtZXRlciA9PT0gbnVsbClcbiAgICAgICAgLy8gVHJ5IG9uZSBhcmd1bWVudCBhbmQgd2l0aG91dCBicmFja2V0cyBhcnJvdyBmdW5jdGlvbiBkZWNsYXJhdGlvbi5cbiAgICAgICAgcGFyYW1ldGVyID0gLyhbXj0gXSspICo9Pi4qL20uZXhlYyhmdW5jdGlvbkNvZGUpXG5cbiAgICBjb25zdCBuYW1lczogQXJyYXk8c3RyaW5nPiA9IFtdXG4gICAgaWYgKHBhcmFtZXRlciAmJiBwYXJhbWV0ZXIubGVuZ3RoID4gMSAmJiBwYXJhbWV0ZXJbMV0udHJpbSgpLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcGFyYW1ldGVyWzFdLnNwbGl0KCcsJykpXG4gICAgICAgICAgICAvLyBSZW1vdmUgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzLlxuICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lLnJlcGxhY2UoLz0uKyQvZywgJycpLnRyaW0oKSlcbiAgICAgICAgcmV0dXJuIG5hbWVzXG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWVzXG59XG4vKipcbiAqIEltcGxlbWVudHMgdGhlIGlkZW50aXR5IGZ1bmN0aW9uLlxuICogQHBhcmFtIHZhbHVlIC0gQSB2YWx1ZSB0byByZXR1cm4uXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBnaXZlbiB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlkZW50aXR5ID0gPFQ+KHZhbHVlOiBUKTogVCA9PiB2YWx1ZVxuLyoqXG4gKiBJbnZlcnRlZCBmaWx0ZXIgaGVscGVyIHRvIGludmVyc2UgZWFjaCBnaXZlbiBmaWx0ZXIuXG4gKiBAcGFyYW0gZmlsdGVyIC0gQSBmdW5jdGlvbiB0aGF0IGZpbHRlcnMgYW4gYXJyYXkuXG4gKiBAcmV0dXJucyBUaGUgaW52ZXJ0ZWQgZmlsdGVyLlxuICovXG5leHBvcnQgY29uc3QgaW52ZXJ0QXJyYXlGaWx0ZXIgPSA8VCwgRCA9IEFycmF5PHVua25vd24+PihmaWx0ZXI6IFQpOiBUID0+IHtcbiAgICByZXR1cm4gKChkYXRhOiBELCAuLi5hZGRpdGlvbmFsUGFyYW1ldGVyOiBBcnJheTx1bmtub3duPik6IEQgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWREYXRhOiBBcnJheTx1bmtub3duPiA9IChcbiAgICAgICAgICAgICAgICBmaWx0ZXIgYXMgdW5rbm93biBhcyBBcnJheVRyYW5zZm9ybWVyXG4gICAgICAgICAgICApKGRhdGEsIC4uLmFkZGl0aW9uYWxQYXJhbWV0ZXIpXG5cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBbXSBhcyBEXG4gICAgICAgICAgICBpZiAoZmlsdGVyZWREYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0ZSBvZiBkYXRhKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbHRlcmVkRGF0YS5pbmNsdWRlcyhkYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQgYXMgQXJyYXk8dW5rbm93bj4pLnB1c2goZGF0ZSlcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGFcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9KSBhcyB1bmtub3duIGFzIFRcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTs7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBYkE7QUFBQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU0saUJBQWlCLEdBQzFCLFFBQThCLElBQ2Q7RUFDaEIsTUFBTSxZQUFvQixHQUFHLENBQ3hCLE9BQU8sUUFBUSxLQUFLLFFBQVEsR0FDekIsUUFBUTtFQUNSO0VBQ0EsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQ3pCLE9BQU8sQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLENBQUM7RUFFakQsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUNoQyxPQUFPLGlCQUFpQixDQUNwQixXQUFXLEdBQ1gsWUFBWSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQzFELENBQUM7O0VBRUw7RUFDQSxJQUFJLFNBQStCLEdBQy9CLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7RUFDekQsSUFBSSxTQUFTLEtBQUssSUFBSTtJQUNsQjtJQUNBLFNBQVMsR0FBRyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO0VBQ2hFLElBQUksU0FBUyxLQUFLLElBQUk7SUFDbEI7SUFDQSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztFQUVwRCxNQUFNLEtBQW9CLEdBQUcsRUFBRTtFQUMvQixJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7SUFDakUsS0FBSyxNQUFNLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUN0QztJQUNBLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoRCxPQUFPLEtBQUs7RUFDaEI7RUFFQSxPQUFPLEtBQUs7QUFDaEIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU0sUUFBUSxHQUFPLEtBQVEsSUFBUSxLQUFLO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU0saUJBQWlCLEdBQTJCLE1BQVMsSUFBUTtFQUN0RSxPQUFRLENBQUMsSUFBTyxFQUFFLEdBQUcsbUJBQW1DLEtBQVE7SUFDNUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO01BQ3JCLE1BQU0sWUFBNEIsR0FDOUIsTUFBTSxDQUNSLElBQUksRUFBRSxHQUFHLG1CQUFtQixDQUFDO01BRS9CLElBQUksTUFBTSxHQUFHLEVBQU87TUFDcEIsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFO1FBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFDM0IsTUFBTSxDQUFvQixJQUFJLENBQUMsSUFBSSxDQUFDO01BQ2pELENBQUMsTUFDRyxNQUFNLEdBQUcsSUFBSTtNQUVqQixPQUFPLE1BQU07SUFDakI7SUFFQSxPQUFPLElBQUk7RUFDZixDQUFDO0FBQ0wsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==