study-kgxx-test3
Version:
ts工具函数
2 lines • 33 kB
JavaScript
!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r();else if("function"==typeof define&&define.amd)define([],r);else{var n=r();for(var t in n)("object"==typeof exports?exports:e)[t]=n[t]}}(self,(()=>(()=>{"use strict";var e={d:(r,n)=>{for(var t in n)e.o(n,t)&&!e.o(r,t)&&Object.defineProperty(r,t,{enumerable:!0,get:n[t]})},o:(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},r={};e.r(r),e.d(r,{arrayUtils:()=>t,broadcastMessageUtils:()=>a,dateUtils:()=>o,objectUtils:()=>n});var n={};e.r(n),e.d(n,{isSameObj:()=>c});var t={};e.r(t),e.d(t,{arrayToTree:()=>i,arrayToTreeWithNoParent:()=>s,getArrayIntersection:()=>u,getArrayUnion:()=>f,treeToArray:()=>y});var o={};e.r(o),e.d(o,{simpleFormatTimestamp:()=>d,simpleGetDate:()=>l});var a={};function c(e,r){if("object"!=typeof e||"object"!=typeof r||null===e||null===r)return e===r;if(Object.keys(e).length!==Object.keys(r).length)return!1;for(var n in e){if("object"==typeof e[n]||"object"==typeof r[n])return c(e[n],r[n]);if(e[n]!==r[n])return!1}return!0}function i(e,r,n){void 0===r&&(r=null),void 0===n&&(n={parentKey:"parentId",sonKey:"id",childrenKey:"children"});try{var t=e;t.forEach((function(e){if(!e.hasOwnProperty(n.sonKey)&&e.hasOwnProperty(n.parentKey))throw new Error("工具arrayToTree的源数组中元素:".concat(n.sonKey,"不存在,请检查源数据结构"));if(e.hasOwnProperty(n.sonKey)&&!e.hasOwnProperty(n.parentKey))throw new Error("工具arrayToTree的源数组中元素:".concat(n.parentKey,"不存在,请检查源数据结构"));if(!e.hasOwnProperty(n.sonKey)&&!e.hasOwnProperty(n.parentKey))throw new Error("工具arrayToTree的源数组中元素:".concat(n.sonKey,"、").concat(n.parentKey,"不存在,请检查源数据结构"))}));var o=[];return t.forEach((function(e){e[n.parentKey]==r&&(i(t,e[n.sonKey],n).length&&(e[n.childrenKey]=i(t,e[n.sonKey],n)),o.push(e))})),o}catch(e){return console.error(e),[]}}function s(e,r,n){void 0===r&&(r=null),void 0===n&&(n={parentKey:"parentId",sonKey:"id",childrenKey:"children"});var t=function e(r,n,t){void 0===n&&(n=null),void 0===t&&(t={parentKey:"parentId",sonKey:"id",childrenKey:"children"});try{var o=r;o.forEach((function(e){if(!e.hasOwnProperty(t.sonKey)&&e.hasOwnProperty(t.parentKey))throw new Error("工具arrayToTree的源数组中元素:".concat(t.sonKey,"不存在,请检查源数据结构"));if(e.hasOwnProperty(t.sonKey)&&!e.hasOwnProperty(t.parentKey))throw new Error("工具arrayToTree的源数组中元素:".concat(t.parentKey,"不存在,请检查源数据结构"));if(!e.hasOwnProperty(t.sonKey)&&!e.hasOwnProperty(t.parentKey))throw new Error("工具arrayToTree的源数组中元素:".concat(t.sonKey,"、").concat(t.parentKey,"不存在,请检查源数据结构"))}));var a=[];return o.forEach((function(r){r[t.parentKey]==n&&(e(o,r[t.sonKey],t).length&&(r[t.childrenKey]=e(o,r[t.sonKey],t)),a.push(r))})),a}catch(e){return console.error(e),[]}}(e,r,n);return t}function y(e,r){void 0===r&&(r={childrenKey:"children"});try{var n=e;n.forEach((function(e){if(!e.hasOwnProperty(r.childrenKey))throw new Error("工具treeToArray的源数组中元素:".concat(r.childrenKey,"不存在,请检查源数据结构"))}));var t=[];return p(n,t,r),t}catch(e){return console.error(e),[]}}function u(e,r){var n=[];return e.forEach((function(e){-1!==r.findIndex((function(r){return c(e,r)}))&&n.push(e)})),n}function f(e,r,n){void 0===n&&(n={unique:!1});var t=n.unique?[]:e;return e.forEach((function(e){r.forEach((function(r){c(e,r)?-1==t.findIndex((function(r){return c(r,e)}))&&t.push(e):(-1==t.findIndex((function(r){return c(r,e)}))&&t.push(e),-1==t.findIndex((function(e){return c(e,r)}))&&t.push(r))}))})),t}function p(e,r,n){e.forEach((function(e){r.push(e),e[n.childrenKey]&&e[n.childrenKey].length&&p(e[n.childrenKey],r,n)}))}function d(e,r){void 0===r&&(r="yyyy-MM-dd HH:mm:ss");var n=e;n=n?"string"==typeof n?parseFloat(n):Number(n):0;var t=new Date(n),o=t.getFullYear(),a=t.getMonth()+1,c=t.getDate(),i=t.getHours(),s=t.getMinutes(),y=t.getSeconds();return r.replace("yyyy",o.toString()).replace("MM",a.toString().padStart(2,"0")).replace("dd",c.toString().padStart(2,"0")).replace("HH",i.toString().padStart(2,"0")).replace("mm",s.toString().padStart(2,"0")).replace("ss",y.toString().padStart(2,"0"))}function l(e,r){void 0===r&&(r="Y");var n=e;n=n?"string"==typeof n?parseFloat(n):Number(n):0;var t=new Date(n),o=0;switch(r){case"Y":o=t.getFullYear();break;case"M":o=t.getMonth()+1;break;case"D":o=t.getDate();break;case"H":o=t.getHours();break;case"m":o=t.getMinutes();break;case"s":o=t.getSeconds()}return o}function h(e,r){new BroadcastChannel(e).postMessage(r)}function K(e,r){new BroadcastChannel(e).onmessage=function(e){r&&r(e)}}function g(e){new BroadcastChannel(e).close()}return e.r(a),e.d(a,{closeChannel:()=>g,listenMessage:()=>K,sendMessage:()=>h}),r})()));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFRVixXQUNoQixNQUNKLElBQUssSUFDRGhELEVBQVEwRCxFQUFRUixhQUNoQixNQUNKLElBQUssSUFDRGxELEVBQVEwRCxFQUFRTixhQUl4QixPQUFPcEQsQ0FDWCxDQ25FTyxTQUFTMkQsRUFBWUMsRUFBZUMsR0FDekIsSUFBSUMsaUJBQWlCRixHQUMzQkcsWUFBWUYsRUFDeEIsQ0FTTyxTQUFTRyxFQUFjSixFQUFjSyxHQUMxQixJQUFJSCxpQkFBaUJGLEdBQzNCTSxVQUFZLFNBQUNMLEdBQ2pCSSxHQUFZQSxFQUFTSixFQUN6QixDQUNKLENBUU8sU0FBU00sRUFBYVAsR0FDWCxJQUFJRSxpQkFBaUJGLEdBQzNCUSxPQUNaLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zdHVkeS1rZ3h4LXRlc3QzL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9zdHVkeS1rZ3h4LXRlc3QzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3N0dWR5LWtneHgtdGVzdDMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3N0dWR5LWtneHgtdGVzdDMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zdHVkeS1rZ3h4LXRlc3QzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vc3R1ZHkta2d4eC10ZXN0My8uL3NyYy9vYmplY3QvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vc3R1ZHkta2d4eC10ZXN0My8uL3NyYy9hcnJheS9pbmRleC50cyIsIndlYnBhY2s6Ly9zdHVkeS1rZ3h4LXRlc3QzLy4vc3JjL2RhdGUvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vc3R1ZHkta2d4eC10ZXN0My8uL3NyYy9icm9hZGNhc3RNZXNzYWdlL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSB7XG5cdFx0dmFyIGEgPSBmYWN0b3J5KCk7XG5cdFx0Zm9yKHZhciBpIGluIGEpICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBleHBvcnRzIDogcm9vdClbaV0gPSBhW2ldO1xuXHR9XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwiLy8gVGhlIHJlcXVpcmUgc2NvcGVcbnZhciBfX3dlYnBhY2tfcmVxdWlyZV9fID0ge307XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKipcclxuICogQG5hbWUgaXNTYW1lT2JqXHJcbiAqIEBkZXNjcmlwdGlvbiDliKTmlq3kuKTkuKrlr7nosaHlhoXlrrnmmK/lkKblrozlhajnm7jlkIxcclxuICogQGF1dGhvciDmnY7lmInosapcclxuICogQHBhcmFtIHsgeyBba2V5OnN0cmluZ106YW55IH0gfSBvYmoxXHJcbiAqIEBwYXJhbSB7IHsgW2tleTpzdHJpbmddOmFueSB9IH0gb2JqMlxyXG4gKiBAcmV0dXJucyB7IEJvb2xlYW4gfSDluIPlsJRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1NhbWVPYmoob2JqMTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgb2JqMjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHR5cGVvZiBvYmoxICE9PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqMiAhPT0gJ29iamVjdCcgfHwgb2JqMSA9PT0gbnVsbCB8fCBvYmoyID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIG9iajEgPT09IG9iajJcclxuICAgIH1cclxuICAgIGlmIChPYmplY3Qua2V5cyhvYmoxKS5sZW5ndGggIT09IE9iamVjdC5rZXlzKG9iajIpLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQga2V5IGluIG9iajEpIHtcclxuICAgICAgICBpZiAodHlwZW9mIG9iajFba2V5XSA9PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqMltrZXldID09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpc1NhbWVPYmoob2JqMVtrZXldLCBvYmoyW2tleV0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG9iajFba2V5XSAhPT0gb2JqMltrZXldKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlXHJcbn0iLCJpbXBvcnQgeyBpc1NhbWVPYmogfSBmcm9tICcuLi9vYmplY3QnXHJcblxyXG4vKipcclxuICogQG5hbWUgYXJyYXlUb1RyZWVcclxuICogQGF1dGhvciDmnY7lmInosapcclxuICogQGRlc2NyaXB0aW9uIOaVsOe7hOi9rOS4uuagkee7k+aehOaVsOe7hFxyXG4gKiBAcGFyYW0geyBBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueSB9PiB9IHNvdXJjZUFycmF5IOa6kOaVsOe7hFxyXG4gKiBAcGFyYW0geyBudWxsIHwgMCB9ICBwYXJlbnRWYWx1ZSDniLboioLngrnlsZ7mgKfliJ3lp4vlgLxcclxuICogQHBhcmFtIHsgQXJyYXlUb1RyZWVPcHRpb25zIH0gb3B0aW9ucyDphY3nva7poblcclxuICogQHJldHVybnMgeyBBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueSB9PiB9IOi/lOWbnuS4gOS4quagkeW9ouaVsOe7hOaIluiAheaKm+WHuuW8guW4uOi/lOWbnuepuuaVsOe7hFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5VG9UcmVlKHNvdXJjZUFycmF5OiBBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueSB9PiwgcGFyZW50VmFsdWU6IG51bGwgfCAwID0gbnVsbCwgb3B0aW9uczogQXJyYXlUb1RyZWVPcHRpb25zID0geyBwYXJlbnRLZXk6ICdwYXJlbnRJZCcsIHNvbktleTogJ2lkJywgY2hpbGRyZW5LZXk6ICdjaGlsZHJlbicgfSk6IEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55IH0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgYXJyYXkgPSBzb3VyY2VBcnJheVxyXG5cclxuICAgICAgICBhcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghaXRlbS5oYXNPd25Qcm9wZXJ0eShvcHRpb25zLnNvbktleSkgJiYgaXRlbS5oYXNPd25Qcm9wZXJ0eShvcHRpb25zLnBhcmVudEtleSkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg5bel5YW3YXJyYXlUb1RyZWXnmoTmupDmlbDnu4TkuK3lhYPntKDvvJoke29wdGlvbnMuc29uS2V5feS4jeWtmOWcqO+8jOivt+ajgOafpea6kOaVsOaNrue7k+aehGApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGl0ZW0uaGFzT3duUHJvcGVydHkob3B0aW9ucy5zb25LZXkpICYmICFpdGVtLmhhc093blByb3BlcnR5KG9wdGlvbnMucGFyZW50S2V5KSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDlt6XlhbdhcnJheVRvVHJlZeeahOa6kOaVsOe7hOS4reWFg+e0oO+8miR7b3B0aW9ucy5wYXJlbnRLZXl95LiN5a2Y5Zyo77yM6K+35qOA5p+l5rqQ5pWw5o2u57uT5p6EYClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0uaGFzT3duUHJvcGVydHkob3B0aW9ucy5zb25LZXkpICYmICFpdGVtLmhhc093blByb3BlcnR5KG9wdGlvbnMucGFyZW50S2V5KSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDlt6XlhbdhcnJheVRvVHJlZeeahOa6kOaVsOe7hOS4reWFg+e0oO+8miR7b3B0aW9ucy5zb25LZXl944CBJHtvcHRpb25zLnBhcmVudEtleX3kuI3lrZjlnKjvvIzor7fmo4Dmn6XmupDmlbDmja7nu5PmnoRgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgbGV0IG5ld0FycjogQXJyYXk8eyBba2V5OiBzdHJpbmddOiBhbnkgfT4gPSBbXVxyXG5cclxuICAgICAgICBhcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtW29wdGlvbnMucGFyZW50S2V5XSA9PSBwYXJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFycmF5VG9UcmVlKGFycmF5LCBpdGVtW29wdGlvbnMuc29uS2V5XSwgb3B0aW9ucykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbVtvcHRpb25zLmNoaWxkcmVuS2V5XSA9IGFycmF5VG9UcmVlKGFycmF5LCBpdGVtW29wdGlvbnMuc29uS2V5XSwgb3B0aW9ucylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG5ld0Fyci5wdXNoKGl0ZW0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3QXJyXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQG5hbWUgYXJyYXlUb1RyZWVXaXRoTm9QYXJlbnRcclxuICogQGF1dGhvciDmnY7lmInosapcclxuICogQGRlc2NyaXB0aW9uIOaVsOe7hOi9rOS4uuagkee7k+aehOaVsOe7hFxyXG4gKiBAcGFyYW0geyBBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueSB9PiB9IHNvdXJjZUFycmF5IOa6kOaVsOe7hFxyXG4gKiBAcGFyYW0geyBudWxsIHwgMCB8ICcwJ30gIHBhcmVudFZhbHVlIOeItuiKgueCueWxnuaAp+WIneWni+WAvFxyXG4gKiBAcGFyYW0geyBBcnJheVRvVHJlZU9wdGlvbnMgfSBvcHRpb25zIOmFjee9rumhuVxyXG4gKiBAcmV0dXJucyB7IEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55IH0+IH0g6L+U5Zue5LiA5Liq5qCR5b2i5pWw57uE5oiW6ICF5oqb5Ye65byC5bi46L+U5Zue56m65pWw57uEXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlUb1RyZWVXaXRoTm9QYXJlbnQoc291cmNlQXJyYXk6IEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55IH0+LCBwYXJlbnRWYWx1ZTogbnVsbCB8IDAgfCAnMCcgPSBudWxsLCBvcHRpb25zOiBBcnJheVRvVHJlZU9wdGlvbnMgPSB7IHBhcmVudEtleTogJ3BhcmVudElkJywgc29uS2V5OiAnaWQnLCBjaGlsZHJlbktleTogJ2NoaWxkcmVuJyB9KTogQXJyYXk8eyBba2V5OiBzdHJpbmddOiBhbnkgfT4ge1xyXG4gICAgZnVuY3Rpb24gYXJyYXlUb1RyZWUoc291cmNlQXJyYXk6IEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55IH0+LCBwYXJlbnRWYWx1ZTogbnVsbCB8IDAgfCAnMCcgPSBudWxsLCBvcHRpb25zOiBBcnJheVRvVHJlZU9wdGlvbnMgPSB7IHBhcmVudEtleTogJ3BhcmVudElkJywgc29uS2V5OiAnaWQnLCBjaGlsZHJlbktleTogJ2NoaWxkcmVuJyB9KTogQXJyYXk8eyBba2V5OiBzdHJpbmddOiBhbnkgfT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFycmF5ID0gc291cmNlQXJyYXlcclxuXHJcbiAgICAgICAgICAgIGFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghaXRlbS5oYXNPd25Qcm9wZXJ0eShvcHRpb25zLnNvbktleSkgJiYgaXRlbS5oYXNPd25Qcm9wZXJ0eShvcHRpb25zLnBhcmVudEtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOW3peWFt2FycmF5VG9UcmVl55qE5rqQ5pWw57uE5Lit5YWD57Sg77yaJHtvcHRpb25zLnNvbktleX3kuI3lrZjlnKjvvIzor7fmo4Dmn6XmupDmlbDmja7nu5PmnoRgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uaGFzT3duUHJvcGVydHkob3B0aW9ucy5zb25LZXkpICYmICFpdGVtLmhhc093blByb3BlcnR5KG9wdGlvbnMucGFyZW50S2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg5bel5YW3YXJyYXlUb1RyZWXnmoTmupDmlbDnu4TkuK3lhYPntKDvvJoke29wdGlvbnMucGFyZW50S2V5feS4jeWtmOWcqO+8jOivt+ajgOafpea6kOaVsOaNrue7k+aehGApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIWl0ZW0uaGFzT3duUHJvcGVydHkob3B0aW9ucy5zb25LZXkpICYmICFpdGVtLmhhc093blByb3BlcnR5KG9wdGlvbnMucGFyZW50S2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg5bel5YW3YXJyYXlUb1RyZWXnmoTmupDmlbDnu4TkuK3lhYPntKDvvJoke29wdGlvbnMuc29uS2V5feOAgSR7b3B0aW9ucy5wYXJlbnRLZXl95LiN5a2Y5Zyo77yM6K+35qOA5p+l5rqQ5pWw5o2u57uT5p6EYClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgIGxldCBuZXdBcnI6IEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55IH0+ID0gW11cclxuXHJcbiAgICAgICAgICAgIGFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtW29wdGlvbnMucGFyZW50S2V5XSA9PSBwYXJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcnJheVRvVHJlZShhcnJheSwgaXRlbVtvcHRpb25zLnNvbktleV0sIG9wdGlvbnMpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtW29wdGlvbnMuY2hpbGRyZW5LZXldID0gYXJyYXlUb1RyZWUoYXJyYXksIGl0ZW1bb3B0aW9ucy5zb25LZXldLCBvcHRpb25zKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBuZXdBcnIucHVzaChpdGVtKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ld0FyclxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXR1cm4gW11cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJldHVybkFyciA9IGFycmF5VG9UcmVlKHNvdXJjZUFycmF5LCBwYXJlbnRWYWx1ZSwgb3B0aW9ucylcclxuXHJcbiAgICByZXR1cm4gcmV0dXJuQXJyXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSB0cmVlVG9BcnJheVxyXG4gKiBAYXV0aG9yIOadjuWYieixqlxyXG4gKiBAZGVzY3JpcHRpb24g5qCR57uT5p6E5pWw57uE6L2s5Li65pWw57uEXHJcbiAqIEBwYXJhbSB7IEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55IH0+IH0gc291cmNlQXJyYXkg5rqQ5pWw57uEXHJcbiAqIEBwYXJhbSB7IFRyZWVUb0FycmF5T3B0aW9ucyB9IG9wdGlvbnMg6YWN572u6aG5XHJcbiAqIEByZXR1cm5zIHsgQXJyYXk8eyBba2V5OiBzdHJpbmddOiBhbnkgfSA+IH0g6L+U5Zue5LiA5Liq5pmu6YCa5pWw57uE5oiW6ICF5oqb5Ye65byC5bi46L+U5Zue56m65pWw57uEXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdHJlZVRvQXJyYXkoc291cmNlQXJyYXk6IEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55IH0+LCBvcHRpb25zOiBUcmVlVG9BcnJheU9wdGlvbnMgPSB7IGNoaWxkcmVuS2V5OiAnY2hpbGRyZW4nIH0pOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueSB9PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGFycmF5ID0gc291cmNlQXJyYXlcclxuXHJcbiAgICAgICAgYXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWl0ZW0uaGFzT3duUHJvcGVydHkob3B0aW9ucy5jaGlsZHJlbktleSkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg5bel5YW3dHJlZVRvQXJyYXnnmoTmupDmlbDnu4TkuK3lhYPntKDvvJoke29wdGlvbnMuY2hpbGRyZW5LZXl95LiN5a2Y5Zyo77yM6K+35qOA5p+l5rqQ5pWw5o2u57uT5p6EYClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGxldCBuZXdBcnI6IEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55IH0+ID0gW11cclxuXHJcbiAgICAgICAgX2xvb3AoYXJyYXksIG5ld0Fyciwgb3B0aW9ucylcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ld0FyclxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICByZXR1cm4gW11cclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBuYW1lIGdldEFycmF5SW50ZXJzZWN0aW9uXHJcbiAqIEBhdXRob3Ig5p2O5ZiJ6LGqXHJcbiAqIEBkZXNjcmlwdGlvbiDojrflj5bkuKTkuKrmlbDnu4TnmoTkuqTpm4ZcclxuICogQHBhcmFtIHsgQXJyYXk8VD4gfSBhcnkxIOaVsOe7hDFcclxuICogQHBhcmFtIHsgQXJyYXk8Sz4gfSBhcnkyIOaVsOe7hDJcclxuICogQHJldHVybnMgeyBBcnJheTxUfEs+IH0g6L+U5Zue5LiA5Liq5paw5pWw57uEXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlJbnRlcnNlY3Rpb248VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogYW55IH0sIEsgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihhcnkxOiBUW10sIGFyeTI6IEtbXSk6IChUIHwgSylbXSB7XHJcbiAgICBsZXQgcmV0dXJuQXJyOiAoVCB8IEspW10gPSBbXVxyXG5cclxuICAgIGFyeTEuZm9yRWFjaCgoaSkgPT4ge1xyXG4gICAgICAgIGlmIChhcnkyLmZpbmRJbmRleCgoZSkgPT4gaXNTYW1lT2JqKGksIGUpKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuQXJyLnB1c2goaSlcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiByZXR1cm5BcnJcclxufVxyXG5cclxuLyoqXHJcbiAqIEBuYW1lIGdldEFycmF5VW5pb25cclxuICogQGF1dGhvciDmnY7lmInosapcclxuICogQGRlc2NyaXB0aW9uIOiOt+WPluS4pOS4quaVsOe7hOeahOW5tumbhlxyXG4gKiBAcGFyYW0geyBBcnJheTxUPiB9IGFyeTEg5pWw57uEMVxyXG4gKiBAcGFyYW0geyBBcnJheTxLPiB9IGFyeTIg5pWw57uEMlxyXG4gKiBAcGFyYW0geyBVbmlvbk9wdGlvbnMgfSBvcHRpb25zIOmFjee9rumhuVxyXG4gKiBAcmV0dXJucyB7IEFycmF5PFQgfCBLPiB9IOi/lOWbnuS4gOS4quaWsOaVsOe7hFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEFycmF5VW5pb248VCwgSz4oYXJ5MTogVFtdLCBhcnkyOiBLW10sIG9wdGlvbnM6IFVuaW9uT3B0aW9ucyA9IHsgdW5pcXVlOiBmYWxzZSB9KTogKFQgfCBLKVtdIHtcclxuICAgIGxldCByZXR1cm5BcnI6IChUIHwgSylbXSA9IG9wdGlvbnMudW5pcXVlID8gW10gOiBhcnkxIC8vIOW9k+S4gOS4quaVsOe7hOS4reWMheWQq+WkmuS4qumHjeWkjemhueaXtuaYr+WQpuWOu+mHjVxyXG4gICAgYXJ5MS5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgICAgYXJ5Mi5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIOWFiOWIpOaWreS4pOS4quWFg+e0oOaYr+WQpuebuOWQjO+8jOebuOWQjOeahOivneWGjeWIpOaWree7k+aenOS4reWtmOS4jeWtmOWcqO+8jOWmguaenOWtmOWcqOWwseS4jea3u+WKoO+8jOS4jeWtmOWcqOWwsea3u+WKoOS4gOS4qlxyXG4gICAgICAgICAgICAvLyDkuI3nm7jlkIznmoTor53liJnliIbliKvliKTmlq3mmK/lkKblrZjlnKjvvIzlho3liKTmlq3mmK/lkKbmt7vliqBcclxuICAgICAgICAgICAgaWYgKGlzU2FtZU9iaihpLCBlKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJldHVybkFyci5maW5kSW5kZXgoKHIpID0+IGlzU2FtZU9iaihyLCBpKSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5BcnIucHVzaChpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJldHVybkFyci5maW5kSW5kZXgoKHIpID0+IGlzU2FtZU9iaihyLCBpKSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5BcnIucHVzaChpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJldHVybkFyci5maW5kSW5kZXgoKHIpID0+IGlzU2FtZU9iaihyLCBlKSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5BcnIucHVzaChlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcbiAgICByZXR1cm4gcmV0dXJuQXJyXHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9sb29wKGFycmF5OiBBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueSB9PiwgbmV3QXJyOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueSB9Piwgb3B0aW9uczogVHJlZVRvQXJyYXlPcHRpb25zKSB7XHJcbiAgICBhcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgbmV3QXJyLnB1c2goaXRlbSlcclxuICAgICAgICBpZiAoaXRlbVtvcHRpb25zLmNoaWxkcmVuS2V5XSAmJiBpdGVtW29wdGlvbnMuY2hpbGRyZW5LZXldLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBfbG9vcChpdGVtW29wdGlvbnMuY2hpbGRyZW5LZXldLCBuZXdBcnIsIG9wdGlvbnMpXHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQXJyYXlUb1RyZWVPcHRpb25zID0ge1xyXG4gICAgcGFyZW50S2V5OiBzdHJpbmcsXHJcbiAgICBzb25LZXk6IHN0cmluZyxcclxuICAgIGNoaWxkcmVuS2V5OiBzdHJpbmdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVHJlZVRvQXJyYXlPcHRpb25zID0ge1xyXG4gICAgY2hpbGRyZW5LZXk6IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBVbmlvbk9wdGlvbnMgPSB7XHJcbiAgICB1bmlxdWU6IGJvb2xlYW4gLy8g5b2T5LiA5Liq5pWw57uE5Lit5YyF5ZCr5aSa5Liq6YeN5aSN6aG55pe25piv5ZCm5Y676YeNXHJcbn0iLCIvKipcclxuICogQG5hbWUgc2ltcGxlRm9ybWF0VGltZXN0YW1wXHJcbiAqIEBhdXRob3Ig5p2O5ZiJ6LGqXHJcbiAqIEBkZXNjcmlwdGlvbiDlsIbkvKDlhaXnmoTml7bpl7TmiLPmoLzlvI/ljJbkuLrmjIflrprmoLzlvI9cclxuICogQHBhcmFtIHsgbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCB9IHRpbWVzdGFtcCDml7bpl7TmiLNcclxuICogQHBhcmFtIHsgRm9ybWF0VHlwZSB9IGZvcm1hdCDmoLzlvI/ljJbmlrnlvI9cclxuICogQHJldHVybnMgeyBzdHJpbmcgfSDmoLzlvI/ljJblkI7nmoTml7bpl7RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGVGb3JtYXRUaW1lc3RhbXAodGltZXN0YW1wOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLCBmb3JtYXQ6IEZvcm1hdFR5cGUgPSAneXl5eS1NTS1kZCBISDptbTpzcycpOiBzdHJpbmcge1xyXG4gICAgbGV0IF90aW1lID0gdGltZXN0YW1wXHJcbiAgICBpZiAoX3RpbWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIF90aW1lID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBfdGltZSA9IHBhcnNlRmxvYXQoX3RpbWUpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgX3RpbWUgPSBOdW1iZXIoX3RpbWUpXHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBfdGltZSA9IDBcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShfdGltZSlcclxuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKClcclxuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMVxyXG4gICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKClcclxuICAgIGNvbnN0IGhvdXIgPSBkYXRlLmdldEhvdXJzKClcclxuICAgIGNvbnN0IG1pbnV0ZSA9IGRhdGUuZ2V0TWludXRlcygpXHJcbiAgICBjb25zdCBzZWNvbmQgPSBkYXRlLmdldFNlY29uZHMoKVxyXG4gICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKCd5eXl5JywgeWVhci50b1N0cmluZygpKS5yZXBsYWNlKCdNTScsIG1vbnRoLnRvU3RyaW5nKCkucGFkU3RhcnQoMixcIjBcIikpLnJlcGxhY2UoJ2RkJywgZGF5LnRvU3RyaW5nKCkucGFkU3RhcnQoMixcIjBcIikpLnJlcGxhY2UoJ0hIJywgaG91ci50b1N0cmluZygpLnBhZFN0YXJ0KDIsXCIwXCIpKS5yZXBsYWNlKCdtbScsIG1pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsXCIwXCIpKS5yZXBsYWNlKCdzcycsIHNlY29uZC50b1N0cmluZygpLnBhZFN0YXJ0KDIsXCIwXCIpKVxyXG59XHJcblxyXG4vKipcclxuICogQG5hbWUgc2ltcGxlR2V0RGF0ZVxyXG4gKiBAYXV0aG9yIOadjuWYieixqlxyXG4gKiBAZGVzY3JpcHRpb24g5qC55o2u5pe26Ze05oiz6I635Y+W5omA6ZyA6KaB55qE5bm05pyI5pel5pe25YiG56eSXHJcbiAqIEBwYXJhbSB7IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwgfSB0aW1lc3RhbXAg5pe26Ze05oizXHJcbiAqIEBwYXJhbSB7IEdldERhdGVUeXBlIH0gZGF0ZSDojrflj5blubTmnIjml6Xml7bliIbnp5Llk6rkuKrlgLxcclxuICogQHJldHVybnMgeyBudW1iZXIgfSDov5Tlm57nmoTlgLxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGVHZXREYXRlKHRpbWVzdGFtcDogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCwgZGF0ZTogR2V0RGF0ZVR5cGUgPSAnWScpOiBudW1iZXIge1xyXG4gICAgbGV0IF90aW1lc3RhbXAgPSB0aW1lc3RhbXBcclxuICAgIGlmIChfdGltZXN0YW1wKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBfdGltZXN0YW1wID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBfdGltZXN0YW1wID0gcGFyc2VGbG9hdChfdGltZXN0YW1wKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIF90aW1lc3RhbXAgPSBOdW1iZXIoX3RpbWVzdGFtcClcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aW1lc3RhbXAgPSAwXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzRGF0ZSA9IG5ldyBEYXRlKF90aW1lc3RhbXApXHJcbiAgICBsZXQgdmFsdWUgPSAwXHJcblxyXG4gICAgc3dpdGNoIChkYXRlKSB7XHJcbiAgICAgICAgY2FzZSAnWSc6XHJcbiAgICAgICAgICAgIHZhbHVlID0gcmVzRGF0ZS5nZXRGdWxsWWVhcigpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJNXCI6XHJcbiAgICAgICAgICAgIHZhbHVlID0gcmVzRGF0ZS5nZXRNb250aCgpICsgMVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiRFwiOlxyXG4gICAgICAgICAgICB2YWx1ZSA9IHJlc0RhdGUuZ2V0RGF0ZSgpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJIXCI6XHJcbiAgICAgICAgICAgIHZhbHVlID0gcmVzRGF0ZS5nZXRIb3VycygpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtXCI6XHJcbiAgICAgICAgICAgIHZhbHVlID0gcmVzRGF0ZS5nZXRNaW51dGVzKClcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInNcIjpcclxuICAgICAgICAgICAgdmFsdWUgPSByZXNEYXRlLmdldFNlY29uZHMoKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsdWVcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRm9ybWF0VHlwZSA9ICd5eXl5LU1NLWRkIEhIOm1tOnNzJyB8ICd5eXl5LU1NLWRkIEhIOm1tJyB8ICd5eXl5LU1NLWRkIEhIJyB8ICd5eXl5LU1NLWRkJyB8ICd5eXl5LU1NJyB8ICd5eXl5JyB8ICd5eXl55bm0TU3mnIhkZOaXpSBISOaXtm1t5YiGc3Pnp5InXHJcbiAgICB8ICd5eXl55bm0TU3mnIhkZOaXpSBISOaXtm1t5YiGJyB8ICd5eXl55bm0TU3mnIhkZOaXpSBISOaXticgfCAneXl5eeW5tE1N5pyIZGTml6UnIHwgJ3l5eXnlubRNTeaciCcgfCAneXl5eeW5tCdcclxuXHJcbmV4cG9ydCB0eXBlIEdldERhdGVUeXBlID0gJ1knIHwgJ00nIHwgJ0QnIHwgJ0gnIHwgJ20nIHwgJ3MnIiwiLyoqXHJcbiAqIEBuYW1lIHNlbmRNZXNzYWdlXHJcbiAqIEBhdXRob3Ig5p2O5ZiJ6LGqXHJcbiAqIEBkZXNjcmlwdGlvbiDot6jmoIfnrb7pobXpgJrkv6Hlj5HpgIHmtojmga9cclxuICogQHBhcmFtIHsgc3RyaW5nIH0gZXZlbnQg5LqL5Lu25qCH6K+GXHJcbiAqIEBwYXJhbSB7IE9iamVjdCB9IG1lc3NhZ2Ug6ZyA6KaB5Y+R6YCB55qE5raI5oGvXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZXZlbnQ6IHN0cmluZywgbWVzc2FnZTogT2JqZWN0KSB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKGV2ZW50KVxyXG4gICAgY2hhbm5lbC5wb3N0TWVzc2FnZShtZXNzYWdlKVxyXG59XHJcblxyXG4vKipcclxuICogQG5hbWUgbGlzdGVuTWVzc2FnZVxyXG4gKiBAYXV0aG9yIOadjuWYieixqlxyXG4gKiBAZGVzY3JpcHRpb24g6Leo5qCH562+6aG16YCa5L+h55uR5ZCs5raI5oGvXHJcbiAqIEBwYXJhbSB7IHN0cmluZyB9IGV2ZW50IOS6i+S7tuagh+ivhlxyXG4gKiBAcGFyYW0geyBGdW5jdGlvbiB9IGNhbGxiYWNrIOWbnuiwg+WHveaVsFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxpc3Rlbk1lc3NhZ2UoZXZlbnQ6IHN0cmluZyxjYWxsYmFjazogKG1lc3NhZ2U6TWVzc2FnZUV2ZW50PGFueT4pID0+IHZvaWQpIHtcclxuICAgIGxldCBjaGFubmVsID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoZXZlbnQpXHJcbiAgICBjaGFubmVsLm9ubWVzc2FnZSA9IChtZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobWVzc2FnZSlcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBuYW1lIGNsb3NlQ2hhbm5lbFxyXG4gKiBAYXV0aG9yIOadjuWYieixqlxyXG4gKiBAZGVzY3JpcHRpb24g5YWz6Zet5bm/5pKt6YCa6YGTXHJcbiAqIEBwYXJhbSBldmVudCDkuovku7bmoIfor4ZcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjbG9zZUNoYW5uZWwoZXZlbnQ6IHN0cmluZyl7XHJcbiAgICBsZXQgY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKGV2ZW50KVxyXG4gICAgY2hhbm5lbC5jbG9zZSgpXHJcbn0iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiYW1kIiwiYSIsImkiLCJzZWxmIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsImRlZmluaXRpb24iLCJrZXkiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0Iiwib2JqIiwicHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJpc1NhbWVPYmoiLCJvYmoxIiwib2JqMiIsImtleXMiLCJsZW5ndGgiLCJhcnJheVRvVHJlZSIsInNvdXJjZUFycmF5IiwicGFyZW50VmFsdWUiLCJvcHRpb25zIiwicGFyZW50S2V5Iiwic29uS2V5IiwiY2hpbGRyZW5LZXkiLCJmb3JFYWNoIiwiaXRlbSIsIkVycm9yIiwicHVzaCIsImVycm9yIiwiY29uc29sZSIsImFycmF5VG9UcmVlV2l0aE5vUGFyZW50IiwicmV0dXJuQXJyIiwidHJlZVRvQXJyYXkiLCJhcnJheSIsIm5ld0FyciIsIl9sb29wIiwiZ2V0QXJyYXlJbnRlcnNlY3Rpb24iLCJhcnkxIiwiYXJ5MiIsImZpbmRJbmRleCIsImUiLCJnZXRBcnJheVVuaW9uIiwidW5pcXVlIiwiciIsInNpbXBsZUZvcm1hdFRpbWVzdGFtcCIsInRpbWVzdGFtcCIsImZvcm1hdCIsIl90aW1lIiwicGFyc2VGbG9hdCIsIk51bWJlciIsImRhdGUiLCJEYXRlIiwieWVhciIsImdldEZ1bGxZZWFyIiwibW9udGgiLCJnZXRNb250aCIsImRheSIsImdldERhdGUiLCJob3VyIiwiZ2V0SG91cnMiLCJtaW51dGUiLCJnZXRNaW51dGVzIiwic2Vjb25kIiwiZ2V0U2Vjb25kcyIsInJlcGxhY2UiLCJ0b1N0cmluZyIsInBhZFN0YXJ0Iiwic2ltcGxlR2V0RGF0ZSIsIl90aW1lc3RhbXAiLCJyZXNEYXRlIiwic2VuZE1lc3NhZ2UiLCJldmVudCIsIm1lc3NhZ2UiLCJCcm9hZGNhc3RDaGFubmVsIiwicG9zdE1lc3NhZ2UiLCJsaXN0ZW5NZXNzYWdlIiwiY2FsbGJhY2siLCJvbm1lc3NhZ2UiLCJjbG9zZUNoYW5uZWwiLCJjbG9zZSJdLCJzb3VyY2VSb290IjoiIn0=