clientnode 4.0.1428 → 4.0.1430

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 -22
  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
package/dist/string.js CHANGED
@@ -1 +1,806 @@
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/construct"),require("@babel/runtime/helpers/asyncToGenerator"),require("@babel/runtime/regenerator"));else if("function"==typeof define&&define.amd)define(["@babel/runtime/helpers/extends","@babel/runtime/helpers/construct","@babel/runtime/helpers/asyncToGenerator","@babel/runtime/regenerator"],r);else{var t="object"==typeof exports?r(require("@babel/runtime/helpers/extends"),require("@babel/runtime/helpers/construct"),require("@babel/runtime/helpers/asyncToGenerator"),require("@babel/runtime/regenerator")):r(e["@babel/runtime/helpers/extends"],e["@babel/runtime/helpers/construct"],e["@babel/runtime/helpers/asyncToGenerator"],e["@babel/runtime/regenerator"]);for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(this,function(__WEBPACK_EXTERNAL_MODULE__3__,__WEBPACK_EXTERNAL_MODULE__13__,__WEBPACK_EXTERNAL_MODULE__11__,__WEBPACK_EXTERNAL_MODULE__12__){return function(){var __webpack_modules__=[function(e,r,t){t.d(r,{ABBREVIATIONS:function(){return o},CLASS_TO_TYPE_MAPPING:function(){return a},DEFAULT_ENCODING:function(){return n},SPECIAL_REGEX_SEQUENCES:function(){return i}});var n="utf8",o=(Symbol.for("clientnodeValue"),Symbol.for("clientnodeIgnoreNullAndUndefined"),["html","id","url","us","de","api","href"]),a={"[object Array]":"array","[object Boolean]":"boolean","[object Date]":"date","[object Error]":"error","[object Function]":"function","[object Map]":"map","[object Number]":"number","[object Object]":"object","[object RegExp]":"regexp","[object Set]":"set","[object String]":"string"},i=(Object.prototype,["-","[","]","(",")","^","$","*","+",".","{","}"])},function(e,r,t){t.d(r,{MAXIMAL_NUMBER_OF_ITERATIONS:function(){return _},globalContext:function(){return i}});var n,o,a=t(5);e=t.hmd(e);var i="undefined"==typeof globalThis?void 0===window?void 0===t.g?e:Object.prototype.hasOwnProperty.call(t.g,"window")?t.g.window:t.g:window:globalThis;i.fetch=i.fetch?i.fetch.bind(i):null!==(n=null==(o=(0,a.optionalRequire)("node-fetch"))?void 0:o.default)&&void 0!==n?n:function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];return a.currentImport?(0,a.currentImport)("node-fetch").then(function(e){var t;return(t=e).default.apply(t,r)}):null};var _={value:100}},function(__unused_webpack_module,__webpack_exports__,__webpack_require__){var _extends,VALUE_COPY_SYMBOL,IGNORE_NULL_AND_UNDEFINED_SYMBOL,isMap,isSet,isObject,isPlainObject,isFunction,isProxy,isNotANumber,evaluate,escapeRegularExpressions;__webpack_require__.d(__webpack_exports__,{determineType:function(){return determineType},represent:function(){return _represent}});var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(3),_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__),_constants__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(0),_indicators__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(4);function _createForOfIteratorHelperLoose(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=_unsupportedIterableToArray(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}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 _unsupportedIterableToArray(e,r){if(e){if("string"==typeof e)return _arrayLikeToArray(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(e,r):void 0}}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}var _addDynamicGetterAndSetter=function(e,r,t,n,o,a){if(void 0===r&&(r=null),void 0===t&&(t=null),void 0===n&&(n={}),void 0===o&&(o=!0),void 0===a&&(a=[Object]),o&&"object"==typeof e)if(Array.isArray(e))for(var i,_=0,l=_createForOfIteratorHelperLoose(e);!(i=l()).done;){var u=i.value;e[_]=_addDynamicGetterAndSetter(u,r,t,n,o),_+=1}else if(isMap(e))for(var s,c=_createForOfIteratorHelperLoose(e);!(s=c()).done;){var f=s.value,p=f[0],d=f[1];e.set(p,_addDynamicGetterAndSetter(d,r,t,n,o))}else if(isSet(e)){for(var v,b=[],O=_createForOfIteratorHelperLoose(e);!(v=O()).done;){var g=v.value;e.delete(g),b.push(_addDynamicGetterAndSetter(g,r,t,n,o))}for(var E=0,m=b;E<m.length;E++){var y=m[E];e.add(y)}}else if(null!==e)for(var h=0,A=Object.entries(e);h<A.length;h++){var P=A[h],L=P[0],I=P[1];e[L]=_addDynamicGetterAndSetter(I,r,t,n,o)}if(r||t)for(var M,x,R=function(){var o=x.value;if(isObject(e)&&e instanceof o){var a=getProxyHandler(e,n),i=getProxyHandler(e,n);r&&(i.get=function(t,n){return"__target__"===n?e:"__revoke__"===n?function(){return u(),e}:"function"==typeof e[n]?e[n]:r(a.get(l,n),n,e)}),t&&(i.set=function(r,n,o){return a.set(l,n,t(n,o,e))});var _=Proxy.revocable({},i),l=_.proxy,u=_.revoke;return{v:l}}},D=_createForOfIteratorHelperLoose(a);!(x=D()).done;)if(M=R())return M.v;return e},convertCircularObjectToJSON=function(e,r,t){void 0===r&&(r=function(e){return null!=e?e:"__circularReference__"}),void 0===t&&(t=0);var n=new Map;return function(e){var o=function(e,t){if(isObject(t)){var a,i;if(n.has(t))return r(null!==(a=n.get(t))&&void 0!==a?a:null,e,t,n);if(n.set(t,null),Array.isArray(t)){i=[];for(var _,l=_createForOfIteratorHelperLoose(t);!(_=l()).done;){var u=_.value;i.push(o(null,u))}}else{i={};for(var s=0,c=Object.entries(t);s<c.length;s++){var f=c[s],p=f[0],d=f[1];i[p]=o(p,d)}}return n.set(t,i),i}return t};return JSON.stringify(e,o,t)}(e)},_convertMapToPlainObject=function(e,r){if(void 0===r&&(r=!0),"object"==typeof e){if(isMap(e)){for(var t,n={},o=_createForOfIteratorHelperLoose(e);!(t=o()).done;){var a=t.value,i=a[0],_=a[1];r&&(_=_convertMapToPlainObject(_,r)),["number","string"].includes(typeof i)&&(n[String(i)]=_)}return n}if(r)if(isPlainObject(e))for(var l=0,u=Object.entries(e);l<u.length;l++){var s=u[l],c=s[0],f=s[1];e[c]=_convertMapToPlainObject(f,r)}else if(Array.isArray(e))for(var p=0,d=0,v=e;d<v.length;d++){var b=v[d];e[p]=_convertMapToPlainObject(b,r),p+=1}else if(isSet(e)){for(var O,g=[],E=_createForOfIteratorHelperLoose(e);!(O=E()).done;){var m=O.value;e.delete(m),g.push(_convertMapToPlainObject(m,r))}for(var y=0,h=g;y<h.length;y++){var A=h[y];e.add(A)}}}return e},_convertPlainObjectToMap=function(e,r){if(void 0===r&&(r=!0),"object"==typeof e){if(isPlainObject(e)){for(var t=new Map,n=0,o=Object.entries(e);n<o.length;n++){var a=o[n],i=a[0],_=a[1];r&&(e[i]=_convertPlainObjectToMap(_,r)),t.set(i,e[i])}return t}if(r)if(Array.isArray(e))for(var l=0,u=0,s=e;u<s.length;u++){var c=s[u];e[l]=_convertPlainObjectToMap(c,r),l+=1}else if(isMap(e))for(var f,p=_createForOfIteratorHelperLoose(e);!(f=p()).done;){var d=f.value,v=d[0],b=d[1];e.set(v,_convertPlainObjectToMap(b,r))}else if(isSet(e)){for(var O,g=[],E=_createForOfIteratorHelperLoose(e);!(O=E()).done;){var m=O.value;e.delete(m),g.push(_convertPlainObjectToMap(m,r))}for(var y=0,h=g;y<h.length;y++){var A=h[y];e.add(A)}}}return e},_convertSubstringInPlainObject=function(e,r,t){for(var n=0,o=Object.entries(e);n<o.length;n++){var a=o[n],i=a[0],_=a[1];isPlainObject(_)?e[i]=_convertSubstringInPlainObject(_,r,t):"string"==typeof _&&(e[i]=_.replace(r,t))}return e},_copy=function(e,r,t,n,o,a,i,_){if(void 0===r&&(r=!1),void 0===t&&(t=-1),void 0===n&&(n=VALUE_COPY_SYMBOL),void 0===o&&(o=null),void 0===a&&(a=!1),void 0===i&&(i=[]),void 0===_&&(_=0),isObject(e)){if(!o){if(Array.isArray(e))return _copy(e,r,t,n,[],a,i,_);if(e instanceof Map)return _copy(e,r,t,n,new Map,a,i,_);if(e instanceof Set)return _copy(e,r,t,n,new Set,a,i,_);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp){var l=/[^/]*$/.exec(e.toString());return(o=new RegExp(e.source,l?l[0]:void 0)).lastIndex=e.lastIndex,o}return"undefined"!=typeof Blob&&e instanceof Blob?r?e.slice(0,e.size,e.type):e:_copy(e,r,t,n,{},a,i,_)}if(e===o)throw new Error("Can't copy because source and destination are identical.");if(!a&&![void 0,null].includes(e)){var u=i.indexOf(e);if(-1!==u)return i[u];i.push(e)}var s=function(e){if(-1!==t&&t<_+1)return n===VALUE_COPY_SYMBOL?e:n;var o=_copy(e,r,t,n,null,a,i,_+1);return a||[void 0,null].includes(e)||"object"!=typeof e||i.push(e),o};if(Array.isArray(e))for(var c,f=_createForOfIteratorHelperLoose(e);!(c=f()).done;){var p=c.value;o.push(s(p))}else if(e instanceof Map)for(var d,v=_createForOfIteratorHelperLoose(e);!(d=v()).done;){var b=d.value,O=b[0],g=b[1];o.set(O,s(g))}else if(e instanceof Set)for(var E,m=_createForOfIteratorHelperLoose(e);!(E=m()).done;){var y=E.value;o.add(s(y))}else for(var h=0,A=Object.entries(e);h<A.length;h++){var P=A[h],L=P[0],I=P[1];try{o[L]=s(I)}catch(e){throw new Error('Failed to copy property value object "'+L+'": '+_represent(e),{cause:e})}}}return o||e},determineType=function(e){if([null,void 0].includes(e))return String(e);var r=typeof e;if(["function","object"].includes(r)&&"toString"in e){var t=Object.prototype.toString.call(e);if(Object.prototype.hasOwnProperty.call(_constants__WEBPACK_IMPORTED_MODULE_1__.CLASS_TO_TYPE_MAPPING,t))return _constants__WEBPACK_IMPORTED_MODULE_1__.CLASS_TO_TYPE_MAPPING[t]}return r},_equals=function equals(firstValue,secondValue,givenOptions){void 0===givenOptions&&(givenOptions={});var options=_extends({compareBlobs:!1,deep:-1,exceptionPrefixes:[],ignoreFunctions:!0,properties:null,returnReasonIfNotEqual:!1},givenOptions);if(options.ignoreFunctions&&isFunction(firstValue)&&isFunction(secondValue)||firstValue===secondValue||isNotANumber(firstValue)&&isNotANumber(secondValue)||firstValue instanceof RegExp&&secondValue instanceof RegExp&&firstValue.toString()===secondValue.toString()&&firstValue.flags.split("").sort().join("")===secondValue.flags.split("").sort().join("")||firstValue instanceof Date&&secondValue instanceof Date&&(isNaN(firstValue.getTime())&&isNaN(secondValue.getTime())||!isNaN(firstValue.getTime())&&!isNaN(secondValue.getTime())&&firstValue.getTime()===secondValue.getTime())||options.compareBlobs&&"undefined"!==eval("typeof Buffer")&&Object.prototype.hasOwnProperty.call(eval("Buffer"),"isBuffer")&&firstValue instanceof eval("Buffer")&&secondValue instanceof eval("Buffer")&&firstValue.toString("base64")===secondValue.toString("base64"))return!0;if(options.compareBlobs&&"undefined"!=typeof Blob&&firstValue instanceof Blob&&secondValue instanceof Blob)return new Promise(function(e){for(var r=[],t=0,n=[firstValue,secondValue];t<n.length;t++){var o=n[t],a=new FileReader;a.onload=function(t){null===t.target?r.push(null):r.push(t.target.result),2===r.length&&(r[0]===r[1]?e(!0):e(!!options.returnReasonIfNotEqual&&">>> Blob("+_represent(r[0])+") !== Blob("+_represent(r[1])+")"))},a.readAsDataURL(o)}});if(isPlainObject(firstValue)&&isPlainObject(secondValue)&&!(firstValue instanceof RegExp||secondValue instanceof RegExp)||Array.isArray(firstValue)&&Array.isArray(secondValue)&&firstValue.length===secondValue.length||determineType(firstValue)===determineType(secondValue)&&["map","set"].includes(determineType(firstValue))&&firstValue.size===secondValue.size){for(var promises=[],_i11=0,_arr4=[[firstValue,secondValue],[secondValue,firstValue]];_i11<_arr4.length;_i11++){var _arr4$_i=_arr4[_i11],first=_arr4$_i[0],second=_arr4$_i[1],firstIsArray=Array.isArray(first);if(firstIsArray&&(!Array.isArray(second)||first.length!==second.length))return!!options.returnReasonIfNotEqual&&".length";var firstIsMap=isMap(first);if(firstIsMap&&(!isMap(second)||first.size!==second.size))return!!options.returnReasonIfNotEqual&&".size";var firstIsSet=isSet(first);if(firstIsSet&&(!isSet(second)||first.size!==second.size))return!!options.returnReasonIfNotEqual&&".size";if(firstIsArray){for(var index=0,_loop2=function(){var e=_arr5[_i12];if(0!==options.deep){var r=_equals(e,second[index],_extends({},options,{deep:options.deep-1}));if(!r)return{v:!1};var t=index,n=function(e){var r;return"string"==typeof e?"["+String(t)+"]"+(null!==(r={"[":"",">":" "}[e[0]])&&void 0!==r?r:".")+e:e};if(Object.prototype.hasOwnProperty.call(r,"then")&&promises.push(r.then(n)),"string"==typeof r)return{v:n(r)}}index+=1},_ret2,_i12=0,_arr5=first;_i12<_arr5.length;_i12++)if(_ret2=_loop2(),_ret2)return _ret2.v}else if(firstIsMap){for(var _loop3=function(){var e=_step11.value,r=e[0],t=e[1];if(0!==options.deep){var n=_equals(t,second.get(r),_extends({},options,{deep:options.deep-1}));if(!n)return{v:!1};var o=function(e){var t;return"string"==typeof e?"get("+_represent(r)+")"+(null!==(t={"[":"",">":" "}[e[0]])&&void 0!==t?t:".")+e:e};if(Object.prototype.hasOwnProperty.call(n,"then")&&promises.push(n.then(o)),"string"==typeof n)return{v:o(n)}}},_ret3,_iterator11=_createForOfIteratorHelperLoose(first),_step11;!(_step11=_iterator11()).done;)if(_ret3=_loop3(),_ret3)return _ret3.v}else if(firstIsSet){for(var _loop4=function(){var e=_step12.value;if(0!==options.deep){for(var r,t=!1,n=[],o=_createForOfIteratorHelperLoose(second);!(r=o()).done;){var a=r.value,i=_equals(e,a,_extends({},options,{deep:options.deep-1}));if("boolean"==typeof i){if(i){t=!0;break}}else n.push(i)}var _=function(r){return!!r||!!options.returnReasonIfNotEqual&&">>> {-> "+_represent(e)+" not found}"};return t?0:(n.length&&promises.push(new Promise(function(e){Promise.all(n).then(function(r){e(_(r.some(function(e){return e})))},function(){})})),{v:_(!1)})}},_ret4,_iterator12=_createForOfIteratorHelperLoose(first),_step12;!(_step12=_iterator12()).done;)if(_ret4=_loop4(),0!==_ret4&&_ret4)return _ret4.v}else for(var _loop5=function(){var e=_Object$entries7[_i13],r=e[0],t=e[1];if(options.properties&&!options.properties.includes(r))return 0;for(var n,o=!1,a=_createForOfIteratorHelperLoose(options.exceptionPrefixes);!(n=a()).done;){var i=n.value;if(r.startsWith(i)){o=!0;break}}if(o)return 0;if(0!==options.deep){var _=_equals(t,second[r],_extends({},options,{deep:options.deep-1}));if(!_)return{v:!1};var l=function(e){var t;return"string"==typeof e?r+(null!==(t={"[":"",">":" "}[e[0]])&&void 0!==t?t:".")+e:e};if(Object.prototype.hasOwnProperty.call(_,"then")&&promises.push(_.then(l)),"string"==typeof _)return{v:l(_)}}},_ret5,_i13=0,_Object$entries7=Object.entries(first);_i13<_Object$entries7.length&&(_ret5=_loop5(),0!==_ret5);_i13++)if(_ret5)return _ret5.v}return!promises.length||new Promise(function(e){Promise.all(promises).then(function(r){for(var t,n=_createForOfIteratorHelperLoose(r);!(t=n()).done;){var o=t.value;if(!o||"string"==typeof o){e(o);break}}e(!0)},function(){})})}return!!options.returnReasonIfNotEqual&&">>> "+_represent(firstValue)+" !== "+_represent(secondValue)},evaluateDynamicData=function(e,r,t,n,o){if(void 0===r&&(r={}),void 0===t&&(t="self"),void 0===n&&(n="__evaluate__"),void 0===o&&(o="__execute__"),"object"!=typeof e||null===e)return e;t in r||(r[t]=e);var a=function(e,t){void 0===t&&(t=n);var a=evaluate(e,r,t===o);if(a.error)throw new Error(a.error);return a.result},i=function(e){if("object"!=typeof e||null===e||"undefined"==typeof Proxy)return e;for(var r=0,t=Object.entries(e);r<t.length;r++){var l=t[r],u=l[0],s=l[1];if("__target__"!==u&&isObject(s)){var c=s;if(i(c),Object.prototype.hasOwnProperty.call(c,n)||Object.prototype.hasOwnProperty.call(c,o)){var f=c;e[u]=new Proxy(c,{get:function(e,r){if("__target__"===r)return e;if("hasOwnProperty"===r)return e[r];for(var t=0,i=[n,o];t<i.length;t++){var l=i[t];if(r===l&&"string"==typeof e[r])return _(a(e[r],l))}var u=_(e);if("toString"===r){var s=a(u);return s[r].bind(s)}if("string"!=typeof r){var c,f=a(u);return null!=(c=f[r])&&c.bind?f[r].bind(f):f[r]}for(var p=0,d=[n,o];p<d.length;p++){var v=d[p];if(Object.prototype.hasOwnProperty.call(e,v))return a(u,v)[r]}return u[r]},ownKeys:function(e){for(var r=0,t=[n,o];r<t.length;r++){var i=t[r];if(Object.prototype.hasOwnProperty.call(e,i))return Object.getOwnPropertyNames(_(a(e[i],i)))}return Object.getOwnPropertyNames(e)}}),e[u].__target__||(e[u].__target__=f)}}}return e},_=function(e){if(isObject(e)){if(isProxy(e)){for(var r=0,t=[n,o];r<t.length;r++){var i=t[r];if(Object.prototype.hasOwnProperty.call(e,i))return e[i]}e=e.__target__}for(var l=0,u=Object.entries(e);l<u.length;l++){var s=u[l],c=s[0],f=s[1];if([n,o].includes(c))return"undefined"==typeof Proxy?_(a(f)):f;e[c]=_(f)}}return e};r.resolve=_;var l=function(e){if(isObject(e))for(var r=0,t=Object.entries(e);r<t.length;r++){var n=t[r],o=n[0],a=n[1];if("__target__"!==o&&null!==a&&["function","undefined"].includes(typeof a)){var i=a.__target__;void 0!==i&&(e[o]=i),l(a)}}return e};return Object.prototype.hasOwnProperty.call(e,n)?a(e[n]):Object.prototype.hasOwnProperty.call(e,o)?a(e[o],o):l(_(i(e)))},_removeKeysInEvaluation=function(e,r){void 0===r&&(r=["__evaluate__","__execute__"]);for(var t=0,n=Object.entries(e);t<n.length;t++){var o=n[t],a=o[0],i=o[1];!r.includes(a)&&r.some(function(r){return Object.prototype.hasOwnProperty.call(e,r)})?delete e[a]:isPlainObject(i)&&_removeKeysInEvaluation(i,r)}return e},_extend=function(e,r){for(var t=!1,n=arguments.length,o=new Array(n>2?n-2:0),a=2;a<n;a++)o[a-2]=arguments[a];var i,_=o;e===IGNORE_NULL_AND_UNDEFINED_SYMBOL||"boolean"==typeof e?(t=e,i=r):(i=e,isObject(r)?_=[r].concat(_):void 0!==r&&(i=r));for(var l,u=function(e,r){return r===e?e:t&&r&&(isPlainObject(r)||isMap(r))?(n=isMap(r)?e&&isMap(e)?e:new Map:e&&isPlainObject(e)?e:{},_extend(t,n,r)):r;var n},s=_createForOfIteratorHelperLoose(_);!(l=s()).done;){var c=l.value,f=typeof i,p=typeof c;if(isMap(i)&&(f+=" Map"),isMap(c)&&(p+=" Map"),f===p&&i!==c)if(isMap(i)&&isMap(c))for(var d,v=_createForOfIteratorHelperLoose(c);!(d=v()).done;){var b=d.value,O=b[0],g=b[1];i.set(O,u(i.get(O),g))}else if(!isObject(i)||Array.isArray(i)||"undefined"!=typeof Blob&&i instanceof Blob||!isObject(c)||Array.isArray(c)||"undefined"!=typeof Blob&&c instanceof Blob)i=c;else for(var E=0,m=Object.entries(c);E<m.length;E++){var y=m[E],h=y[0],A=y[1];t===IGNORE_NULL_AND_UNDEFINED_SYMBOL&&[null,void 0].includes(A)||(i[h]=u(i[h],A))}else i=c}return i},getProxyHandler=function(e,r){return void 0===r&&(r={}),r=_extends({delete:"[]",get:"[]",has:"[]",set:"[]"},r),{deleteProperty:function(t,n){return"[]"!==r.delete||"string"!=typeof n?e[r.delete](n):(delete e[n],!0)},get:function(t,n){return"[]"===r.get&&"string"==typeof n?e[n]:e[r.get](n)},has:function(t,n){return"[]"===r.has?n in e:e[r.has](n)},set:function(t,n,o){return"[]"!==r.set||"string"!=typeof n?e[r.set](n,o):(e[n]=o,!0)}}},_mask=function(e,r){if(!0===(r=_extends({exclude:!1,include:!0},r)).exclude||Array.isArray(r.exclude)&&0===r.exclude.length||!1===r.include||"object"!=typeof e)return{};var t=Array.isArray(r.exclude)?r.exclude.reduce(function(e,r){var t;return _extends({},e,((t={})[r]=!0,t))},{}):r.exclude,n=Array.isArray(r.include)?r.include.reduce(function(e,r){var t;return _extends({},e,((t={})[r]=!0,t))},{}):r.include,o={};if(isPlainObject(n))for(var a=0,i=Object.entries(n);a<i.length;a++){var _=i[a],l=_[0],u=_[1];Object.prototype.hasOwnProperty.call(e,l)&&(!0===u?o[l]=e[l]:(isPlainObject(u)||Array.isArray(u)&&u.length)&&"object"==typeof e[l]&&(o[l]=_mask(e[l],{include:u})))}else o=e;if(isPlainObject(t)){for(var s=!1,c=_extends({},o),f=0,p=Object.entries(t);f<p.length;f++){var d=p[f],v=d[0],b=d[1];if(Object.prototype.hasOwnProperty.call(c,v))if(!0===b)s=!0,delete c[v];else if((isPlainObject(b)||Array.isArray(b)&&b.length)&&"object"==typeof c[v]){var O=c[v];c[v]=_mask(c[v],{exclude:b}),c[v]!==O&&(s=!0)}}s&&(o=c)}return o},_modifyObject=function(e,r,t,n,o,a,i,_,l){if(void 0===t&&(t="__remove__"),void 0===n&&(n="__prepend__"),void 0===o&&(o="__append__"),void 0===a&&(a="__"),void 0===i&&(i="__"),void 0===_&&(_=null),void 0===l&&(l=null),isMap(r)&&isMap(e))for(var u,s=_createForOfIteratorHelperLoose(r);!(u=s()).done;){var c=u.value,f=c[0],p=c[1];e.has(f)&&_modifyObject(e.get(f),p,t,n,o,a,i,r,f)}else if(isObject(r)&&isObject(e))for(var d=0,v=Object.entries(r);d<v.length;d++){var b=v[d],O=b[0],g=b[1],E=NaN;if(Array.isArray(e)&&O.startsWith(a)&&O.endsWith(i)&&((E=parseInt(O.substring(a.length,O.length-i.length),10))<0||E>=e.length)&&(E=NaN),[t,n,o].includes(O)||!isNaN(E)){if(Array.isArray(e))if(O===t)for(var m,y=_createForOfIteratorHelperLoose([].concat(g));!(m=y()).done;){var h=m.value;"string"==typeof h&&h.startsWith(a)&&h.endsWith(i)?e.splice(parseInt(h.substring(a.length,h.length-i.length),10),1):e.includes(h)?e.splice(e.indexOf(h),1):"number"==typeof h&&h<e.length&&e.splice(h,1)}else O===o?e=e.concat(g):O===n?e=[].concat(g).concat(e):isObject(e[E])&&isObject(g)?_extend(!0,_modifyObject(e[E],g,t,n,o,a,i),e[E],g):e[E]=g;else if(O===t)for(var A,P=_createForOfIteratorHelperLoose([].concat(g));!(A=P()).done;){var L=A.value;"string"==typeof L&&Object.prototype.hasOwnProperty.call(e,L)&&delete e[L]}delete r[O],_&&"string"==typeof l&&delete _[l]}else null!==e&&Object.prototype.hasOwnProperty.call(e,O)&&(e[O]=_modifyObject(e[O],g,t,n,o,a,i,r,O))}return e},_removeKeyPrefixes=function(e,r){void 0===r&&(r="#");var t=[].concat(r);if(Array.isArray(e))for(var n,o=0,a=_createForOfIteratorHelperLoose(e.slice());!(n=a()).done;){var i=n.value,_=!1;if("string"==typeof i){for(var l,u=_createForOfIteratorHelperLoose(t);!(l=u()).done;){var s=l.value;if(i.startsWith(s+":")){e.splice(o,1),_=!0;break}}if(_)continue}e[o]=_removeKeyPrefixes(i,t),o+=1}else if(isSet(e))for(var c,f=_createForOfIteratorHelperLoose(new Set(e));!(c=f()).done;){var p=c.value,d=!1;if("string"==typeof p){for(var v,b=_createForOfIteratorHelperLoose(t);!(v=b()).done;){var O=v.value;if(p.startsWith(O+":")){e.delete(p),d=!0;break}}if(d)continue}_removeKeyPrefixes(p,t)}else if(isMap(e))for(var g,E=_createForOfIteratorHelperLoose(new Map(e));!(g=E()).done;){var m=g.value,y=m[0],h=m[1],A=!1;if("string"==typeof y){for(var P,L=_createForOfIteratorHelperLoose(t);!(P=L()).done;){var I=P.value,M=escapeRegularExpressions(I);if(new RegExp("^"+M+"[0-9]*$").test(y)){e.delete(y),A=!0;break}}if(A)continue}e.set(y,_removeKeyPrefixes(h,t))}else if(isObject(e))for(var x=0,R=Object.entries(Object.assign({},e));x<R.length;x++){for(var D,T=R[x],w=T[0],j=T[1],S=!1,N=_createForOfIteratorHelperLoose(t);!(D=N()).done;){var C=D.value,B=escapeRegularExpressions(C);if(new RegExp("^"+B+"[0-9]*$").test(w)){delete e[w],S=!0;break}}S||(e[w]=_removeKeyPrefixes(j,t))}return e},_represent=function(e,r,t,n,o,a){if(void 0===r&&(r=30),void 0===t&&(t=" "),void 0===n&&(n=""),void 0===o&&(o="__maximum_number_of_levels_reached__"),void 0===a&&(a=8),0===a)return String(o);if(null===e)return"null";if(void 0===e)return"undefined";if("string"==typeof e)return'"'+e.replace(/\n/g,"\n"+n)+'"';if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isNumeric)(e)||"boolean"==typeof e)return String(e);if(e instanceof Date)return e.toISOString();if(Array.isArray(e)){for(var i,_="[",l=!1,u=1,s=_createForOfIteratorHelperLoose(e);!(i=s()).done;){var c=i.value;if(u>r){_+="\n"+n+"...";break}l&&(_+=","),_+="\n"+n+t+_represent(c,r,t,""+n+t,o,a-1),l=!0,u+=1}return l&&(_+="\n"+n),_+="]"}if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(e)){for(var f,p="",d=!1,v=1,b=_createForOfIteratorHelperLoose(e);!(f=b()).done;){var O=f.value,g=O[0],E=O[1];if(v>r){p+=",\n"+n+"...";break}d&&(p+=",\n"+n+t),p+=_represent(g,r,t,""+n+t,o,a-1)+" -> "+_represent(E,r,t,""+n+t,o,a-1),d=!0,v+=1}return d||(p="EmptyMap"),p}if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isSet)(e)){for(var m,y="{",h=!1,A=1,P=_createForOfIteratorHelperLoose(e);!(m=P()).done;){var L=m.value;if(A>r){y+=",\n"+n+"...";break}h&&(y+=","),y+="\n"+n+t+_represent(L,r,t,""+n+t,o,a-1),h=!0,A+=1}return h?y+="\n"+n+"}":y="EmptySet",y}if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isFunction)(e))return"__function__";for(var I,M="{",x=!1,R=1,D=_createForOfIteratorHelperLoose(Object.getOwnPropertyNames(e).sort());!(I=D()).done;){var T=I.value;if(R>r){M+=",\n"+n+"...";break}x&&(M+=","),M+="\n"+n+t+T+": "+_represent(e[T],r,t,""+n+t,o,a-1),x=!0,R+=1}return x&&(M+="\n"+n),M+="}"},sort=function(e){var r=[];if(Array.isArray(e))for(var t=0;t<e.length;t++)r.push(t);else if("object"==typeof e)if(isMap(e))for(var n,o=_createForOfIteratorHelperLoose(e);!(n=o()).done;){var a=n.value;r.push(a[0])}else if(null!==e)for(var i=0,_=Object.keys(e);i<_.length;i++){var l=_[i];r.push(l)}return r.sort()},_unwrapProxy=function(e,r){if(void 0===r&&(r=new Set),isObject(e)){if(r.has(e))return e;try{isFunction(e.__revoke__)&&(isProxy(e)&&(e=e.__target__),e.__revoke__())}catch(r){return e}finally{r.add(e)}if(Array.isArray(e))for(var t,n=0,o=_createForOfIteratorHelperLoose(e);!(t=o()).done;){var a=t.value;e[n]=_unwrapProxy(a,r),n+=1}else if(isMap(e))for(var i,_=_createForOfIteratorHelperLoose(e);!(i=_()).done;){var l=i.value,u=l[0],s=l[1];e.set(u,_unwrapProxy(s,r))}else if(isSet(e)){for(var c,f=[],p=_createForOfIteratorHelperLoose(e);!(c=p()).done;){var d=c.value;e.delete(d),f.push(_unwrapProxy(d,r))}for(var v=0,b=f;v<b.length;v++){var O=b[v];e.add(O)}}else for(var g=0,E=Object.entries(e);g<E.length;g++){var m=E[g],y=m[0],h=m[1];e[y]=_unwrapProxy(h,r)}}return e}},function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__3__},function(e,r,t){t.d(r,{isFunction:function(){return _},isMap:function(){return i},isNumeric:function(){return o},isSet:function(){return a}});var n=t(2);var o=function(e){var r=(0,n.determineType)(e);return["number","string"].includes(r)&&!isNaN(e-parseFloat(e))},a=function(e){return"set"===(0,n.determineType)(e)},i=function(e){return"map"===(0,n.determineType)(e)},_=function(e){return Boolean(e)&&["[object AsyncFunction]","[object Function]"].includes({}.toString.call(e))}},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={},t=0,n=Object.entries(e);t<n.length;t++){var o=n[t],a=o[0],i=o[1];r[a]=i,delete e[a]}return r},restoreRequireCache=function(e,r){void 0===e&&(e=(null==currentRequire?void 0:currentRequire.cache)||__webpack_require__.c),clearRequireCache();for(var t=0,n=Object.entries(r);t<n.length;t++){var o=n[t],a=o[0],i=o[1];e[a]=i}},isolatedRequire=function(e,r){void 0===r&&(r=currentRequire||__webpack_require__(6));var t=clearRequireCache(r.cache);try{return r(e)}catch(e){throw e}finally{restoreRequireCache(r.cache,t)}}},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(__unused_webpack_module,__webpack_exports__,__webpack_require__){__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{ALLOWED_STARTING_VARIABLE_SYMBOLS:function(){return ALLOWED_STARTING_VARIABLE_SYMBOLS},ALLOWED_VARIABLE_SYMBOLS:function(){return ALLOWED_VARIABLE_SYMBOLS},FIX_ENCODING_ERROR_MAPPING:function(){return FIX_ENCODING_ERROR_MAPPING},POLYFILL_TEMPLATE_STRINGS:function(){return POLYFILL_TEMPLATE_STRINGS},addSeparatorToPath:function(){return addSeparatorToPath},camelCaseToDelimited:function(){return camelCaseToDelimited},capitalize:function(){return capitalize},compile:function(){return compile},compressStyleValue:function(){return compressStyleValue},convertToValidVariableName:function(){return convertToValidVariableName},decodeHTMLEntities:function(){return decodeHTMLEntities},delimitedToCamelCase:function(){return delimitedToCamelCase},encodeURIComponentExtended:function(){return encodeURIComponentExtended},escapeRegularExpressions:function(){return escapeRegularExpressions},evaluate:function(){return evaluate},findNormalizedMatchRange:function(){return findNormalizedMatchRange},fixKnownEncodingErrors:function(){return fixKnownEncodingErrors},format:function(){return format},getDomainName:function(){return getDomainName},getEditDistance:function(){return getEditDistance},getPortNumber:function(){return getPortNumber},getProtocolName:function(){return getProtocolName},getURLParameter:function(){return getURLParameter},hasPathPrefix:function(){return hasPathPrefix},limit:function(){return limit},lowerCase:function(){return lowerCase},mark:function(){return mark},maskForRegularExpression:function(){return maskForRegularExpression},normalizeDomNodeSelector:function(){return normalizeDomNodeSelector},normalizePhoneNumber:function(){return normalizePhoneNumber},normalizeURL:function(){return normalizeURL},normalizeZipCode:function(){return normalizeZipCode},parseEncodedObject:function(){return parseEncodedObject},representPhoneNumber:function(){return representPhoneNumber},representURL:function(){return representURL},serviceURLEquals:function(){return serviceURLEquals},sliceAllExceptNumberAndLastSeparator:function(){return sliceAllExceptNumberAndLastSeparator}});var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(3),_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__),_babel_runtime_helpers_construct__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(13),_babel_runtime_helpers_construct__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_babel_runtime_helpers_construct__WEBPACK_IMPORTED_MODULE_1__),_constants__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(0),_context__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(1),_filesystem__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(14),_object__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(2);function _createForOfIteratorHelperLoose(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=_unsupportedIterableToArray(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}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 _unsupportedIterableToArray(e,r){if(e){if("string"==typeof e)return _arrayLikeToArray(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(e,r):void 0}}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}var POLYFILL_TEMPLATE_STRINGS={value:!1},ALLOWED_VARIABLE_SYMBOLS="0-9a-zA-Z_$",ALLOWED_STARTING_VARIABLE_SYMBOLS="a-zA-Z_$",FIX_ENCODING_ERROR_MAPPING=[["Ã\\x84","Ä"],["Ã\\x96","Ö"],["Ã\\x9c","Ü"],["ä","ä"],["ö","ö"],["ü","ü"],["\\x96","-"],["é","é"],["è","e"],["ô","o"],["à ","á"],["ø","ø"],["Ã\\x9f","ß"],["Ã","ß"]],escapeRegularExpressions=function(e,r){if(void 0===r&&(r=[]),1===e.length&&!_constants__WEBPACK_IMPORTED_MODULE_2__.SPECIAL_REGEX_SEQUENCES.includes(e))return e;r.includes("\\")||e.replace(/\\/g,"\\\\");for(var t,n=_createForOfIteratorHelperLoose(_constants__WEBPACK_IMPORTED_MODULE_2__.SPECIAL_REGEX_SEQUENCES);!(t=n()).done;){var o=t.value;r.includes(o)||(e=e.replace(new RegExp("\\"+o,"g"),"\\"+o))}return e},convertToValidVariableName=function(e){return["class","default"].includes(e)?"_"+e:e.replace(new RegExp("^[^"+ALLOWED_STARTING_VARIABLE_SYMBOLS+"]+"),"").replace(new RegExp("[^"+ALLOWED_VARIABLE_SYMBOLS+"]+([a-zA-Z])","g"),function(e,r){return r.toUpperCase()})},encodeURIComponentExtended=function(e,r){return void 0===r&&(r=!1),encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,r?"%20":"+")},addSeparatorToPath=function(e,r){return void 0===r&&(r="/"),(e=e.trim()).substring(e.length-1)!==r&&e.length?e+r:e},hasPathPrefix=function(e,r,t){var n;(void 0===e&&(e="/admin"),void 0===r)&&(r=(null==(n=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location)?void 0:n.pathname)||"");return void 0===t&&(t="/"),"string"==typeof e&&(e.endsWith(t)||(e+=t),r===e.substring(0,e.length-t.length)||r.startsWith(e))},getDomainName=function(e,r){var t,n;void 0===e&&(e=(null==(t=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location)?void 0:t.href)||"");void 0===r&&(r=(null==(n=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location)?void 0:n.hostname)||"");var o=/^([a-z]*:?\/\/)?([^/]+?)(?::[0-9]+)?(?:\/.*|$)/i.exec(e);return o&&o.length>2&&o[1]&&o[2]?o[2]:r},getPortNumber=function(e,r){var t,n,o;void 0===e&&(e=(null==(n=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location)?void 0:n.href)||"");void 0===r&&(r=null!=(o=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location)&&o.port?parseInt(_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location.port):null);var a=/^(?:[a-z]*:?\/\/[^/]+?)?[^/]+?:([0-9]+)/i.exec(e);return a&&a.length>1?parseInt(a[1],10):null!==r?r:null!=(t=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location)&&t.port&&parseInt(_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location.port,10)?parseInt(_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location.port,10):"https"===getProtocolName(e)?443:80},getProtocolName=function(e,r){var t,n;void 0===e&&(e=(null==(t=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location)?void 0:t.href)||"");void 0===r&&(r=(null==(n=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location)?void 0:n.protocol)&&_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location.protocol.substring(0,_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location.protocol.length-1)||"");var o=/^([a-z]+):\/\//i.exec(e);return o&&o.length>1&&o[1]?o[1]:r},getURLParameter=function(e,r,t,n,o,a,i){var _,l,u;(void 0===e&&(e=null),void 0===r&&(r=!1),void 0===t&&(t=null),void 0===n&&(n="$"),void 0===o&&(o="!"),void 0===a&&(a=null),void 0===i)&&(i=null!==(l=null==(u=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location)?void 0:u.hash)&&void 0!==l?l:"");var s=null!==(_=i)&&void 0!==_?_:"#",c="";if(a)c=a;else if(o&&s.startsWith(o)){var f,p=s.indexOf("#");-1===p?(f=s.substring(o.length),s=""):(f=s.substring(o.length,p),s=s.substring(p));var d=f.indexOf("?");-1!==d&&(c=f.substring(d))}else _context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location&&(c=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location.search||"");var v=t||c,b="&"===v;if(b||"#"===v){var O="";try{O=decodeURIComponent(s)}catch(e){}var g=O.indexOf(n);-1===g?v="":(v=O.substring(g)).startsWith(n)&&(v=v.substring(n.length))}else v.startsWith("?")&&(v=v.substring(1));var E=v?v.split("&"):[];c=c.substring(1),b&&c&&(E=E.concat(c.split("&")));for(var m,y=[],h=_createForOfIteratorHelperLoose(E);!(m=h()).done;){var A=m.value,P=A.split("="),L=void 0;try{L=decodeURIComponent(P[0])}catch(e){L=""}try{A=decodeURIComponent(P[1])}catch(e){A=""}y.push(L),r?Object.prototype.hasOwnProperty.call(y,L)&&Array.isArray(y[L])?y[L].push(A):y[L]=[A]:y[L]=A}return e?Object.prototype.hasOwnProperty.call(y,e)?y[e]:null:y},serviceURLEquals=function(e,r){var t;void 0===r&&(r=(null==(t=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.location)?void 0:t.href)||"");var n=getDomainName(e,""),o=getProtocolName(e,""),a=getPortNumber(e);return!(""!==n&&n!==getDomainName(r)||""!==o&&o!==getProtocolName(r)||null!==a&&a!==getPortNumber(r))},normalizeURL=function(e){if("string"==typeof e){var r=e.replace(/^:?\/+/,"").replace(/\/+$/,"").trim();return r.startsWith("http")?r:"http://"+r}return""},representURL=function(e){return"string"==typeof e?e.replace(/^(https?)?:?\/+/,"").replace(/\/+$/,"").trim():""},camelCaseToDelimited=function(e,r,t){void 0===r&&(r="-"),void 0===t&&(t=null),t||(t=_constants__WEBPACK_IMPORTED_MODULE_2__.ABBREVIATIONS);var n=maskForRegularExpression(r);if(t.length){for(var o,a="",i=_createForOfIteratorHelperLoose(t);!(o=i()).done;){a&&(a+="|"),a+=o.value.toUpperCase()}e=e.replace(new RegExp("("+a+")("+a+")","g"),"$1"+r+"$2")}return(e=e.replace(new RegExp("([^"+n+"])([A-Z][a-z]+)","g"),"$1"+r+"$2")).replace(/([a-z0-9])([A-Z])/g,"$1"+r+"$2").toLowerCase()},capitalize=function(e){return e.charAt(0).toUpperCase()+e.substring(1)},compressStyleValue=function(e){return e.replace(/ *([:;]) */g,"$1").replace(/ +/g," ").replace(/^;+/,"").replace(/;+$/,"").trim()},decodeHTMLEntities=function(e){if(_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.document){var r=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.document.createElement("textarea");return r.innerHTML=e,r.value}return null},delimitedToCamelCase=function(e,r,t,n,o){void 0===r&&(r="-"),void 0===t&&(t=null),void 0===n&&(n=!1),void 0===o&&(o=!1);var a,i=maskForRegularExpression(r);if(t||(t=_constants__WEBPACK_IMPORTED_MODULE_2__.ABBREVIATIONS),n)a=_constants__WEBPACK_IMPORTED_MODULE_2__.ABBREVIATIONS.join("|");else{a="";for(var _,l=_createForOfIteratorHelperLoose(t);!(_=l()).done;){var u=_.value;a&&(a+="|"),a+=capitalize(u)+"|"+u}}var s=e.startsWith(r);return s&&(e=e.substring(r.length)),e=e.replace(new RegExp("("+i+")("+a+")("+i+"|$)","g"),function(e,r,t,n){return r+t.toUpperCase()+n}),o&&(i="(?:"+i+")+"),e=e.replace(new RegExp(i+"([a-zA-Z0-9])","g"),function(e,r){return r.toUpperCase()}),s&&(e=r+e),e},compile=function(e,r,t,n,o){var a;void 0===r&&(r=[]),void 0===t&&(t=!1),void 0===n&&(n=!0),void 0===o&&(o={});for(var i,_,l=Object.keys(globalThis).concat("globalThis").filter(function(e){return new RegExp("^["+ALLOWED_STARTING_VARIABLE_SYMBOLS+"]["+ALLOWED_VARIABLE_SYMBOLS+"]*$").test(e)}),u={error:null,globalNames:l,globalNamesUndefinedList:l.map(function(){}),originalScopeNames:Array.isArray(r)?r:"string"==typeof r?[r]:Object.keys(r),scopeNameMapping:{},scopeNames:[],templateFunction:function(){}},s=_createForOfIteratorHelperLoose(u.originalScopeNames);!(i=s()).done;){var c=i.value,f=convertToValidVariableName(c);u.scopeNameMapping[c]=f,u.scopeNames.push(f)}if(POLYFILL_TEMPLATE_STRINGS.value)if(null!=(a=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.Babel)&&a.transform)e=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.Babel.transform("("+e+")",{plugins:["transform-template-literals"]}).code;else if(e.startsWith("`")&&e.endsWith("`")){var p="####",d="`"===(e=e.replace(/\\\$/g,p).replace(/^`\$\{([\s\S]+)}`$/,"String($1)").replace(/^`([^']+)`$/,"'$1'").replace(/^`([^"]+)`$/,'"$1"')).charAt(0)?"'":e.charAt(0);e=e.replace(/\$\{((([^{]*{[^}]*}[^}]*})|[^{}]+)+)}/g,d+"+($1)+"+d).replace(/^`([\s\S]+)`$/,d+"$1"+d).replace(/\n+/g,"").replace(new RegExp(p,"g"),"\\$")}try{_=_babel_runtime_helpers_construct__WEBPACK_IMPORTED_MODULE_1___default()(Function,(n?u.globalNames:[]).concat(u.scopeNames,[(t?"":"return ")+e]))}catch(r){u.error='Given expression "'+e+'" could not be compiled width given scope names "'+u.scopeNames.join('", "')+'": '+(0,_object__WEBPACK_IMPORTED_MODULE_4__.represent)(r)}if(_){var v=_.bind(o);u.templateFunction=n?function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];return v.apply(void 0,u.globalNamesUndefinedList.concat(r))}:v}return u},evaluate=function(e,r,t,n,o){void 0===r&&(r={}),void 0===t&&(t=!1),void 0===n&&(n=!0),void 0===o&&(o={});var a=compile(e,r,t,n,o),i=a.error,_=a.originalScopeNames,l=a.scopeNames,u=a.templateFunction,s={compileError:null,runtimeError:null,error:"Not yet evaluated.",result:void 0};if(i)return s.compileError=s.error=i,s;try{s={compileError:null,runtimeError:null,error:null,result:u.apply(void 0,_.map(function(e){return r[e]}))}}catch(i){s.error=s.runtimeError='Given expression "'+e+'" could not be evaluated with given scope names "'+l.join('", "')+'": '+(0,_object__WEBPACK_IMPORTED_MODULE_4__.represent)(i)}return s},findNormalizedMatchRange=function(e,r,t,n){void 0===t&&(t=function(e){return String(e).toLowerCase()}),void 0===n&&(n=["<",">"]);var o=t(r),a=t(e),i="string"==typeof e?e:a;if(a&&o)for(var _=!1,l=0;l<i.length;l+=1)if(_)Array.isArray(n)&&i.charAt(l)===n[1]&&(_=!1);else if(Array.isArray(n)&&i.charAt(l)===n[0])_=!0;else if(t(i.substring(l)).startsWith(o)){if(1===o.length)return[l,l+1];for(var u=i.length;u>l;u-=1)if(!t(i.substring(l,u)).startsWith(o))return[l,u+1]}return null},fixKnownEncodingErrors=function(e){for(var r=0,t=FIX_ENCODING_ERROR_MAPPING;r<t.length;r++){var n=t[r],o=n[0],a=n[1];e=e.replace(new RegExp(o,"g"),a)}return e},format=function(e){for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n<r;n++)t[n-1]=arguments[n];t.unshift(e);for(var o=0,a=0,i=t;a<i.length;a++){var _=i[a];e=e.replace(new RegExp("\\{"+String(o)+"\\}","gm"),String(_)),o+=1}return e},getEditDistance=function(e,r){for(var t=Array(r.length+1).fill(null).map(function(){return Array(e.length+1).fill(null)}),n=0;n<=e.length;n++)t[0][n]=n;for(var o=0;o<=r.length;o++)t[o][0]=o;for(var a=1;a<=r.length;a++)for(var i=1;i<=e.length;i++){var _=e[i-1]===r[a-1]?0:1;t[a][i]=Math.min(t[a][i-1]+1,t[a-1][i]+1,t[a-1][i-1]+_)}return t[r.length][e.length]},maskForRegularExpression=function(e){return e.replace(/([\\|.*$^+[\]()?\-{}])/g,"\\$1")},lowerCase=function(e){return e.charAt(0).toLowerCase()+e.substring(1)},mark=function(e,r,t){if(void 0===t&&(t={}),"string"==typeof e&&null!=r&&r.length){var n=_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({marker:'<span class="tools-mark">{1}</span>',normalizer:function(e){return String(e).toLowerCase()},skipTagDelimitedParts:["<",">"]},t);e=e.trim();for(var o,a=[],i=[].concat(r),_=0,l=_createForOfIteratorHelperLoose(i);!(o=l()).done;){var u=o.value;i[_]=n.normalizer(u).trim(),_+=1}for(var s=e,c=0,f=0;f<_context__WEBPACK_IMPORTED_MODULE_3__.MAXIMAL_NUMBER_OF_ITERATIONS.value;f++){for(var p,d=null,v=void 0,b=_createForOfIteratorHelperLoose(i);!(p=b()).done;){var O=p.value;(v=findNormalizedMatchRange(s,O,n.normalizer,n.skipTagDelimitedParts))&&(!d||v[0]<d[0])&&(d=v)}if(!d){s.length&&a.push(s);break}d[0]>0&&a.push(e.substring(c,c+d[0])),a.push("string"==typeof n.marker?format(n.marker,e.substring(c+d[0],c+d[1])):n.marker(e.substring(c+d[0],c+d[1]),a)),c+=d[1],s=e.substring(c)}return"string"==typeof n.marker?a.join(""):a}return e},normalizePhoneNumber=function(e,r){if(void 0===r&&(r=!0),"string"==typeof e||"number"==typeof e){var t=String(e).trim();if(t=(t=t.replace(/^[^0-9]*\+/,"00")).replace(/([0-9].*?) *(,|o[rd]?)\.? ?-?[0-9]+$/,"$1"),r)return t.replace(/[^0-9]+/g,"");var n="(?:[ /\\-]+)";t=(t=t.replace(new RegExp("^(.+?)"+n+"?\\(0\\)"+n+"?(.+)$"),"$1-$2")).replace(new RegExp("^(.+?)"+n+"?\\((.+)\\)"+n+"?(.+)$"),"$1-$2-$3");var o=new RegExp("^(00[0-9]+)"+n+"([0-9]+)"+n+"(.+)$");if(o.test(t))t=t.replace(o,function(e,r,t,n){return r+"-"+t+"-"+sliceAllExceptNumberAndLastSeparator(n)});else{var a=function(e,r,t){return r.replace(/ +/,"")+"-"+sliceAllExceptNumberAndLastSeparator(t)};t=(o=/^([0-9 ]+)[/-](.+)$/).test(t)?t.replace(o,a):t.replace(new RegExp("^([0-9]+)"+n+"(.+)$"),a)}return t.replace(/[^0-9-]+/g,"").replace(/^-+$/,"")}return""},normalizeZipCode=function(e){return"string"==typeof e||"number"==typeof e?String(e).trim().replace(/^([^0-9]*[a-zA-Z]-)?(.+)$/,function(e,r,t){var n;return r&&(r=r.substring(r.length-2).charAt(0).toUpperCase()+"-"),(null!==(n=r)&&void 0!==n?n:"")+(null!=t?t:"").trim().replace(/[^0-9]+/g,"")}):""},parseEncodedObject=function parseEncodedObject(serializedObject,scope,name){var _evaluate;if(void 0===scope&&(scope={}),void 0===name&&(name="scope"),!_filesystem__WEBPACK_IMPORTED_MODULE_5__.readFileSync)throw new Error("File system api could not be loaded.");serializedObject.endsWith(".json")&&(0,_filesystem__WEBPACK_IMPORTED_MODULE_5__.isFileSync)(serializedObject)&&(serializedObject=(0,_filesystem__WEBPACK_IMPORTED_MODULE_5__.readFileSync)(serializedObject,{encoding:_constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_ENCODING})),serializedObject=serializedObject.trim(),serializedObject.startsWith("{")||(serializedObject=eval("Buffer").from(serializedObject,"base64").toString(_constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_ENCODING));var result=evaluate(serializedObject,(_evaluate={},_evaluate[name]=scope,_evaluate));return"object"==typeof result.result?result.result:null},representPhoneNumber=function(e){if(["number","string"].includes((0,_object__WEBPACK_IMPORTED_MODULE_4__.determineType)(e))&&e){var r=String(e).replace(/^(00|\+)([0-9]+)-([0-9-]+)$/,"+$2 (0) $3");return(r=(r=r.replace(/^0([1-9][0-9-]+)$/,"+49 (0) $1")).replace(/^([^-]+)-([0-9-]+)$/,"$1 / $2")).replace(/^(.*?)([0-9]+)(-?[0-9]*)$/,function(e,r,t,n){return r+(t.length%2==0?t.replace(/([0-9]{2})/g,"$1 "):t.replace(/^([0-9]{3})([0-9]+)$/,function(e,r,t){return r+" "+t.replace(/([0-9]{2})/g,"$1 ").trim()})+n).trim()}).trim()}return""},sliceAllExceptNumberAndLastSeparator=function(e){var r=/^(.*[0-9].*)-([0-9]+)$/;return r.test(e)?e.replace(r,function(e,r,t){return r.replace(/[^0-9]+/g,"")+"-"+t}):e.replace(/[^0-9]+/g,"")},normalizeDomNodeSelector=function(e,r){void 0===r&&(r="");var t="";return r&&(t=r+" "),e.startsWith(t)||e.trim().startsWith("<")||(e=t+e),e.trim()},limit=function(e,r){if(void 0===r&&(r=100),e.length<=r)return e;return e.substring(0,r-3)+"..."}},,,,function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__11__},function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__12__},function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__13__},function(e,r,t){t.d(r,{isFileSync:function(){return c},readFileSync:function(){return i}});t(3),t(11),t(12);var n=t(5);var o=(0,n.optionalRequire)("fs")||{},a=(o.mkdirSync,o.readdirSync,o.readFileSync),i=void 0===a?null:a,_=o.statSync,l=void 0===_?null:_,u=(o.writeFileSync,(0,n.optionalRequire)("fs/promises")||{}),s=(u.mkdir,u.readdir,u.readFile,u.stat,u.writeFile,(0,n.optionalRequire)("path")||{}),c=(s.basename,s.join,s.resolve,function(e){if(!l)throw new Error("Could not load filesystem functions.");try{return l(e).isFile()}catch(e){if(Object.prototype.hasOwnProperty.call(e,"code")&&["ENOENT","ENOTDIR"].includes(e.code))return!1;throw e}})}],__webpack_module_cache__={};function __webpack_require__(e){var r=__webpack_module_cache__[e];if(void 0!==r)return r.exports;var t=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.loaded=!0,t.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 t in r)__webpack_require__.o(r,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},__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__(7);return __webpack_exports__}()});
1
+ // #!/usr/bin/env babel-node
2
+ // -*- coding: utf-8 -*-
3
+ /** @module string */
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
+ // region url handling
21
+ import "core-js/modules/es.array.includes.js";
22
+ import "core-js/modules/es.array.push.js";
23
+ import "core-js/modules/es.iterator.constructor.js";
24
+ import "core-js/modules/es.iterator.filter.js";
25
+ import "core-js/modules/es.iterator.map.js";
26
+ import { ABBREVIATIONS, DEFAULT_ENCODING, SPECIAL_REGEX_SEQUENCES } from "./constants.js";
27
+ import { globalContext, MAXIMAL_NUMBER_OF_ITERATIONS } from "./context.js";
28
+ import { isFileSync, imports } from "./filesystem.js";
29
+ import { determineType, represent } from "./object.js";
30
+ export const POLYFILL_TEMPLATE_STRINGS = {
31
+ value: false
32
+ };
33
+ // Partial regular expression matching symbols which should be allowed within a
34
+ // variable name excluding the first character.
35
+ export const ALLOWED_VARIABLE_SYMBOLS = '0-9a-zA-Z_$';
36
+ // Partial regular expression matching symbols which should be allowed as
37
+ // starting character for a variable name.
38
+ export const ALLOWED_STARTING_VARIABLE_SYMBOLS = 'a-zA-Z_$';
39
+ export const FIX_ENCODING_ERROR_MAPPING = [['Ã\\x84', 'Ä'], ['Ã\\x96', 'Ö'], ['Ã\\x9c', 'Ü'], ['ä', 'ä'], ['ö', 'ö'], ['ü', 'ü'], ['\\x96', '-'], ['é', 'é'], ['è', 'e'], ['ô', 'o'], ['à ', 'á'], ['ø', 'ø'], ['Ã\\x9f', 'ß'], ['Ã', 'ß']];
40
+
41
+ /**
42
+ * Translates a given string into the regular expression validated
43
+ * representation.
44
+ * @param value - String to convert.
45
+ * @param excludeSymbols - Symbols not to escape.
46
+ * @returns Converted string.
47
+ */
48
+ export const escapeRegularExpressions = (value, excludeSymbols = []) => {
49
+ // NOTE: This is only for performance improvements.
50
+ if (value.length === 1 && !SPECIAL_REGEX_SEQUENCES.includes(value)) return value;
51
+
52
+ // The escape sequence must also be escaped; but at first.
53
+ if (!excludeSymbols.includes('\\')) value.replace(/\\/g, '\\\\');
54
+ for (const replace of SPECIAL_REGEX_SEQUENCES) if (!excludeSymbols.includes(replace)) value = value.replace(new RegExp(`\\${replace}`, 'g'), `\\${replace}`);
55
+ return value;
56
+ };
57
+ /**
58
+ * Translates a given name into a valid JavaScript one.
59
+ * @param name - Name to convert.
60
+ * @returns Converted name is returned.
61
+ */
62
+ export const convertToValidVariableName = name => {
63
+ if (['class', 'default'].includes(name)) return `_${name}`;
64
+ return name
65
+ // Remove all disallowed starting characters.
66
+ .replace(new RegExp(`^[^${ALLOWED_STARTING_VARIABLE_SYMBOLS}]+`), '')
67
+ // Remove all disallowed characters within a variable name and make
68
+ // continuing character upper case.
69
+ .replace(new RegExp(`[^${ALLOWED_VARIABLE_SYMBOLS}]+([a-zA-Z])`, 'g'), (_fullMatch, firstLetter) => firstLetter.toUpperCase());
70
+ };
71
+ /**
72
+ * This method is intended for encoding *key* or *value* parts of a query
73
+ * component. We need a custom method because "encodeURIComponent()" is too
74
+ * aggressive and encodes stuff that doesn't have to be encoded per
75
+ * "http://tools.ietf.org/html/rfc3986:".
76
+ * @param url - URL to encode.
77
+ * @param encodeSpaces - Indicates whether given url should encode
78
+ * whitespaces as "+" or "%20".
79
+ * @returns Encoded given url.
80
+ */
81
+ export const encodeURIComponentExtended = (url, encodeSpaces = false) => {
82
+ return encodeURIComponent(url).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, encodeSpaces ? '%20' : '+');
83
+ };
84
+ /**
85
+ * Appends a path selector to the given path if there isn't one yet.
86
+ * @param path - The path for appending a selector.
87
+ * @param pathSeparator - The selector for appending to a path.
88
+ * @returns The appended path.
89
+ */
90
+ export const addSeparatorToPath = (path, pathSeparator = '/') => {
91
+ path = path.trim();
92
+ if (path.substring(path.length - 1) !== pathSeparator && path.length) return path + pathSeparator;
93
+ return path;
94
+ };
95
+ /**
96
+ * Checks if a given path has given path prefix.
97
+ * @param prefix - Path prefix to search for.
98
+ * @param path - Path to search in.
99
+ * @param separator - Delimiter to use in a path (default is the posix
100
+ * conform slash).
101
+ * @returns Value "true" if given prefix occurs and "false" otherwise.
102
+ */
103
+ export const hasPathPrefix = (prefix = '/admin', path = globalContext.location?.pathname || '', separator = '/') => {
104
+ if (typeof prefix === 'string') {
105
+ if (!prefix.endsWith(separator)) prefix += separator;
106
+ return path === prefix.substring(0, prefix.length - separator.length) || path.startsWith(prefix);
107
+ }
108
+ return false;
109
+ };
110
+ /**
111
+ * Extracts domain name from given url. If no explicit domain name given
112
+ * current domain name will be assumed. If no parameter is given, the current
113
+ * domain name will be determined.
114
+ * @param url - The url to extract domain from.
115
+ * @param fallback - The fallback host name if no one exits in given url
116
+ * (default is current hostname).
117
+ * @returns Extracted domain.
118
+ */
119
+ export const getDomainName = (url = globalContext.location?.href || '', fallback = globalContext.location?.hostname || '') => {
120
+ const result = /^([a-z]*:?\/\/)?([^/]+?)(?::[0-9]+)?(?:\/.*|$)/i.exec(url);
121
+ if (result && result.length > 2 && result[1] && result[2]) return result[2];
122
+ return fallback;
123
+ };
124
+ /**
125
+ * Extracts port number from given url. If no explicit port number is given
126
+ * and no fallback is defined, the current port number will be assumed for local
127
+ * links. For external links 80 will be assumed for http protocols and 443
128
+ * for https protocols.
129
+ * @param url - The url to extract port from.
130
+ * @param fallback - Fallback port number if no explicit one was found.
131
+ * Default is derived from the current protocol name.
132
+ * @returns Extracted port number.
133
+ */
134
+ export const getPortNumber = (url = globalContext.location?.href || '', fallback = globalContext.location?.port ? parseInt(globalContext.location.port) : null) => {
135
+ const result = /^(?:[a-z]*:?\/\/[^/]+?)?[^/]+?:([0-9]+)/i.exec(url);
136
+ if (result && result.length > 1) return parseInt(result[1], 10);
137
+ if (fallback !== null) return fallback;
138
+ if (
139
+ // NOTE: Would result in an endless loop:
140
+ // serviceURLEquals(url, ...parameters) &&
141
+ globalContext.location?.port && parseInt(globalContext.location.port, 10)) return parseInt(globalContext.location.port, 10);
142
+ return getProtocolName(url) === 'https' ? 443 : 80;
143
+ };
144
+ /**
145
+ * Extracts protocol name from given url. If no explicit url is given,
146
+ * the current protocol will be assumed. If no parameter is given, the current
147
+ * protocol number will be determined.
148
+ * @param url - The url to extract protocol from.
149
+ * @param fallback - Fallback port to use if no protocol exists in given
150
+ * url (default is current protocol).
151
+ * @returns Extracted protocol.
152
+ */
153
+ export const getProtocolName = (url = globalContext.location?.href || '', fallback = globalContext.location?.protocol && globalContext.location.protocol.substring(0, globalContext.location.protocol.length - 1) || '') => {
154
+ const result = /^([a-z]+):\/\//i.exec(url);
155
+ if (result && result.length > 1 && result[1]) return result[1];
156
+ return fallback;
157
+ };
158
+ /**
159
+ * Read a page's GET URL variables and return them as an associative array
160
+ * and preserves ordering.
161
+ * @param keyToGet - If provided the corresponding value for a given key is
162
+ * returned or full object otherwise.
163
+ * @param allowDuplicates - Indicates whether to return arrays of values or
164
+ * single values. If set to "false" (default) last values will overwrite
165
+ * preceding values.
166
+ * @param givenInput - An alternative input to the url search parameter. If
167
+ * "#" is given, the complete current hashtag will be interpreted as url and
168
+ * search parameter will be extracted from there. If "&" is given a classical
169
+ * search parameter, and hash parameter will be taken in an account. If a
170
+ * search string is given, this will be analyzed. The default is to take a
171
+ * given search part into account.
172
+ * @param subDelimiter - Defines which sequence indicates the start of
173
+ * parameter in a hash part of the url.
174
+ * @param hashedPathIndicator - If defined and given hash starts with this
175
+ * indicator, given hash will be interpreted as a path containing search and
176
+ * hash parts.
177
+ * @param givenSearch - Search part to take into account defaults to
178
+ * current url search part.
179
+ * @param givenHash - Hash part to take into account defaults to current
180
+ * url hash part.
181
+ * @returns Returns the current get array or requested value. If the requested
182
+ * key doesn't exist, "undefined" is returned.
183
+ */
184
+ export const getURLParameter = (keyToGet = null, allowDuplicates = false, givenInput = null, subDelimiter = '$', hashedPathIndicator = '!', givenSearch = null, givenHash = globalContext.location?.hash ?? '') => {
185
+ // region set search and hash
186
+ let hash = givenHash ?? '#';
187
+ let search = '';
188
+ if (givenSearch) search = givenSearch;else if (hashedPathIndicator && hash.startsWith(hashedPathIndicator)) {
189
+ const subHashStartIndex = hash.indexOf('#');
190
+ let pathAndSearch;
191
+ if (subHashStartIndex === -1) {
192
+ pathAndSearch = hash.substring(hashedPathIndicator.length);
193
+ hash = '';
194
+ } else {
195
+ pathAndSearch = hash.substring(hashedPathIndicator.length, subHashStartIndex);
196
+ hash = hash.substring(subHashStartIndex);
197
+ }
198
+ const subSearchStartIndex = pathAndSearch.indexOf('?');
199
+ if (subSearchStartIndex !== -1) search = pathAndSearch.substring(subSearchStartIndex);
200
+ } else if (globalContext.location) search = globalContext.location.search || '';
201
+ let input = givenInput ? givenInput : search;
202
+ // endregion
203
+ // region determine data from search and hash if specified
204
+ const both = input === '&';
205
+ if (both || input === '#') {
206
+ let decodedHash = '';
207
+ try {
208
+ decodedHash = decodeURIComponent(hash);
209
+ } catch {
210
+ // Continue regardless of an error.
211
+ }
212
+ const subDelimiterIndex = decodedHash.indexOf(subDelimiter);
213
+ if (subDelimiterIndex === -1) input = '';else {
214
+ input = decodedHash.substring(subDelimiterIndex);
215
+ if (input.startsWith(subDelimiter)) input = input.substring(subDelimiter.length);
216
+ }
217
+ } else if (input.startsWith('?')) input = input.substring('?'.length);
218
+ let data = input ? input.split('&') : [];
219
+ search = search.substring('?'.length);
220
+ if (both && search) data = data.concat(search.split('&'));
221
+ // endregion
222
+ // region construct data structure
223
+ const parameters = [];
224
+ for (let value of data) {
225
+ const keyValuePair = value.split('=');
226
+ let key;
227
+ try {
228
+ key = decodeURIComponent(keyValuePair[0]);
229
+ } catch {
230
+ key = '';
231
+ }
232
+ try {
233
+ value = decodeURIComponent(keyValuePair[1]);
234
+ } catch {
235
+ value = '';
236
+ }
237
+ parameters.push(key);
238
+ if (allowDuplicates) {
239
+ if (Object.prototype.hasOwnProperty.call(parameters, key) && Array.isArray(parameters[key])) parameters[key].push(value);else parameters[key] = [value];
240
+ } else parameters[key] = value;
241
+ }
242
+ // endregion
243
+
244
+ if (keyToGet) {
245
+ if (Object.prototype.hasOwnProperty.call(parameters, keyToGet)) return parameters[keyToGet];
246
+ return null;
247
+ }
248
+ return parameters;
249
+ };
250
+ /**
251
+ * Checks if given url points to another "service" than the second given url.
252
+ * If no second given url is provided, the current url will be assumed.
253
+ * @param url - URL to check against second url.
254
+ * @param referenceURL - URL to check against first url.
255
+ * @returns Returns "true" if given first url has same domain as given
256
+ * second (or current).
257
+ */
258
+ export const serviceURLEquals = (url, referenceURL = globalContext.location?.href || '') => {
259
+ const domain = getDomainName(url, '');
260
+ const protocol = getProtocolName(url, '');
261
+ const port = getPortNumber(url);
262
+ return (domain === '' || domain === getDomainName(referenceURL)) && (protocol === '' || protocol === getProtocolName(referenceURL)) && (port === null || port === getPortNumber(referenceURL));
263
+ };
264
+ /**
265
+ * Normalized given website url.
266
+ * @param givenURL - Uniform resource locator to normalize.
267
+ * @returns Normalized result.
268
+ */
269
+ export const normalizeURL = givenURL => {
270
+ if (typeof givenURL === 'string') {
271
+ const url = givenURL.replace(/^:?\/+/, '').replace(/\/+$/, '').trim();
272
+ if (url.startsWith('http')) return url;
273
+ return `http://${url}`;
274
+ }
275
+ return '';
276
+ };
277
+ /**
278
+ * Represents given website url.
279
+ * @param url - Uniform resource locator to represent.
280
+ * @returns Represented result.
281
+ */
282
+ export const representURL = url => {
283
+ if (typeof url === 'string') return url.replace(/^(https?)?:?\/+/, '').replace(/\/+$/, '').trim();
284
+ return '';
285
+ };
286
+ //// endregion
287
+ /**
288
+ * Converts a camel-cased string to its delimited string version.
289
+ * @param value - The string to format.
290
+ * @param delimiter - Defines delimiter string.
291
+ * @param abbreviations - Collection of shortcut words to represent uppercased.
292
+ * @returns The formatted string.
293
+ */
294
+ export const camelCaseToDelimited = (value, delimiter = '-', abbreviations = null) => {
295
+ if (!abbreviations) abbreviations = ABBREVIATIONS;
296
+ const escapedDelimiter = maskForRegularExpression(delimiter);
297
+ if (abbreviations.length) {
298
+ let abbreviationPattern = '';
299
+ for (const abbreviation of abbreviations) {
300
+ if (abbreviationPattern) abbreviationPattern += '|';
301
+ abbreviationPattern += abbreviation.toUpperCase();
302
+ }
303
+ value = value.replace(new RegExp(`(${abbreviationPattern})(${abbreviationPattern})`, 'g'), `$1${delimiter}$2`);
304
+ }
305
+ value = value.replace(new RegExp(`([^${escapedDelimiter}])([A-Z][a-z]+)`, 'g'), `$1${delimiter}$2`);
306
+ return value.replace(new RegExp('([a-z0-9])([A-Z])', 'g'), `$1${delimiter}$2`).toLowerCase();
307
+ };
308
+ /**
309
+ * Converts a string to its capitalized representation.
310
+ * @param string - The string to format.
311
+ * @returns The formatted string.
312
+ */
313
+ export const capitalize = string => {
314
+ return string.charAt(0).toUpperCase() + string.substring(1);
315
+ };
316
+ /**
317
+ * Compresses given style attribute value.
318
+ * @param styleValue - Style value to compress.
319
+ * @returns The compressed value.
320
+ */
321
+ export const compressStyleValue = styleValue => {
322
+ return styleValue.replace(/ *([:;]) */g, '$1').replace(/ +/g, ' ').replace(/^;+/, '').replace(/;+$/, '').trim();
323
+ };
324
+ /**
325
+ * Decodes all html symbols in text nodes in a given html string.
326
+ * @param htmlString - HTML string to decode.
327
+ * @returns Decoded html string.
328
+ */
329
+ export const decodeHTMLEntities = htmlString => {
330
+ if (globalContext.document) {
331
+ const textareaDomNode = globalContext.document.createElement('textarea');
332
+ textareaDomNode.innerHTML = htmlString;
333
+ return textareaDomNode.value;
334
+ }
335
+ return null;
336
+ };
337
+ /**
338
+ * Converts a delimited string to its camel case representation.
339
+ * @param value - The string to format.
340
+ * @param delimiter - Delimiter string to use.
341
+ * @param abbreviations - Collection of shortcut words to represent uppercased.
342
+ * @param preserveWrongFormattedAbbreviations - If set to "True" wrong
343
+ * formatted camel case abbreviations will be ignored.
344
+ * @param removeMultipleDelimiter - Indicates whether a series of delimiter
345
+ * should be consolidated.
346
+ * @returns The formatted string.
347
+ */
348
+ export const delimitedToCamelCase = (value, delimiter = '-', abbreviations = null, preserveWrongFormattedAbbreviations = false, removeMultipleDelimiter = false) => {
349
+ let escapedDelimiter = maskForRegularExpression(delimiter);
350
+ if (!abbreviations) abbreviations = ABBREVIATIONS;
351
+ let abbreviationPattern;
352
+ if (preserveWrongFormattedAbbreviations) abbreviationPattern = ABBREVIATIONS.join('|');else {
353
+ abbreviationPattern = '';
354
+ for (const abbreviation of abbreviations) {
355
+ if (abbreviationPattern) abbreviationPattern += '|';
356
+ abbreviationPattern += `${capitalize(abbreviation)}|${abbreviation}`;
357
+ }
358
+ }
359
+ const stringStartsWithDelimiter = value.startsWith(delimiter);
360
+ if (stringStartsWithDelimiter) value = value.substring(delimiter.length);
361
+ value = value.replace(new RegExp(`(${escapedDelimiter})(${abbreviationPattern})` + `(${escapedDelimiter}|$)`, 'g'), (_fullMatch, before, abbreviation, after) => before + abbreviation.toUpperCase() + after);
362
+ if (removeMultipleDelimiter) escapedDelimiter = `(?:${escapedDelimiter})+`;
363
+ value = value.replace(new RegExp(`${escapedDelimiter}([a-zA-Z0-9])`, 'g'), (_fullMatch, firstLetter) => firstLetter.toUpperCase());
364
+ if (stringStartsWithDelimiter) value = delimiter + value;
365
+ return value;
366
+ };
367
+ /**
368
+ * Compiles a given string as an expression with given scope names.
369
+ * @param expression - The string to interpret.
370
+ * @param scope - Scope to extract names from.
371
+ * @param execute - Indicates whether to execute or evaluate.
372
+ * @param removeGlobalScope - Indicates whether to shadow global variables via
373
+ * "undefined".
374
+ * @param binding - Object to apply as "this" in evaluation scope.
375
+ * @returns Object of prepared scope name mappings and compiled function or
376
+ * error string message if given expression couldn't be compiled.
377
+ */
378
+ export const compile = (expression, scope = [], execute = false, removeGlobalScope = true, binding = {}) => {
379
+ /*
380
+ NOTE: We do this global variable name determining as close as possible
381
+ to the compiling step to cover as much as possible global introduces
382
+ variables.
383
+ */
384
+ const globalNames = Object.keys(globalThis).concat('globalThis').filter(name => new RegExp(`^[${ALLOWED_STARTING_VARIABLE_SYMBOLS}]` + `[${ALLOWED_VARIABLE_SYMBOLS}]*$`).test(name));
385
+ const result = {
386
+ error: null,
387
+ globalNames: globalNames,
388
+ globalNamesUndefinedList: globalNames.map(() => undefined),
389
+ originalScopeNames: Array.isArray(scope) ? scope : typeof scope === 'string' ? [scope] : Object.keys(scope),
390
+ scopeNameMapping: {},
391
+ scopeNames: [],
392
+ templateFunction: () => undefined
393
+ };
394
+ for (const name of result.originalScopeNames) {
395
+ const newName = convertToValidVariableName(name);
396
+ result.scopeNameMapping[name] = newName;
397
+ result.scopeNames.push(newName);
398
+ }
399
+ // region try to polyfill template string literals for older engines
400
+ if (POLYFILL_TEMPLATE_STRINGS.value) if (globalContext.Babel?.transform) expression = globalContext.Babel.transform(`(${expression})`, {
401
+ plugins: ['transform-template-literals']
402
+ }).code;else if (expression.startsWith('`') && expression.endsWith('`')) {
403
+ const escapeMarker = '####';
404
+ // Convert template string into legacy string concatenations.
405
+ expression = expression
406
+ // Mark simple escape sequences.
407
+ .replace(/\\\$/g, escapeMarker)
408
+ // Handle avoidable template expression: Use raw code.
409
+ .replace(/^`\$\{([\s\S]+)}`$/, 'String($1)')
410
+ // Use plain string with single quotes.
411
+ .replace(/^`([^']+)`$/, `'$1'`)
412
+ // Use plain string with double quotes.
413
+ .replace(/^`([^"]+)`$/, '"$1"');
414
+ // Use single quotes and hope (just a heuristic).
415
+ const quote = expression.charAt(0) === '`' ? `'` : expression.charAt(0);
416
+ expression = expression
417
+ // Replace a simple placeholder.
418
+ // NOTE: Replace complete bracket pairs.
419
+ .replace(/\$\{((([^{]*{[^}]*}[^}]*})|[^{}]+)+)}/g, `${quote}+($1)+${quote}`).replace(/^`([\s\S]+)`$/, `${quote}$1${quote}`)
420
+ // Remove remaining newlines.
421
+ .replace(/\n+/g, '')
422
+ // Replace marked escape sequences.
423
+ .replace(new RegExp(escapeMarker, 'g'), '\\$');
424
+ }
425
+ // endregion
426
+ let innerTemplateFunction;
427
+ try {
428
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
429
+ innerTemplateFunction = new Function(...(removeGlobalScope ? result.globalNames : []), ...result.scopeNames, `${execute ? '' : 'return '}${expression}`);
430
+ } catch (error) {
431
+ result.error = `Given expression "${expression}" could not be compiled width ` + `given scope names "${result.scopeNames.join('", "')}": ` + represent(error);
432
+ }
433
+ if (innerTemplateFunction) {
434
+ const boundInnerTemplateFunction = innerTemplateFunction.bind(binding);
435
+ result.templateFunction = removeGlobalScope ? (...parameters) =>
436
+ /*
437
+ NOTE: We shadow existing global names to sandbox
438
+ expressions.
439
+ */
440
+ boundInnerTemplateFunction(...result.globalNamesUndefinedList, ...parameters) : boundInnerTemplateFunction;
441
+ }
442
+ return result;
443
+ };
444
+ /**
445
+ * Evaluates a given string as an expression against a given scope.
446
+ * @param expression - The string to interpret.
447
+ * @param scope - Scope to render against.
448
+ * @param execute - Indicates whether to execute or evaluate.
449
+ * @param removeGlobalScope - Indicates whether to shadow global variables via
450
+ * "undefined".
451
+ * @param binding - Object to apply as "this" in evaluation scope.
452
+ * @returns Object with an error message during parsing / running or result.
453
+ */
454
+ export const evaluate = (expression, scope = {}, execute = false, removeGlobalScope = true, binding = {}) => {
455
+ // NOTE: We extract string-only types from given scope type.
456
+
457
+ const {
458
+ error,
459
+ originalScopeNames,
460
+ scopeNames,
461
+ templateFunction
462
+ } = compile(expression, scope, execute, removeGlobalScope, binding);
463
+ let result = {
464
+ compileError: null,
465
+ runtimeError: null,
466
+ error: 'Not yet evaluated.',
467
+ result: undefined
468
+ };
469
+ if (error) {
470
+ result.compileError = result.error = error;
471
+ return result;
472
+ }
473
+ try {
474
+ result = {
475
+ compileError: null,
476
+ runtimeError: null,
477
+ error: null,
478
+ result: templateFunction(
479
+ /*
480
+ NOTE: We want to be sure to have the same ordering as we
481
+ have for the scope names and to call internal registered
482
+ getter by retrieving values. So simple using
483
+ "...Object.values(scope)" is not appreciate here.
484
+ */
485
+ ...originalScopeNames.map(name => scope[name]))
486
+ };
487
+ } catch (error) {
488
+ result.error = result.runtimeError = `Given expression "${expression}" could not be evaluated ` + `with given scope names "${scopeNames.join('", "')}": ` + represent(error);
489
+ }
490
+ return result;
491
+ };
492
+ /**
493
+ * Finds the string match of a given query in a given target text by applying a
494
+ * given normalization function to target and query.
495
+ * @param target - Target to search in.
496
+ * @param query - Search string to search for.
497
+ * @param normalizer - Function to use as normalization for queries and search
498
+ * targets.
499
+ * @param skipTagDelimitedParts - Indicates whether to, for example, ignore
500
+ * html tags via "['<', '>']" (the default).
501
+ * @returns Start and end index of matching range.
502
+ */
503
+ export const findNormalizedMatchRange = (target, query, normalizer = value => String(value).toLowerCase(), skipTagDelimitedParts = ['<', '>']) => {
504
+ const normalizedQuery = normalizer(query);
505
+ const normalizedTarget = normalizer(target);
506
+ const stringTarget = typeof target === 'string' ? target : normalizedTarget;
507
+ if (normalizedTarget && normalizedQuery) {
508
+ let inTag = false;
509
+ for (let index = 0; index < stringTarget.length; index += 1) {
510
+ if (inTag) {
511
+ if (Array.isArray(skipTagDelimitedParts) && stringTarget.charAt(index) === skipTagDelimitedParts[1]) inTag = false;
512
+ continue;
513
+ }
514
+ if (Array.isArray(skipTagDelimitedParts) && stringTarget.charAt(index) === skipTagDelimitedParts[0]) {
515
+ inTag = true;
516
+ continue;
517
+ }
518
+ if (normalizer(stringTarget.substring(index)).startsWith(normalizedQuery)) {
519
+ if (normalizedQuery.length === 1) return [index, index + 1];
520
+ for (let subIndex = stringTarget.length; subIndex > index; subIndex -= 1) if (!normalizer(stringTarget.substring(index, subIndex)).startsWith(normalizedQuery)) return [index, subIndex + 1];
521
+ }
522
+ }
523
+ }
524
+ return null;
525
+ };
526
+ /**
527
+ * Fixes known encoding problems in given data.
528
+ * @param data - To process.
529
+ * @returns Processed data.
530
+ */
531
+ export const fixKnownEncodingErrors = data => {
532
+ for (const [search, replacement] of FIX_ENCODING_ERROR_MAPPING) data = data.replace(new RegExp(search, 'g'), replacement);
533
+ return data;
534
+ };
535
+ /**
536
+ * Performs a string formation. Replaces every placeholder "{i}" with the i'th
537
+ * argument.
538
+ * @param string - The string to format.
539
+ * @param additionalArguments - Additional arguments are interpreted as
540
+ * replacements for string formatting.
541
+ * @returns The formatted string.
542
+ */
543
+ export const format = (string, ...additionalArguments) => {
544
+ additionalArguments.unshift(string);
545
+ let index = 0;
546
+ for (const value of additionalArguments) {
547
+ string = string.replace(new RegExp(`\\{${String(index)}\\}`, 'gm'), String(value));
548
+ index += 1;
549
+ }
550
+ return string;
551
+ };
552
+ /**
553
+ * Calculates the edit (levenstein) distance between two given strings.
554
+ * @param first - First string to compare.
555
+ * @param second - Second string to compare.
556
+ * @returns The distance as number.
557
+ */
558
+ export const getEditDistance = (first, second) => {
559
+ /*
560
+ Create empty edit distance matrix for all possible modifications of
561
+ substrings of "first" to substrings of "second".
562
+ */
563
+ const distanceMatrix = Array(second.length + 1).fill(null).map(() => Array(first.length + 1).fill(null));
564
+ /*
565
+ Fill the first row of the matrix.
566
+ If this is the first row, then, we're transforming an empty string to
567
+ "first". In this case the number of transformations equals to the size
568
+ of the "first" substring.
569
+ */
570
+ for (let index = 0; index <= first.length; index++) distanceMatrix[0][index] = index;
571
+ /*
572
+ Fill the first column of the matrix.
573
+ If this is the first column, then we're transforming an empty string to
574
+ "second".
575
+ In this case the number of transformations equals to the size of the
576
+ "second" substring.
577
+ */
578
+ for (let index = 0; index <= second.length; index++) distanceMatrix[index][0] = index;
579
+ for (let firstIndex = 1; firstIndex <= second.length; firstIndex++) for (let secondIndex = 1; secondIndex <= first.length; secondIndex++) {
580
+ const indicator = first[secondIndex - 1] === second[firstIndex - 1] ? 0 : 1;
581
+ distanceMatrix[firstIndex][secondIndex] = Math.min(
582
+ // deletion
583
+ distanceMatrix[firstIndex][secondIndex - 1] + 1,
584
+ // insertion
585
+ distanceMatrix[firstIndex - 1][secondIndex] + 1,
586
+ // substitution
587
+ distanceMatrix[firstIndex - 1][secondIndex - 1] + indicator);
588
+ }
589
+ return distanceMatrix[second.length][first.length];
590
+ };
591
+ /**
592
+ * Validates the current string for using in a regular expression pattern.
593
+ * Special regular expression chars will be escaped.
594
+ * @param value - The string to format.
595
+ * @returns The formatted string.
596
+ */
597
+ export const maskForRegularExpression = value => {
598
+ return value.replace(/([\\|.*$^+[\]()?\-{}])/g, '\\$1');
599
+ };
600
+ /**
601
+ * Converts a string to its lower case representation.
602
+ * @param string - The string to format.
603
+ * @returns The formatted string.
604
+ */
605
+ export const lowerCase = string => {
606
+ return string.charAt(0).toLowerCase() + string.substring(1);
607
+ };
608
+ /**
609
+ * Wraps given mark strings in a given target with a given marker.
610
+ * @param target - String to search for marker.
611
+ * @param givenWords - String or array of strings to search in target for.
612
+ * @param givenOptions - Defines highlighting behavior.
613
+ * @param givenOptions.marker - HTML template string to mark.
614
+ * @param givenOptions.normalizer - Pure normalization function to use before
615
+ * searching for matches.
616
+ * @param givenOptions.skipTagDelimitedParts - Indicates whether to, for
617
+ * example, ignore html tags via "['<', '>']" (the default).
618
+ * @returns Processed result.
619
+ */
620
+ export const mark = (target, givenWords, givenOptions = {}) => {
621
+ if (typeof target === 'string' && givenWords?.length) {
622
+ const options = {
623
+ marker: '<span class="tools-mark">{1}</span>',
624
+ normalizer: value => String(value).toLowerCase(),
625
+ skipTagDelimitedParts: ['<', '>'],
626
+ ...givenOptions
627
+ };
628
+ target = target.trim();
629
+ const markedTarget = [];
630
+ const words = [].concat(givenWords);
631
+ let index = 0;
632
+ for (const word of words) {
633
+ words[index] = options.normalizer(word).trim();
634
+ index += 1;
635
+ }
636
+ let restTarget = target;
637
+ let offset = 0;
638
+ /*
639
+ Search for matches as long there is enough target text remaining to
640
+ walk through.
641
+ */
642
+ for (let iteration = 0; iteration < MAXIMAL_NUMBER_OF_ITERATIONS.value; iteration++) {
643
+ let nearestRange = null;
644
+ let currentRange;
645
+
646
+ // Find the nearest next matching word.
647
+ for (const word of words) {
648
+ currentRange = findNormalizedMatchRange(restTarget, word, options.normalizer, options.skipTagDelimitedParts);
649
+ if (currentRange && (!nearestRange || currentRange[0] < nearestRange[0])) nearestRange = currentRange;
650
+ }
651
+ if (nearestRange) {
652
+ if (nearestRange[0] > 0) markedTarget.push(target.substring(offset, offset + nearestRange[0]));
653
+ markedTarget.push(typeof options.marker === 'string' ? format(options.marker, target.substring(offset + nearestRange[0], offset + nearestRange[1])) : options.marker(target.substring(offset + nearestRange[0], offset + nearestRange[1]), markedTarget));
654
+ offset += nearestRange[1];
655
+ restTarget = target.substring(offset);
656
+ } else {
657
+ if (restTarget.length) markedTarget.push(restTarget);
658
+ break;
659
+ }
660
+ }
661
+ return typeof options.marker === 'string' ? markedTarget.join('') : markedTarget;
662
+ }
663
+ return target;
664
+ };
665
+ /**
666
+ * Normalizes a given phone number for automatic dialing or comparison.
667
+ * @param value - Number to normalize.
668
+ * @param dialable - Indicates whether the result should be dialed or
669
+ * represented as lossless data.
670
+ * @returns Normalized number.
671
+ */
672
+ export const normalizePhoneNumber = (value, dialable = true) => {
673
+ if (typeof value === 'string' || typeof value === 'number') {
674
+ let normalizedValue = String(value).trim();
675
+
676
+ // Normalize country code prefix.
677
+ normalizedValue = normalizedValue.replace(/^[^0-9]*\+/, '00');
678
+
679
+ // Remove alternate direct dial numbers.
680
+ normalizedValue = normalizedValue.replace(/([0-9].*?) *(,|o[rd]?)\.? ?-?[0-9]+$/, '$1');
681
+ if (dialable) return normalizedValue.replace(/[^0-9]+/g, '');
682
+ const separatorPattern = '(?:[ /\\-]+)';
683
+ // Remove unneeded area code zero in brackets.
684
+ normalizedValue = normalizedValue.replace(new RegExp(`^(.+?)${separatorPattern}?\\(0\\)${separatorPattern}?` + '(.+)$'), '$1-$2');
685
+ // Remove unneeded area code brackets.
686
+ normalizedValue = normalizedValue.replace(new RegExp(`^(.+?)${separatorPattern}?\\((.+)\\)` + `${separatorPattern}?(.+)$`), '$1-$2-$3');
687
+ /*
688
+ Remove separators that don't mark semantics:
689
+ 1: Country code
690
+ 2: Area code
691
+ 3: Number
692
+ */
693
+ let compiledPattern = new RegExp(`^(00[0-9]+)${separatorPattern}([0-9]+)${separatorPattern}` + '(.+)$');
694
+ if (compiledPattern.test(normalizedValue))
695
+ // Country code and area code matched.
696
+ normalizedValue = normalizedValue.replace(compiledPattern, (_match, countryCode, areaCode, number) => `${countryCode}-${areaCode}-` + sliceAllExceptNumberAndLastSeparator(number));else {
697
+ /*
698
+ One prefix code matched:
699
+ 1: Prefix code
700
+ 2: Number
701
+ */
702
+ compiledPattern = /^([0-9 ]+)[/-](.+)$/;
703
+ const replacer = (_match, prefixCode, number) => `${prefixCode.replace(/ +/, '')}-` + sliceAllExceptNumberAndLastSeparator(number);
704
+ if (compiledPattern.test(normalizedValue))
705
+ // Prefer "/" or "-" over " " as area code separator.
706
+ normalizedValue = normalizedValue.replace(compiledPattern, replacer);else normalizedValue = normalizedValue.replace(new RegExp(`^([0-9]+)${separatorPattern}(.+)$`), replacer);
707
+ }
708
+ return normalizedValue.replace(/[^0-9-]+/g, '').replace(/^-+$/, '');
709
+ }
710
+ return '';
711
+ };
712
+ /**
713
+ * Normalizes a given zip code for automatic address processing.
714
+ * @param value - Number to normalize.
715
+ * @returns Normalized number.
716
+ */
717
+ export const normalizeZipCode = value => {
718
+ if (typeof value === 'string' || typeof value === 'number') return String(value).trim().replace(/^([^0-9]*[a-zA-Z]-)?(.+)$/, (match, prefix, code) => {
719
+ if (prefix) prefix = prefix.substring(prefix.length - 2).charAt(0).toUpperCase() + '-';
720
+ return (prefix ?? '') + (code ?? '').trim().replace(/[^0-9]+/g, '');
721
+ });
722
+ return '';
723
+ };
724
+ /**
725
+ * Converts a given serialized, base64 encoded or file path given object into a
726
+ * native JavaScript one if possible.
727
+ * @param serializedObject - Object as string.
728
+ * @param scope - An optional scope which will be used to evaluate given object
729
+ * in.
730
+ * @param name - The name under given scope will be available.
731
+ * @returns The parsed object if possible and null otherwise.
732
+ */
733
+ export const parseEncodedObject = (serializedObject, scope = {}, name = 'scope') => {
734
+ if (!imports.fs?.readFileSync) throw new Error('File system api could not be loaded.');
735
+ if (serializedObject.endsWith('.json') && isFileSync(serializedObject)) serializedObject = imports.fs.readFileSync(serializedObject, {
736
+ encoding: DEFAULT_ENCODING
737
+ });
738
+ serializedObject = serializedObject.trim();
739
+ if (!serializedObject.startsWith('{')) serializedObject = eval('Buffer').from(serializedObject, 'base64').toString(DEFAULT_ENCODING);
740
+ const result = evaluate(serializedObject, {
741
+ [name]: scope
742
+ });
743
+ if (typeof result.result === 'object') return result.result;
744
+ return null;
745
+ };
746
+ /**
747
+ * Represents a given phone number. NOTE: Currently only support German phone
748
+ * numbers.
749
+ * @param value - Number to format.
750
+ * @returns Formatted number.
751
+ */
752
+ export const representPhoneNumber = value => {
753
+ if (['number', 'string'].includes(determineType(value)) && value) {
754
+ // Represent country code and leading area code zero.
755
+ let normalizedValue =
756
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
757
+ String(value).replace(/^(00|\+)([0-9]+)-([0-9-]+)$/, '+$2 (0) $3');
758
+
759
+ // Add German country code if not exists.
760
+ normalizedValue = normalizedValue.replace(/^0([1-9][0-9-]+)$/, '+49 (0) $1');
761
+ // Separate area code from base number.
762
+ normalizedValue = normalizedValue.replace(/^([^-]+)-([0-9-]+)$/, '$1 / $2');
763
+
764
+ // Partition base number in one triple and tuples or tuples only.
765
+ return normalizedValue.replace(/^(.*?)([0-9]+)(-?[0-9]*)$/, (_match, prefix, number, suffix) => prefix + (number.length % 2 === 0 ? number.replace(/([0-9]{2})/g, '$1 ') : number.replace(/^([0-9]{3})([0-9]+)$/, (_match, triple, rest) => `${triple} ` + rest.replace(/([0-9]{2})/g, '$1 ').trim()) + suffix).trim()).trim();
766
+ }
767
+ return '';
768
+ };
769
+ /**
770
+ * Slices all none numbers but preserves last separator.
771
+ * @param value - String to process.
772
+ * @returns - Sliced given value.
773
+ */
774
+ export const sliceAllExceptNumberAndLastSeparator = value => {
775
+ /*
776
+ 1: baseNumber
777
+ 2: directDialingNumberSuffix
778
+ */
779
+ const compiledPattern = /^(.*[0-9].*)-([0-9]+)$/;
780
+ if (compiledPattern.test(value)) return value.replace(compiledPattern, (_match, baseNumber, directDialingNumberSuffix) => `${baseNumber.replace(/[^0-9]+/g, '')}-` + directDialingNumberSuffix);
781
+ return value.replace(/[^0-9]+/g, '');
782
+ };
783
+ /**
784
+ * Converts a dom selector to a prefixed dom selector string.
785
+ * @param selector - A dom node selector.
786
+ * @param selectorPrefix - A dom node selector prefix to take into account.
787
+ * @returns Returns given selector prefixed.
788
+ */
789
+ export const normalizeDomNodeSelector = (selector, selectorPrefix = '') => {
790
+ let domNodeSelectorPrefix = '';
791
+ if (selectorPrefix) domNodeSelectorPrefix = `${selectorPrefix} `;
792
+ if (!(selector.startsWith(domNodeSelectorPrefix) || selector.trim().startsWith('<'))) selector = domNodeSelectorPrefix + selector;
793
+ return selector.trim();
794
+ };
795
+ /**
796
+ * Abbreviates a given string if it excesses a given limit.
797
+ * @param value - String to abbreviate.
798
+ * @param limit - Maximum length of processed string.
799
+ * @returns Abbreviated given string.
800
+ */
801
+ export const limit = (value, limit = 100) => {
802
+ if (value.length <= limit) return value;
803
+ const dots = '...';
804
+ return value.substring(0, limit - dots.length) + dots;
805
+ };
806
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3N0cmluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAjIS91c3IvYmluL2VudiBiYWJlbC1ub2RlXG4vLyAtKi0gY29kaW5nOiB1dGYtOCAtKi1cbi8qKiBAbW9kdWxlIHN0cmluZyAqL1xuJ3VzZSBzdHJpY3QnXG4vKiAhXG4gICAgcmVnaW9uIGhlYWRlclxuICAgIFtQcm9qZWN0IHBhZ2VdKGh0dHBzOi8vdG9yYmVuLndlYnNpdGUvY2xpZW50bm9kZSlcblxuICAgIENvcHlyaWdodCBUb3JiZW4gU2lja2VydCAoaW5mb1tcIn5hdH5cIl10b3JiZW4ud2Vic2l0ZSkgMTYuMTIuMjAxMlxuXG4gICAgTGljZW5zZVxuICAgIC0tLS0tLS1cblxuICAgIFRoaXMgbGlicmFyeSB3cml0dGVuIGJ5IFRvcmJlbiBTaWNrZXJ0IHN0YW5kcyB1bmRlciBhIGNyZWF0aXZlIGNvbW1vbnNcbiAgICBuYW1pbmcgMy4wIHVucG9ydGVkIGxpY2Vuc2UuXG4gICAgU2VlIGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvZGVlZC5kZVxuICAgIGVuZHJlZ2lvblxuKi9cbi8vIHJlZ2lvbiB1cmwgaGFuZGxpbmdcbmltcG9ydCB0eXBlIHtcbiAgICBDb21waWxhdGlvblJlc3VsdCxcbiAgICBFdmFsdWF0aW9uUmVzdWx0LFxuICAgIE1hcHBpbmcsXG4gICAgUGxhaW5PYmplY3QsXG4gICAgU3RyaW5nTWFya09wdGlvbnMsXG4gICAgVGVtcGxhdGVGdW5jdGlvbixcbiAgICBRdWVyeVBhcmFtZXRlcnMsXG4gICAgVmFsdWVPZlxufSBmcm9tICcuL3R5cGUnXG5cbmltcG9ydCB7XG4gICAgQUJCUkVWSUFUSU9OUywgREVGQVVMVF9FTkNPRElORywgU1BFQ0lBTF9SRUdFWF9TRVFVRU5DRVNcbn0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQge2dsb2JhbENvbnRleHQsIE1BWElNQUxfTlVNQkVSX09GX0lURVJBVElPTlN9IGZyb20gJy4vY29udGV4dCdcbmltcG9ydCB7aXNGaWxlU3luYywgaW1wb3J0c30gZnJvbSAnLi9maWxlc3lzdGVtJ1xuaW1wb3J0IHtkZXRlcm1pbmVUeXBlLCByZXByZXNlbnR9IGZyb20gJy4vb2JqZWN0J1xuXG5leHBvcnQgY29uc3QgUE9MWUZJTExfVEVNUExBVEVfU1RSSU5HUyA9IHt2YWx1ZTogZmFsc2V9XG4vLyBQYXJ0aWFsIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBzeW1ib2xzIHdoaWNoIHNob3VsZCBiZSBhbGxvd2VkIHdpdGhpbiBhXG4vLyB2YXJpYWJsZSBuYW1lIGV4Y2x1ZGluZyB0aGUgZmlyc3QgY2hhcmFjdGVyLlxuZXhwb3J0IGNvbnN0IEFMTE9XRURfVkFSSUFCTEVfU1lNQk9MUyA9ICcwLTlhLXpBLVpfJCdcbi8vIFBhcnRpYWwgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIHN5bWJvbHMgd2hpY2ggc2hvdWxkIGJlIGFsbG93ZWQgYXNcbi8vIHN0YXJ0aW5nIGNoYXJhY3RlciBmb3IgYSB2YXJpYWJsZSBuYW1lLlxuZXhwb3J0IGNvbnN0IEFMTE9XRURfU1RBUlRJTkdfVkFSSUFCTEVfU1lNQk9MUyA9ICdhLXpBLVpfJCdcbmV4cG9ydCBjb25zdCBGSVhfRU5DT0RJTkdfRVJST1JfTUFQUElORyA9IFtcbiAgICBbJ8ODXFxcXHg4NCcsICfDhCddLFxuICAgIFsnw4NcXFxceDk2JywgJ8OWJ10sXG4gICAgWyfDg1xcXFx4OWMnLCAnw5wnXSxcbiAgICBbJ8ODwqQnLCAnw6QnXSxcbiAgICBbJ8ODwrYnLCAnw7YnXSxcbiAgICBbJ8ODwrwnLCAnw7wnXSxcblxuICAgIFsnXFxcXHg5NicsICctJ10sXG5cbiAgICBbJ8ODwqknLCAnw6knXSxcbiAgICBbJ8ODwqgnLCAnZSddLFxuXG4gICAgWyfDg8K0JywgJ28nXSxcblxuICAgIFsnw4MgJywgJ8OhJ10sXG4gICAgWyfDg8K4JywgJ8O4J10sXG5cbiAgICBbJ8ODXFxcXHg5ZicsICfDnyddLFxuICAgIFsnw4MnLCAnw58nXVxuXSBhcyBjb25zdFxuXG4vKipcbiAqIFRyYW5zbGF0ZXMgYSBnaXZlbiBzdHJpbmcgaW50byB0aGUgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRlZFxuICogcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0gdmFsdWUgLSBTdHJpbmcgdG8gY29udmVydC5cbiAqIEBwYXJhbSBleGNsdWRlU3ltYm9scyAtIFN5bWJvbHMgbm90IHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIENvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBlc2NhcGVSZWd1bGFyRXhwcmVzc2lvbnMgPSAoXG4gICAgdmFsdWU6IHN0cmluZywgZXhjbHVkZVN5bWJvbHM6IEFycmF5PHN0cmluZz4gPSBbXVxuKTogc3RyaW5nID0+IHtcbiAgICAvLyBOT1RFOiBUaGlzIGlzIG9ubHkgZm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cy5cbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAxICYmICFTUEVDSUFMX1JFR0VYX1NFUVVFTkNFUy5pbmNsdWRlcyh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZVxuXG4gICAgLy8gVGhlIGVzY2FwZSBzZXF1ZW5jZSBtdXN0IGFsc28gYmUgZXNjYXBlZDsgYnV0IGF0IGZpcnN0LlxuICAgIGlmICghZXhjbHVkZVN5bWJvbHMuaW5jbHVkZXMoJ1xcXFwnKSlcbiAgICAgICAgdmFsdWUucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKVxuXG4gICAgZm9yIChjb25zdCByZXBsYWNlIG9mIFNQRUNJQUxfUkVHRVhfU0VRVUVOQ0VTKVxuICAgICAgICBpZiAoIWV4Y2x1ZGVTeW1ib2xzLmluY2x1ZGVzKHJlcGxhY2UpKVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYFxcXFwke3JlcGxhY2V9YCwgJ2cnKSwgYFxcXFwke3JlcGxhY2V9YClcblxuICAgIHJldHVybiB2YWx1ZVxufVxuLyoqXG4gKiBUcmFuc2xhdGVzIGEgZ2l2ZW4gbmFtZSBpbnRvIGEgdmFsaWQgSmF2YVNjcmlwdCBvbmUuXG4gKiBAcGFyYW0gbmFtZSAtIE5hbWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIENvbnZlcnRlZCBuYW1lIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgY29uc3QgY29udmVydFRvVmFsaWRWYXJpYWJsZU5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBpZiAoWydjbGFzcycsICdkZWZhdWx0J10uaW5jbHVkZXMobmFtZSkpXG4gICAgICAgIHJldHVybiBgXyR7bmFtZX1gXG5cbiAgICByZXR1cm4gbmFtZVxuICAgICAgICAvLyBSZW1vdmUgYWxsIGRpc2FsbG93ZWQgc3RhcnRpbmcgY2hhcmFjdGVycy5cbiAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChgXlteJHtBTExPV0VEX1NUQVJUSU5HX1ZBUklBQkxFX1NZTUJPTFN9XStgKSwgJycpXG4gICAgICAgIC8vIFJlbW92ZSBhbGwgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzIHdpdGhpbiBhIHZhcmlhYmxlIG5hbWUgYW5kIG1ha2VcbiAgICAgICAgLy8gY29udGludWluZyBjaGFyYWN0ZXIgdXBwZXIgY2FzZS5cbiAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICBuZXcgUmVnRXhwKGBbXiR7QUxMT1dFRF9WQVJJQUJMRV9TWU1CT0xTfV0rKFthLXpBLVpdKWAsICdnJyksXG4gICAgICAgICAgICAoX2Z1bGxNYXRjaDogc3RyaW5nLCBmaXJzdExldHRlcjogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgICAgICAgICAgICAgZmlyc3RMZXR0ZXIudG9VcHBlckNhc2UoKVxuICAgICAgICApXG59XG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBlbmNvZGluZyAqa2V5KiBvciAqdmFsdWUqIHBhcnRzIG9mIGEgcXVlcnlcbiAqIGNvbXBvbmVudC4gV2UgbmVlZCBhIGN1c3RvbSBtZXRob2QgYmVjYXVzZSBcImVuY29kZVVSSUNvbXBvbmVudCgpXCIgaXMgdG9vXG4gKiBhZ2dyZXNzaXZlIGFuZCBlbmNvZGVzIHN0dWZmIHRoYXQgZG9lc24ndCBoYXZlIHRvIGJlIGVuY29kZWQgcGVyXG4gKiBcImh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODY6XCIuXG4gKiBAcGFyYW0gdXJsIC0gVVJMIHRvIGVuY29kZS5cbiAqIEBwYXJhbSBlbmNvZGVTcGFjZXMgLSBJbmRpY2F0ZXMgd2hldGhlciBnaXZlbiB1cmwgc2hvdWxkIGVuY29kZVxuICogd2hpdGVzcGFjZXMgYXMgXCIrXCIgb3IgXCIlMjBcIi5cbiAqIEByZXR1cm5zIEVuY29kZWQgZ2l2ZW4gdXJsLlxuICovXG5leHBvcnQgY29uc3QgZW5jb2RlVVJJQ29tcG9uZW50RXh0ZW5kZWQgPSAoXG4gICAgdXJsOiBzdHJpbmcsIGVuY29kZVNwYWNlcyA9IGZhbHNlXG4pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodXJsKVxuICAgICAgICAucmVwbGFjZSgvJTQwL2dpLCAnQCcpXG4gICAgICAgIC5yZXBsYWNlKC8lM0EvZ2ksICc6JylcbiAgICAgICAgLnJlcGxhY2UoLyUyNC9nLCAnJCcpXG4gICAgICAgIC5yZXBsYWNlKC8lMkMvZ2ksICcsJylcbiAgICAgICAgLnJlcGxhY2UoLyUyMC9nLCBlbmNvZGVTcGFjZXMgPyAnJTIwJyA6ICcrJylcbn1cbi8qKlxuICogQXBwZW5kcyBhIHBhdGggc2VsZWN0b3IgdG8gdGhlIGdpdmVuIHBhdGggaWYgdGhlcmUgaXNuJ3Qgb25lIHlldC5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggZm9yIGFwcGVuZGluZyBhIHNlbGVjdG9yLlxuICogQHBhcmFtIHBhdGhTZXBhcmF0b3IgLSBUaGUgc2VsZWN0b3IgZm9yIGFwcGVuZGluZyB0byBhIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgYXBwZW5kZWQgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFkZFNlcGFyYXRvclRvUGF0aCA9IChcbiAgICBwYXRoOiBzdHJpbmcsIHBhdGhTZXBhcmF0b3IgPSAnLydcbik6IHN0cmluZyA9PiB7XG4gICAgcGF0aCA9IHBhdGgudHJpbSgpXG5cbiAgICBpZiAocGF0aC5zdWJzdHJpbmcocGF0aC5sZW5ndGggLSAxKSAhPT0gcGF0aFNlcGFyYXRvciAmJiBwYXRoLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIHBhdGggKyBwYXRoU2VwYXJhdG9yXG5cbiAgICByZXR1cm4gcGF0aFxufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBwYXRoIGhhcyBnaXZlbiBwYXRoIHByZWZpeC5cbiAqIEBwYXJhbSBwcmVmaXggLSBQYXRoIHByZWZpeCB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIHNlYXJjaCBpbi5cbiAqIEBwYXJhbSBzZXBhcmF0b3IgLSBEZWxpbWl0ZXIgdG8gdXNlIGluIGEgcGF0aCAoZGVmYXVsdCBpcyB0aGUgcG9zaXhcbiAqIGNvbmZvcm0gc2xhc2gpLlxuICogQHJldHVybnMgVmFsdWUgXCJ0cnVlXCIgaWYgZ2l2ZW4gcHJlZml4IG9jY3VycyBhbmQgXCJmYWxzZVwiIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc1BhdGhQcmVmaXggPSAoXG4gICAgcHJlZml4OiB1bmtub3duID0gJy9hZG1pbicsXG4gICAgcGF0aDogc3RyaW5nID0gZ2xvYmFsQ29udGV4dC5sb2NhdGlvbj8ucGF0aG5hbWUgfHwgJycsXG4gICAgc2VwYXJhdG9yID0gJy8nXG4pOiBib29sZWFuID0+IHtcbiAgICBpZiAodHlwZW9mIHByZWZpeCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKCFwcmVmaXguZW5kc1dpdGgoc2VwYXJhdG9yKSlcbiAgICAgICAgICAgIHByZWZpeCArPSBzZXBhcmF0b3JcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcGF0aCA9PT1cbiAgICAgICAgICAgIHByZWZpeC5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCAtIHNlcGFyYXRvci5sZW5ndGgpIHx8XG4gICAgICAgICAgICBwYXRoLnN0YXJ0c1dpdGgocHJlZml4KVxuICAgICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG59XG4vKipcbiAqIEV4dHJhY3RzIGRvbWFpbiBuYW1lIGZyb20gZ2l2ZW4gdXJsLiBJZiBubyBleHBsaWNpdCBkb21haW4gbmFtZSBnaXZlblxuICogY3VycmVudCBkb21haW4gbmFtZSB3aWxsIGJlIGFzc3VtZWQuIElmIG5vIHBhcmFtZXRlciBpcyBnaXZlbiwgdGhlIGN1cnJlbnRcbiAqIGRvbWFpbiBuYW1lIHdpbGwgYmUgZGV0ZXJtaW5lZC5cbiAqIEBwYXJhbSB1cmwgLSBUaGUgdXJsIHRvIGV4dHJhY3QgZG9tYWluIGZyb20uXG4gKiBAcGFyYW0gZmFsbGJhY2sgLSBUaGUgZmFsbGJhY2sgaG9zdCBuYW1lIGlmIG5vIG9uZSBleGl0cyBpbiBnaXZlbiB1cmxcbiAqIChkZWZhdWx0IGlzIGN1cnJlbnQgaG9zdG5hbWUpLlxuICogQHJldHVybnMgRXh0cmFjdGVkIGRvbWFpbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldERvbWFpbk5hbWUgPSAoXG4gICAgdXJsOiBzdHJpbmcgPSBnbG9iYWxDb250ZXh0LmxvY2F0aW9uPy5ocmVmIHx8ICcnLFxuICAgIGZhbGxiYWNrOiBzdHJpbmcgPSBnbG9iYWxDb250ZXh0LmxvY2F0aW9uPy5ob3N0bmFtZSB8fCAnJ1xuKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PHN0cmluZz4gfCBudWxsID1cbiAgICAgICAgL14oW2Etel0qOj9cXC9cXC8pPyhbXi9dKz8pKD86OlswLTldKyk/KD86XFwvLip8JCkvaS5leGVjKHVybClcblxuICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDIgJiYgcmVzdWx0WzFdICYmIHJlc3VsdFsyXSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdFsyXVxuXG4gICAgcmV0dXJuIGZhbGxiYWNrXG59XG4vKipcbiAqIEV4dHJhY3RzIHBvcnQgbnVtYmVyIGZyb20gZ2l2ZW4gdXJsLiBJZiBubyBleHBsaWNpdCBwb3J0IG51bWJlciBpcyBnaXZlblxuICogYW5kIG5vIGZhbGxiYWNrIGlzIGRlZmluZWQsIHRoZSBjdXJyZW50IHBvcnQgbnVtYmVyIHdpbGwgYmUgYXNzdW1lZCBmb3IgbG9jYWxcbiAqIGxpbmtzLiBGb3IgZXh0ZXJuYWwgbGlua3MgODAgd2lsbCBiZSBhc3N1bWVkIGZvciBodHRwIHByb3RvY29scyBhbmQgNDQzXG4gKiBmb3IgaHR0cHMgcHJvdG9jb2xzLlxuICogQHBhcmFtIHVybCAtIFRoZSB1cmwgdG8gZXh0cmFjdCBwb3J0IGZyb20uXG4gKiBAcGFyYW0gZmFsbGJhY2sgLSBGYWxsYmFjayBwb3J0IG51bWJlciBpZiBubyBleHBsaWNpdCBvbmUgd2FzIGZvdW5kLlxuICogRGVmYXVsdCBpcyBkZXJpdmVkIGZyb20gdGhlIGN1cnJlbnQgcHJvdG9jb2wgbmFtZS5cbiAqIEByZXR1cm5zIEV4dHJhY3RlZCBwb3J0IG51bWJlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFBvcnROdW1iZXIgPSAoXG4gICAgdXJsOiBzdHJpbmcgPSBnbG9iYWxDb250ZXh0LmxvY2F0aW9uPy5ocmVmIHx8ICcnLFxuICAgIGZhbGxiYWNrOiBudWxsIHwgbnVtYmVyID0gZ2xvYmFsQ29udGV4dC5sb2NhdGlvbj8ucG9ydCA/XG4gICAgICAgIHBhcnNlSW50KGdsb2JhbENvbnRleHQubG9jYXRpb24ucG9ydCkgOlxuICAgICAgICBudWxsXG4pOiBudWxsIHwgbnVtYmVyID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PHN0cmluZz4gfCBudWxsID1cbiAgICAgICAgL14oPzpbYS16XSo6P1xcL1xcL1teL10rPyk/W14vXSs/OihbMC05XSspL2kuZXhlYyh1cmwpXG5cbiAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAxKVxuICAgICAgICByZXR1cm4gcGFyc2VJbnQocmVzdWx0WzFdLCAxMClcblxuICAgIGlmIChmYWxsYmFjayAhPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrXG5cbiAgICBpZiAoXG4gICAgICAgIC8vIE5PVEU6IFdvdWxkIHJlc3VsdCBpbiBhbiBlbmRsZXNzIGxvb3A6XG4gICAgICAgIC8vIHNlcnZpY2VVUkxFcXVhbHModXJsLCAuLi5wYXJhbWV0ZXJzKSAmJlxuICAgICAgICBnbG9iYWxDb250ZXh0LmxvY2F0aW9uPy5wb3J0ICYmXG4gICAgICAgIHBhcnNlSW50KGdsb2JhbENvbnRleHQubG9jYXRpb24ucG9ydCwgMTApXG4gICAgKVxuICAgICAgICByZXR1cm4gcGFyc2VJbnQoZ2xvYmFsQ29udGV4dC5sb2NhdGlvbi5wb3J0LCAxMClcblxuICAgIHJldHVybiBnZXRQcm90b2NvbE5hbWUodXJsKSA9PT0gJ2h0dHBzJyA/IDQ0MyA6IDgwXG59XG4vKipcbiAqIEV4dHJhY3RzIHByb3RvY29sIG5hbWUgZnJvbSBnaXZlbiB1cmwuIElmIG5vIGV4cGxpY2l0IHVybCBpcyBnaXZlbixcbiAqIHRoZSBjdXJyZW50IHByb3RvY29sIHdpbGwgYmUgYXNzdW1lZC4gSWYgbm8gcGFyYW1ldGVyIGlzIGdpdmVuLCB0aGUgY3VycmVudFxuICogcHJvdG9jb2wgbnVtYmVyIHdpbGwgYmUgZGV0ZXJtaW5lZC5cbiAqIEBwYXJhbSB1cmwgLSBUaGUgdXJsIHRvIGV4dHJhY3QgcHJvdG9jb2wgZnJvbS5cbiAqIEBwYXJhbSBmYWxsYmFjayAtIEZhbGxiYWNrIHBvcnQgdG8gdXNlIGlmIG5vIHByb3RvY29sIGV4aXN0cyBpbiBnaXZlblxuICogdXJsIChkZWZhdWx0IGlzIGN1cnJlbnQgcHJvdG9jb2wpLlxuICogQHJldHVybnMgRXh0cmFjdGVkIHByb3RvY29sLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJvdG9jb2xOYW1lID0gKFxuICAgIHVybDogc3RyaW5nID0gZ2xvYmFsQ29udGV4dC5sb2NhdGlvbj8uaHJlZiB8fCAnJyxcbiAgICBmYWxsYmFjazogc3RyaW5nID0gKFxuICAgICAgICBnbG9iYWxDb250ZXh0LmxvY2F0aW9uPy5wcm90b2NvbCAmJlxuICAgICAgICBnbG9iYWxDb250ZXh0LmxvY2F0aW9uLnByb3RvY29sLnN1YnN0cmluZyhcbiAgICAgICAgICAgIDAsIGdsb2JhbENvbnRleHQubG9jYXRpb24ucHJvdG9jb2wubGVuZ3RoIC0gMVxuICAgICAgICApIHx8XG4gICAgICAgICcnXG4gICAgKVxuKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PHN0cmluZz4gfCBudWxsID0gL14oW2Etel0rKTpcXC9cXC8vaS5leGVjKHVybClcblxuICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDEgJiYgcmVzdWx0WzFdKVxuICAgICAgICByZXR1cm4gcmVzdWx0WzFdXG5cbiAgICByZXR1cm4gZmFsbGJhY2tcbn1cbi8qKlxuICogUmVhZCBhIHBhZ2UncyBHRVQgVVJMIHZhcmlhYmxlcyBhbmQgcmV0dXJuIHRoZW0gYXMgYW4gYXNzb2NpYXRpdmUgYXJyYXlcbiAqIGFuZCBwcmVzZXJ2ZXMgb3JkZXJpbmcuXG4gKiBAcGFyYW0ga2V5VG9HZXQgLSBJZiBwcm92aWRlZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkgaXNcbiAqIHJldHVybmVkIG9yIGZ1bGwgb2JqZWN0IG90aGVyd2lzZS5cbiAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZXMgLSBJbmRpY2F0ZXMgd2hldGhlciB0byByZXR1cm4gYXJyYXlzIG9mIHZhbHVlcyBvclxuICogc2luZ2xlIHZhbHVlcy4gSWYgc2V0IHRvIFwiZmFsc2VcIiAoZGVmYXVsdCkgbGFzdCB2YWx1ZXMgd2lsbCBvdmVyd3JpdGVcbiAqIHByZWNlZGluZyB2YWx1ZXMuXG4gKiBAcGFyYW0gZ2l2ZW5JbnB1dCAtIEFuIGFsdGVybmF0aXZlIGlucHV0IHRvIHRoZSB1cmwgc2VhcmNoIHBhcmFtZXRlci4gSWZcbiAqIFwiI1wiIGlzIGdpdmVuLCB0aGUgY29tcGxldGUgY3VycmVudCBoYXNodGFnIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgdXJsIGFuZFxuICogc2VhcmNoIHBhcmFtZXRlciB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZXJlLiBJZiBcIiZcIiBpcyBnaXZlbiBhIGNsYXNzaWNhbFxuICogc2VhcmNoIHBhcmFtZXRlciwgYW5kIGhhc2ggcGFyYW1ldGVyIHdpbGwgYmUgdGFrZW4gaW4gYW4gYWNjb3VudC4gSWYgYVxuICogc2VhcmNoIHN0cmluZyBpcyBnaXZlbiwgdGhpcyB3aWxsIGJlIGFuYWx5emVkLiBUaGUgZGVmYXVsdCBpcyB0byB0YWtlIGFcbiAqIGdpdmVuIHNlYXJjaCBwYXJ0IGludG8gYWNjb3VudC5cbiAqIEBwYXJhbSBzdWJEZWxpbWl0ZXIgLSBEZWZpbmVzIHdoaWNoIHNlcXVlbmNlIGluZGljYXRlcyB0aGUgc3RhcnQgb2ZcbiAqIHBhcmFtZXRlciBpbiBhIGhhc2ggcGFydCBvZiB0aGUgdXJsLlxuICogQHBhcmFtIGhhc2hlZFBhdGhJbmRpY2F0b3IgLSBJZiBkZWZpbmVkIGFuZCBnaXZlbiBoYXNoIHN0YXJ0cyB3aXRoIHRoaXNcbiAqIGluZGljYXRvciwgZ2l2ZW4gaGFzaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgcGF0aCBjb250YWluaW5nIHNlYXJjaCBhbmRcbiAqIGhhc2ggcGFydHMuXG4gKiBAcGFyYW0gZ2l2ZW5TZWFyY2ggLSBTZWFyY2ggcGFydCB0byB0YWtlIGludG8gYWNjb3VudCBkZWZhdWx0cyB0b1xuICogY3VycmVudCB1cmwgc2VhcmNoIHBhcnQuXG4gKiBAcGFyYW0gZ2l2ZW5IYXNoIC0gSGFzaCBwYXJ0IHRvIHRha2UgaW50byBhY2NvdW50IGRlZmF1bHRzIHRvIGN1cnJlbnRcbiAqIHVybCBoYXNoIHBhcnQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjdXJyZW50IGdldCBhcnJheSBvciByZXF1ZXN0ZWQgdmFsdWUuIElmIHRoZSByZXF1ZXN0ZWRcbiAqIGtleSBkb2Vzbid0IGV4aXN0LCBcInVuZGVmaW5lZFwiIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0VVJMUGFyYW1ldGVyID0gKFxuICAgIGtleVRvR2V0OiBudWxsIHwgc3RyaW5nID0gbnVsbCxcbiAgICBhbGxvd0R1cGxpY2F0ZXMgPSBmYWxzZSxcbiAgICBnaXZlbklucHV0OiBudWxsIHwgc3RyaW5nID0gbnVsbCxcbiAgICBzdWJEZWxpbWl0ZXIgPSAnJCcsXG4gICAgaGFzaGVkUGF0aEluZGljYXRvciA9ICchJyxcbiAgICBnaXZlblNlYXJjaDogbnVsbCB8IHN0cmluZyA9IG51bGwsXG4gICAgZ2l2ZW5IYXNoOiBudWxsIHwgc3RyaW5nID0gZ2xvYmFsQ29udGV4dC5sb2NhdGlvbj8uaGFzaCA/PyAnJ1xuKTogQXJyYXk8c3RyaW5nPiB8IG51bGwgfCBRdWVyeVBhcmFtZXRlcnMgfCBzdHJpbmcgPT4ge1xuICAgIC8vIHJlZ2lvbiBzZXQgc2VhcmNoIGFuZCBoYXNoXG4gICAgbGV0IGhhc2g6IHN0cmluZyA9IGdpdmVuSGFzaCA/PyAnIydcbiAgICBsZXQgc2VhcmNoID0gJydcbiAgICBpZiAoZ2l2ZW5TZWFyY2gpXG4gICAgICAgIHNlYXJjaCA9IGdpdmVuU2VhcmNoXG4gICAgZWxzZSBpZiAoaGFzaGVkUGF0aEluZGljYXRvciAmJiBoYXNoLnN0YXJ0c1dpdGgoaGFzaGVkUGF0aEluZGljYXRvcikpIHtcbiAgICAgICAgY29uc3Qgc3ViSGFzaFN0YXJ0SW5kZXg6IG51bWJlciA9IGhhc2guaW5kZXhPZignIycpXG4gICAgICAgIGxldCBwYXRoQW5kU2VhcmNoOiBzdHJpbmdcbiAgICAgICAgaWYgKHN1Ykhhc2hTdGFydEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcGF0aEFuZFNlYXJjaCA9IGhhc2guc3Vic3RyaW5nKGhhc2hlZFBhdGhJbmRpY2F0b3IubGVuZ3RoKVxuICAgICAgICAgICAgaGFzaCA9ICcnXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXRoQW5kU2VhcmNoID0gaGFzaC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgaGFzaGVkUGF0aEluZGljYXRvci5sZW5ndGgsIHN1Ykhhc2hTdGFydEluZGV4XG4gICAgICAgICAgICApXG4gICAgICAgICAgICBoYXNoID0gaGFzaC5zdWJzdHJpbmcoc3ViSGFzaFN0YXJ0SW5kZXgpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ViU2VhcmNoU3RhcnRJbmRleDogbnVtYmVyID0gcGF0aEFuZFNlYXJjaC5pbmRleE9mKCc/JylcbiAgICAgICAgaWYgKHN1YlNlYXJjaFN0YXJ0SW5kZXggIT09IC0xKVxuICAgICAgICAgICAgc2VhcmNoID0gcGF0aEFuZFNlYXJjaC5zdWJzdHJpbmcoc3ViU2VhcmNoU3RhcnRJbmRleClcbiAgICB9IGVsc2UgaWYgKGdsb2JhbENvbnRleHQubG9jYXRpb24pXG4gICAgICAgIHNlYXJjaCA9IGdsb2JhbENvbnRleHQubG9jYXRpb24uc2VhcmNoIHx8ICcnXG4gICAgbGV0IGlucHV0OiBzdHJpbmcgPSBnaXZlbklucHV0ID8gZ2l2ZW5JbnB1dCA6IHNlYXJjaFxuICAgIC8vIGVuZHJlZ2lvblxuICAgIC8vIHJlZ2lvbiBkZXRlcm1pbmUgZGF0YSBmcm9tIHNlYXJjaCBhbmQgaGFzaCBpZiBzcGVjaWZpZWRcbiAgICBjb25zdCBib3RoOiBib29sZWFuID0gaW5wdXQgPT09ICcmJ1xuICAgIGlmIChib3RoIHx8IGlucHV0ID09PSAnIycpIHtcbiAgICAgICAgbGV0IGRlY29kZWRIYXNoID0gJydcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlY29kZWRIYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KGhhc2gpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQ29udGludWUgcmVnYXJkbGVzcyBvZiBhbiBlcnJvci5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdWJEZWxpbWl0ZXJJbmRleDogbnVtYmVyID0gZGVjb2RlZEhhc2guaW5kZXhPZihzdWJEZWxpbWl0ZXIpXG4gICAgICAgIGlmIChzdWJEZWxpbWl0ZXJJbmRleCA9PT0gLTEpXG4gICAgICAgICAgICBpbnB1dCA9ICcnXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW5wdXQgPSBkZWNvZGVkSGFzaC5zdWJzdHJpbmcoc3ViRGVsaW1pdGVySW5kZXgpXG4gICAgICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChzdWJEZWxpbWl0ZXIpKVxuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyaW5nKHN1YkRlbGltaXRlci5sZW5ndGgpXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlucHV0LnN0YXJ0c1dpdGgoJz8nKSlcbiAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoJz8nLmxlbmd0aClcbiAgICBsZXQgZGF0YTogQXJyYXk8c3RyaW5nPiA9IGlucHV0ID8gaW5wdXQuc3BsaXQoJyYnKSA6IFtdXG4gICAgc2VhcmNoID0gc2VhcmNoLnN1YnN0cmluZygnPycubGVuZ3RoKVxuICAgIGlmIChib3RoICYmIHNlYXJjaClcbiAgICAgICAgZGF0YSA9IGRhdGEuY29uY2F0KHNlYXJjaC5zcGxpdCgnJicpKVxuICAgIC8vIGVuZHJlZ2lvblxuICAgIC8vIHJlZ2lvbiBjb25zdHJ1Y3QgZGF0YSBzdHJ1Y3R1cmVcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBRdWVyeVBhcmFtZXRlcnMgPSBbXSBhcyB1bmtub3duIGFzIFF1ZXJ5UGFyYW1ldGVyc1xuICAgIGZvciAobGV0IHZhbHVlIG9mIGRhdGEpIHtcbiAgICAgICAgY29uc3Qga2V5VmFsdWVQYWlyOiBBcnJheTxzdHJpbmc+ID0gdmFsdWUuc3BsaXQoJz0nKVxuICAgICAgICBsZXQga2V5OiBzdHJpbmdcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXlWYWx1ZVBhaXJbMF0pXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAga2V5ID0gJydcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5VmFsdWVQYWlyWzFdKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHZhbHVlID0gJydcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtZXRlcnMucHVzaChrZXkpXG4gICAgICAgIGlmIChhbGxvd0R1cGxpY2F0ZXMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtZXRlcnMsIGtleSkgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHBhcmFtZXRlcnNba2V5XSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAocGFyYW1ldGVyc1trZXldIGFzIEFycmF5PHN0cmluZz4pLnB1c2godmFsdWUpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc1trZXldID0gW3ZhbHVlXVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgICAvLyBlbmRyZWdpb25cblxuICAgIGlmIChrZXlUb0dldCkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtZXRlcnMsIGtleVRvR2V0KSlcbiAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzW2tleVRvR2V0XVxuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnNcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGdpdmVuIHVybCBwb2ludHMgdG8gYW5vdGhlciBcInNlcnZpY2VcIiB0aGFuIHRoZSBzZWNvbmQgZ2l2ZW4gdXJsLlxuICogSWYgbm8gc2Vjb25kIGdpdmVuIHVybCBpcyBwcm92aWRlZCwgdGhlIGN1cnJlbnQgdXJsIHdpbGwgYmUgYXNzdW1lZC5cbiAqIEBwYXJhbSB1cmwgLSBVUkwgdG8gY2hlY2sgYWdhaW5zdCBzZWNvbmQgdXJsLlxuICogQHBhcmFtIHJlZmVyZW5jZVVSTCAtIFVSTCB0byBjaGVjayBhZ2FpbnN0IGZpcnN0IHVybC5cbiAqIEByZXR1cm5zIFJldHVybnMgXCJ0cnVlXCIgaWYgZ2l2ZW4gZmlyc3QgdXJsIGhhcyBzYW1lIGRvbWFpbiBhcyBnaXZlblxuICogc2Vjb25kIChvciBjdXJyZW50KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlcnZpY2VVUkxFcXVhbHMgPSAoXG4gICAgdXJsOiBzdHJpbmcsIHJlZmVyZW5jZVVSTDogc3RyaW5nID0gZ2xvYmFsQ29udGV4dC5sb2NhdGlvbj8uaHJlZiB8fCAnJ1xuKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgZG9tYWluOiBzdHJpbmcgPSBnZXREb21haW5OYW1lKHVybCwgJycpXG4gICAgY29uc3QgcHJvdG9jb2w6IHN0cmluZyA9IGdldFByb3RvY29sTmFtZSh1cmwsICcnKVxuICAgIGNvbnN0IHBvcnQ6IG51bGwgfCBudW1iZXIgPSBnZXRQb3J0TnVtYmVyKHVybClcblxuICAgIHJldHVybiAoXG4gICAgICAgIChkb21haW4gPT09ICcnIHx8IGRvbWFpbiA9PT0gZ2V0RG9tYWluTmFtZShyZWZlcmVuY2VVUkwpKSAmJlxuICAgICAgICAocHJvdG9jb2wgPT09ICcnIHx8IHByb3RvY29sID09PSBnZXRQcm90b2NvbE5hbWUocmVmZXJlbmNlVVJMKSkgJiZcbiAgICAgICAgKHBvcnQgPT09IG51bGwgfHwgcG9ydCA9PT0gZ2V0UG9ydE51bWJlcihyZWZlcmVuY2VVUkwpKVxuICAgIClcbn1cbi8qKlxuICogTm9ybWFsaXplZCBnaXZlbiB3ZWJzaXRlIHVybC5cbiAqIEBwYXJhbSBnaXZlblVSTCAtIFVuaWZvcm0gcmVzb3VyY2UgbG9jYXRvciB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVVSTCA9IChnaXZlblVSTDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gICAgaWYgKHR5cGVvZiBnaXZlblVSTCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgdXJsID0gZ2l2ZW5VUkwucmVwbGFjZSgvXjo/XFwvKy8sICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKS50cmltKClcblxuICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSlcbiAgICAgICAgICAgIHJldHVybiB1cmxcblxuICAgICAgICByZXR1cm4gYGh0dHA6Ly8ke3VybH1gXG4gICAgfVxuXG4gICAgcmV0dXJuICcnXG59XG4vKipcbiAqIFJlcHJlc2VudHMgZ2l2ZW4gd2Vic2l0ZSB1cmwuXG4gKiBAcGFyYW0gdXJsIC0gVW5pZm9ybSByZXNvdXJjZSBsb2NhdG9yIHRvIHJlcHJlc2VudC5cbiAqIEByZXR1cm5zIFJlcHJlc2VudGVkIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcHJlc2VudFVSTCA9ICh1cmw6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJylcbiAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgICAgLnJlcGxhY2UoL14oaHR0cHM/KT86P1xcLysvLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgICAgICAgLnRyaW0oKVxuXG4gICAgcmV0dXJuICcnXG59XG4vLy8vIGVuZHJlZ2lvblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNhbWVsLWNhc2VkIHN0cmluZyB0byBpdHMgZGVsaW1pdGVkIHN0cmluZyB2ZXJzaW9uLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0cmluZyB0byBmb3JtYXQuXG4gKiBAcGFyYW0gZGVsaW1pdGVyIC0gRGVmaW5lcyBkZWxpbWl0ZXIgc3RyaW5nLlxuICogQHBhcmFtIGFiYnJldmlhdGlvbnMgLSBDb2xsZWN0aW9uIG9mIHNob3J0Y3V0IHdvcmRzIHRvIHJlcHJlc2VudCB1cHBlcmNhc2VkLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBjYW1lbENhc2VUb0RlbGltaXRlZCA9IChcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9ICctJyxcbiAgICBhYmJyZXZpYXRpb25zOiBBcnJheTxzdHJpbmc+IHwgbnVsbCA9IG51bGxcbik6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFhYmJyZXZpYXRpb25zKVxuICAgICAgICBhYmJyZXZpYXRpb25zID0gQUJCUkVWSUFUSU9OU1xuXG4gICAgY29uc3QgZXNjYXBlZERlbGltaXRlcjogc3RyaW5nID0gbWFza0ZvclJlZ3VsYXJFeHByZXNzaW9uKGRlbGltaXRlcilcblxuICAgIGlmIChhYmJyZXZpYXRpb25zLmxlbmd0aCkge1xuICAgICAgICBsZXQgYWJicmV2aWF0aW9uUGF0dGVybiA9ICcnXG4gICAgICAgIGZvciAoY29uc3QgYWJicmV2aWF0aW9uIG9mIGFiYnJldmlhdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChhYmJyZXZpYXRpb25QYXR0ZXJuKVxuICAgICAgICAgICAgICAgIGFiYnJldmlhdGlvblBhdHRlcm4gKz0gJ3wnXG4gICAgICAgICAgICBhYmJyZXZpYXRpb25QYXR0ZXJuICs9IGFiYnJldmlhdGlvbi50b1VwcGVyQ2FzZSgpXG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoXG4gICAgICAgICAgICBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgIGAoJHthYmJyZXZpYXRpb25QYXR0ZXJufSkoJHthYmJyZXZpYXRpb25QYXR0ZXJufSlgLCAnZydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBgJDEke2RlbGltaXRlcn0kMmBcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShcbiAgICAgICAgbmV3IFJlZ0V4cChgKFteJHtlc2NhcGVkRGVsaW1pdGVyfV0pKFtBLVpdW2Etel0rKWAsICdnJyksXG4gICAgICAgIGAkMSR7ZGVsaW1pdGVyfSQyYFxuICAgIClcblxuICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKCcoW2EtejAtOV0pKFtBLVpdKScsICdnJyksIGAkMSR7ZGVsaW1pdGVyfSQyYClcbiAgICAgICAgLnRvTG93ZXJDYXNlKClcbn1cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgdG8gaXRzIGNhcGl0YWxpemVkIHJlcHJlc2VudGF0aW9uLlxuICogQHBhcmFtIHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gZm9ybWF0LlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBjYXBpdGFsaXplID0gKHN0cmluZzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnN1YnN0cmluZygxKVxufVxuLyoqXG4gKiBDb21wcmVzc2VzIGdpdmVuIHN0eWxlIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEBwYXJhbSBzdHlsZVZhbHVlIC0gU3R5bGUgdmFsdWUgdG8gY29tcHJlc3MuXG4gKiBAcmV0dXJucyBUaGUgY29tcHJlc3NlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXByZXNzU3R5bGVWYWx1ZSA9IChzdHlsZVZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBzdHlsZVZhbHVlXG4gICAgICAgIC5yZXBsYWNlKC8gKihbOjtdKSAqL2csICckMScpXG4gICAgICAgIC5yZXBsYWNlKC8gKy9nLCAnICcpXG4gICAgICAgIC5yZXBsYWNlKC9eOysvLCAnJylcbiAgICAgICAgLnJlcGxhY2UoLzsrJC8sICcnKVxuICAgICAgICAudHJpbSgpXG59XG4vKipcbiAqIERlY29kZXMgYWxsIGh0bWwgc3ltYm9scyBpbiB0ZXh0IG5vZGVzIGluIGEgZ2l2ZW4gaHRtbCBzdHJpbmcuXG4gKiBAcGFyYW0gaHRtbFN0cmluZyAtIEhUTUwgc3RyaW5nIHRvIGRlY29kZS5cbiAqIEByZXR1cm5zIERlY29kZWQgaHRtbCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNvZGVIVE1MRW50aXRpZXMgPSAoaHRtbFN0cmluZzogc3RyaW5nKTogbnVsbCB8IHN0cmluZyA9PiB7XG4gICAgaWYgKGdsb2JhbENvbnRleHQuZG9jdW1lbnQpIHtcbiAgICAgICAgY29uc3QgdGV4dGFyZWFEb21Ob2RlID1cbiAgICAgICAgICAgIGdsb2JhbENvbnRleHQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKVxuICAgICAgICB0ZXh0YXJlYURvbU5vZGUuaW5uZXJIVE1MID0gaHRtbFN0cmluZ1xuXG4gICAgICAgIHJldHVybiB0ZXh0YXJlYURvbU5vZGUudmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGRlbGltaXRlZCBzdHJpbmcgdG8gaXRzIGNhbWVsIGNhc2UgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3RyaW5nIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBkZWxpbWl0ZXIgLSBEZWxpbWl0ZXIgc3RyaW5nIHRvIHVzZS5cbiAqIEBwYXJhbSBhYmJyZXZpYXRpb25zIC0gQ29sbGVjdGlvbiBvZiBzaG9ydGN1dCB3b3JkcyB0byByZXByZXNlbnQgdXBwZXJjYXNlZC5cbiAqIEBwYXJhbSBwcmVzZXJ2ZVdyb25nRm9ybWF0dGVkQWJicmV2aWF0aW9ucyAtIElmIHNldCB0byBcIlRydWVcIiB3cm9uZ1xuICogZm9ybWF0dGVkIGNhbWVsIGNhc2UgYWJicmV2aWF0aW9ucyB3aWxsIGJlIGlnbm9yZWQuXG4gKiBAcGFyYW0gcmVtb3ZlTXVsdGlwbGVEZWxpbWl0ZXIgLSBJbmRpY2F0ZXMgd2hldGhlciBhIHNlcmllcyBvZiBkZWxpbWl0ZXJcbiAqIHNob3VsZCBiZSBjb25zb2xpZGF0ZWQuXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGltaXRlZFRvQ2FtZWxDYXNlID0gKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZGVsaW1pdGVyID0gJy0nLFxuICAgIGFiYnJldmlhdGlvbnM6IEFycmF5PHN0cmluZz4gfCBudWxsID0gbnVsbCxcbiAgICBwcmVzZXJ2ZVdyb25nRm9ybWF0dGVkQWJicmV2aWF0aW9ucyA9IGZhbHNlLFxuICAgIHJlbW92ZU11bHRpcGxlRGVsaW1pdGVyID0gZmFsc2Vcbik6IHN0cmluZyA9PiB7XG4gICAgbGV0IGVzY2FwZWREZWxpbWl0ZXI6IHN0cmluZyA9IG1hc2tGb3JSZWd1bGFyRXhwcmVzc2lvbihkZWxpbWl0ZXIpXG5cbiAgICBpZiAoIWFiYnJldmlhdGlvbnMpXG4gICAgICAgIGFiYnJldmlhdGlvbnMgPSBBQkJSRVZJQVRJT05TXG4gICAgbGV0IGFiYnJldmlhdGlvblBhdHRlcm46IHN0cmluZ1xuICAgIGlmIChwcmVzZXJ2ZVdyb25nRm9ybWF0dGVkQWJicmV2aWF0aW9ucylcbiAgICAgICAgYWJicmV2aWF0aW9uUGF0dGVybiA9IEFCQlJFVklBVElPTlMuam9pbignfCcpXG4gICAgZWxzZSB7XG4gICAgICAgIGFiYnJldmlhdGlvblBhdHRlcm4gPSAnJ1xuICAgICAgICBmb3IgKGNvbnN0IGFiYnJldmlhdGlvbiBvZiBhYmJyZXZpYXRpb25zKSB7XG4gICAgICAgICAgICBpZiAoYWJicmV2aWF0aW9uUGF0dGVybilcbiAgICAgICAgICAgICAgICBhYmJyZXZpYXRpb25QYXR0ZXJuICs9ICd8J1xuICAgICAgICAgICAgYWJicmV2aWF0aW9uUGF0dGVybiArPVxuICAgICAgICAgICAgICAgIGAke2NhcGl0YWxpemUoYWJicmV2aWF0aW9uKX18JHthYmJyZXZpYXRpb259YFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyaW5nU3RhcnRzV2l0aERlbGltaXRlcjogYm9vbGVhbiA9IHZhbHVlLnN0YXJ0c1dpdGgoZGVsaW1pdGVyKVxuICAgIGlmIChzdHJpbmdTdGFydHNXaXRoRGVsaW1pdGVyKVxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyhkZWxpbWl0ZXIubGVuZ3RoKVxuXG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgICBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgYCgke2VzY2FwZWREZWxpbWl0ZXJ9KSgke2FiYnJldmlhdGlvblBhdHRlcm59KWAgK1xuICAgICAgICAgICAgYCgke2VzY2FwZWREZWxpbWl0ZXJ9fCQpYCxcbiAgICAgICAgICAgICdnJ1xuICAgICAgICApLFxuICAgICAgICAoXG4gICAgICAgICAgICBfZnVsbE1hdGNoOiBzdHJpbmcsXG4gICAgICAgICAgICBiZWZvcmU6IHN0cmluZyxcbiAgICAgICAgICAgIGFiYnJldmlhdGlvbjogc3RyaW5nLFxuICAgICAgICAgICAgYWZ0ZXI6IHN0cmluZ1xuICAgICAgICApOiBzdHJpbmcgPT4gYmVmb3JlICsgYWJicmV2aWF0aW9uLnRvVXBwZXJDYXNlKCkgKyBhZnRlclxuICAgIClcblxuICAgIGlmIChyZW1vdmVNdWx0aXBsZURlbGltaXRlcilcbiAgICAgICAgZXNjYXBlZERlbGltaXRlciA9IGAoPzoke2VzY2FwZWREZWxpbWl0ZXJ9KStgXG5cbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoYCR7ZXNjYXBlZERlbGltaXRlcn0oW2EtekEtWjAtOV0pYCwgJ2cnKSxcbiAgICAgICAgKF9mdWxsTWF0Y2g6IHN0cmluZywgZmlyc3RMZXR0ZXI6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgICAgICAgICAgZmlyc3RMZXR0ZXIudG9VcHBlckNhc2UoKVxuICAgIClcblxuICAgIGlmIChzdHJpbmdTdGFydHNXaXRoRGVsaW1pdGVyKVxuICAgICAgICB2YWx1ZSA9IGRlbGltaXRlciArIHZhbHVlXG5cbiAgICByZXR1cm4gdmFsdWVcbn1cbi8qKlxuICogQ29tcGlsZXMgYSBnaXZlbiBzdHJpbmcgYXMgYW4gZXhwcmVzc2lvbiB3aXRoIGdpdmVuIHNjb3BlIG5hbWVzLlxuICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgc3RyaW5nIHRvIGludGVycHJldC5cbiAqIEBwYXJhbSBzY29wZSAtIFNjb3BlIHRvIGV4dHJhY3QgbmFtZXMgZnJvbS5cbiAqIEBwYXJhbSBleGVjdXRlIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gZXhlY3V0ZSBvciBldmFsdWF0ZS5cbiAqIEBwYXJhbSByZW1vdmVHbG9iYWxTY29wZSAtIEluZGljYXRlcyB3aGV0aGVyIHRvIHNoYWRvdyBnbG9iYWwgdmFyaWFibGVzIHZpYVxuICogXCJ1bmRlZmluZWRcIi5cbiAqIEBwYXJhbSBiaW5kaW5nIC0gT2JqZWN0IHRvIGFwcGx5IGFzIFwidGhpc1wiIGluIGV2YWx1YXRpb24gc2NvcGUuXG4gKiBAcmV0dXJucyBPYmplY3Qgb2YgcHJlcGFyZWQgc2NvcGUgbmFtZSBtYXBwaW5ncyBhbmQgY29tcGlsZWQgZnVuY3Rpb24gb3JcbiAqIGVycm9yIHN0cmluZyBtZXNzYWdlIGlmIGdpdmVuIGV4cHJlc3Npb24gY291bGRuJ3QgYmUgY29tcGlsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBjb21waWxlID0gPFQgPSBzdHJpbmcsIE4gZXh0ZW5kcyBBcnJheTxzdHJpbmc+ID0gQXJyYXk8c3RyaW5nPj4oXG4gICAgZXhwcmVzc2lvbjogc3RyaW5nLFxuICAgIHNjb3BlOlxuICAgICAgICBNYXBwaW5nPHVua25vd24+IHxcbiAgICAgICAgTiB8XG4gICAgICAgIE5bbnVtYmVyXSB8XG4gICAgICAgIHN0cmluZyA9IFtdIGFzIHVua25vd24gYXMgTixcbiAgICBleGVjdXRlID0gZmFsc2UsXG4gICAgcmVtb3ZlR2xvYmFsU2NvcGUgPSB0cnVlLFxuICAgIGJpbmRpbmc6IHVua25vd24gPSB7fVxuKTogQ29tcGlsYXRpb25SZXN1bHQ8VCwgTj4gPT4ge1xuICAgIC8qXG4gICAgICAgIE5PVEU6IFdlIGRvIHRoaXMgZ2xvYmFsIHZhcmlhYmxlIG5hbWUgZGV0ZXJtaW5pbmcgYXMgY2xvc2UgYXMgcG9zc2libGVcbiAgICAgICAgdG8gdGhlIGNvbXBpbGluZyBzdGVwIHRvIGNvdmVyIGFzIG11Y2ggYXMgcG9zc2libGUgZ2xvYmFsIGludHJvZHVjZXNcbiAgICAgICAgdmFyaWFibGVzLlxuICAgICovXG4gICAgY29uc3QgZ2xvYmFsTmFtZXMgPSBPYmplY3Qua2V5cyhnbG9iYWxUaGlzKVxuICAgICAgICAuY29uY2F0KCdnbG9iYWxUaGlzJylcbiAgICAgICAgLmZpbHRlcigobmFtZSkgPT5cbiAgICAgICAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgYF5bJHtBTExPV0VEX1NUQVJUSU5HX1ZBUklBQkxFX1NZTUJPTFN9XWAgK1xuICAgICAgICAgICAgICAgIGBbJHtBTExPV0VEX1ZBUklBQkxFX1NZTUJPTFN9XSokYFxuICAgICAgICAgICAgKS50ZXN0KG5hbWUpXG4gICAgICAgIClcbiAgICBjb25zdCByZXN1bHQ6IENvbXBpbGF0aW9uUmVzdWx0PFQsIE4+ID0ge1xuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgZ2xvYmFsTmFtZXM6IGdsb2JhbE5hbWVzLFxuICAgICAgICBnbG9iYWxOYW1lc1VuZGVmaW5lZExpc3Q6IGdsb2JhbE5hbWVzLm1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgICBvcmlnaW5hbFNjb3BlTmFtZXM6IChcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoc2NvcGUpID9cbiAgICAgICAgICAgICAgICBzY29wZSA6XG4gICAgICAgICAgICAgICAgdHlwZW9mIHNjb3BlID09PSAnc3RyaW5nJyA/IFtzY29wZV0gOiBPYmplY3Qua2V5cyhzY29wZSlcbiAgICAgICAgKSBhcyBOLFxuICAgICAgICBzY29wZU5hbWVNYXBwaW5nOiB7fSBhcyBSZWNvcmQ8TltudW1iZXJdLCBzdHJpbmc+LFxuICAgICAgICBzY29wZU5hbWVzOiBbXSxcbiAgICAgICAgdGVtcGxhdGVGdW5jdGlvbjogKCk6IFQgPT4gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHQub3JpZ2luYWxTY29wZU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IG5ld05hbWU6IHN0cmluZyA9IGNvbnZlcnRUb1ZhbGlkVmFyaWFibGVOYW1lKG5hbWUpXG4gICAgICAgIHJlc3VsdC5zY29wZU5hbWVNYXBwaW5nW25hbWUgYXMgTltudW1iZXJdXSA9IG5ld05hbWVcbiAgICAgICAgcmVzdWx0LnNjb3BlTmFtZXMucHVzaChuZXdOYW1lKVxuICAgIH1cbiAgICAvLyByZWdpb24gdHJ5IHRvIHBvbHlmaWxsIHRlbXBsYXRlIHN0cmluZyBsaXRlcmFscyBmb3Igb2xkZXIgZW5naW5lc1xuICAgIGlmIChQT0xZRklMTF9URU1QTEFURV9TVFJJTkdTLnZhbHVlKVxuICAgICAgICBpZiAoKChcbiAgICAgICAgICAgIGdsb2JhbENvbnRleHQgYXMgTWFwcGluZzx1bmtub3duPlxuICAgICAgICApLkJhYmVsIGFzIE1hcHBpbmc8dW5rbm93bj4gfCB1bmRlZmluZWQpPy50cmFuc2Zvcm0pXG4gICAgICAgICAgICBleHByZXNzaW9uID0gKFxuICAgICAgICAgICAgICAgICgoZ2xvYmFsQ29udGV4dCBhcyBNYXBwaW5nPHVua25vd24+KS5CYWJlbCBhcyBNYXBwaW5nPHVua25vd24+KVxuICAgICAgICAgICAgICAgICAgICAudHJhbnNmb3JtIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAoKHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM6IE1hcHBpbmc8dW5rbm93bj4pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvZGU6IHN0cmluZ30pXG4gICAgICAgICAgICApKFxuICAgICAgICAgICAgICAgIGAoJHtleHByZXNzaW9ufSlgLFxuICAgICAgICAgICAgICAgIHtwbHVnaW5zOiBbJ3RyYW5zZm9ybS10ZW1wbGF0ZS1saXRlcmFscyddfVxuICAgICAgICAgICAgKS5jb2RlXG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgZXhwcmVzc2lvbi5zdGFydHNXaXRoKCdgJykgJiYgZXhwcmVzc2lvbi5lbmRzV2l0aCgnYCcpXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgZXNjYXBlTWFya2VyID0gJyMjIyMnXG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRlbXBsYXRlIHN0cmluZyBpbnRvIGxlZ2FjeSBzdHJpbmcgY29uY2F0ZW5hdGlvbnMuXG4gICAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIC8vIE1hcmsgc2ltcGxlIGVzY2FwZSBzZXF1ZW5jZXMuXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcXCQvZywgZXNjYXBlTWFya2VyKVxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBhdm9pZGFibGUgdGVtcGxhdGUgZXhwcmVzc2lvbjogVXNlIHJhdyBjb2RlLlxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eYFxcJFxceyhbXFxzXFxTXSspfWAkLywgJ1N0cmluZygkMSknKVxuICAgICAgICAgICAgICAgIC8vIFVzZSBwbGFpbiBzdHJpbmcgd2l0aCBzaW5nbGUgcXVvdGVzLlxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eYChbXiddKylgJC8sIGAnJDEnYClcbiAgICAgICAgICAgICAgICAvLyBVc2UgcGxhaW4gc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXmAoW15cIl0rKWAkLywgJ1wiJDFcIicpXG4gICAgICAgICAgICAvLyBVc2Ugc2luZ2xlIHF1b3RlcyBhbmQgaG9wZSAoanVzdCBhIGhldXJpc3RpYykuXG4gICAgICAgICAgICBjb25zdCBxdW90ZTogc3RyaW5nID1cbiAgICAgICAgICAgICAgICBleHByZXNzaW9uLmNoYXJBdCgwKSA9PT0gJ2AnID8gYCdgIDogZXhwcmVzc2lvbi5jaGFyQXQoMClcbiAgICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uXG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBhIHNpbXBsZSBwbGFjZWhvbGRlci5cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBSZXBsYWNlIGNvbXBsZXRlIGJyYWNrZXQgcGFpcnMuXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIC9cXCRcXHsoKChbXntdKntbXn1dKn1bXn1dKn0pfFtee31dKykrKX0vZyxcbiAgICAgICAgICAgICAgICAgICAgYCR7cXVvdGV9KygkMSkrJHtxdW90ZX1gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eYChbXFxzXFxTXSspYCQvLCBgJHtxdW90ZX0kMSR7cXVvdGV9YClcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcmVtYWluaW5nIG5ld2xpbmVzLlxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXG4rL2csICcnKVxuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgbWFya2VkIGVzY2FwZSBzZXF1ZW5jZXMuXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChlc2NhcGVNYXJrZXIsICdnJyksICdcXFxcJCcpXG4gICAgICAgIH1cbiAgICAvLyBlbmRyZWdpb25cbiAgICBsZXQgaW5uZXJUZW1wbGF0ZUZ1bmN0aW9uOiBUZW1wbGF0ZUZ1bmN0aW9uPFQ+IHwgdW5kZWZpbmVkXG5cbiAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWltcGxpZWQtZXZhbFxuICAgICAgICBpbm5lclRlbXBsYXRlRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oXG4gICAgICAgICAgICAuLi4ocmVtb3ZlR2xvYmFsU2NvcGUgPyByZXN1bHQuZ2xvYmFsTmFtZXMgOiBbXSksXG4gICAgICAgICAgICAuLi5yZXN1bHQuc2NvcGVOYW1lcyxcbiAgICAgICAgICAgIGAke2V4ZWN1dGUgPyAnJyA6ICdyZXR1cm4gJ30ke2V4cHJlc3Npb259YFxuICAgICAgICApIGFzIFRlbXBsYXRlRnVuY3Rpb248VD5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXN1bHQuZXJyb3IgPVxuICAgICAgICAgICAgYEdpdmVuIGV4cHJlc3Npb24gXCIke2V4cHJlc3Npb259XCIgY291bGQgbm90IGJlIGNvbXBpbGVkIHdpZHRoIGAgK1xuICAgICAgICAgICAgYGdpdmVuIHNjb3BlIG5hbWVzIFwiJHtyZXN1bHQuc2NvcGVOYW1lcy5qb2luKCdcIiwgXCInKX1cIjogYCArXG4gICAgICAgICAgICByZXByZXNlbnQoZXJyb3IpXG4gICAgfVxuICAgIGlmIChpbm5lclRlbXBsYXRlRnVuY3Rpb24pIHtcbiAgICAgICAgY29uc3QgYm91bmRJbm5lclRlbXBsYXRlRnVuY3Rpb24gPVxuICAgICAgICAgICAgaW5uZXJUZW1wbGF0ZUZ1bmN0aW9uLmJpbmQoYmluZGluZylcbiAgICAgICAgcmVzdWx0LnRlbXBsYXRlRnVuY3Rpb24gPSByZW1vdmVHbG9iYWxTY29wZSA/XG4gICAgICAgICAgICAoLi4ucGFyYW1ldGVycykgPT5cbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICBOT1RFOiBXZSBzaGFkb3cgZXhpc3RpbmcgZ2xvYmFsIG5hbWVzIHRvIHNhbmRib3hcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMuXG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBib3VuZElubmVyVGVtcGxhdGVGdW5jdGlvbihcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0Lmdsb2JhbE5hbWVzVW5kZWZpbmVkTGlzdCwgLi4ucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICkgOlxuICAgICAgICAgICAgYm91bmRJbm5lclRlbXBsYXRlRnVuY3Rpb25cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG4vKipcbiAqIEV2YWx1YXRlcyBhIGdpdmVuIHN0cmluZyBhcyBhbiBleHByZXNzaW9uIGFnYWluc3QgYSBnaXZlbiBzY29wZS5cbiAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIHN0cmluZyB0byBpbnRlcnByZXQuXG4gKiBAcGFyYW0gc2NvcGUgLSBTY29wZSB0byByZW5kZXIgYWdhaW5zdC5cbiAqIEBwYXJhbSBleGVjdXRlIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gZXhlY3V0ZSBvciBldmFsdWF0ZS5cbiAqIEBwYXJhbSByZW1vdmVHbG9iYWxTY29wZSAtIEluZGljYXRlcyB3aGV0aGVyIHRvIHNoYWRvdyBnbG9iYWwgdmFyaWFibGVzIHZpYVxuICogXCJ1bmRlZmluZWRcIi5cbiAqIEBwYXJhbSBiaW5kaW5nIC0gT2JqZWN0IHRvIGFwcGx5IGFzIFwidGhpc1wiIGluIGV2YWx1YXRpb24gc2NvcGUuXG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGR1cmluZyBwYXJzaW5nIC8gcnVubmluZyBvciByZXN1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBldmFsdWF0ZSA9IDxUID0gc3RyaW5nLCBTIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PihcbiAgICBleHByZXNzaW9uOiBzdHJpbmcsXG4gICAgc2NvcGU6IFMgPSB7fSBhcyBTLFxuICAgIGV4ZWN1dGUgPSBmYWxzZSxcbiAgICByZW1vdmVHbG9iYWxTY29wZSA9IHRydWUsXG4gICAgYmluZGluZzogdW5rbm93biA9IHt9XG4pOiBFdmFsdWF0aW9uUmVzdWx0PFQ+ID0+IHtcbiAgICAvLyBOT1RFOiBXZSBleHRyYWN0IHN0cmluZy1vbmx5IHR5cGVzIGZyb20gZ2l2ZW4gc2NvcGUgdHlwZS5cbiAgICB0eXBlIE4gPSBBcnJheTxrZXlvZiBTIGV4dGVuZHMgc3RyaW5nID8ga2V5b2YgUyA6IG5ldmVyPlxuXG4gICAgY29uc3Qge1xuICAgICAgICBlcnJvcixcbiAgICAgICAgb3JpZ2luYWxTY29wZU5hbWVzLFxuICAgICAgICBzY29wZU5hbWVzLFxuICAgICAgICB0ZW1wbGF0ZUZ1bmN0aW9uXG4gICAgfSA9IGNvbXBpbGU8VCwgTj4oXG4gICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIHNjb3BlIGFzIE1hcHBpbmc8dW5rbm93bj4sXG4gICAgICAgIGV4ZWN1dGUsXG4gICAgICAgIHJlbW92ZUdsb2JhbFNjb3BlLFxuICAgICAgICBiaW5kaW5nXG4gICAgKVxuXG4gICAgbGV0IHJlc3VsdDogRXZhbHVhdGlvblJlc3VsdDxUPiA9IHtcbiAgICAgICAgY29tcGlsZUVycm9yOiBudWxsLFxuICAgICAgICBydW50aW1lRXJyb3I6IG51bGwsXG4gICAgICAgIGVycm9yOiAnTm90IHlldCBldmFsdWF0ZWQuJyxcblxuICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXN1bHQuY29tcGlsZUVycm9yID0gcmVzdWx0LmVycm9yID0gZXJyb3JcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29tcGlsZUVycm9yOiBudWxsLFxuICAgICAgICAgICAgcnVudGltZUVycm9yOiBudWxsLFxuICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICByZXN1bHQ6IHRlbXBsYXRlRnVuY3Rpb24oXG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgTk9URTogV2Ugd2FudCB0byBiZSBzdXJlIHRvIGhhdmUgdGhlIHNhbWUgb3JkZXJpbmcgYXMgd2VcbiAgICAgICAgICAgICAgICAgICAgaGF2ZSBmb3IgdGhlIHNjb3BlIG5hbWVzIGFuZCB0byBjYWxsIGludGVybmFsIHJlZ2lzdGVyZWRcbiAgICAgICAgICAgICAgICAgICAgZ2V0dGVyIGJ5IHJldHJpZXZpbmcgdmFsdWVzLiBTbyBzaW1wbGUgdXNpbmdcbiAgICAgICAgICAgICAgICAgICAgXCIuLi5PYmplY3QudmFsdWVzKHNjb3BlKVwiIGlzIG5vdCBhcHByZWNpYXRlIGhlcmUuXG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAuLi5vcmlnaW5hbFNjb3BlTmFtZXMubWFwKChuYW1lOiBrZXlvZiBTKTogVmFsdWVPZjxTPiA9PlxuICAgICAgICAgICAgICAgICAgICBzY29wZVtuYW1lXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlc3VsdC5lcnJvciA9XG4gICAgICAgICAgICByZXN1bHQucnVudGltZUVycm9yID0gKFxuICAgICAgICAgICAgICAgIGBHaXZlbiBleHByZXNzaW9uIFwiJHtleHByZXNzaW9ufVwiIGNvdWxkIG5vdCBiZSBldmFsdWF0ZWQgYCArXG4gICAgICAgICAgICAgICAgYHdpdGggZ2l2ZW4gc2NvcGUgbmFtZXMgXCIke3Njb3BlTmFtZXMuam9pbignXCIsIFwiJyl9XCI6IGAgK1xuICAgICAgICAgICAgICAgIHJlcHJlc2VudChlcnJvcilcbiAgICAgICAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG4vKipcbiAqIEZpbmRzIHRoZSBzdHJpbmcgbWF0Y2ggb2YgYSBnaXZlbiBxdWVyeSBpbiBhIGdpdmVuIHRhcmdldCB0ZXh0IGJ5IGFwcGx5aW5nIGFcbiAqIGdpdmVuIG5vcm1hbGl6YXRpb24gZnVuY3Rpb24gdG8gdGFyZ2V0IGFuZCBxdWVyeS5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUYXJnZXQgdG8gc2VhcmNoIGluLlxuICogQHBhcmFtIHF1ZXJ5IC0gU2VhcmNoIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIG5vcm1hbGl6ZXIgLSBGdW5jdGlvbiB0byB1c2UgYXMgbm9ybWFsaXphdGlvbiBmb3IgcXVlcmllcyBhbmQgc2VhcmNoXG4gKiB0YXJnZXRzLlxuICogQHBhcmFtIHNraXBUYWdEZWxpbWl0ZWRQYXJ0cyAtIEluZGljYXRlcyB3aGV0aGVyIHRvLCBmb3IgZXhhbXBsZSwgaWdub3JlXG4gKiBodG1sIHRhZ3MgdmlhIFwiWyc8JywgJz4nXVwiICh0aGUgZGVmYXVsdCkuXG4gKiBAcmV0dXJucyBTdGFydCBhbmQgZW5kIGluZGV4IG9mIG1hdGNoaW5nIHJhbmdlLlxuICovXG5leHBvcnQgY29uc3QgZmluZE5vcm1hbGl6ZWRNYXRjaFJhbmdlID0gKFxuICAgIHRhcmdldDogdW5rbm93bixcbiAgICBxdWVyeTogdW5rbm93bixcbiAgICBub3JtYWxpemVyID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKSxcbiAgICBza2lwVGFnRGVsaW1pdGVkUGFydHM6IG51bGwgfCBbc3RyaW5nLCBzdHJpbmddID0gWyc8JywgJz4nXVxuKTogQXJyYXk8bnVtYmVyPiB8IG51bGwgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeTogc3RyaW5nID0gbm9ybWFsaXplcihxdWVyeSlcbiAgICBjb25zdCBub3JtYWxpemVkVGFyZ2V0OiBzdHJpbmcgPSBub3JtYWxpemVyKHRhcmdldClcblxuICAgIGNvbnN0IHN0cmluZ1RhcmdldCA9IHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnID9cbiAgICAgICAgdGFyZ2V0IDpcbiAgICAgICAgbm9ybWFsaXplZFRhcmdldFxuXG4gICAgaWYgKG5vcm1hbGl6ZWRUYXJnZXQgJiYgbm9ybWFsaXplZFF1ZXJ5KSB7XG4gICAgICAgIGxldCBpblRhZyA9IGZhbHNlXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdHJpbmdUYXJnZXQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgICBpZiAoaW5UYWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoc2tpcFRhZ0RlbGltaXRlZFBhcnRzKSAmJlxuICAgICAgICAgICAgICAgICAgICBzdHJpbmdUYXJnZXQuY2hhckF0KGluZGV4KSA9PT0gc2tpcFRhZ0RlbGltaXRlZFBhcnRzWzFdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBpblRhZyA9IGZhbHNlXG5cbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShza2lwVGFnRGVsaW1pdGVkUGFydHMpICYmXG4gICAgICAgICAgICAgICAgc3RyaW5nVGFyZ2V0LmNoYXJBdChpbmRleCkgPT09IHNraXBUYWdEZWxpbWl0ZWRQYXJ0c1swXVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaW5UYWcgPSB0cnVlXG5cbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9ybWFsaXplcihzdHJpbmdUYXJnZXQuc3Vic3RyaW5nKGluZGV4KSkuc3RhcnRzV2l0aChcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkUXVlcnlcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFF1ZXJ5Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtpbmRleCwgaW5kZXggKyAxXVxuXG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1YkluZGV4ID0gc3RyaW5nVGFyZ2V0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgc3ViSW5kZXggPiBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgc3ViSW5kZXggLT0gMVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub3JtYWxpemVyKHN0cmluZ1RhcmdldC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgc3ViSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgKSkuc3RhcnRzV2l0aChub3JtYWxpemVkUXVlcnkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtpbmRleCwgc3ViSW5kZXggKyAxXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbn1cbi8qKlxuICogRml4ZXMga25vd24gZW5jb2RpbmcgcHJvYmxlbXMgaW4gZ2l2ZW4gZGF0YS5cbiAqIEBwYXJhbSBkYXRhIC0gVG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIFByb2Nlc3NlZCBkYXRhLlxuICovXG5leHBvcnQgY29uc3QgZml4S25vd25FbmNvZGluZ0Vycm9ycyA9IChkYXRhOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGZvciAoY29uc3QgW3NlYXJjaCwgcmVwbGFjZW1lbnRdIG9mIEZJWF9FTkNPRElOR19FUlJPUl9NQVBQSU5HKVxuICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKG5ldyBSZWdFeHAoc2VhcmNoLCAnZycpLCByZXBsYWNlbWVudClcblxuICAgIHJldHVybiBkYXRhXG59XG4vKipcbiAqIFBlcmZvcm1zIGEgc3RyaW5nIGZvcm1hdGlvbi4gUmVwbGFjZXMgZXZlcnkgcGxhY2Vob2xkZXIgXCJ7aX1cIiB3aXRoIHRoZSBpJ3RoXG4gKiBhcmd1bWVudC5cbiAqIEBwYXJhbSBzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBhZGRpdGlvbmFsQXJndW1lbnRzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIGludGVycHJldGVkIGFzXG4gKiByZXBsYWNlbWVudHMgZm9yIHN0cmluZyBmb3JtYXR0aW5nLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXQgPSAoXG4gICAgc3RyaW5nOiBzdHJpbmcsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHM6IEFycmF5PHVua25vd24+XG4pOiBzdHJpbmcgPT4ge1xuICAgIGFkZGl0aW9uYWxBcmd1bWVudHMudW5zaGlmdChzdHJpbmcpXG5cbiAgICBsZXQgaW5kZXggPSAwXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhZGRpdGlvbmFsQXJndW1lbnRzKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKFxuICAgICAgICAgICAgbmV3IFJlZ0V4cChgXFxcXHske1N0cmluZyhpbmRleCl9XFxcXH1gLCAnZ20nKSwgU3RyaW5nKHZhbHVlKVxuICAgICAgICApXG5cbiAgICAgICAgaW5kZXggKz0gMVxuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZWRpdCAobGV2ZW5zdGVpbikgZGlzdGFuY2UgYmV0d2VlbiB0d28gZ2l2ZW4gc3RyaW5ncy5cbiAqIEBwYXJhbSBmaXJzdCAtIEZpcnN0IHN0cmluZyB0byBjb21wYXJlLlxuICogQHBhcmFtIHNlY29uZCAtIFNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIFRoZSBkaXN0YW5jZSBhcyBudW1iZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0RGlzdGFuY2UgPSAoZmlyc3Q6IHN0cmluZywgc2Vjb25kOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIC8qXG4gICAgICAgIENyZWF0ZSBlbXB0eSBlZGl0IGRpc3RhbmNlIG1hdHJpeCBmb3IgYWxsIHBvc3NpYmxlIG1vZGlmaWNhdGlvbnMgb2ZcbiAgICAgICAgc3Vic3RyaW5ncyBvZiBcImZpcnN0XCIgdG8gc3Vic3RyaW5ncyBvZiBcInNlY29uZFwiLlxuICAgICovXG4gICAgY29uc3QgZGlzdGFuY2VNYXRyaXg6IEFycmF5PEFycmF5PG51bWJlcj4+ID1cbiAgICAgICAgQXJyYXkoc2Vjb25kLmxlbmd0aCArIDEpLmZpbGwobnVsbCkubWFwKCgpOiBBcnJheTxudW1iZXI+ID0+XG4gICAgICAgICAgICBBcnJheShmaXJzdC5sZW5ndGggKyAxKS5maWxsKG51bGwpIGFzIEFycmF5PG51bWJlcj5cbiAgICAgICAgKVxuICAgIC8qXG4gICAgICAgIEZpbGwgdGhlIGZpcnN0IHJvdyBvZiB0aGUgbWF0cml4LlxuICAgICAgICBJZiB0aGlzIGlzIHRoZSBmaXJzdCByb3csIHRoZW4sIHdlJ3JlIHRyYW5zZm9ybWluZyBhbiBlbXB0eSBzdHJpbmcgdG9cbiAgICAgICAgXCJmaXJzdFwiLiBJbiB0aGlzIGNhc2UgdGhlIG51bWJlciBvZiB0cmFuc2Zvcm1hdGlvbnMgZXF1YWxzIHRvIHRoZSBzaXplXG4gICAgICAgIG9mIHRoZSBcImZpcnN0XCIgc3Vic3RyaW5nLlxuICAgICovXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8PSBmaXJzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgICAgIGRpc3RhbmNlTWF0cml4WzBdW2luZGV4XSA9IGluZGV4XG4gICAgLypcbiAgICAgICAgRmlsbCB0aGUgZmlyc3QgY29sdW1uIG9mIHRoZSBtYXRyaXguXG4gICAgICAgIElmIHRoaXMgaXMgdGhlIGZpcnN0IGNvbHVtbiwgdGhlbiB3ZSdyZSB0cmFuc2Zvcm1pbmcgYW4gZW1wdHkgc3RyaW5nIHRvXG4gICAgICAgIFwic2Vjb25kXCIuXG4gICAgICAgIEluIHRoaXMgY2FzZSB0aGUgbnVtYmVyIG9mIHRyYW5zZm9ybWF0aW9ucyBlcXVhbHMgdG8gdGhlIHNpemUgb2YgdGhlXG4gICAgICAgIFwic2Vjb25kXCIgc3Vic3RyaW5nLlxuICAgICovXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8PSBzZWNvbmQubGVuZ3RoOyBpbmRleCsrKVxuICAgICAgICBkaXN0YW5jZU1hdHJpeFtpbmRleF1bMF0gPSBpbmRleFxuXG4gICAgZm9yIChsZXQgZmlyc3RJbmRleCA9IDE7IGZpcnN0SW5kZXggPD0gc2Vjb25kLmxlbmd0aDsgZmlyc3RJbmRleCsrKVxuICAgICAgICBmb3IgKFxuICAgICAgICAgICAgbGV0IHNlY29uZEluZGV4ID0gMTtcbiAgICAgICAgICAgIHNlY29uZEluZGV4IDw9IGZpcnN0Lmxlbmd0aDtcbiAgICAgICAgICAgIHNlY29uZEluZGV4KytcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRpY2F0b3I6IG51bWJlciA9XG4gICAgICAgICAgICAgICAgZmlyc3Rbc2Vjb25kSW5kZXggLSAxXSA9PT0gc2Vjb25kW2ZpcnN0SW5kZXggLSAxXSA/IDAgOiAxXG4gICAgICAgICAgICBkaXN0YW5jZU1hdHJpeFtmaXJzdEluZGV4XVtzZWNvbmRJbmRleF0gPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAvLyBkZWxldGlvblxuICAgICAgICAgICAgICAgIGRpc3RhbmNlTWF0cml4W2ZpcnN0SW5kZXhdW3NlY29uZEluZGV4IC0gMV0gKyAxLFxuICAgICAgICAgICAgICAgIC8vIGluc2VydGlvblxuICAgICAgICAgICAgICAgIGRpc3RhbmNlTWF0cml4W2ZpcnN0SW5kZXggLSAxXVtzZWNvbmRJbmRleF0gKyAxLFxuICAgICAgICAgICAgICAgIC8vIHN1YnN0aXR1dGlvblxuICAgICAgICAgICAgICAgIGRpc3RhbmNlTWF0cml4W2ZpcnN0SW5kZXggLSAxXVtzZWNvbmRJbmRleCAtIDFdICsgaW5kaWNhdG9yXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgIHJldHVybiBkaXN0YW5jZU1hdHJpeFtzZWNvbmQubGVuZ3RoXVtmaXJzdC5sZW5ndGhdXG59XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgY3VycmVudCBzdHJpbmcgZm9yIHVzaW5nIGluIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uXG4gKiBTcGVjaWFsIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFycyB3aWxsIGJlIGVzY2FwZWQuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3RyaW5nIHRvIGZvcm1hdC5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgbWFza0ZvclJlZ3VsYXJFeHByZXNzaW9uID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oW1xcXFx8LiokXitbXFxdKCk/XFwte31dKS9nLCAnXFxcXCQxJylcbn1cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgdG8gaXRzIGxvd2VyIGNhc2UgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0gc3RyaW5nIC0gVGhlIHN0cmluZyB0byBmb3JtYXQuXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvd2VyQ2FzZSA9IChzdHJpbmc6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHN0cmluZy5zdWJzdHJpbmcoMSlcbn1cbi8qKlxuICogV3JhcHMgZ2l2ZW4gbWFyayBzdHJpbmdzIGluIGEgZ2l2ZW4gdGFyZ2V0IHdpdGggYSBnaXZlbiBtYXJrZXIuXG4gKiBAcGFyYW0gdGFyZ2V0IC0gU3RyaW5nIHRvIHNlYXJjaCBmb3IgbWFya2VyLlxuICogQHBhcmFtIGdpdmVuV29yZHMgLSBTdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyB0byBzZWFyY2ggaW4gdGFyZ2V0IGZvci5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMgLSBEZWZpbmVzIGhpZ2hsaWdodGluZyBiZWhhdmlvci5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMubWFya2VyIC0gSFRNTCB0ZW1wbGF0ZSBzdHJpbmcgdG8gbWFyay5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMubm9ybWFsaXplciAtIFB1cmUgbm9ybWFsaXphdGlvbiBmdW5jdGlvbiB0byB1c2UgYmVmb3JlXG4gKiBzZWFyY2hpbmcgZm9yIG1hdGNoZXMuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLnNraXBUYWdEZWxpbWl0ZWRQYXJ0cyAtIEluZGljYXRlcyB3aGV0aGVyIHRvLCBmb3JcbiAqIGV4YW1wbGUsIGlnbm9yZSBodG1sIHRhZ3MgdmlhIFwiWyc8JywgJz4nXVwiICh0aGUgZGVmYXVsdCkuXG4gKiBAcmV0dXJucyBQcm9jZXNzZWQgcmVzdWx0LlxuICovXG5leHBvcnQgY29uc3QgbWFyayA9IChcbiAgICB0YXJnZXQ6IHVua25vd24sXG4gICAgZ2l2ZW5Xb3Jkcz86IEFycmF5PHN0cmluZz4gfCBzdHJpbmcsXG4gICAgZ2l2ZW5PcHRpb25zOiBQYXJ0aWFsPFN0cmluZ01hcmtPcHRpb25zPiA9IHt9XG4pOiB1bmtub3duID0+IHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycgJiYgZ2l2ZW5Xb3Jkcz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IFN0cmluZ01hcmtPcHRpb25zID0ge1xuICAgICAgICAgICAgbWFya2VyOiAnPHNwYW4gY2xhc3M9XCJ0b29scy1tYXJrXCI+ezF9PC9zcGFuPicsXG4gICAgICAgICAgICBub3JtYWxpemVyOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIHNraXBUYWdEZWxpbWl0ZWRQYXJ0czogWyc8JywgJz4nXSxcbiAgICAgICAgICAgIC4uLmdpdmVuT3B0aW9uc1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnRyaW0oKVxuICAgICAgICBjb25zdCBtYXJrZWRUYXJnZXQ6IEFycmF5PHVua25vd24+ID0gW11cblxuICAgICAgICBjb25zdCB3b3JkczogQXJyYXk8c3RyaW5nPiA9XG4gICAgICAgICAgICAoW10gYXMgQXJyYXk8c3RyaW5nPikuY29uY2F0KGdpdmVuV29yZHMpXG4gICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIHdvcmRzKSB7XG4gICAgICAgICAgICB3b3Jkc1tpbmRleF0gPSBvcHRpb25zLm5vcm1hbGl6ZXIod29yZCkudHJpbSgpXG5cbiAgICAgICAgICAgIGluZGV4ICs9IDFcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN0VGFyZ2V0OiBzdHJpbmcgPSB0YXJnZXQgYXMgc3RyaW5nXG4gICAgICAgIGxldCBvZmZzZXQgPSAwXG4gICAgICAgIC8qXG4gICAgICAgICAgICBTZWFyY2ggZm9yIG1hdGNoZXMgYXMgbG9uZyB0aGVyZSBpcyBlbm91Z2ggdGFyZ2V0IHRleHQgcmVtYWluaW5nIHRvXG4gICAgICAgICAgICB3YWxrIHRocm91Z2guXG4gICAgICAgICovXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgICBsZXQgaXRlcmF0aW9uID0gMDtcbiAgICAgICAgICAgIGl0ZXJhdGlvbiA8IE1BWElNQUxfTlVNQkVSX09GX0lURVJBVElPTlMudmFsdWU7XG4gICAgICAgICAgICBpdGVyYXRpb24rK1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBuZWFyZXN0UmFuZ2U6IEFycmF5PG51bWJlcj4gfCBudWxsID0gbnVsbFxuICAgICAgICAgICAgbGV0IGN1cnJlbnRSYW5nZTogQXJyYXk8bnVtYmVyPiB8IG51bGxcblxuICAgICAgICAgICAgLy8gRmluZCB0aGUgbmVhcmVzdCBuZXh0IG1hdGNoaW5nIHdvcmQuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHdvcmQgb2Ygd29yZHMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2UgPSBmaW5kTm9ybWFsaXplZE1hdGNoUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHJlc3RUYXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmQsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubm9ybWFsaXplcixcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5za2lwVGFnRGVsaW1pdGVkUGFydHNcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2UgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFuZWFyZXN0UmFuZ2UgfHwgY3VycmVudFJhbmdlWzBdIDwgbmVhcmVzdFJhbmdlWzBdKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgbmVhcmVzdFJhbmdlID0gY3VycmVudFJhbmdlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZWFyZXN0UmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBpZiAobmVhcmVzdFJhbmdlWzBdID4gMClcbiAgICAgICAgICAgICAgICAgICAgbWFya2VkVGFyZ2V0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0IGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbmVhcmVzdFJhbmdlWzBdKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgbWFya2VkVGFyZ2V0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLm1hcmtlciA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubWFya2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQgYXMgc3RyaW5nKS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIG5lYXJlc3RSYW5nZVswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsgbmVhcmVzdFJhbmdlWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1hcmtlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0IGFzIHN0cmluZykuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyBuZWFyZXN0UmFuZ2VbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIG5lYXJlc3RSYW5nZVsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VkVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG5lYXJlc3RSYW5nZVsxXVxuXG4gICAgICAgICAgICAgICAgcmVzdFRhcmdldCA9ICh0YXJnZXQgYXMgc3RyaW5nKS5zdWJzdHJpbmcob2Zmc2V0KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdFRhcmdldC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZFRhcmdldC5wdXNoKHJlc3RUYXJnZXQpXG5cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zLm1hcmtlciA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgbWFya2VkVGFyZ2V0LmpvaW4oJycpIDpcbiAgICAgICAgICAgIG1hcmtlZFRhcmdldFxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRcbn1cbi8qKlxuICogTm9ybWFsaXplcyBhIGdpdmVuIHBob25lIG51bWJlciBmb3IgYXV0b21hdGljIGRpYWxpbmcgb3IgY29tcGFyaXNvbi5cbiAqIEBwYXJhbSB2YWx1ZSAtIE51bWJlciB0byBub3JtYWxpemUuXG4gKiBAcGFyYW0gZGlhbGFibGUgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVzdWx0IHNob3VsZCBiZSBkaWFsZWQgb3JcbiAqIHJlcHJlc2VudGVkIGFzIGxvc3NsZXNzIGRhdGEuXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIG51bWJlci5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVBob25lTnVtYmVyID0gKFxuICAgIHZhbHVlOiB1bmtub3duLCBkaWFsYWJsZSA9IHRydWVcbik6IHN0cmluZyA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBsZXQgbm9ybWFsaXplZFZhbHVlOiBzdHJpbmcgPSBTdHJpbmcodmFsdWUpLnRyaW0oKVxuXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBjb3VudHJ5IGNvZGUgcHJlZml4LlxuICAgICAgICBub3JtYWxpemVkVmFsdWUgPSBub3JtYWxpemVkVmFsdWUucmVwbGFjZSgvXlteMC05XSpcXCsvLCAnMDAnKVxuXG4gICAgICAgIC8vIFJlbW92ZSBhbHRlcm5hdGUgZGlyZWN0IGRpYWwgbnVtYmVycy5cbiAgICAgICAgbm9ybWFsaXplZFZhbHVlID0gbm9ybWFsaXplZFZhbHVlLnJlcGxhY2UoXG4gICAgICAgICAgICAvKFswLTldLio/KSAqKCx8b1tyZF0/KVxcLj8gPy0/WzAtOV0rJC8sICckMSdcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChkaWFsYWJsZSlcbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkVmFsdWUucmVwbGFjZSgvW14wLTldKy9nLCAnJylcblxuICAgICAgICBjb25zdCBzZXBhcmF0b3JQYXR0ZXJuID0gJyg/OlsgL1xcXFwtXSspJ1xuICAgICAgICAvLyBSZW1vdmUgdW5uZWVkZWQgYXJlYSBjb2RlIHplcm8gaW4gYnJhY2tldHMuXG4gICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICBgXiguKz8pJHtzZXBhcmF0b3JQYXR0ZXJufT9cXFxcKDBcXFxcKSR7c2VwYXJhdG9yUGF0dGVybn0/YCArXG4gICAgICAgICAgICAgICAgJyguKykkJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICckMS0kMidcbiAgICAgICAgKVxuICAgICAgICAvLyBSZW1vdmUgdW5uZWVkZWQgYXJlYSBjb2RlIGJyYWNrZXRzLlxuICAgICAgICBub3JtYWxpemVkVmFsdWUgPSBub3JtYWxpemVkVmFsdWUucmVwbGFjZShcbiAgICAgICAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgYF4oLis/KSR7c2VwYXJhdG9yUGF0dGVybn0/XFxcXCgoLispXFxcXClgICtcbiAgICAgICAgICAgICAgICBgJHtzZXBhcmF0b3JQYXR0ZXJufT8oLispJGBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAnJDEtJDItJDMnXG4gICAgICAgIClcbiAgICAgICAgLypcbiAgICAgICAgICAgIFJlbW92ZSBzZXBhcmF0b3JzIHRoYXQgZG9uJ3QgbWFyayBzZW1hbnRpY3M6XG4gICAgICAgICAgICAxOiBDb3VudHJ5IGNvZGVcbiAgICAgICAgICAgIDI6IEFyZWEgY29kZVxuICAgICAgICAgICAgMzogTnVtYmVyXG4gICAgICAgICovXG4gICAgICAgIGxldCBjb21waWxlZFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgYF4oMDBbMC05XSspJHtzZXBhcmF0b3JQYXR0ZXJufShbMC05XSspJHtzZXBhcmF0b3JQYXR0ZXJufWAgK1xuICAgICAgICAgICAgJyguKykkJ1xuICAgICAgICApXG5cbiAgICAgICAgaWYgKGNvbXBpbGVkUGF0dGVybi50ZXN0KG5vcm1hbGl6ZWRWYWx1ZSkpXG4gICAgICAgICAgICAvLyBDb3VudHJ5IGNvZGUgYW5kIGFyZWEgY29kZSBtYXRjaGVkLlxuICAgICAgICAgICAgbm9ybWFsaXplZFZhbHVlID0gbm9ybWFsaXplZFZhbHVlLnJlcGxhY2UoY29tcGlsZWRQYXR0ZXJuLCAoXG4gICAgICAgICAgICAgICAgX21hdGNoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgY291bnRyeUNvZGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBhcmVhQ29kZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIG51bWJlcjogc3RyaW5nXG4gICAgICAgICAgICApOiBzdHJpbmcgPT5cbiAgICAgICAgICAgICAgICBgJHtjb3VudHJ5Q29kZX0tJHthcmVhQ29kZX0tYCArXG4gICAgICAgICAgICAgICAgc2xpY2VBbGxFeGNlcHROdW1iZXJBbmRMYXN0U2VwYXJhdG9yKG51bWJlcilcbiAgICAgICAgICAgIClcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIE9uZSBwcmVmaXggY29kZSBtYXRjaGVkOlxuICAgICAgICAgICAgICAgIDE6IFByZWZpeCBjb2RlXG4gICAgICAgICAgICAgICAgMjogTnVtYmVyXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29tcGlsZWRQYXR0ZXJuID0gL14oWzAtOSBdKylbLy1dKC4rKSQvXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlciA9IChcbiAgICAgICAgICAgICAgICBfbWF0Y2g6IHN0cmluZywgcHJlZml4Q29kZTogc3RyaW5nLCBudW1iZXI6IHN0cmluZ1xuICAgICAgICAgICAgKTogc3RyaW5nID0+XG4gICAgICAgICAgICAgICAgYCR7cHJlZml4Q29kZS5yZXBsYWNlKC8gKy8sICcnKX0tYCArXG4gICAgICAgICAgICAgICAgc2xpY2VBbGxFeGNlcHROdW1iZXJBbmRMYXN0U2VwYXJhdG9yKG51bWJlcilcblxuICAgICAgICAgICAgaWYgKGNvbXBpbGVkUGF0dGVybi50ZXN0KG5vcm1hbGl6ZWRWYWx1ZSkpXG4gICAgICAgICAgICAgICAgLy8gUHJlZmVyIFwiL1wiIG9yIFwiLVwiIG92ZXIgXCIgXCIgYXMgYXJlYSBjb2RlIHNlcGFyYXRvci5cbiAgICAgICAgICAgICAgICBub3JtYWxpemVkVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmFsdWUucmVwbGFjZShjb21waWxlZFBhdHRlcm4sIHJlcGxhY2VyKVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGBeKFswLTldKykke3NlcGFyYXRvclBhdHRlcm59KC4rKSRgKSxcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZXJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZFZhbHVlLnJlcGxhY2UoL1teMC05LV0rL2csICcnKS5yZXBsYWNlKC9eLSskLywgJycpXG4gICAgfVxuXG4gICAgcmV0dXJuICcnXG59XG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBnaXZlbiB6aXAgY29kZSBmb3IgYXV0b21hdGljIGFkZHJlc3MgcHJvY2Vzc2luZy5cbiAqIEBwYXJhbSB2YWx1ZSAtIE51bWJlciB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIG51bWJlci5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVppcENvZGUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpLnRyaW0oKS5yZXBsYWNlKFxuICAgICAgICAgICAgL14oW14wLTldKlthLXpBLVpdLSk/KC4rKSQvLFxuICAgICAgICAgICAgKG1hdGNoOiBzdHJpbmcsIHByZWZpeD86IHN0cmluZywgY29kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwcmVmaXgpXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGggLSAyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGFyQXQoMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnLSdcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAocHJlZml4ID8/ICcnKSArXG4gICAgICAgICAgICAgICAgICAgIChjb2RlID8/ICcnKS50cmltKCkucmVwbGFjZSgvW14wLTldKy9nLCAnJylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIClcblxuICAgIHJldHVybiAnJ1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGdpdmVuIHNlcmlhbGl6ZWQsIGJhc2U2NCBlbmNvZGVkIG9yIGZpbGUgcGF0aCBnaXZlbiBvYmplY3QgaW50byBhXG4gKiBuYXRpdmUgSmF2YVNjcmlwdCBvbmUgaWYgcG9zc2libGUuXG4gKiBAcGFyYW0gc2VyaWFsaXplZE9iamVjdCAtIE9iamVjdCBhcyBzdHJpbmcuXG4gKiBAcGFyYW0gc2NvcGUgLSBBbiBvcHRpb25hbCBzY29wZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZXZhbHVhdGUgZ2l2ZW4gb2JqZWN0XG4gKiBpbi5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgdW5kZXIgZ2l2ZW4gc2NvcGUgd2lsbCBiZSBhdmFpbGFibGUuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIG9iamVjdCBpZiBwb3NzaWJsZSBhbmQgbnVsbCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZUVuY29kZWRPYmplY3QgPSA8VCA9IFBsYWluT2JqZWN0PihcbiAgICBzZXJpYWxpemVkT2JqZWN0OiBzdHJpbmcsIHNjb3BlOiBNYXBwaW5nPHVua25vd24+ID0ge30sIG5hbWUgPSAnc2NvcGUnXG4pOiBudWxsIHwgVCA9PiB7XG4gICAgaWYgKCFpbXBvcnRzLmZzPy5yZWFkRmlsZVN5bmMpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBzeXN0ZW0gYXBpIGNvdWxkIG5vdCBiZSBsb2FkZWQuJylcblxuICAgIGlmIChzZXJpYWxpemVkT2JqZWN0LmVuZHNXaXRoKCcuanNvbicpICYmIGlzRmlsZVN5bmMoc2VyaWFsaXplZE9iamVjdCkpXG4gICAgICAgIHNlcmlhbGl6ZWRPYmplY3QgPVxuICAgICAgICAgICAgaW1wb3J0cy5mcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE9iamVjdCwge2VuY29kaW5nOiBERUZBVUxUX0VOQ09ESU5HfVxuICAgICAgICAgICAgKVxuXG4gICAgc2VyaWFsaXplZE9iamVjdCA9IHNlcmlhbGl6ZWRPYmplY3QudHJpbSgpXG5cbiAgICBpZiAoIXNlcmlhbGl6ZWRPYmplY3Quc3RhcnRzV2l0aCgneycpKVxuICAgICAgICBzZXJpYWxpemVkT2JqZWN0ID0gKGV2YWwoJ0J1ZmZlcicpIGFzIHR5cGVvZiBCdWZmZXIpXG4gICAgICAgICAgICAuZnJvbShzZXJpYWxpemVkT2JqZWN0LCAnYmFzZTY0JylcbiAgICAgICAgICAgIC50b1N0cmluZyhERUZBVUxUX0VOQ09ESU5HKVxuXG4gICAgY29uc3QgcmVzdWx0OiBFdmFsdWF0aW9uUmVzdWx0PFQ+ID1cbiAgICAgICAgZXZhbHVhdGU8VD4oc2VyaWFsaXplZE9iamVjdCwge1tuYW1lXTogc2NvcGV9KVxuXG4gICAgaWYgKHR5cGVvZiByZXN1bHQucmVzdWx0ID09PSAnb2JqZWN0JylcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHRcblxuICAgIHJldHVybiBudWxsXG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSBnaXZlbiBwaG9uZSBudW1iZXIuIE5PVEU6IEN1cnJlbnRseSBvbmx5IHN1cHBvcnQgR2VybWFuIHBob25lXG4gKiBudW1iZXJzLlxuICogQHBhcmFtIHZhbHVlIC0gTnVtYmVyIHRvIGZvcm1hdC5cbiAqIEByZXR1cm5zIEZvcm1hdHRlZCBudW1iZXIuXG4gKi9cbmV4cG9ydCBjb25zdCByZXByZXNlbnRQaG9uZU51bWJlciA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gICAgaWYgKFsnbnVtYmVyJywgJ3N0cmluZyddLmluY2x1ZGVzKGRldGVybWluZVR5cGUodmFsdWUpKSAmJiB2YWx1ZSkge1xuICAgICAgICAvLyBSZXByZXNlbnQgY291bnRyeSBjb2RlIGFuZCBsZWFkaW5nIGFyZWEgY29kZSB6ZXJvLlxuICAgICAgICBsZXQgbm9ybWFsaXplZFZhbHVlID1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1iYXNlLXRvLXN0cmluZ1xuICAgICAgICAgICAgU3RyaW5nKHZhbHVlKS5yZXBsYWNlKC9eKDAwfFxcKykoWzAtOV0rKS0oWzAtOS1dKykkLywgJyskMiAoMCkgJDMnKVxuXG4gICAgICAgIC8vIEFkZCBHZXJtYW4gY291bnRyeSBjb2RlIGlmIG5vdCBleGlzdHMuXG4gICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9XG4gICAgICAgICAgICBub3JtYWxpemVkVmFsdWUucmVwbGFjZSgvXjAoWzEtOV1bMC05LV0rKSQvLCAnKzQ5ICgwKSAkMScpXG4gICAgICAgIC8vIFNlcGFyYXRlIGFyZWEgY29kZSBmcm9tIGJhc2UgbnVtYmVyLlxuICAgICAgICBub3JtYWxpemVkVmFsdWUgPVxuICAgICAgICAgICAgbm9ybWFsaXplZFZhbHVlLnJlcGxhY2UoL14oW14tXSspLShbMC05LV0rKSQvLCAnJDEgLyAkMicpXG5cbiAgICAgICAgLy8gUGFydGl0aW9uIGJhc2UgbnVtYmVyIGluIG9uZSB0cmlwbGUgYW5kIHR1cGxlcyBvciB0dXBsZXMgb25seS5cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRWYWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgL14oLio/KShbMC05XSspKC0/WzAtOV0qKSQvLFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIF9tYXRjaDogc3RyaW5nLCBwcmVmaXg6IHN0cmluZywgbnVtYmVyOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nXG4gICAgICAgICAgICApOiBzdHJpbmcgPT5cbiAgICAgICAgICAgICAgICBwcmVmaXggK1xuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgKG51bWJlci5sZW5ndGggJSAyID09PSAwKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIucmVwbGFjZSgvKFswLTldezJ9KS9nLCAnJDEgJykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgL14oWzAtOV17M30pKFswLTldKykkLyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tYXRjaDogc3RyaW5nLCB0cmlwbGU6IHN0cmluZywgcmVzdDogc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTogc3RyaW5nID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RyaXBsZX0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QucmVwbGFjZSgvKFswLTldezJ9KS9nLCAnJDEgJykudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApICsgc3VmZml4XG4gICAgICAgICAgICAgICAgKS50cmltKClcbiAgICAgICAgKS50cmltKClcbiAgICB9XG5cbiAgICByZXR1cm4gJydcbn1cbi8qKlxuICogU2xpY2VzIGFsbCBub25lIG51bWJlcnMgYnV0IHByZXNlcnZlcyBsYXN0IHNlcGFyYXRvci5cbiAqIEBwYXJhbSB2YWx1ZSAtIFN0cmluZyB0byBwcm9jZXNzLlxuICogQHJldHVybnMgLSBTbGljZWQgZ2l2ZW4gdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBzbGljZUFsbEV4Y2VwdE51bWJlckFuZExhc3RTZXBhcmF0b3IgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgLypcbiAgICAgICAgMTogYmFzZU51bWJlclxuICAgICAgICAyOiBkaXJlY3REaWFsaW5nTnVtYmVyU3VmZml4XG4gICAgKi9cbiAgICBjb25zdCBjb21waWxlZFBhdHRlcm4gPSAvXiguKlswLTldLiopLShbMC05XSspJC9cbiAgICBpZiAoY29tcGlsZWRQYXR0ZXJuLnRlc3QodmFsdWUpKVxuICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZShjb21waWxlZFBhdHRlcm4sIChcbiAgICAgICAgICAgIF9tYXRjaDogc3RyaW5nLFxuICAgICAgICAgICAgYmFzZU51bWJlcjogc3RyaW5nLFxuICAgICAgICAgICAgZGlyZWN0RGlhbGluZ051bWJlclN1ZmZpeDogc3RyaW5nXG4gICAgICAgICk6IHN0cmluZyA9PlxuICAgICAgICAgICAgYCR7YmFzZU51bWJlci5yZXBsYWNlKC9bXjAtOV0rL2csICcnKX0tYCArXG4gICAgICAgICAgICBkaXJlY3REaWFsaW5nTnVtYmVyU3VmZml4XG4gICAgICAgIClcblxuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bXjAtOV0rL2csICcnKVxufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGRvbSBzZWxlY3RvciB0byBhIHByZWZpeGVkIGRvbSBzZWxlY3RvciBzdHJpbmcuXG4gKiBAcGFyYW0gc2VsZWN0b3IgLSBBIGRvbSBub2RlIHNlbGVjdG9yLlxuICogQHBhcmFtIHNlbGVjdG9yUHJlZml4IC0gQSBkb20gbm9kZSBzZWxlY3RvciBwcmVmaXggdG8gdGFrZSBpbnRvIGFjY291bnQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGdpdmVuIHNlbGVjdG9yIHByZWZpeGVkLlxuICovXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplRG9tTm9kZVNlbGVjdG9yID0gKFxuICAgIHNlbGVjdG9yOiBzdHJpbmcsIHNlbGVjdG9yUHJlZml4ID0gJydcbik6IHN0cmluZyA9PiB7XG4gICAgbGV0IGRvbU5vZGVTZWxlY3RvclByZWZpeCA9ICcnXG4gICAgaWYgKHNlbGVjdG9yUHJlZml4KVxuICAgICAgICBkb21Ob2RlU2VsZWN0b3JQcmVmaXggPSBgJHtzZWxlY3RvclByZWZpeH0gYFxuICAgIGlmICghKFxuICAgICAgICBzZWxlY3Rvci5zdGFydHNXaXRoKGRvbU5vZGVTZWxlY3RvclByZWZpeCkgfHxcbiAgICAgICAgc2VsZWN0b3IudHJpbSgpLnN0YXJ0c1dpdGgoJzwnKVxuICAgICkpXG4gICAgICAgIHNlbGVjdG9yID0gZG9tTm9kZVNlbGVjdG9yUHJlZml4ICsgc2VsZWN0b3JcblxuICAgIHJldHVybiBzZWxlY3Rvci50cmltKClcbn1cbi8qKlxuICogQWJicmV2aWF0ZXMgYSBnaXZlbiBzdHJpbmcgaWYgaXQgZXhjZXNzZXMgYSBnaXZlbiBsaW1pdC5cbiAqIEBwYXJhbSB2YWx1ZSAtIFN0cmluZyB0byBhYmJyZXZpYXRlLlxuICogQHBhcmFtIGxpbWl0IC0gTWF4aW11bSBsZW5ndGggb2YgcHJvY2Vzc2VkIHN0cmluZy5cbiAqIEByZXR1cm5zIEFiYnJldmlhdGVkIGdpdmVuIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGxpbWl0ID0gKHZhbHVlOiBzdHJpbmcsIGxpbWl0ID0gMTAwKSA9PiB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA8PSBsaW1pdClcbiAgICAgICAgcmV0dXJuIHZhbHVlXG5cbiAgICBjb25zdCBkb3RzID0gJy4uLidcbiAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGxpbWl0IC0gZG90cy5sZW5ndGgpICsgZG90c1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQSxTQUNJLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUI7QUFFNUQsU0FBUSxhQUFhLEVBQUUsNEJBQTRCO0FBQ25ELFNBQVEsVUFBVSxFQUFFLE9BQU87QUFDM0IsU0FBUSxhQUFhLEVBQUUsU0FBUztBQUVoQyxPQUFPLE1BQU0seUJBQXlCLEdBQUc7RUFBQyxLQUFLLEVBQUU7QUFBSyxDQUFDO0FBQ3ZEO0FBQ0E7QUFDQSxPQUFPLE1BQU0sd0JBQXdCLEdBQUcsYUFBYTtB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