UNPKG

typed-fetcher

Version:
2 lines 45.4 kB
var t={77:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.HttpErrorArrayBuffer=void 0;const s=r(181),n=s.HTTP_ERROR_TYPE.ARRAY_BUFFER;class o extends s.HttpErrorBase{status;details;message;type=n;constructor(t,e,r="ArrayBuffer http error, please check details field"){super(r),this.status=t,this.details=e,this.message=r}}e.HttpErrorArrayBuffer=o},94:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.HttpErrorJSON=void 0;const s=r(181),n=s.HTTP_ERROR_TYPE.JSON;class o extends s.HttpErrorBase{message;status;details;type=n;constructor(t,e,r){super(t||"Unknown error"),this.message=t,this.status=e,this.details=r}}e.HttpErrorJSON=o},181:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.HttpErrorBase=e.HTTP_ERROR_TYPE=void 0,e.HTTP_ERROR_TYPE={JSON:"JSON",ARRAY_BUFFER:"ARRAY_BUFFER"};class r extends Error{}e.HttpErrorBase=r},362:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.HttpErrorBase=e.HttpErrorArrayBuffer=e.HttpErrorJSON=void 0;var s=r(94);Object.defineProperty(e,"HttpErrorJSON",{enumerable:!0,get:function(){return s.HttpErrorJSON}});var n=r(77);Object.defineProperty(e,"HttpErrorArrayBuffer",{enumerable:!0,get:function(){return n.HttpErrorArrayBuffer}});var o=r(181);Object.defineProperty(e,"HttpErrorBase",{enumerable:!0,get:function(){return o.HttpErrorBase}})},677:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.FetchProvider=void 0,e.FetchProvider=class{fetch(t){return globalThis.fetch(t.url,{method:t.method,...t.options})}}},708:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.HttpClient=void 0;const s=r(887),n=r(739),o=r(720);e.HttpClient=class{errorManager;fetchProvider;setting={responseAs:s.RESPONSE_AS.json};normalizer=new n.HttpClientNormalizer;constructor(t,e=new o.FetchProvider){this.errorManager=t,this.fetchProvider=e}async get(t,e,r=this.setting){return await this.fetchWithShortResponse(s.REQUEST_METHOD.GET,t,e,r)}async post(t,e,r=this.setting){return await this.fetchWithShortResponse(s.REQUEST_METHOD.POST,t,e,r)}async put(t,e,r=this.setting){return await this.fetchWithShortResponse(s.REQUEST_METHOD.PUT,t,e,r)}async patch(t,e,r=this.setting){return await this.fetchWithShortResponse(s.REQUEST_METHOD.PATCH,t,e,r)}async delete(t,e,r=this.setting){return await this.fetchWithShortResponse(s.REQUEST_METHOD.DELETE,t,e,r)}async head(t,e,r=this.setting){return await this.fetchHeaders(s.REQUEST_METHOD.HEAD,t,e,r)}async options(t,e,r=this.setting){return await this.fetchHeaders(s.REQUEST_METHOD.OPTIONS,t,e,r)}async fetchGet(t,e,r=this.setting){return await this.fetch(s.REQUEST_METHOD.GET,t,e,r)}async fetchPost(t,e,r=this.setting){return await this.fetch(s.REQUEST_METHOD.POST,t,e,r)}async fetchPut(t,e,r=this.setting){return await this.fetch(s.REQUEST_METHOD.PUT,t,e,r)}async fetchPatch(t,e,r=this.setting){return await this.fetch(s.REQUEST_METHOD.PATCH,t,e,r)}async fetchDelete(t,e,r=this.setting){return await this.fetch(s.REQUEST_METHOD.DELETE,t,e,r)}fetchHead(t,e,r=this.setting){return this.fetch(s.REQUEST_METHOD.HEAD,t,e,r)}fetchOptions(t,e,r=this.setting){return this.fetch(s.REQUEST_METHOD.OPTIONS,t,e,r)}applyOptions(t){this.normalizer.setOptions(t)}unapplyOptions(){this.normalizer.setOptions({})}async fetch(t,e,r,s=this.setting){const n={...this.setting,...s},o=r??{},i=this.normalizer.normalizeOptions(o,n);try{const r={url:e,method:t,options:i},s=await this.fetchProvider.fetch(r);if(s.ok)return await this.normalizer.normalizeResponse(s,n);const o=await s.text();this.errorManager.throw(s,o)}catch(t){return this.errorManager.parse(t)}}async fetchWithShortResponse(t,e,r,s=this.setting){const n=await this.fetch(t,e,r,s);return n.error?{data:null,error:n.error}:{data:n.data,error:null}}async fetchHeaders(t,e,r,n=this.setting){const o={...r,body:void 0},i={...n,responseAs:s.RESPONSE_AS.text},{error:a,original:c}=await this.fetch(t,e,o,i);return a?{data:null,error:a}:{data:c?.headers||null,error:null}}}},720:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.FetchProvider=e.XmlHttpProvider=void 0;var s=r(972);Object.defineProperty(e,"XmlHttpProvider",{enumerable:!0,get:function(){return s.XmlHttpProvider}});var n=r(677);Object.defineProperty(e,"FetchProvider",{enumerable:!0,get:function(){return n.FetchProvider}})},739:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.HttpClientNormalizer=void 0;const s=r(887);e.HttpClientNormalizer=class{options={};setOptions(t){this.options=t}normalizeOptions(t,e){const r={...this.options,...t,body:this.normalizeBody(t.body)};return e.responseAs===s.RESPONSE_AS.json&&(r.headers={"Content-Type":"application/json",...r.headers}),{...r,headers:r.headers??{}}}async normalizeResponse(t,e){return{original:t,data:await t[e.responseAs](),error:null}}normalizeBody(t){return t&&t instanceof ArrayBuffer||t&&t instanceof Blob||t&&t instanceof ReadableStream||t&&t instanceof URLSearchParams||t&&"string"==typeof t?t:t&&t instanceof FormData?t.toString():t?JSON.stringify(t):void 0}}},763:function(t,e,r){var s=this&&this.__createBinding||(Object.create?function(t,e,r,s){void 0===s&&(s=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,n)}:function(t,e,r,s){void 0===s&&(s=r),t[s]=e[r]}),n=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||s(e,t,r)};Object.defineProperty(e,"__esModule",{value:!0}),e.HttpClient=void 0;var o=r(708);Object.defineProperty(e,"HttpClient",{enumerable:!0,get:function(){return o.HttpClient}}),n(r(887),e)},887:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.REQUEST_METHOD=e.RESPONSE_AS=void 0,e.RESPONSE_AS={json:"json",text:"text",arrayBuffer:"arrayBuffer"},e.REQUEST_METHOD={GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE",HEAD:"HEAD",OPTIONS:"OPTIONS",PATCH:"PATCH"}},888:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.HttpErrorManager=void 0;var s=r(979);Object.defineProperty(e,"HttpErrorManager",{enumerable:!0,get:function(){return s.HttpErrorManager}})},972:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.XmlHttpProvider=void 0,e.XmlHttpProvider=class{constructor(){if(!globalThis.XMLHttpRequest)throw new Error("XMLHttpRequest is not supported in this environment")}fetch(t){return new Promise((e,r)=>{const s=new XMLHttpRequest;if(s.open(t.method,t.url,!0),t.options.headers)for(const[e,r]of Object.entries(t.options.headers))s.setRequestHeader(e,r);"include"===t.options?.credentials&&(s.withCredentials=!0),s.onload=()=>{const t={status:s.status,statusText:s.statusText,headers:new Headers};s.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(e=>{const r=e.split(": "),s=r.shift(),n=r.join(": ");s&&t.headers.append(s,n)});const r=s.response||s.responseText;e(new Response(r,t))},s.onerror=()=>{r(new TypeError("Network request failed"))},s.ontimeout=()=>{r(new TypeError("Network request timed out"))};const n=JSON.stringify(t.options.body);s.send(n||null)})}}},979:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.HttpErrorManager=void 0;const s=r(362);e.HttpErrorManager=class{contentType={JSON:"application/json",ARRAY_BUFFER:"application/octet-stream",TEXT:"text/plain"};constructor(){}throw(t,e){if(e){const r=t.headers.get("content-type");if(r?.includes(this.contentType.ARRAY_BUFFER)){const r=(new TextEncoder).encode(e).buffer;throw new s.HttpErrorArrayBuffer(t.status,r)}if(r?.includes(this.contentType.TEXT))throw new s.HttpErrorJSON(e,t.status,e);let n;try{n=JSON.parse(e)}catch(t){}if(n){const e="Unknown error please check details field";throw new s.HttpErrorJSON(n?.message??e,t.status,n)}}const r={status:t.status,message:t.statusText,details:"No response for details"};throw new s.HttpErrorJSON(r.message,r.status,r.details)}parse(t){if(t instanceof s.HttpErrorJSON)return{original:null,data:null,error:t};throw t}}}},e={};function r(s){var n=e[s];if(void 0!==n)return n.exports;var o=e[s]={exports:{}};return t[s].call(o.exports,o,o.exports,r),o.exports}var s={};(()=>{var t=s;Object.defineProperty(t,"BJ",{value:!0}),t.dL=t.WE=t.n=t.y0=t.Qq=void 0;var e=r(763);Object.defineProperty(t,"Qq",{enumerable:!0,get:function(){return e.HttpClient}});var n=r(888);Object.defineProperty(t,"y0",{enumerable:!0,get:function(){return n.HttpErrorManager}});var o=r(362);Object.defineProperty(t,"n",{enumerable:!0,get:function(){return o.HttpErrorJSON}}),Object.defineProperty(t,"WE",{enumerable:!0,get:function(){return o.HttpErrorBase}});var i=r(720);Object.defineProperty(t,"dL",{enumerable:!0,get:function(){return i.XmlHttpProvider}})})();const n=s.Qq,o=s.WE,i=s.n,a=s.y0,c=s.dL,p=s.BJ;export{n as HttpClient,o as HttpErrorBase,i as HttpErrorJSON,a as HttpErrorManager,c as XmlHttpProvider,p as __esModule}; //# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQ3pCLENBQUUsTUFBTzFELEdBRVQsQ0FFQSxHQUFJK0QsRUFBVyxDQUNiLE1BQU1DLEVBQWlCLDJDQUN2QixNQUFNLElBQUksRUFBQXZILGNBQWNzSCxHQUFXM0gsU0FBVzRILEVBQWdCdEUsRUFBU3hELE9BQVE2SCxFQUNqRixDQUNGLENBRUEsTUFBTTVELEVBQVEsQ0FDWmpFLE9BQVF3RCxFQUFTeEQsT0FDakJFLFFBQVNzRCxFQUFTNEMsV0FDbEJuRyxRQUFTLDJCQUdYLE1BQU0sSUFBSSxFQUFBTSxjQUFjMEQsRUFBTS9ELFFBQVMrRCxFQUFNakUsT0FBUWlFLEVBQU1oRSxRQUM3RCxDQUVPLEtBQUE4RCxDQUFZZ0UsR0FDakIsR0FBSUEsYUFBcUIsRUFBQXhILGNBQ3ZCLE1BQU8sQ0FDTGdFLFNBQVUsS0FDVkwsS0FBTSxLQUNORCxNQUFPOEQsR0FJWCxNQUFNQSxDQUNSLEUsR0N4REVDLEVBQTJCLENBQUMsRUFHaEMsU0FBU0MsRUFBb0JDLEdBRTVCLElBQUlDLEVBQWVILEVBQXlCRSxHQUM1QyxRQUFxQjdELElBQWpCOEQsRUFDSCxPQUFPQSxFQUFhQyxRQUdyQixJQUFJQyxFQUFTTCxFQUF5QkUsR0FBWSxDQUdqREUsUUFBUyxDQUFDLEdBT1gsT0FIQUUsRUFBb0JKLEdBQVVLLEtBQUtGLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNILEdBR3BFSSxFQUFPRCxPQUNmLEMsK0ZDdEJBLGFBQVMsb0VBQUFsRCxVQUFVLElBQ25CLGFBQVMsb0VBQUFFLGdCQUFnQixJQUN6QixhQUFTLG1FQUFBN0UsYUFBYSxJQUFFLG9FQUFBUixhQUFhLElBQ3JDLGFBQVMsb0VBQUEwRSxlQUFlLEciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90eXBlZC1mZXRjaGVyLy4vc3JjL2h0dHAtZXJyb3IvSHR0cEVycm9yQXJyYXlCdWZmZXIudHMiLCJ3ZWJwYWNrOi8vdHlwZWQtZmV0Y2hlci8uL3NyYy9odHRwLWVycm9yL0h0dHBFcnJvckpTT04udHMiLCJ3ZWJwYWNrOi8vdHlwZWQtZmV0Y2hlci8uL3NyYy9odHRwLWVycm9yL0h0dHBFcnJvckJhc2UudHMiLCJ3ZWJwYWNrOi8vdHlwZWQtZmV0Y2hlci8uL3NyYy9odHRwLWVycm9yL2luZGV4LnRzIiwid2VicGFjazovL3R5cGVkLWZldGNoZXIvLi9zcmMvcHJvdmlkZXIvZmV0Y2hQcm92aWRlci50cyIsIndlYnBhY2s6Ly90eXBlZC1mZXRjaGVyLy4vc3JjL2h0dHAtY2xpZW50L0h0dHBDbGllbnQudHMiLCJ3ZWJwYWNrOi8vdHlwZWQtZmV0Y2hlci8uL3NyYy9wcm92aWRlci9pbmRleC50cyIsIndlYnBhY2s6Ly90eXBlZC1mZXRjaGVyLy4vc3JjL2h0dHAtY2xpZW50L0h0dHBDbGllbnROb3JtYWxpemVyLnRzIiwid2VicGFjazovL3R5cGVkLWZldGNoZXIvLi9zcmMvaHR0cC1jbGllbnQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vdHlwZWQtZmV0Y2hlci8uL3NyYy9odHRwLWNsaWVudC9IdHRwQ2xpZW50LnR5cGVzLnRzIiwid2VicGFjazovL3R5cGVkLWZldGNoZXIvLi9zcmMvaHR0cC1lcnJvci1tYW5hZ2VyL2luZGV4LnRzIiwid2VicGFjazovL3R5cGVkLWZldGNoZXIvLi9zcmMvcHJvdmlkZXIveG1sSHR0cFByb3ZpZGVyLnRzIiwid2VicGFjazovL3R5cGVkLWZldGNoZXIvLi9zcmMvaHR0cC1lcnJvci1tYW5hZ2VyL0h0dHBFcnJvck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vdHlwZWQtZmV0Y2hlci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly90eXBlZC1mZXRjaGVyLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhUVFBfRVJST1JfVFlQRSwgSHR0cEVycm9yQmFzZSB9IGZyb20gJy4vSHR0cEVycm9yQmFzZSc7XG5cbmNvbnN0IHR5cGVBcnJheUJ1ZmZlciA9IEhUVFBfRVJST1JfVFlQRS5BUlJBWV9CVUZGRVI7XG5cbmV4cG9ydCBjbGFzcyBIdHRwRXJyb3JBcnJheUJ1ZmZlclxuICBleHRlbmRzIEh0dHBFcnJvckJhc2U8dHlwZW9mIHR5cGVBcnJheUJ1ZmZlcj5cbiAgaW1wbGVtZW50cyBIdHRwRXJyb3JCYXNlPHR5cGVvZiB0eXBlQXJyYXlCdWZmZXI+XG57XG4gIHB1YmxpYyByZWFkb25seSB0eXBlID0gdHlwZUFycmF5QnVmZmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM6IG51bGwgfCBBcnJheUJ1ZmZlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nID0gJ0FycmF5QnVmZmVyIGh0dHAgZXJyb3IsIHBsZWFzZSBjaGVjayBkZXRhaWxzIGZpZWxkJyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEhUVFBfRVJST1JfVFlQRSwgSHR0cEVycm9yQmFzZSB9IGZyb20gJy4vSHR0cEVycm9yQmFzZSc7XG5cbmNvbnN0IHR5cGVKU09OID0gSFRUUF9FUlJPUl9UWVBFLkpTT047XG5cbmV4cG9ydCBjbGFzcyBIdHRwRXJyb3JKU09OIGV4dGVuZHMgSHR0cEVycm9yQmFzZTx0eXBlb2YgdHlwZUpTT04+IGltcGxlbWVudHMgSHR0cEVycm9yQmFzZTx0eXBlb2YgdHlwZUpTT04+IHtcbiAgcHVibGljIHR5cGUgPSB0eXBlSlNPTjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgc3RhdHVzOiBudW1iZXIsXG4gICAgcHVibGljIGRldGFpbHM6IG51bGwgfCB1bmtub3duLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJyk7XG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBIVFRQX0VSUk9SX1RZUEUgPSB7XG4gIEpTT046ICdKU09OJyxcbiAgQVJSQVlfQlVGRkVSOiAnQVJSQVlfQlVGRkVSJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEh0dHBFcnJvclR5cGUgPSAodHlwZW9mIEhUVFBfRVJST1JfVFlQRSlba2V5b2YgdHlwZW9mIEhUVFBfRVJST1JfVFlQRV07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIdHRwRXJyb3JCYXNlPFR5cGUgZXh0ZW5kcyBIdHRwRXJyb3JUeXBlPiBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGFic3RyYWN0IHR5cGU6IFR5cGU7XG4gIHB1YmxpYyBhYnN0cmFjdCBzdGF0dXM6IG51bWJlcjtcbiAgcHVibGljIGFic3RyYWN0IG1lc3NhZ2U6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IGRldGFpbHM6IG51bGwgfCB1bmtub3duO1xufVxuXG5leHBvcnQgdHlwZSBIdHRwRXJyb3IgPSBIdHRwRXJyb3JCYXNlPHR5cGVvZiBIVFRQX0VSUk9SX1RZUEUuSlNPTj47XG4iLCJleHBvcnQgeyBIdHRwRXJyb3JKU09OIH0gZnJvbSAnLi9IdHRwRXJyb3JKU09OJztcbmV4cG9ydCB7IEh0dHBFcnJvckFycmF5QnVmZmVyIH0gZnJvbSAnLi9IdHRwRXJyb3JBcnJheUJ1ZmZlcic7XG5leHBvcnQgeyBIdHRwRXJyb3JCYXNlIH0gZnJvbSAnLi9IdHRwRXJyb3JCYXNlJztcbiIsImltcG9ydCB0eXBlIHsgSHR0cEZldGNoUHJvdmlkZXIsIFJlcXVlc3RQYXJhbXMgfSBmcm9tICcuLi9odHRwLWNsaWVudC9pbmRleCc7XG5cbmV4cG9ydCBjbGFzcyBGZXRjaFByb3ZpZGVyIGltcGxlbWVudHMgSHR0cEZldGNoUHJvdmlkZXIge1xuICBwdWJsaWMgZmV0Y2gocGFyYW1zOiBSZXF1ZXN0UGFyYW1zKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLmZldGNoKHBhcmFtcy51cmwsIHtcbiAgICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICAgIC4uLnBhcmFtcy5vcHRpb25zLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFJlcXVlc3RPcHRpb25zSW5wdXQsXG4gIEh0dHBDbGllbnRCYXNlLFxuICBIdHRwRXJyb3JNYW5hZ2VyQmFzZSxcbiAgSHR0cENsaWVudFNldHRpbmdzLFxuICBIdHRwRmV0Y2hQcm92aWRlcixcbiAgSHR0cFJlc3BvbnNlLFxuICBIdHRwUmVzcG9uc2VGdWxsLFxuICBSZXF1ZXN0TWV0aG9kLFxuICBSZXF1ZXN0UGFyYW1zLFxuICBVcmwsXG4gIFN0YWJsZU9wdGlvbnMsXG59IGZyb20gJy4vSHR0cENsaWVudC50eXBlcyc7XG5pbXBvcnQgeyBSRVFVRVNUX01FVEhPRCwgUkVTUE9OU0VfQVMgfSBmcm9tICcuL0h0dHBDbGllbnQudHlwZXMnO1xuaW1wb3J0IHsgSHR0cENsaWVudE5vcm1hbGl6ZXIgfSBmcm9tICcuL0h0dHBDbGllbnROb3JtYWxpemVyJztcbmltcG9ydCB7IEZldGNoUHJvdmlkZXIgfSBmcm9tICcuLi9wcm92aWRlcic7XG5cbmV4cG9ydCBjbGFzcyBIdHRwQ2xpZW50IGltcGxlbWVudHMgSHR0cENsaWVudEJhc2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmc6IEh0dHBDbGllbnRTZXR0aW5ncyA9IHtcbiAgICByZXNwb25zZUFzOiBSRVNQT05TRV9BUy5qc29uLFxuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbm9ybWFsaXplciA9IG5ldyBIdHRwQ2xpZW50Tm9ybWFsaXplcigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVycm9yTWFuYWdlcjogSHR0cEVycm9yTWFuYWdlckJhc2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmZXRjaFByb3ZpZGVyOiBIdHRwRmV0Y2hQcm92aWRlciA9IG5ldyBGZXRjaFByb3ZpZGVyKCksXG4gICkge31cblxuICBwdWJsaWMgYXN5bmMgZ2V0PERhdGE+KHVybDogVXJsLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCwgc2V0dGluZyA9IHRoaXMuc2V0dGluZyk6IFByb21pc2U8SHR0cFJlc3BvbnNlPERhdGE+PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hXaXRoU2hvcnRSZXNwb25zZTxEYXRhPihSRVFVRVNUX01FVEhPRC5HRVQsIHVybCwgb3B0aW9ucywgc2V0dGluZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcG9zdDxEYXRhPihcbiAgICB1cmw6IFVybCxcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCxcbiAgICBzZXR0aW5nID0gdGhpcy5zZXR0aW5nLFxuICApOiBQcm9taXNlPEh0dHBSZXNwb25zZTxEYXRhPj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoV2l0aFNob3J0UmVzcG9uc2U8RGF0YT4oUkVRVUVTVF9NRVRIT0QuUE9TVCwgdXJsLCBvcHRpb25zLCBzZXR0aW5nKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwdXQ8RGF0YT4odXJsOiBVcmwsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0lucHV0LCBzZXR0aW5nID0gdGhpcy5zZXR0aW5nKTogUHJvbWlzZTxIdHRwUmVzcG9uc2U8RGF0YT4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaFdpdGhTaG9ydFJlc3BvbnNlPERhdGE+KFJFUVVFU1RfTUVUSE9ELlBVVCwgdXJsLCBvcHRpb25zLCBzZXR0aW5nKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwYXRjaDxEYXRhPihcbiAgICB1cmw6IFVybCxcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCxcbiAgICBzZXR0aW5nID0gdGhpcy5zZXR0aW5nLFxuICApOiBQcm9taXNlPEh0dHBSZXNwb25zZTxEYXRhPj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoV2l0aFNob3J0UmVzcG9uc2U8RGF0YT4oUkVRVUVTVF9NRVRIT0QuUEFUQ0gsIHVybCwgb3B0aW9ucywgc2V0dGluZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlPERhdGE+KFxuICAgIHVybDogVXJsLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0lucHV0LFxuICAgIHNldHRpbmcgPSB0aGlzLnNldHRpbmcsXG4gICk6IFByb21pc2U8SHR0cFJlc3BvbnNlPERhdGE+PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hXaXRoU2hvcnRSZXNwb25zZTxEYXRhPihSRVFVRVNUX01FVEhPRC5ERUxFVEUsIHVybCwgb3B0aW9ucywgc2V0dGluZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGVhZCh1cmw6IFVybCwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zSW5wdXQsIHNldHRpbmcgPSB0aGlzLnNldHRpbmcpOiBQcm9taXNlPEh0dHBSZXNwb25zZTxIZWFkZXJzPj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoSGVhZGVycyhSRVFVRVNUX01FVEhPRC5IRUFELCB1cmwsIG9wdGlvbnMsIHNldHRpbmcpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG9wdGlvbnMoXG4gICAgdXJsOiBVcmwsXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zSW5wdXQsXG4gICAgc2V0dGluZyA9IHRoaXMuc2V0dGluZyxcbiAgKTogUHJvbWlzZTxIdHRwUmVzcG9uc2U8SGVhZGVycz4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaEhlYWRlcnMoUkVRVUVTVF9NRVRIT0QuT1BUSU9OUywgdXJsLCBvcHRpb25zLCBzZXR0aW5nKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmZXRjaEdldDxEYXRhPihcbiAgICB1cmw6IFVybCxcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCxcbiAgICBzZXR0aW5nID0gdGhpcy5zZXR0aW5nLFxuICApOiBQcm9taXNlPEh0dHBSZXNwb25zZUZ1bGw8RGF0YT4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaDxEYXRhPihSRVFVRVNUX01FVEhPRC5HRVQsIHVybCwgb3B0aW9ucywgc2V0dGluZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmV0Y2hQb3N0PERhdGE+KFxuICAgIHVybDogVXJsLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0lucHV0LFxuICAgIHNldHRpbmcgPSB0aGlzLnNldHRpbmcsXG4gICk6IFByb21pc2U8SHR0cFJlc3BvbnNlRnVsbDxEYXRhPj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoPERhdGE+KFJFUVVFU1RfTUVUSE9ELlBPU1QsIHVybCwgb3B0aW9ucywgc2V0dGluZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmV0Y2hQdXQ8RGF0YT4oXG4gICAgdXJsOiBVcmwsXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zSW5wdXQsXG4gICAgc2V0dGluZyA9IHRoaXMuc2V0dGluZyxcbiAgKTogUHJvbWlzZTxIdHRwUmVzcG9uc2VGdWxsPERhdGE+PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2g8RGF0YT4oUkVRVUVTVF9NRVRIT0QuUFVULCB1cmwsIG9wdGlvbnMsIHNldHRpbmcpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZldGNoUGF0Y2g8RGF0YT4oXG4gICAgdXJsOiBVcmwsXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zSW5wdXQsXG4gICAgc2V0dGluZyA9IHRoaXMuc2V0dGluZyxcbiAgKTogUHJvbWlzZTxIdHRwUmVzcG9uc2VGdWxsPERhdGE+PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2goUkVRVUVTVF9NRVRIT0QuUEFUQ0gsIHVybCwgb3B0aW9ucywgc2V0dGluZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmV0Y2hEZWxldGU8RGF0YT4oXG4gICAgdXJsOiBVcmwsXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zSW5wdXQsXG4gICAgc2V0dGluZyA9IHRoaXMuc2V0dGluZyxcbiAgKTogUHJvbWlzZTxIdHRwUmVzcG9uc2VGdWxsPERhdGE+PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2g8RGF0YT4oUkVRVUVTVF9NRVRIT0QuREVMRVRFLCB1cmwsIG9wdGlvbnMsIHNldHRpbmcpO1xuICB9XG5cbiAgcHVibGljIGZldGNoSGVhZCh1cmw6IFVybCwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zSW5wdXQsIHNldHRpbmcgPSB0aGlzLnNldHRpbmcpOiBQcm9taXNlPEh0dHBSZXNwb25zZUZ1bGw8bnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaDxudWxsPihSRVFVRVNUX01FVEhPRC5IRUFELCB1cmwsIG9wdGlvbnMsIHNldHRpbmcpO1xuICB9XG5cbiAgcHVibGljIGZldGNoT3B0aW9ucyhcbiAgICB1cmw6IFVybCxcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCxcbiAgICBzZXR0aW5nID0gdGhpcy5zZXR0aW5nLFxuICApOiBQcm9taXNlPEh0dHBSZXNwb25zZUZ1bGw8bnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaDxudWxsPihSRVFVRVNUX01FVEhPRC5PUFRJT05TLCB1cmwsIG9wdGlvbnMsIHNldHRpbmcpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5T3B0aW9ucyhvcHRpb25zOiBTdGFibGVPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5ub3JtYWxpemVyLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgdW5hcHBseU9wdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5ub3JtYWxpemVyLnNldE9wdGlvbnMoe30pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaDxEYXRhPihcbiAgICBtZXRob2Q6IFJlcXVlc3RNZXRob2QsXG4gICAgdXJsOiBVcmwsXG4gICAgb3B0aW9uc0lucHV0PzogUmVxdWVzdE9wdGlvbnNJbnB1dCxcbiAgICBzZXR0aW5nSW5wdXQgPSB0aGlzLnNldHRpbmcsXG4gICk6IFByb21pc2U8SHR0cFJlc3BvbnNlRnVsbDxEYXRhPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RTZXR0aW5nID0geyAuLi50aGlzLnNldHRpbmcsIC4uLnNldHRpbmdJbnB1dCB9O1xuICAgIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25zSW5wdXQgPz8ge307XG5cbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHRoaXMubm9ybWFsaXplci5ub3JtYWxpemVPcHRpb25zKG9wdGlvbnMsIHJlcXVlc3RTZXR0aW5nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0UGFyYW1zOiBSZXF1ZXN0UGFyYW1zID0ge1xuICAgICAgICB1cmwsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgb3B0aW9uczogcmVxdWVzdE9wdGlvbnMsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hQcm92aWRlci5mZXRjaChyZXF1ZXN0UGFyYW1zKTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm5vcm1hbGl6ZXIubm9ybWFsaXplUmVzcG9uc2U8RGF0YT4ocmVzcG9uc2UsIHJlcXVlc3RTZXR0aW5nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YUFzVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcblxuICAgICAgdGhpcy5lcnJvck1hbmFnZXIudGhyb3cocmVzcG9uc2UsIGRhdGFBc1RleHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmVycm9yTWFuYWdlci5wYXJzZTxEYXRhPihlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aFNob3J0UmVzcG9uc2U8RGF0YT4oXG4gICAgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kLFxuICAgIHVybDogVXJsLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0lucHV0LFxuICAgIHNldHRpbmcgPSB0aGlzLnNldHRpbmcsXG4gICk6IFByb21pc2U8SHR0cFJlc3BvbnNlPERhdGE+PiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHRoaXMuZmV0Y2g8RGF0YT4obWV0aG9kLCB1cmwsIG9wdGlvbnMsIHNldHRpbmcpO1xuXG4gICAgaWYgKHBheWxvYWQuZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIGVycm9yOiBwYXlsb2FkLmVycm9yLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogcGF5bG9hZC5kYXRhLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hIZWFkZXJzKFxuICAgIG1ldGhvZDogdHlwZW9mIFJFUVVFU1RfTUVUSE9ELkhFQUQgfCB0eXBlb2YgUkVRVUVTVF9NRVRIT0QuT1BUSU9OUyxcbiAgICB1cmw6IFVybCxcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCxcbiAgICBzZXR0aW5nID0gdGhpcy5zZXR0aW5nLFxuICApOiBQcm9taXNlPEh0dHBSZXNwb25zZTxIZWFkZXJzPj4ge1xuICAgIGNvbnN0IG9wdGlvbnNXaXRoTm9Cb2R5ID0geyAuLi5vcHRpb25zLCBib2R5OiB1bmRlZmluZWQgfTtcbiAgICBjb25zdCBzZXR0aW5nUmVzcG9uc2VBc1RleHQgPSB7IC4uLnNldHRpbmcsIHJlc3BvbnNlQXM6IFJFU1BPTlNFX0FTLnRleHQgfTtcbiAgICBjb25zdCB7IGVycm9yLCBvcmlnaW5hbCB9ID0gYXdhaXQgdGhpcy5mZXRjaDxIZWFkZXJzPihtZXRob2QsIHVybCwgb3B0aW9uc1dpdGhOb0JvZHksIHNldHRpbmdSZXNwb25zZUFzVGV4dCk7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlcnMgPSBvcmlnaW5hbD8uaGVhZGVycyB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IGhlYWRlcnMsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICB9O1xuICB9XG59XG4iLCJleHBvcnQgeyBYbWxIdHRwUHJvdmlkZXIgfSBmcm9tICcuL3htbEh0dHBQcm92aWRlcic7XG5leHBvcnQgeyBGZXRjaFByb3ZpZGVyIH0gZnJvbSAnLi9mZXRjaFByb3ZpZGVyJztcbiIsImltcG9ydCB0eXBlIHtcbiAgUmVxdWVzdE9wdGlvbnNJbnB1dCxcbiAgSHR0cENsaWVudFNldHRpbmdzLFxuICBIdHRwUmVzcG9uc2VGdWxsLFxuICBSZXF1ZXN0T3B0aW9ucyxcbiAgU3RhYmxlT3B0aW9ucyxcbn0gZnJvbSAnLi9IdHRwQ2xpZW50LnR5cGVzJztcbmltcG9ydCB7IFJFU1BPTlNFX0FTIH0gZnJvbSAnLi9IdHRwQ2xpZW50LnR5cGVzJztcblxuZXhwb3J0IGNsYXNzIEh0dHBDbGllbnROb3JtYWxpemVyIHtcbiAgcHJpdmF0ZSBvcHRpb25zOiBTdGFibGVPcHRpb25zID0ge307XG5cbiAgcHVibGljIHNldE9wdGlvbnMob3B0aW9uczogU3RhYmxlT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICBwdWJsaWMgbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zOiBSZXF1ZXN0T3B0aW9uc0lucHV0LCBzZXR0aW5nOiBIdHRwQ2xpZW50U2V0dGluZ3MpOiBSZXF1ZXN0T3B0aW9ucyB7XG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGJvZHk6IHRoaXMubm9ybWFsaXplQm9keShvcHRpb25zLmJvZHkpLFxuICAgIH07XG5cbiAgICBpZiAoc2V0dGluZy5yZXNwb25zZUFzID09PSBSRVNQT05TRV9BUy5qc29uKSB7XG4gICAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0geyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAuLi5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlcXVlc3RPcHRpb25zLFxuICAgICAgaGVhZGVyczogcmVxdWVzdE9wdGlvbnMuaGVhZGVycyA/PyB7fSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG5vcm1hbGl6ZVJlc3BvbnNlPERhdGE+KFxuICAgIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgICBzZXR0aW5nOiBIdHRwQ2xpZW50U2V0dGluZ3MsXG4gICk6IFByb21pc2U8SHR0cFJlc3BvbnNlRnVsbDxEYXRhPj4ge1xuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW5hbDogcmVzcG9uc2UsXG4gICAgICBkYXRhOiBhd2FpdCByZXNwb25zZVtzZXR0aW5nLnJlc3BvbnNlQXNdKCksXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVCb2R5KGJvZHk6IFJlcXVlc3RPcHRpb25zSW5wdXRbJ2JvZHknXSk6IFJlcXVlc3RPcHRpb25zWydib2R5J10ge1xuICAgIGlmIChib2R5ICYmIGJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfVxuXG4gICAgaWYgKGJvZHkgJiYgYm9keSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgIHJldHVybiBib2R5O1xuICAgIH1cblxuICAgIGlmIChib2R5ICYmIGJvZHkgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkge1xuICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfVxuXG4gICAgaWYgKGJvZHkgJiYgYm9keSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfVxuXG4gICAgaWYgKGJvZHkgJiYgdHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYm9keTtcbiAgICB9XG5cbiAgICBpZiAoYm9keSAmJiBib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgIHJldHVybiBib2R5LnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKGJvZHkpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJleHBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnLi9IdHRwQ2xpZW50JztcblxuZXhwb3J0ICogZnJvbSAnLi9IdHRwQ2xpZW50LnR5cGVzJztcbiIsImltcG9ydCB0eXBlIHsgSHR0cEVycm9yIH0gZnJvbSAnLi4vaHR0cC1lcnJvci9IdHRwRXJyb3JCYXNlJztcblxuZXhwb3J0IGNvbnN0IFJFU1BPTlNFX0FTID0ge1xuICBqc29uOiAnanNvbicsXG4gIHRleHQ6ICd0ZXh0JyxcbiAgYXJyYXlCdWZmZXI6ICdhcnJheUJ1ZmZlcicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZXNwb25zZUFzID0gKHR5cGVvZiBSRVNQT05TRV9BUylba2V5b2YgdHlwZW9mIFJFU1BPTlNFX0FTXTtcblxuZXhwb3J0IGNvbnN0IFJFUVVFU1RfTUVUSE9EID0ge1xuICBHRVQ6ICdHRVQnLFxuICBQT1NUOiAnUE9TVCcsXG4gIFBVVDogJ1BVVCcsXG4gIERFTEVURTogJ0RFTEVURScsXG4gIEhFQUQ6ICdIRUFEJyxcbiAgT1BUSU9OUzogJ09QVElPTlMnLFxuICBQQVRDSDogJ1BBVENIJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RNZXRob2QgPSAodHlwZW9mIFJFUVVFU1RfTUVUSE9EKVtrZXlvZiB0eXBlb2YgUkVRVUVTVF9NRVRIT0RdO1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRTZXR0aW5ncyB7XG4gIHJlc3BvbnNlQXM6IFJlc3BvbnNlQXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdFBhcmFtcyB7XG4gIHVybDogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnM7XG59XG5cbmludGVyZmFjZSBIdHRwUmVzcG9uc2VFcnJvciB7XG4gIGRhdGE6IG51bGw7XG4gIGVycm9yOiBIdHRwRXJyb3I7XG59XG5cbmludGVyZmFjZSBIdHRwUmVzcG9uc2VTdWNjZXNzPERhdGE+IHtcbiAgZGF0YTogRGF0YTtcbiAgZXJyb3I6IG51bGw7XG59XG5cbmV4cG9ydCB0eXBlIEh0dHBSZXNwb25zZTxEYXRhPiA9IEh0dHBSZXNwb25zZVN1Y2Nlc3M8RGF0YT4gfCBIdHRwUmVzcG9uc2VFcnJvcjtcblxuZXhwb3J0IGludGVyZmFjZSBIdHRwUmVzcG9uc2VFcnJvckZ1bGwgZXh0ZW5kcyBIdHRwUmVzcG9uc2VFcnJvciB7XG4gIG9yaWdpbmFsOiBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBSZXNwb25zZVN1Y2Nlc3NGdWxsPERhdGE+IGV4dGVuZHMgSHR0cFJlc3BvbnNlU3VjY2VzczxEYXRhPiB7XG4gIG9yaWdpbmFsOiBSZXNwb25zZTtcbn1cblxuZXhwb3J0IHR5cGUgSHR0cFJlc3BvbnNlRnVsbDxEYXRhPiA9IEh0dHBSZXNwb25zZVN1Y2Nlc3NGdWxsPERhdGE+IHwgSHR0cFJlc3BvbnNlRXJyb3JGdWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRCYXNlIHtcbiAgZ2V0OiA8RGF0YT4odXJsOiBVcmwsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0lucHV0LCBzZXR0aW5nPzogSHR0cENsaWVudFNldHRpbmdzKSA9PiBQcm9taXNlPEh0dHBSZXNwb25zZTxEYXRhPj47XG5cbiAgcG9zdDogPERhdGE+KHVybDogVXJsLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCwgc2V0dGluZz86IEh0dHBDbGllbnRTZXR0aW5ncykgPT4gUHJvbWlzZTxIdHRwUmVzcG9uc2U8RGF0YT4+O1xuXG4gIHB1dDogPERhdGE+KHVybDogVXJsLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCwgc2V0dGluZz86IEh0dHBDbGllbnRTZXR0aW5ncykgPT4gUHJvbWlzZTxIdHRwUmVzcG9uc2U8RGF0YT4+O1xuXG4gIHBhdGNoOiA8RGF0YT4odXJsOiBVcmwsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0lucHV0LCBzZXR0aW5nPzogSHR0cENsaWVudFNldHRpbmdzKSA9PiBQcm9taXNlPEh0dHBSZXNwb25zZTxEYXRhPj47XG5cbiAgZGVsZXRlOiA8RGF0YT4odXJsOiBVcmwsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0lucHV0LCBzZXR0aW5nPzogSHR0cENsaWVudFNldHRpbmdzKSA9PiBQcm9taXNlPEh0dHBSZXNwb25zZTxEYXRhPj47XG5cbiAgaGVhZDogKHVybDogVXJsLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCwgc2V0dGluZz86IEh0dHBDbGllbnRTZXR0aW5ncykgPT4gUHJvbWlzZTxIdHRwUmVzcG9uc2U8SGVhZGVycz4+O1xuXG4gIG9wdGlvbnM6ICh1cmw6IFVybCwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zSW5wdXQsIHNldHRpbmc/OiBIdHRwQ2xpZW50U2V0dGluZ3MpID0+IFByb21pc2U8SHR0cFJlc3BvbnNlPEhlYWRlcnM+PjtcblxuICBmZXRjaEdldDogPERhdGE+KFxuICAgIHVybDogVXJsLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0lucHV0LFxuICAgIHNldHRpbmc/OiBIdHRwQ2xpZW50U2V0dGluZ3MsXG4gICkgPT4gUHJvbWlzZTxIdHRwUmVzcG9uc2VGdWxsPERhdGE+PjtcblxuICBmZXRjaFBvc3Q6IDxEYXRhPihcbiAgICB1cmw6IFVybCxcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCxcbiAgICBzZXR0aW5nPzogSHR0cENsaWVudFNldHRpbmdzLFxuICApID0+IFByb21pc2U8SHR0cFJlc3BvbnNlRnVsbDxEYXRhPj47XG5cbiAgZmV0Y2hQdXQ6IDxEYXRhPihcbiAgICB1cmw6IFVybCxcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNJbnB1dCxcbiAgICBzZXR0aW5nPzogSHR0cENsaWVudFNldHRpbmdzLFxuICApID0+IFByb21pc2U8SHR0cFJlc3BvbnNlRnVsbDxEYXRhPj47XG5cbiAgZmV0Y2hQYXRjaDogPERhdGE+KFxuICAgIHVybDogVXJsLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0lucHV0LFxuICAgIHNldHRpbmc/OiBIdHRwQ2xpZW50U2V0dGluZ3MsXG4gICkgPT4gUHJvbWlzZTxIdHRwUmVzcG9uc2VGdWxsPERhdGE+PjtcblxuICBmZXRjaERlbGV0ZTogPERhdGE+KFxuICAgIHVybDogVXJsLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0lucHV0LFxuICAgIHNldHRpbmc/OiBIdHRwQ2xpZW50U2V0dGluZ3MsXG4gICkgPT4gUHJvbWlzZTxIdHRwUmVzcG9uc2VGdWxsPERhdGE+PjtcblxuICBmZXRjaEhlYWQ6ICh1cmw6IFVybCwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zSW5wdXQsIHNldHRpbmc/OiBIdHRwQ2xpZW50U2V0dGluZ3MpID0+IFByb21pc2U8SHR0cFJlc3BvbnNlRnVsbDxudWxsPj47XG5cbiAgZmV0Y2hPcHRpb25zOiAoXG4gICAgdXJsOiBVcmwsXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zSW5wdXQsXG4gICAgc2V0dGluZz86IEh0dHBDbGllbnRTZXR0aW5ncyxcbiAgKSA9PiBQcm9taXNlPEh0dHBSZXNwb25zZUZ1bGw8bnVsbD4+O1xuXG4gIGFwcGx5T3B0aW9uczogKG9wdGlvbnM6IFN0YWJsZU9wdGlvbnMpID0+IHZvaWQ7XG4gIHVuYXBwbHlPcHRpb25zOiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFcnJvck1hbmFnZXJCYXNlIHtcbiAgdGhyb3c6IChyZXNwb25zZTogUmVzcG9uc2UsIGRhdGFUZXh0OiBzdHJpbmcpID0+IG5ldmVyO1xuICBwYXJzZTogPERhdGE+KGVycm9yRGF0YTogdW5rbm93bikgPT4gSHR0cFJlc3BvbnNlRnVsbDxEYXRhPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIdHRwRmV0Y2hQcm92aWRlciB7XG4gIGZldGNoOiAocGFyYW1zOiBSZXF1ZXN0UGFyYW1zKSA9PiBQcm9taXNlPFJlc3BvbnNlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0T3B0aW9uc0lucHV0IGV4dGVuZHMgT21pdDxSZXF1ZXN0SW5pdCwgJ2JvZHknIHwgJ21ldGhvZCc+IHtcbiAgYm9keT86IFJlcXVlc3RJbml0Wydib2R5J10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWJsZU9wdGlvbnMgZXh0ZW5kcyBPbWl0PFJlcXVlc3RPcHRpb25zSW5wdXQsICdib2R5Jz4ge31cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0T3B0aW9ucyBleHRlbmRzIFJlcXVlc3RJbml0IHt9XG5cbmV4cG9ydCB0eXBlIFVybCA9IHN0cmluZztcbiIsImV4cG9ydCB7IEh0dHBFcnJvck1hbmFnZXIgfSBmcm9tICcuL0h0dHBFcnJvck1hbmFnZXInO1xuIiwiaW1wb3J0IHR5cGUgeyBIdHRwRmV0Y2hQcm92aWRlciwgUmVxdWVzdFBhcmFtcyB9IGZyb20gJy4uL2h0dHAtY2xpZW50JztcblxuZXhwb3J0IGNsYXNzIFhtbEh0dHBQcm92aWRlciBpbXBsZW1lbnRzIEh0dHBGZXRjaFByb3ZpZGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghZ2xvYmFsVGhpcy5YTUxIdHRwUmVxdWVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdYTUxIdHRwUmVxdWVzdCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmV0Y2gocGFyYW1zOiBSZXF1ZXN0UGFyYW1zKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgICAgeGhyLm9wZW4ocGFyYW1zLm1ldGhvZCwgcGFyYW1zLnVybCwgdHJ1ZSk7XG5cbiAgICAgIGlmIChwYXJhbXMub3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtcy5vcHRpb25zLmhlYWRlcnMpKSB7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5vcHRpb25zPy5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZUluaXQgPSB7XG4gICAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKCksXG4gICAgICAgIH07XG5cbiAgICAgICAgeGhyXG4gICAgICAgICAgLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5zcGxpdCgvW1xcclxcbl0rLylcbiAgICAgICAgICAuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnNwbGl0KCc6ICcpO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gcGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFydHMuam9pbignOiAnKTtcbiAgICAgICAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VJbml0LmhlYWRlcnMuYXBwZW5kKGhlYWRlciwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGJvZHkgPSB4aHIucmVzcG9uc2UgfHwgeGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgcmVzcG9uc2VJbml0KSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub250aW1lb3V0ID0gKCkgPT4ge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IHRpbWVkIG91dCcpKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMub3B0aW9ucy5ib2R5KTtcbiAgICAgIHhoci5zZW5kKGJvZHkgfHwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgSHR0cEVycm9yTWFuYWdlckJhc2UsIEh0dHBSZXNwb25zZUZ1bGwgfSBmcm9tICcuLi9odHRwLWNsaWVudC9pbmRleCc7XG5pbXBvcnQgeyBIdHRwRXJyb3JBcnJheUJ1ZmZlciwgSHR0cEVycm9ySlNPTiB9IGZyb20gJy4uL2h0dHAtZXJyb3IvaW5kZXgnO1xuXG5leHBvcnQgY2xhc3MgSHR0cEVycm9yTWFuYWdlciBpbXBsZW1lbnRzIEh0dHBFcnJvck1hbmFnZXJCYXNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZW50VHlwZSA9IHtcbiAgICBKU09OOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgQVJSQVlfQlVGRkVSOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcbiAgICBURVhUOiAndGV4dC9wbGFpbicsXG4gIH07XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHVibGljIHRocm93KHJlc3BvbnNlOiBSZXNwb25zZSwgZGF0YVRleHQ6IHN0cmluZyk6IG5ldmVyIHtcbiAgICBpZiAoZGF0YVRleHQpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuXG4gICAgICBpZiAoY29udGVudFR5cGU/LmluY2x1ZGVzKHRoaXMuY29udGVudFR5cGUuQVJSQVlfQlVGRkVSKSkge1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGVuY29kZXIuZW5jb2RlKGRhdGFUZXh0KS5idWZmZXI7XG4gICAgICAgIHRocm93IG5ldyBIdHRwRXJyb3JBcnJheUJ1ZmZlcihyZXNwb25zZS5zdGF0dXMsIGJ1ZmZlcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZW50VHlwZT8uaW5jbHVkZXModGhpcy5jb250ZW50VHlwZS5URVhUKSkge1xuICAgICAgICB0aHJvdyBuZXcgSHR0cEVycm9ySlNPTihkYXRhVGV4dCwgcmVzcG9uc2Uuc3RhdHVzLCBkYXRhVGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBlcnJvckpTT047XG4gICAgICB0cnkge1xuICAgICAgICBlcnJvckpTT04gPSBKU09OLnBhcnNlKGRhdGFUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLyogZW1wdHkgKi9cbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9ySlNPTikge1xuICAgICAgICBjb25zdCBkZWZhdWx0TWVzc2FnZSA9ICdVbmtub3duIGVycm9yIHBsZWFzZSBjaGVjayBkZXRhaWxzIGZpZWxkJztcbiAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvckpTT04oZXJyb3JKU09OPy5tZXNzYWdlID8/IGRlZmF1bHRNZXNzYWdlLCByZXNwb25zZS5zdGF0dXMsIGVycm9ySlNPTik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3IgPSB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICBkZXRhaWxzOiAnTm8gcmVzcG9uc2UgZm9yIGRldGFpbHMnLFxuICAgIH07XG5cbiAgICB0aHJvdyBuZXcgSHR0cEVycm9ySlNPTihlcnJvci5tZXNzYWdlLCBlcnJvci5zdGF0dXMsIGVycm9yLmRldGFpbHMpO1xuICB9XG5cbiAgcHVibGljIHBhcnNlPERhdGE+KGVycm9yRGF0YTogdW5rbm93bik6IEh0dHBSZXNwb25zZUZ1bGw8RGF0YT4ge1xuICAgIGlmIChlcnJvckRhdGEgaW5zdGFuY2VvZiBIdHRwRXJyb3JKU09OKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcmlnaW5hbDogbnVsbCxcbiAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgZXJyb3I6IGVycm9yRGF0YSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3JEYXRhO1xuICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiZXhwb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJy4vaHR0cC1jbGllbnQnO1xuZXhwb3J0IHsgSHR0cEVycm9yTWFuYWdlciB9IGZyb20gJy4vaHR0cC1lcnJvci1tYW5hZ2VyJztcbmV4cG9ydCB7IEh0dHBFcnJvckpTT04sIEh0dHBFcnJvckJhc2UgfSBmcm9tICcuL2h0dHAtZXJyb3InO1xuZXhwb3J0IHsgWG1sSHR0cFByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcic7XG5leHBvcnQgdHlwZSB7IEh0dHBDbGllbnRCYXNlLCBIdHRwRmV0Y2hQcm92aWRlciwgSHR0cEVycm9yTWFuYWdlckJhc2UgfSBmcm9tICcuL2h0dHAtY2xpZW50L0h0dHBDbGllbnQudHlwZXMnO1xuIl0sIm5hbWVzIjpbInR5cGVBcnJheUJ1ZmZlciIsIkhUVFBfRVJST1JfVFlQRSIsIkFSUkFZX0JVRkZFUiIsIkh0dHBFcnJvckFycmF5QnVmZmVyIiwiSHR0cEVycm9yQmFzZSIsInN0YXR1cyIsImRldGFpbHMiLCJtZXNzYWdlIiwidHlwZSIsInN1cGVyIiwidHlwZUpTT04iLCJKU09OIiwiSHR0cEVycm9ySlNPTiIsIkVycm9yIiwiZmV0Y2giLCJwYXJhbXMiLCJnbG9iYWxUaGlzIiwidXJsIiwibWV0aG9kIiwib3B0aW9ucyIsImVycm9yTWFuYWdlciIsImZldGNoUHJvdmlkZXIiLCJzZXR0aW5nIiwicmVzcG9uc2VBcyIsIlJFU1BPTlNFX0FTIiwianNvbiIsIm5vcm1hbGl6ZXIiLCJIdHRwQ2xpZW50Tm9ybWFsaXplciIsIkZldGNoUHJvdmlkZXIiLCJnZXQiLCJ0aGlzIiwiZmV0Y2hXaXRoU2hvcnRSZXNwb25zZSIsIlJFUVVFU1RfTUVUSE9EIiwiR0VUIiwicG9zdCIsIlBPU1QiLCJwdXQiLCJQVVQiLCJwYXRjaCIsIlBBVENIIiwiREVMRVRFIiwiaGVhZCIsImZldGNoSGVhZGVycyIsIkhFQUQiLCJPUFRJT05TIiwiZmV0Y2hHZXQiLCJmZXRjaFBvc3QiLCJmZXRjaFB1dCIsImZldGNoUGF0Y2giLCJmZXRjaERlbGV0ZSIsImZldGNoSGVhZCIsImZldGNoT3B0aW9ucyIsImFwcGx5T3B0aW9ucyIsInNldE9wdGlvbnMiLCJ1bmFwcGx5T3B0aW9ucyIsIm9wdGlvbnNJbnB1dCIsInNldHRpbmdJbnB1dCIsInJlcXVlc3RTZXR0aW5nIiwicmVxdWVzdE9wdGlvbnMiLCJub3JtYWxpemVPcHRpb25zIiwicmVxdWVzdFBhcmFtcyIsInJlc3BvbnNlIiwib2siLCJub3JtYWxpemVSZXNwb25zZSIsImRhdGFBc1RleHQiLCJ0ZXh0IiwidGhyb3ciLCJlIiwicGFyc2UiLCJwYXlsb2FkIiwiZXJyb3IiLCJkYXRhIiwib3B0aW9uc1dpdGhOb0JvZHkiLCJib2R5IiwidW5kZWZpbmVkIiwic2V0dGluZ1Jlc3BvbnNlQXNUZXh0Iiwib3JpZ2luYWwiLCJoZWFkZXJzIiwiWG1sSHR0cFByb3ZpZGVyIiwibm9ybWFsaXplQm9keSIsIkFycmF5QnVmZmVyIiwiQmxvYiIsIlJlYWRhYmxlU3RyZWFtIiwiVVJMU2VhcmNoUGFyYW1zIiwiRm9ybURhdGEiLCJ0b1N0cmluZyIsInN0cmluZ2lmeSIsIkh0dHBDbGllbnQiLCJhcnJheUJ1ZmZlciIsIkh0dHBFcnJvck1hbmFnZXIiLCJYTUxIdHRwUmVxdWVzdCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwieGhyIiwib3BlbiIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsInNldFJlcXVlc3RIZWFkZXIiLCJjcmVkZW50aWFscyIsIndpdGhDcmVkZW50aWFscyIsIm9ubG9hZCIsInJlc3BvbnNlSW5pdCIsInN0YXR1c1RleHQiLCJIZWFkZXJzIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwidHJpbSIsInNwbGl0IiwiZm9yRWFjaCIsImxpbmUiLCJwYXJ0cyIsImhlYWRlciIsInNoaWZ0Iiwiam9pbiIsImFwcGVuZCIsInJlc3BvbnNlVGV4dCIsIlJlc3BvbnNlIiwib25lcnJvciIsIlR5cGVFcnJvciIsIm9udGltZW91dCIsInNlbmQiLCJjb250ZW50VHlwZSIsIlRFWFQiLCJkYXRhVGV4dCIsImluY2x1ZGVzIiwiYnVmZmVyIiwiVGV4dEVuY29kZXIiLCJlbmNvZGUiLCJlcnJvckpTT04iLCJkZWZhdWx0TWVzc2FnZSIsImVycm9yRGF0YSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiY2FsbCJdLCJzb3VyY2VSb290IjoiIn0=