@campxdev/campx-web-utils 2.0.6 → 2.0.8

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.
package/dist/esm/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"axios";import{Store as t}from"pullstate";import{jsxs as n,jsx as r,Fragment as o}from"react/jsx-runtime";import{ConfirmDialog as i,Icons as a,TextField as s,PasswordField as c,Button as u,ResourceNotFound as l,InternalServerError as d,NoInterneConnection as p,UnAuthorized as f,Dialog as h,Snackbar as m,SingleSelect as y}from"@campxdev/react-blueprint";import*as b from"react";import{createContext as v,useState as w,useEffect as g}from"react";import{useMutation as _,QueryErrorResetBoundary as E,QueryClient as O,QueryClientProvider as x}from"react-query";import{useNavigate as k,useLocation as N,BrowserRouter as P}from"react-router-dom";export{BrowserRouter}from"react-router-dom";import{validateFieldsNatively as S,toNestError as j}from"@hookform/resolvers";import{appendErrors as A,useForm as D,Controller as C}from"react-hook-form";import I from"device-detector-js";import*as V from"yup";import{Provider as T}from"react-redux";var R=function(){return R=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},R.apply(this,arguments)};function L(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(a,s)}c((r=r.apply(e,t||[])).next())})}function K(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=s(0),a.throw=s(1),a.return=s(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(c){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],r=0}finally{n=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,c])}}}function F(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}"function"==typeof SuppressedError&&SuppressedError;var $=function e(t,n){function r(e,r,o){if("undefined"!=typeof document){"number"==typeof(o=F({},n,o)).expires&&(o.expires=new Date(Date.now()+864e5*o.expires)),o.expires&&(o.expires=o.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var i="";for(var a in o)o[a]&&(i+="; "+a,!0!==o[a]&&(i+="="+o[a].split(";")[0]));return document.cookie=e+"="+t.write(r,e)+i}}return Object.create({set:r,get:function(e){if("undefined"!=typeof document&&(!arguments.length||e)){for(var n=document.cookie?document.cookie.split("; "):[],r={},o=0;o<n.length;o++){var i=n[o].split("="),a=i.slice(1).join("=");try{var s=decodeURIComponent(i[0]);if(r[s]=t.read(a,s),e===s)break}catch(e){}}return e?r[e]:r}},remove:function(e,t){r(e,"",F({},t,{expires:-1}))},withAttributes:function(t){return e(this.converter,F({},this.attributes,t))},withConverter:function(t){return e(F({},this.converter,t),this.attributes)}},{attributes:{value:Object.freeze(n)},converter:{value:Object.freeze(t)}})}({read:function(e){return'"'===e[0]&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"}),z={isLoginDialogOpen:!1,snackbar:{open:!1,message:"",severity:"success"},confirmDialog:{isOpen:!1,title:"",message:"",onConfirm:function(){},onCancel:function(){},type:"confirm"},user:void 0,institutionInfo:void 0,asset:void 0},M=new t(z),B=window.location.hostname.includes("localhost"),U=window.location.hostname.split(".")[0],q=window.location.pathname.split("/")[1],W=window.location.pathname.split("/")[2],Y={"student-workspace":"/student-api","faculty-workspace":"/faculty-api","department-workspace":"/department-api","academic-coordinator-workspace":"/academic-coordinator-api","feedback-coordinator-workspace":"/feedback-coordinator-api","course-coordinator-workspace":"/course-coordinator-api","classroom-coordinator-workspace":"/classroom-coordinator-api","academic-admin-workspace":"/academic-admin-api","hostel-admin-workspace":"/hostel-admin-api","transport-coordinator-workspace":"/transport-coordinator-api","employee-workspace":"/employee-api","librarian-workspace":"/librarian-api","fee-terminal":"/fee-terminal-api","accounts-officer-workspace":"accounts-officer-api","finance-officer-workspace":"finance-officer-api","outreach-agent-workspace":"outreach-agent-api","prospect-workspace":"prospect-api","research-coordinator-workspace":"research-coordinator-api","tele-counsellor-workspace":"tele-counsellor-api","team-owner-workspace":"/team-owner-api","admissions-counsellor-workspace":"/admissions-counsellor-api"},H=e.create({baseURL:process.env.REACT_APP_API_HOST||"",withCredentials:!0,headers:{"x-tenant-id":U,"x-institution-code":q}});function X(e,t,n){return n.reduce(function(n,r){var o=e[r];return o&&(n[r]=R({singleton:!0,requiredVersion:o,version:o.replace(/^[\^~]/,"")},t.includes(r)?{eager:!0}:{})),n},{})}H.interceptors.request.use(function(e){var t=function(e){return Object.fromEntries(Object.entries(null!=e?e:{}).map(function(e){var t=e[0],n=e[1];return[t,"__empty__"===n?"":n]}))}(null==e?void 0:e.params);if(!1!==e.workspace&&W&&Y[W]&&"common-workspace"!==W){var n=Y[W];e.url="".concat(n).concat(e.url)}var r=$.get("campx_session_key"),o=$.get("campx_open_payments_key"),i=$.get("campx_student_key");return B&&r&&e.headers.set("campx_session_key",r),B&&i&&e.headers.set("campx_student_key",i),o&&e.headers.set("campx_open_payments_key",o),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),R(R({},e),{params:t})},function(e){return Promise.reject(e)}),H.interceptors.response.use(function(e){var t;return!(!0===(null===(t=e.data)||void 0===t?void 0:t.hideSnackbar))&&e.config.method&&["put","post","delete","patch"].includes(e.config.method)&&[200,201,202].includes(e.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.data.message||"Operation successful",t.snackbar.severity="success"}),e},function(e){var t,n,r,o,i=!0===(null===(n=null===(t=e.response)||void 0===t?void 0:t.data)||void 0===n?void 0:n.hideSnackbar);return!i&&[400,422,413].includes(null===(r=e.response)||void 0===r?void 0:r.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Bad Request",t.snackbar.severity="error"}),!i&&(null===(o=e.response)||void 0===o?void 0:o.config.method)&&["put","post","delete","patch"].includes(e.response.config.method)&&[404].includes(e.response.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var G=e.create({baseURL:process.env.REACT_APP_API_HOST||"",withCredentials:!0,workspace:!1,headers:{"x-tenant-id":U,"x-institution-code":q}});G.interceptors.request.use(function(e){var t=function(e){return Object.fromEntries(Object.entries(null!=e?e:{}).map(function(e){var t=e[0],n=e[1];return[t,"__empty__"===n?"":n]}))}(null==e?void 0:e.params),n=$.get("campx_session_key"),r=$.get("campx_open_payments_key"),o=$.get("campx_student_key");return B&&n&&e.headers.set("campx_session_key",n),B&&o&&e.headers.set("campx_student_key",o),r&&e.headers.set("campx_open_payments_key",r),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),R(R({},e),{params:t})},function(e){return Promise.reject(e)}),G.interceptors.response.use(function(e){var t;return!(!0===(null===(t=e.data)||void 0===t?void 0:t.hideSnackbar))&&e.config.method&&["put","post","delete","patch"].includes(e.config.method)&&[200,201,202].includes(e.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.data.message||"Operation successful",t.snackbar.severity="success"}),e},function(e){var t,n,r,o,i=!0===(null===(n=null===(t=e.response)||void 0===t?void 0:t.data)||void 0===n?void 0:n.hideSnackbar);return!i&&[400,422].includes(null===(r=e.response)||void 0===r?void 0:r.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Bad Request",t.snackbar.severity="error"}),!i&&(null===(o=e.response)||void 0===o?void 0:o.config.method)&&["put","post","delete","patch"].includes(e.response.config.method)&&[404].includes(e.response.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var J=v({showConfirmDialog:function(){}}),Q=function(e){var t=e.children,o=M.useState(function(e){return e.confirmDialog}),a=function(){M.update(function(e){e.confirmDialog.isOpen=!1})};return n(J.Provider,{value:{showConfirmDialog:function(e,t,n,r,o,i,a){void 0===o&&(o="confirm"),M.update(function(s){s.confirmDialog={isOpen:!0,title:e,message:t,onConfirm:n,onCancel:r,type:o,confirmButtonText:i,cancelButtonText:a}})}},children:[t,r(i,{isOpen:o.isOpen,title:o.title,message:o.message,type:o.type,confirmButtonText:o.confirmButtonText,cancelButtonText:o.cancelButtonText,onConfirm:function(){o.onConfirm(),a()},onCancel:function(){o.onCancel(),a()}})]})};function Z(e,t){return Z=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Z(e,t)}var ee={error:null},te=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).state=ee,t.resetErrorBoundary=function(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];null==t.props.onReset||(e=t.props).onReset.apply(e,r),t.reset()},t}!function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,Z(e,t)}(t,e),t.getDerivedStateFromError=function(e){return{error:e}};var n=t.prototype;return n.reset=function(){this.setState(ee)},n.componentDidCatch=function(e,t){var n,r;null==(n=(r=this.props).onError)||n.call(r,e,t)},n.componentDidUpdate=function(e,t){var n,r,o,i,a=this.state.error,s=this.props.resetKeys;null!==a&&null!==t.error&&(void 0===(o=e.resetKeys)&&(o=[]),void 0===(i=s)&&(i=[]),o.length!==i.length||o.some(function(e,t){return!Object.is(e,i[t])}))&&(null==(n=(r=this.props).onResetKeysChange)||n.call(r,e.resetKeys,s),this.reset())},n.render=function(){var e=this.state.error,t=this.props,n=t.fallbackRender,r=t.FallbackComponent,o=t.fallback;if(null!==e){var i={error:e,resetErrorBoundary:this.resetErrorBoundary};if(b.isValidElement(o))return o;if("function"==typeof n)return n(i);if(r)return b.createElement(r,i);throw new Error("react-error-boundary requires either a fallback, fallbackRender, or FallbackComponent prop")}return this.props.children},t}(b.Component),ne=function(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),function(r,o,i){try{return Promise.resolve(function(a,s){try{var c=(t.context&&process.env.NODE_ENV,Promise.resolve(e["sync"===n.mode?"validateSync":"validate"](r,Object.assign({abortEarly:!1},t,{context:o}))).then(function(e){return i.shouldUseNativeValidation&&S({},i),{values:n.rawValues?r:e,errors:{}}}))}catch(e){return s(e)}return c&&c.then?c.then(void 0,s):c}(0,function(e){if(!e.inner)throw e;return{values:{},errors:j((t=e,n=!i.shouldUseNativeValidation&&"all"===i.criteriaMode,(t.inner||[]).reduce(function(e,t){if(e[t.path]||(e[t.path]={message:t.message,type:t.type}),n){var r=e[t.path].types,o=r&&r[t.type];e[t.path]=A(t.path,n,e,t.type,o?[].concat(o,t.message):t.message)}return e},{})),i)};var t,n}))}catch(e){return Promise.reject(e)}}},re=function(e){return L(void 0,void 0,void 0,function(){var t;return K(this,function(n){switch(n.label){case 0:return e.latitude&&e.longitude?[3,3]:[4,fetch("https://www.googleapis.com/geolocation/v1/geolocate?key=AIzaSyB2YCpo1yi107RYj1LdZu2DCcpcO93reFY",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({considerIp:"true"})})];case 1:return[4,n.sent().json()];case 2:t=n.sent(),e.latitude=t.location.lat,e.longitude=t.location.lng,n.label=3;case 3:return[2,H.post("/auth-server/auth-v2/login",e,{workspace:!1}).then(function(e){return e.data})]}})})},oe=V.object().shape({username:V.string().required("Username is required"),password:V.string().required("Password is required")}),ie=function(e){var t=e.close,o=w({deviceInformation:{deviceType:"browser",clientName:"unknown",os:"unknown",osVersion:"unknown",latitude:null,longitude:null,tokenType:"WEB"},isLocationAllowed:!0}),i=o[0],l=o[1],d=k();g(function(){navigator.geolocation.getCurrentPosition(function(e){l(function(t){return R(R({},t),{deviceInformation:R(R({},t.deviceInformation),{latitude:e.coords.latitude,longitude:e.coords.longitude})})})}),navigator.permissions.query({name:"geolocation"}).then(function(e){"denied"===e.state&&l(function(e){return R(R({},e),{isLocationAllowed:!1})})});var e=(new I).parse(navigator.userAgent);l(function(t){var n,r,o;return R(R({},t),{deviceInformation:R(R({},t.deviceInformation),{clientName:(null===(n=e.client)||void 0===n?void 0:n.name)||t.deviceInformation.clientName,os:(null===(r=e.os)||void 0===r?void 0:r.name)||t.deviceInformation.os,osVersion:(null===(o=e.os)||void 0===o?void 0:o.version)||t.deviceInformation.osVersion})})})},[]);var p=D({resolver:ne(oe)}),f=p.handleSubmit,h=p.control,m=p.formState.errors,y=_(re,{onSuccess:function(e){B&&($.remove("campx_session_key"),$.set("campx_session_key",e.session.token),t(),d("/".concat(e.session.institutionCode,"/workspace")),window.location.reload())}}),b=y.mutate,v=y.isLoading;return n("div",{className:"flex flex-col gap-8 justify-center items-center p-8",children:[r("div",{className:"flex items-center justify-center h-9 w-48",children:r(a.CampxFullLogoIcon,{})}),n("div",{className:"flex flex-col gap-4 w-full max-w-[400px]",children:[r(C,{control:h,render:function(e){var t=e.field;return r(s,{name:"username",placeholder:"Enter Username or Email",onChange:t.onChange,label:"Username or Email",error:!!m.username,required:!0,fullWidth:!0})},name:"username"}),r(C,{control:h,render:function(e){var t=e.field;return r(c,{name:"password",placeholder:"Enter password",onChange:t.onChange,label:"Password",error:!!m.password,required:!0,fullWidth:!0})},name:"password"}),r(u,{type:"submit",color:"primary",variant:"default",onClick:f(function(e){return L(void 0,void 0,void 0,function(){return K(this,function(t){return b(R(R(R({},e),i.deviceInformation),{loginId:e.username,loginType:"USER"})),[2]})})}),disabled:v,loading:v,fullWidth:!0,children:"Login"})]})]})},ae=function(e){var t=N();return r(E,{children:function(n){var o=n.reset;return r(te,{onReset:o,FallbackComponent:se,children:e.children},null==t?void 0:t.pathname)}})},se=function(e){var t,o,i,a,s,c,f,h=e.error,m=e.resetErrorBoundary;if(null===(t=null==h?void 0:h.response)||void 0===t?void 0:t.status)switch(null===(o=null==h?void 0:h.response)||void 0===o?void 0:o.status){case 401:return r(ce,{});case 500:return r(d,{resetBoundary:m});case 404:return r(l,{message:null===(a=null===(i=null==h?void 0:h.response)||void 0===i?void 0:i.data)||void 0===a?void 0:a.message})}return"ERR_NETWORK"===(null==h?void 0:h.code)?r(p,{resetBoundary:m}):r("div",{className:"mt-4 p-5",children:n("div",{className:"relative h-15 border border-red-200 bg-red-50 flex items-center rounded-md px-2",children:[r("div",{className:"flex-1 text-red-700 bg-transparent",children:null!==(f=null===(c=null===(s=null==h?void 0:h.response)||void 0===s?void 0:s.data)||void 0===c?void 0:c.message)&&void 0!==f?f:null==h?void 0:h.message}),r(u,{onClick:function(){return m()},size:"sm",variant:"link",className:"hover:no-underline text-destructive",children:"Try Again"})]})})},ce=function(){var e=k(),t=w(!1),i=t[0],a=t[1],s=$.get("campx_session_key");return r(f,{component:n(o,{children:[r(u,{className:"mt-5",variant:"default",onClick:function(){"localhost"===window.location.hostname.split(".")[1]?a(!0):s||e("prospect-workspace"===W?"".concat(q,"/ats/login"):"/auth/login")},children:"Click Here To Login"}),r(h,{open:i,onClose:function(){return a(!1)},content:function(e){var t=e.close;return r(ie,{close:t})}})]})})};function ue(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var le=(()=>"function"==typeof Symbol&&Symbol.observable||"@@observable")(),de=()=>Math.random().toString(36).substring(7).split("").join("."),pe={INIT:`@@redux/INIT${de()}`,REPLACE:`@@redux/REPLACE${de()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${de()}`};function fe(e){if("object"!=typeof e||null===e)return!1;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||null===Object.getPrototypeOf(e)}function he(e){if(void 0===e)return"undefined";if(null===e)return"null";const t=typeof e;switch(t){case"boolean":case"string":case"number":case"symbol":case"function":return t}if(Array.isArray(e))return"array";if(function(e){return e instanceof Date||"function"==typeof e.toDateString&&"function"==typeof e.getDate&&"function"==typeof e.setDate}(e))return"date";if(function(e){return e instanceof Error||"string"==typeof e.message&&e.constructor&&"number"==typeof e.constructor.stackTraceLimit}(e))return"error";const n=function(e){return"function"==typeof e.constructor?e.constructor.name:null}(e);switch(n){case"Symbol":case"Promise":case"WeakMap":case"WeakSet":case"Map":case"Set":return n}return Object.prototype.toString.call(e).slice(8,-1).toLowerCase().replace(/\s/g,"")}function me(e){let t=typeof e;return"production"!==process.env.NODE_ENV&&(t=he(e)),t}function ye(e,t,n){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?ue(2):`Expected the root reducer to be a function. Instead, received: '${me(e)}'`);if("function"==typeof t&&"function"==typeof n||"function"==typeof n&&"function"==typeof arguments[3])throw new Error("production"===process.env.NODE_ENV?ue(0):"It looks like you are passing several store enhancers to createStore(). This is not supported. Instead, compose them together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.");if("function"==typeof t&&void 0===n&&(n=t,t=void 0),void 0!==n){if("function"!=typeof n)throw new Error("production"===process.env.NODE_ENV?ue(1):`Expected the enhancer to be a function. Instead, received: '${me(n)}'`);return n(ye)(e,t)}let r=e,o=t,i=new Map,a=i,s=0,c=!1;function u(){a===i&&(a=new Map,i.forEach((e,t)=>{a.set(t,e)}))}function l(){if(c)throw new Error("production"===process.env.NODE_ENV?ue(3):"You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store.");return o}function d(e){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?ue(4):`Expected the listener to be a function. Instead, received: '${me(e)}'`);if(c)throw new Error("production"===process.env.NODE_ENV?ue(5):"You may not call store.subscribe() while the reducer is executing. If you would like to be notified after the store has been updated, subscribe from a component and invoke store.getState() in the callback to access the latest state. See https://redux.js.org/api/store#subscribelistener for more details.");let t=!0;u();const n=s++;return a.set(n,e),function(){if(t){if(c)throw new Error("production"===process.env.NODE_ENV?ue(6):"You may not unsubscribe from a store listener while the reducer is executing. See https://redux.js.org/api/store#subscribelistener for more details.");t=!1,u(),a.delete(n),i=null}}}function p(e){if(!fe(e))throw new Error("production"===process.env.NODE_ENV?ue(7):`Actions must be plain objects. Instead, the actual type was: '${me(e)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`);if(void 0===e.type)throw new Error("production"===process.env.NODE_ENV?ue(8):'Actions may not have an undefined "type" property. You may have misspelled an action type string constant.');if("string"!=typeof e.type)throw new Error("production"===process.env.NODE_ENV?ue(17):`Action "type" property must be a string. Instead, the actual type was: '${me(e.type)}'. Value was: '${e.type}' (stringified)`);if(c)throw new Error("production"===process.env.NODE_ENV?ue(9):"Reducers may not dispatch actions.");try{c=!0,o=r(o,e)}finally{c=!1}return(i=a).forEach(e=>{e()}),e}p({type:pe.INIT});return{dispatch:p,subscribe:d,getState:l,replaceReducer:function(e){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?ue(10):`Expected the nextReducer to be a function. Instead, received: '${me(e)}`);r=e,p({type:pe.REPLACE})},[le]:function(){const e=d;return{subscribe(t){if("object"!=typeof t||null===t)throw new Error("production"===process.env.NODE_ENV?ue(11):`Expected the observer to be an object. Instead, received: '${me(t)}'`);function n(){const e=t;e.next&&e.next(l())}n();return{unsubscribe:e(n)}},[le](){return this}}}}}function be(e){"undefined"!=typeof console&&console.error;try{throw new Error(e)}catch(e){}}function ve(e){const t=Object.keys(e),n={};for(let r=0;r<t.length;r++){const o=t[r];"production"!==process.env.NODE_ENV&&void 0===e[o]&&be(`No reducer provided for key "${o}"`),"function"==typeof e[o]&&(n[o]=e[o])}const r=Object.keys(n);let o,i;"production"!==process.env.NODE_ENV&&(o={});try{!function(e){Object.keys(e).forEach(t=>{const n=e[t];if(void 0===n(void 0,{type:pe.INIT}))throw new Error("production"===process.env.NODE_ENV?ue(12):`The slice reducer for key "${t}" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.`);if(void 0===n(void 0,{type:pe.PROBE_UNKNOWN_ACTION()}))throw new Error("production"===process.env.NODE_ENV?ue(13):`The slice reducer for key "${t}" returned undefined when probed with a random type. Don't try to handle '${pe.INIT}' or other actions in "redux/*" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.`)})}(n)}catch(e){i=e}return function(e={},t){if(i)throw i;if("production"!==process.env.NODE_ENV){const r=function(e,t,n,r){const o=Object.keys(t),i=n&&n.type===pe.INIT?"preloadedState argument passed to createStore":"previous state received by the reducer";if(0===o.length)return"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";if(!fe(e))return`The ${i} has unexpected type of "${me(e)}". Expected argument to be an object with the following keys: "${o.join('", "')}"`;const a=Object.keys(e).filter(e=>!t.hasOwnProperty(e)&&!r[e]);return a.forEach(e=>{r[e]=!0}),n&&n.type===pe.REPLACE?void 0:a.length>0?`Unexpected ${a.length>1?"keys":"key"} "${a.join('", "')}" found in ${i}. Expected to find one of the known reducer keys instead: "${o.join('", "')}". Unexpected keys will be ignored.`:void 0}(e,n,t,o);r&&be(r)}let a=!1;const s={};for(let o=0;o<r.length;o++){const i=r[o],c=n[i],u=e[i],l=c(u,t);if(void 0===l){const e=t&&t.type;throw new Error("production"===process.env.NODE_ENV?ue(14):`When called with an action of type ${e?`"${String(e)}"`:"(unknown type)"}, the slice reducer for key "${i}" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.`)}s[i]=l,a=a||l!==u}return a=a||r.length!==Object.keys(e).length,a?s:e}}function we(...e){return 0===e.length?e=>e:1===e.length?e[0]:e.reduce((e,t)=>(...n)=>e(t(...n)))}var ge=Symbol.for("immer-nothing"),_e=Symbol.for("immer-draftable"),Ee=Symbol.for("immer-state"),Oe="production"!==process.env.NODE_ENV?[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}]:[];function xe(e,...t){if("production"!==process.env.NODE_ENV){const n=Oe[e],r="function"==typeof n?n.apply(null,t):n;throw new Error(`[Immer] ${r}`)}throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var ke=Object.getPrototypeOf;function Ne(e){return!!e&&!!e[Ee]}function Pe(e){return!!e&&(Ae(e)||Array.isArray(e)||!!e[_e]||!!e.constructor?.[_e]||Te(e)||Re(e))}var Se=Object.prototype.constructor.toString(),je=new WeakMap;function Ae(e){if(!e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);if(null===t||t===Object.prototype)return!0;const n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(n===Object)return!0;if("function"!=typeof n)return!1;let r=je.get(n);return void 0===r&&(r=Function.toString.call(n),je.set(n,r)),r===Se}function De(e,t,n=!0){if(0===Ce(e)){(n?Reflect.ownKeys(e):Object.keys(e)).forEach(n=>{t(n,e[n],e)})}else e.forEach((n,r)=>t(r,n,e))}function Ce(e){const t=e[Ee];return t?t.type_:Array.isArray(e)?1:Te(e)?2:Re(e)?3:0}function Ie(e,t){return 2===Ce(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function Ve(e,t,n){const r=Ce(e);2===r?e.set(t,n):3===r?e.add(n):e[t]=n}function Te(e){return e instanceof Map}function Re(e){return e instanceof Set}function Le(e){return e.copy_||e.base_}function Ke(e,t){if(Te(e))return new Map(e);if(Re(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const n=Ae(e);if(!0===t||"class_only"===t&&!n){const t=Object.getOwnPropertyDescriptors(e);delete t[Ee];let n=Reflect.ownKeys(t);for(let r=0;r<n.length;r++){const o=n[r],i=t[o];!1===i.writable&&(i.writable=!0,i.configurable=!0),(i.get||i.set)&&(t[o]={configurable:!0,writable:!0,enumerable:i.enumerable,value:e[o]})}return Object.create(ke(e),t)}{const t=ke(e);if(null!==t&&n)return{...e};const r=Object.create(t);return Object.assign(r,e)}}function Fe(e,t=!1){return ze(e)||Ne(e)||!Pe(e)||(Ce(e)>1&&Object.defineProperties(e,{set:$e,add:$e,clear:$e,delete:$e}),Object.freeze(e),t&&Object.values(e).forEach(e=>Fe(e,!0))),e}var $e={value:function(){xe(2)}};function ze(e){return null===e||"object"!=typeof e||Object.isFrozen(e)}var Me,Be={};function Ue(e){const t=Be[e];return t||xe(0,e),t}function qe(){return Me}function We(e,t){t&&(Ue("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Ye(e){He(e),e.drafts_.forEach(Ge),e.drafts_=null}function He(e){e===Me&&(Me=e.parent_)}function Xe(e){return Me={drafts_:[],parent_:Me,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Ge(e){const t=e[Ee];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function Je(e,t){t.unfinalizedDrafts_=t.drafts_.length;const n=t.drafts_[0];return void 0!==e&&e!==n?(n[Ee].modified_&&(Ye(t),xe(4)),Pe(e)&&(e=Qe(t,e),t.parent_||et(t,e)),t.patches_&&Ue("Patches").generateReplacementPatches_(n[Ee].base_,e,t.patches_,t.inversePatches_)):e=Qe(t,n,[]),Ye(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==ge?e:void 0}function Qe(e,t,n){if(ze(t))return t;const r=e.immer_.shouldUseStrictIteration(),o=t[Ee];if(!o)return De(t,(r,i)=>Ze(e,o,t,r,i,n),r),t;if(o.scope_!==e)return t;if(!o.modified_)return et(e,o.base_,!0),o.base_;if(!o.finalized_){o.finalized_=!0,o.scope_.unfinalizedDrafts_--;const t=o.copy_;let i=t,a=!1;3===o.type_&&(i=new Set(t),t.clear(),a=!0),De(i,(r,i)=>Ze(e,o,t,r,i,n,a),r),et(e,t,!1),n&&e.patches_&&Ue("Patches").generatePatches_(o,n,e.patches_,e.inversePatches_)}return o.copy_}function Ze(e,t,n,r,o,i,a){if(null==o)return;if("object"!=typeof o&&!a)return;const s=ze(o);if(!s||a){if("production"!==process.env.NODE_ENV&&o===n&&xe(5),Ne(o)){const a=Qe(e,o,i&&t&&3!==t.type_&&!Ie(t.assigned_,r)?i.concat(r):void 0);if(Ve(n,r,a),!Ne(a))return;e.canAutoFreeze_=!1}else a&&n.add(o);if(Pe(o)&&!s){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;if(t&&t.base_&&t.base_[r]===o&&s)return;Qe(e,o),t&&t.scope_.parent_||"symbol"==typeof r||!(Te(n)?n.has(r):Object.prototype.propertyIsEnumerable.call(n,r))||et(e,o)}}}function et(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Fe(t,n)}var tt={get(e,t){if(t===Ee)return e;const n=Le(e);if(!Ie(n,t))return function(e,t,n){const r=ot(t,n);return r?"value"in r?r.value:r.get?.call(e.draft_):void 0}(e,n,t);const r=n[t];return e.finalized_||!Pe(r)?r:r===rt(e.base_,t)?(at(e),e.copy_[t]=st(r,e)):r},has:(e,t)=>t in Le(e),ownKeys:e=>Reflect.ownKeys(Le(e)),set(e,t,n){const r=ot(Le(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){const r=rt(Le(e),t),a=r?.[Ee];if(a&&a.base_===n)return e.copy_[t]=n,e.assigned_[t]=!1,!0;if(((o=n)===(i=r)?0!==o||1/o==1/i:o!=o&&i!=i)&&(void 0!==n||Ie(e.base_,t)))return!0;at(e),it(e)}var o,i;return e.copy_[t]===n&&(void 0!==n||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_[t]=!0),!0},deleteProperty:(e,t)=>(void 0!==rt(e.base_,t)||t in e.base_?(e.assigned_[t]=!1,at(e),it(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=Le(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{writable:!0,configurable:1!==e.type_||"length"!==t,enumerable:r.enumerable,value:n[t]}:r},defineProperty(){xe(11)},getPrototypeOf:e=>ke(e.base_),setPrototypeOf(){xe(12)}},nt={};function rt(e,t){const n=e[Ee];return(n?Le(n):e)[t]}function ot(e,t){if(!(t in e))return;let n=ke(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=ke(n)}}function it(e){e.modified_||(e.modified_=!0,e.parent_&&it(e.parent_))}function at(e){e.copy_||(e.copy_=Ke(e.base_,e.scope_.immer_.useStrictShallowCopy_))}De(tt,(e,t)=>{nt[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}}),nt.deleteProperty=function(e,t){return"production"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&xe(13),nt.set.call(this,e,t,void 0)},nt.set=function(e,t,n){return"production"!==process.env.NODE_ENV&&"length"!==t&&isNaN(parseInt(t))&&xe(14),tt.set.call(this,e[0],t,n,e[0])};function st(e,t){const n=Te(e)?Ue("MapSet").proxyMap_(e,t):Re(e)?Ue("MapSet").proxySet_(e,t):function(e,t){const n=Array.isArray(e),r={type_:n?1:0,scope_:t?t.scope_:qe(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let o=r,i=tt;n&&(o=[r],i=nt);const{revoke:a,proxy:s}=Proxy.revocable(o,i);return r.draft_=s,r.revoke_=a,s}(e,t);return(t?t.scope_:qe()).drafts_.push(n),n}function ct(e){if(!Pe(e)||ze(e))return e;const t=e[Ee];let n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Ke(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Ke(e,!0);return De(n,(e,t)=>{Ve(n,e,ct(t))},r),t&&(t.finalized_=!1),n}var ut=new class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(e,t,n)=>{if("function"==typeof e&&"function"!=typeof t){const n=t;t=e;const r=this;return function(e=n,...o){return r.produce(e,e=>t.call(this,e,...o))}}let r;if("function"!=typeof t&&xe(6),void 0!==n&&"function"!=typeof n&&xe(7),Pe(e)){const o=Xe(this),i=st(e,void 0);let a=!0;try{r=t(i),a=!1}finally{a?Ye(o):He(o)}return We(o,n),Je(r,o)}if(!e||"object"!=typeof e){if(r=t(e),void 0===r&&(r=e),r===ge&&(r=void 0),this.autoFreeze_&&Fe(r,!0),n){const t=[],o=[];Ue("Patches").generateReplacementPatches_(e,r,t,o),n(t,o)}return r}xe(1,e)},this.produceWithPatches=(e,t)=>{if("function"==typeof e)return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},"boolean"==typeof e?.autoFreeze&&this.setAutoFreeze(e.autoFreeze),"boolean"==typeof e?.useStrictShallowCopy&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),"boolean"==typeof e?.useStrictIteration&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){Pe(e)||xe(8),Ne(e)&&(e=function(e){Ne(e)||xe(10,e);return ct(e)}(e));const t=Xe(this),n=st(e,void 0);return n[Ee].isManual_=!0,He(t),n}finishDraft(e,t){const n=e&&e[Ee];n&&n.isManual_||xe(9);const{scope_:r}=n;return We(r,t),Je(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));const r=Ue("Patches").applyPatches_;return Ne(e)?r(e,t):this.produce(e,e=>r(e,t))}};ut.produce;var lt=ut.setUseStrictIteration.bind(ut);function dt(e){return({dispatch:t,getState:n})=>r=>o=>"function"==typeof o?o(t,n,e):r(o)}var pt=dt(),ft=dt,ht="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(0!==arguments.length)return"object"==typeof arguments[0]?we:we.apply(null,arguments)};function mt(e){return"function"==typeof e&&"type"in e&&((t=e)&&"function"==typeof t.match);var t}function yt(e,t){let n=0;return{measureTime(e){const t=Date.now();try{return e()}finally{const e=Date.now();n+=e-t}},warnIfExceeded(){}}}var bt=class e extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,e.prototype)}static get[Symbol.species](){return e}concat(...e){return super.concat.apply(this,e)}prepend(...t){return 1===t.length&&Array.isArray(t[0])?new e(...t[0].concat(this)):new e(...t.concat(this))}};function vt(e){return"object"!=typeof e||null==e||Object.isFrozen(e)}function wt(e,t,n){const r=gt(e,t,n);return{detectMutations:()=>_t(e,t,r,n)}}function gt(e,t=[],n,r="",o=new Set){const i={value:n};if(!e(n)&&!o.has(n)){o.add(n),i.children={};for(const o in n){const a=r?r+"."+o:o;t.length&&-1!==t.indexOf(a)||(i.children[o]=gt(e,t,n[o],a))}}return i}function _t(e,t=[],n,r,o=!1,i=""){const a=n?n.value:void 0,s=a===r;if(o&&!s&&!Number.isNaN(r))return{wasMutated:!0,path:i};if(e(a)||e(r))return{wasMutated:!1};const c={};for(let e in n.children)c[e]=!0;for(let e in r)c[e]=!0;const u=t.length>0;for(let o in c){const a=i?i+"."+o:o;if(u){if(t.some(e=>e instanceof RegExp?e.test(a):a===e))continue}const c=_t(e,t,n.children[o],r[o],s,a);if(c.wasMutated)return c}return{wasMutated:!1}}function Et(e){const t=typeof e;return null==e||"string"===t||"boolean"===t||"number"===t||Array.isArray(e)||fe(e)}function Ot(e,t="",n=Et,r,o=[],i){let a;if(!n(e))return{keyPath:t||"<root>",value:e};if("object"!=typeof e||null===e)return!1;if(i?.has(e))return!1;const s=null!=r?r(e):Object.entries(e),c=o.length>0;for(const[e,u]of s){const s=t?t+"."+e:e;if(c){if(o.some(e=>e instanceof RegExp?e.test(s):s===e))continue}if(!n(u))return{keyPath:s,value:u};if("object"==typeof u&&(a=Ot(u,s,n,r,o,i),a))return a}return i&&xt(e)&&i.add(e),!1}function xt(e){if(!Object.isFrozen(e))return!1;for(const t of Object.values(e))if("object"==typeof t&&null!==t&&!xt(t))return!1;return!0}function kt(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);{const{isSerializable:t=Et,getEntries:n,ignoredActions:r=[],ignoredActionPaths:o=["meta.arg","meta.baseQueryMeta"],ignoredPaths:i=[],warnAfter:a=32,ignoreState:s=!1,ignoreActions:c=!1,disableCache:u=!1}=e,l=!u&&WeakSet?new WeakSet:void 0;return e=>a=>u=>{if(!function(e){return fe(e)&&"type"in e&&"string"==typeof e.type}(u))return a(u);const d=a(u),p=yt();return c||r.length&&-1!==r.indexOf(u.type)||p.measureTime(()=>{const e=Ot(u,"",t,n,o,l);if(e){const{keyPath:t,value:n}=e}}),s||(p.measureTime(()=>{const r=Ot(e.getState(),"",t,n,i,l);if(r){const{keyPath:e,value:t}=r}}),p.warnIfExceeded()),d}}}function Nt(e){return"boolean"==typeof e}var Pt=()=>function(e){const{thunk:t=!0,immutableCheck:n=!0,serializableCheck:r=!0,actionCreatorCheck:o=!0}=e??{};let i=new bt;if(t&&(Nt(t)?i.push(pt):i.push(ft(t.extraArgument))),"production"!==process.env.NODE_ENV){if(n){let e={};Nt(n)||(e=n),i.unshift(function(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);{let t=function(e,t,r,o){return JSON.stringify(e,n(t,o),r)},n=function(e,t){let n=[],r=[];return t||(t=function(e,t){return n[0]===t?"[Circular ~]":"[Circular ~."+r.slice(0,n.indexOf(t)).join(".")+"]"}),function(o,i){if(n.length>0){var a=n.indexOf(this);~a?n.splice(a+1):n.push(this),~a?r.splice(a,1/0,o):r.push(o),~n.indexOf(i)&&(i=t.call(this,o,i))}else n.push(i);return null==e?i:e.call(this,o,i)}},{isImmutable:r=vt,ignoredPaths:o,warnAfter:i=32}=e;const a=wt.bind(null,r,o);return({getState:e})=>{let n,r=e(),o=a(r);return i=>s=>{const c=yt();c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?Dt(19):`A state mutation was detected between dispatches, in the path '${n.path||""}'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`)});const u=i(s);return c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?Dt(20):`A state mutation was detected inside a dispatch, in the path: ${n.path||""}. Take a look at the reducer(s) handling the action ${t(s)}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`)}),c.warnIfExceeded(),u}}}}(e))}if(r){let e={};Nt(r)||(e=r),i.push(kt(e))}if(o){let e={};Nt(o)||(e=o),i.unshift(function(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);const{isActionCreator:t=mt}=e;return()=>e=>n=>(t(n),e(n))}(e))}}return i},St=e=>t=>{setTimeout(t,e)},jt=e=>function(t){const{autoBatch:n=!0}=t??{};let r=new bt(e);return n&&r.push(((e={type:"raf"})=>t=>(...n)=>{const r=t(...n);let o=!0,i=!1,a=!1;const s=new Set,c="tick"===e.type?queueMicrotask:"raf"===e.type?"undefined"!=typeof window&&window.requestAnimationFrame?window.requestAnimationFrame:St(10):"callback"===e.type?e.queueNotification:St(e.timeout),u=()=>{a=!1,i&&(i=!1,s.forEach(e=>e()))};return Object.assign({},r,{subscribe(e){const t=r.subscribe(()=>o&&e());return s.add(e),()=>{t(),s.delete(e)}},dispatch(e){try{return o=!e?.meta?.RTK_autoBatch,i=!o,i&&(a||(a=!0,c(u))),r.dispatch(e)}finally{o=!0}}})})("object"==typeof n?n:void 0)),r};function At(e){const t=Pt(),{reducer:n,middleware:r,devTools:o=!0,duplicateMiddlewareCheck:i=!0,preloadedState:a,enhancers:s}=e||{};let c,u;if("function"==typeof n)c=n;else{if(!fe(n))throw new Error("production"===process.env.NODE_ENV?Dt(1):"`reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers");c=ve(n)}if("production"!==process.env.NODE_ENV&&r&&"function"!=typeof r)throw new Error("production"===process.env.NODE_ENV?Dt(2):"`middleware` field must be a callback");if("function"==typeof r){if(u=r(t),"production"!==process.env.NODE_ENV&&!Array.isArray(u))throw new Error("production"===process.env.NODE_ENV?Dt(3):"when using a middleware builder function, an array of middleware must be returned")}else u=t();if("production"!==process.env.NODE_ENV&&u.some(e=>"function"!=typeof e))throw new Error("production"===process.env.NODE_ENV?Dt(4):"each middleware provided to configureStore must be a function");if("production"!==process.env.NODE_ENV&&i){let e=new Set;u.forEach(t=>{if(e.has(t))throw new Error("production"===process.env.NODE_ENV?Dt(42):"Duplicate middleware references found when creating the store. Ensure that each middleware is only included once.");e.add(t)})}let l=we;o&&(l=ht({trace:"production"!==process.env.NODE_ENV,..."object"==typeof o&&o}));const d=function(...e){return t=>(n,r)=>{const o=t(n,r);let i=()=>{throw new Error("production"===process.env.NODE_ENV?ue(15):"Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")};const a={getState:o.getState,dispatch:(e,...t)=>i(e,...t)},s=e.map(e=>e(a));return i=we(...s)(o.dispatch),{...o,dispatch:i}}}(...u),p=jt(d);if("production"!==process.env.NODE_ENV&&s&&"function"!=typeof s)throw new Error("production"===process.env.NODE_ENV?Dt(5):"`enhancers` field must be a callback");let f="function"==typeof s?s(p):p();if("production"!==process.env.NODE_ENV&&!Array.isArray(f))throw new Error("production"===process.env.NODE_ENV?Dt(6):"`enhancers` callback must return an array");if("production"!==process.env.NODE_ENV&&f.some(e=>"function"!=typeof e))throw new Error("production"===process.env.NODE_ENV?Dt(7):"each enhancer provided to configureStore must be a function");"production"!==process.env.NODE_ENV&&u.length&&f.includes(d);return ye(c,a,l(...f))}function Dt(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}lt(!1);var Ct=v(void 0),It=function(e){var t=e.children,o=M.useState(function(e){return e.snackbar});return n(Ct.Provider,{value:{showSnackbar:function(e,t){void 0===t&&(t="info"),M.update(function(n){n.snackbar.open=!0,n.snackbar.message=e,n.snackbar.severity=t})}},children:[t,r(m,{open:o.open,message:o.message,severity:o.severity,autoHideDuration:1500,onClose:function(){M.update(function(e){e.snackbar.open=!1})}})]})},Vt=function(e){var t=e.children,n=e.basename,o=e.reducers,i=void 0===o?{}:o,a=new O({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:!1,useErrorBoundary:!0}}}),s=U&&q&&W?"/".concat(q,"/").concat(W):"/";g(function(){"/"===window.location.pathname&&q&&W&&U&&window.location.replace(window.location.origin+"/".concat(q,"/").concat(W))},[q,U,W]);var c=At({reducer:ve(i)});return r(T,{store:c,children:r(P,{basename:null!=n?n:s,children:r(x,{client:a,children:r(It,{children:r(Q,{children:t})})})})})},Tt={isOpen:!1,title:"",message:"",confirmButtonText:"",cancelButtonText:"",type:"confirm",onConfirm:function(){},onCancel:function(){}},Rt=function(){var e=function(){M.update(function(e){e.confirmDialog=Tt})};return function(t){var n=t.title,r=t.message,o=t.confirmButtonText,i=t.cancelButtonText,a=t.type,s=void 0===a?"confirm":a;return new Promise(function(t){M.update(function(a){a.confirmDialog={isOpen:!0,title:n,message:r,confirmButtonText:o,cancelButtonText:i,type:s,onConfirm:function(){t(!0),e()},onCancel:function(){t(!1),e()}}})})}},Lt=function(e){return r(y,R({label:"Batch"},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/batches"}))},Kt=function(e){return r(y,R({dbLabelProps:{labelKey:"courseName",subLabelKey:"level"}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/courses"}))},Ft=function(e){return r(y,R({dbLabelProps:{labelKey:"name"},dbValueProps:{valueKey:"_id",isObjectId:!0}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/departments"}))},$t=function(e){return r(y,R({dbValueProps:{valueKey:"_id",isObjectId:!0},dbLabelProps:{labelKey:"fullName",subLabelKey:"employeeId"}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/employees"}))},zt=function(e){return r(y,R({label:"Regulation"},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/exam-regulations",dbLabelProps:{labelKey:"r.name"},dbValueProps:{valueKey:"r.name"}}))},Mt=[{label:"All",value:null},{label:"REGULAR",value:"R"},{label:"SUPPLEMENTARY",value:"S"}],Bt=function(e){return r(y,R({label:"Exam Type",options:Mt},e))},Ut=[{label:"Tuition Fee",value:"tuition_fee"},{label:"Admission Fee",value:"admission_fee"},{label:"Hostel Fee",value:"hostel_fee"},{label:"Transport Fee",value:"transport_fee"},{label:"Exam Fee",value:"exam_fee"},{label:"Other Fee",value:"other_fee"}],qt=Array.from({length:6},function(e,t){return(new Date).getFullYear()-t});Array.from({length:12},function(e,t){return{label:"".concat((new Date).getFullYear()-t," - ").concat((new Date).getFullYear()-t+1),value:"".concat((new Date).getFullYear()-t," - ").concat((new Date).getFullYear()-t+1)}});var Wt=function(e){return r(y,R({label:"Fee Type",options:null==Ut?void 0:Ut.map(function(e){return{label:e.label,value:e.value}})},e))},Yt=function(e){return r(y,R({dbValueProps:{valueKey:"id",isInt:!0},dbLabelProps:{labelKey:"name",subLabelKey:"type",useLabelStartCase:!0,useSubLabelStartCase:!0}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/hostel-blocks"}))},Ht=function(e){return r(y,R({label:"Hostel Room No.",dbValueProps:{valueKey:"floor"},dbLabelProps:{labelKey:"floor"}},e,{externalAxios:G,optionsApiEndPoint:"dropdowns/floors"}))},Xt=function(e){return r(y,R({label:"Hostel Room",dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"room_number",useLabelStartCase:!0}},e,{optionsApiEndPoint:"dropdowns/hostel-rooms",externalAxios:G}))},Gt=function(e){return r(y,R({label:"Month & Year"},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/month-years"}))},Jt=function(e){return r(y,R({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/print-formats"}))},Qt=function(e){return r(y,R({dbLabelProps:{labelKey:"branchCode",subLabelKey:"branchDisplay"}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/programs"}))},Zt=function(e){return r(y,R({label:"Regulation",dbValueProps:{valueKey:"regulation_id"},dbLabelProps:{labelKey:"r.name"}},e,{optionsApiEndPoint:"dropdowns/regulations",externalAxios:G}))},en=function(e){return r(y,R({dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"name",subLabelKey:"organization"}},e,{optionsApiEndPoint:"dropdowns/research-experts",externalAxios:G}))},tn=function(e){return r(y,R({dbValueProps:{valueKey:"`order`"},dbLabelProps:{labelKey:"name",subLabelKey:"`order`"}},e,{optionsApiEndPoint:"dropdowns/research-stages",externalAxios:G}))},nn=function(e){return r(y,R({dbLabelProps:{labelKey:"name",subLabelKey:"year"}},e,{optionsApiEndPoint:"/dropdowns/semesters",externalAxios:G}))},rn=function(e){return r(y,R({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/students"}))},on=function(e){return r(y,R({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/student-services"}))},an=function(e){var t=e.suffix,n=void 0===t?null:t,o=e.valueKey,i=void 0===o?"yearRange":o,a=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}(e,["suffix","valueKey"]);return r(y,R({label:"Year Range",options:null==qt?void 0:qt.map(function(e){return{label:n?"".concat(n," ").concat(e," - ").concat(e+1):"".concat(e," - ").concat(e+1),value:"yearRange"===i?"".concat(e," - ").concat(e+1):e}})},a))},sn=function(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=!1);var r=window.location.pathname.split("/"),o=[];!t&&r[1]&&o.push(r[1]),!n&&r[2]&&o.push(r[2]);var i=o.length>0?"/"+o.join("/"):"",a="".concat(window.location.origin).concat(i,"/").concat(e);window.open(a,"_blank")};export{M as ApplicationStore,Lt as BatchSelector,Q as ConfirmDialogProvider,Kt as CourseSelector,Ft as DepartmentSelector,$t as EmployeesSelector,ae as ErrorBoundary,Bt as ExamTypeSelector,zt as ExamsRegulationSelector,Wt as FeeTypeSelector,Yt as HostelBlockSelector,Ht as HostelFloorSelector,Xt as HostelRoomSelector,Gt as MonthYearSelector,Jt as PrintFormatSelector,Qt as ProgramSelector,Vt as Providers,Zt as RegulationSelector,en as ResearchExpertSelector,tn as ResearchStageSelector,nn as SemesterSelector,It as SnackbarProvider,rn as StudentSelector,on as StudentServicesSelector,an as YearRangeSelector,H as axios,X as createRsbuildSharedConfig,z as initialApplicationState,q as institutionCode,B as isDevelopment,G as nonWorkspaceAxios,sn as openInNewTab,U as tenantCode,Rt as useConfirm,W as workspace,Y as workspaceApiMapping};
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvanMtY29va2llL2Rpc3QvanMuY29va2llLm1qcyIsIi4uLy4uL3NyYy9jb250ZXh0L2FwcGxpY2F0aW9uLXN0b3JlLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2NvbnN0YW50cy50cyIsIi4uLy4uL3NyYy9jb25maWcvYXhpb3MudHMiLCIuLi8uLi9zcmMvY29uZmlnL2NyZWF0ZVJzYnVpbGRTaGFyZWRDb25maWcudHMiLCIuLi8uLi9zcmMvY29uZmlnL25vbldvcmtzcGFjZUF4aW9zLnRzIiwiLi4vLi4vc3JjL2NvbnRleHQvQ29uZmlybURpYWxvZ1Byb3ZpZGVyLnRzeCIsIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1lcnJvci1ib3VuZGFyeS9kaXN0L3JlYWN0LWVycm9yLWJvdW5kYXJ5LmVzbS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bob29rZm9ybS9yZXNvbHZlcnMveXVwL2Rpc3QveXVwLm1qcyIsIi4uLy4uL3NyYy9jb250ZXh0L0Vycm9yQm91bmRhcnkvTG9naW4udHN4IiwiLi4vLi4vc3JjL2NvbnRleHQvRXJyb3JCb3VuZGFyeS9FcnJvckJvdW5kYXJ5LnRzeCIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWR1eC9kaXN0L3JlZHV4Lm1qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcmVkdXhqcy90b29sa2l0L25vZGVfbW9kdWxlcy9pbW1lci9kaXN0L2ltbWVyLm1qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWR1eC10aHVuay9kaXN0L3JlZHV4LXRodW5rLm1qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcmVkdXhqcy90b29sa2l0L2Rpc3QvcmVkdXgtdG9vbGtpdC5tb2Rlcm4ubWpzIiwiLi4vLi4vc3JjL2NvbnRleHQvU25hY2tiYXJQcm92aWRlci50c3giLCIuLi8uLi9zcmMvY29udGV4dC9Qcm92aWRlcnMudHN4IiwiLi4vLi4vc3JjL2hvb2tzL3VzZUNvbmZpcm0udHMiLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0JhdGNoU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Db3Vyc2VTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0RlcGFydG1lbnRTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0VtcGxveWVlc1NlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRXhhbVJlZ3VsYXRpb25TZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0V4YW1UeXBlU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy91dGlscy50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0ZlZVR5cGVTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0hvc3RlbEJsb2NrU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Ib3N0ZWxGbG9vclNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvSG9zdGVsUm9vbVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvTW9udGhZZWFyU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9QcmludEZvcm1hdFNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvUHJvZ3JhbVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvUmVndWxhdGlvblNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvUmVzZWFyY2hFeHBlcnRTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1Jlc2VhcmNoU3RhZ2VTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1NlbWVzdGVyU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9TdHVkZW50U2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9TdHVkZW50U2VydmljZXNTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1llYXJSYW5nZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy91dGlscy9vcGVuSW5OZXdUYWIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xyXG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XHJcbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xyXG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XHJcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcclxuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XHJcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xyXG4gICAgZG9uZSA9IHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xyXG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XHJcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xyXG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xyXG4gICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgdmFyIGFyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG93bktleXMobyk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XHJcbiAgICAgICAgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcclxuICAgICAgICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcclxuICAgICAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG5cclxufVxyXG5cclxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XHJcbiAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XHJcbiAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHZhciByLCBzID0gMDtcclxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBzIHw9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGZhaWwoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XHJcbiAgICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBfX2V4dGVuZHM6IF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduOiBfX2Fzc2lnbixcclxuICAgIF9fcmVzdDogX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZTogX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW06IF9fcGFyYW0sXHJcbiAgICBfX2VzRGVjb3JhdGU6IF9fZXNEZWNvcmF0ZSxcclxuICAgIF9fcnVuSW5pdGlhbGl6ZXJzOiBfX3J1bkluaXRpYWxpemVycyxcclxuICAgIF9fcHJvcEtleTogX19wcm9wS2V5LFxyXG4gICAgX19zZXRGdW5jdGlvbk5hbWU6IF9fc2V0RnVuY3Rpb25OYW1lLFxyXG4gICAgX19tZXRhZGF0YTogX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcjogX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nOiBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXI6IF9fZXhwb3J0U3RhcixcclxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZDogX19yZWFkLFxyXG4gICAgX19zcHJlYWQ6IF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheTogX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yOiBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdDogX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXI6IF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW46IF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxuICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlOiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlczogX19kaXNwb3NlUmVzb3VyY2VzLFxyXG4gICAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb246IF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxyXG59O1xyXG4iLCIvKiEganMtY29va2llIHYzLjAuNSB8IE1JVCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5mdW5jdGlvbiBhc3NpZ24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldFxufVxuLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG52YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgcmVhZDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlWzBdID09PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyglW1xcZEEtRl17Mn0pKy9naSwgZGVjb2RlVVJJQ29tcG9uZW50KVxuICB9LFxuICB3cml0ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkucmVwbGFjZShcbiAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgIGRlY29kZVVSSUNvbXBvbmVudFxuICAgIClcbiAgfVxufTtcbi8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG5mdW5jdGlvbiBpbml0IChjb252ZXJ0ZXIsIGRlZmF1bHRBdHRyaWJ1dGVzKSB7XG4gIGZ1bmN0aW9uIHNldCAobmFtZSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgZGVmYXVsdEF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlcy5leHBpcmVzKSB7XG4gICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICB9XG5cbiAgICBuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpXG4gICAgICAucmVwbGFjZSgvJSgyWzM0NkJdfDVFfDYwfDdDKS9nLCBkZWNvZGVVUklDb21wb25lbnQpXG4gICAgICAucmVwbGFjZSgvWygpXS9nLCBlc2NhcGUpO1xuXG4gICAgdmFyIHN0cmluZ2lmaWVkQXR0cmlidXRlcyA9ICcnO1xuICAgIGZvciAodmFyIGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykge1xuICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblxuICAgICAgaWYgKGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gQ29uc2lkZXJzIFJGQyA2MjY1IHNlY3Rpb24gNS4yOlxuICAgICAgLy8gLi4uXG4gICAgICAvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gICAgICAvLyAgICAgY2hhcmFjdGVyOlxuICAgICAgLy8gQ29uc3VtZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyB1cCB0byxcbiAgICAgIC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgICAgLy8gLi4uXG4gICAgICBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJz0nICsgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS5zcGxpdCgnOycpWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAoZG9jdW1lbnQuY29va2llID1cbiAgICAgIG5hbWUgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIG5hbWUpICsgc3RyaW5naWZpZWRBdHRyaWJ1dGVzKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0IChuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgKGFyZ3VtZW50cy5sZW5ndGggJiYgIW5hbWUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG4gICAgLy8gaW4gY2FzZSB0aGVyZSBhcmUgbm8gY29va2llcyBhdCBhbGwuXG4gICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUgPyBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsgJykgOiBbXTtcbiAgICB2YXIgamFyID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFydHMgPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7XG4gICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBmb3VuZCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1swXSk7XG4gICAgICAgIGphcltmb3VuZF0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmQpO1xuXG4gICAgICAgIGlmIChuYW1lID09PSBmb3VuZCkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWUgPyBqYXJbbmFtZV0gOiBqYXJcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuY3JlYXRlKFxuICAgIHtcbiAgICAgIHNldCxcbiAgICAgIGdldCxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gKG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgc2V0KFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgYXNzaWduKHt9LCBhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICBleHBpcmVzOiAtMVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgd2l0aEF0dHJpYnV0ZXM6IGZ1bmN0aW9uIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiBpbml0KHRoaXMuY29udmVydGVyLCBhc3NpZ24oe30sIHRoaXMuYXR0cmlidXRlcywgYXR0cmlidXRlcykpXG4gICAgICB9LFxuICAgICAgd2l0aENvbnZlcnRlcjogZnVuY3Rpb24gKGNvbnZlcnRlcikge1xuICAgICAgICByZXR1cm4gaW5pdChhc3NpZ24oe30sIHRoaXMuY29udmVydGVyLCBjb252ZXJ0ZXIpLCB0aGlzLmF0dHJpYnV0ZXMpXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBhdHRyaWJ1dGVzOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGRlZmF1bHRBdHRyaWJ1dGVzKSB9LFxuICAgICAgY29udmVydGVyOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGNvbnZlcnRlcikgfVxuICAgIH1cbiAgKVxufVxuXG52YXIgYXBpID0gaW5pdChkZWZhdWx0Q29udmVydGVyLCB7IHBhdGg6ICcvJyB9KTtcbi8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbmV4cG9ydCB7IGFwaSBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgeyBTdG9yZSB9IGZyb20gJ3B1bGxzdGF0ZSc7XG5leHBvcnQgdmFyIGluaXRpYWxBcHBsaWNhdGlvblN0YXRlID0ge1xuICAgIGlzTG9naW5EaWFsb2dPcGVuOiBmYWxzZSxcbiAgICBzbmFja2Jhcjoge1xuICAgICAgICBvcGVuOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIHNldmVyaXR5OiAnc3VjY2VzcycsXG4gICAgfSxcbiAgICBjb25maXJtRGlhbG9nOiB7XG4gICAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIG9uQ29uZmlybTogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvbkNhbmNlbDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICB0eXBlOiAnY29uZmlybScsXG4gICAgfSxcbiAgICB1c2VyOiB1bmRlZmluZWQsXG4gICAgaW5zdGl0dXRpb25JbmZvOiB1bmRlZmluZWQsXG4gICAgYXNzZXQ6IHVuZGVmaW5lZCxcbn07XG5leHBvcnQgdmFyIEFwcGxpY2F0aW9uU3RvcmUgPSBuZXcgU3RvcmUoaW5pdGlhbEFwcGxpY2F0aW9uU3RhdGUpO1xuIiwiZXhwb3J0IHZhciBpc0RldmVsb3BtZW50ID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluY2x1ZGVzKCdsb2NhbGhvc3QnKTtcbmV4cG9ydCB2YXIgdGVuYW50Q29kZSA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5zcGxpdCgnLicpWzBdO1xuLy8gaWYgdXJsIHNlYXJjaGVkIGlzIGF1cHVsc2UuY2FtcHguaW4gdGhlbiByZWRpcmVjdCB0byBhdXB1bHNlLmNhbXB4LmluL2F1cHVsc2VcbmV4cG9ydCB2YXIgaW5zdGl0dXRpb25Db2RlID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCcvJylbMV07XG5leHBvcnQgdmFyIHdvcmtzcGFjZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpWzJdO1xuLy8gV29ya3NwYWNlIHRvIEFQSSBlbmRwb2ludCBwcmVmaXggbWFwcGluZ1xuZXhwb3J0IHZhciB3b3Jrc3BhY2VBcGlNYXBwaW5nID0ge1xuICAgICdzdHVkZW50LXdvcmtzcGFjZSc6ICcvc3R1ZGVudC1hcGknLFxuICAgICdmYWN1bHR5LXdvcmtzcGFjZSc6ICcvZmFjdWx0eS1hcGknLFxuICAgICdkZXBhcnRtZW50LXdvcmtzcGFjZSc6ICcvZGVwYXJ0bWVudC1hcGknLFxuICAgICdhY2FkZW1pYy1jb29yZGluYXRvci13b3Jrc3BhY2UnOiAnL2FjYWRlbWljLWNvb3JkaW5hdG9yLWFwaScsXG4gICAgJ2ZlZWRiYWNrLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvZmVlZGJhY2stY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnY291cnNlLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvY291cnNlLWNvb3JkaW5hdG9yLWFwaScsXG4gICAgJ2NsYXNzcm9vbS1jb29yZGluYXRvci13b3Jrc3BhY2UnOiAnL2NsYXNzcm9vbS1jb29yZGluYXRvci1hcGknLFxuICAgICdhY2FkZW1pYy1hZG1pbi13b3Jrc3BhY2UnOiAnL2FjYWRlbWljLWFkbWluLWFwaScsXG4gICAgJ2hvc3RlbC1hZG1pbi13b3Jrc3BhY2UnOiAnL2hvc3RlbC1hZG1pbi1hcGknLFxuICAgICd0cmFuc3BvcnQtY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy90cmFuc3BvcnQtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnZW1wbG95ZWUtd29ya3NwYWNlJzogJy9lbXBsb3llZS1hcGknLFxuICAgICdsaWJyYXJpYW4td29ya3NwYWNlJzogJy9saWJyYXJpYW4tYXBpJyxcbiAgICAnZmVlLXRlcm1pbmFsJzogJy9mZWUtdGVybWluYWwtYXBpJyxcbiAgICAnYWNjb3VudHMtb2ZmaWNlci13b3Jrc3BhY2UnOiAnYWNjb3VudHMtb2ZmaWNlci1hcGknLFxuICAgICdmaW5hbmNlLW9mZmljZXItd29ya3NwYWNlJzogJ2ZpbmFuY2Utb2ZmaWNlci1hcGknLFxuICAgICdvdXRyZWFjaC1hZ2VudC13b3Jrc3BhY2UnOiAnb3V0cmVhY2gtYWdlbnQtYXBpJyxcbiAgICAncHJvc3BlY3Qtd29ya3NwYWNlJzogJ3Byb3NwZWN0LWFwaScsXG4gICAgJ3Jlc2VhcmNoLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICdyZXNlYXJjaC1jb29yZGluYXRvci1hcGknLFxuICAgICd0ZWxlLWNvdW5zZWxsb3Itd29ya3NwYWNlJzogJ3RlbGUtY291bnNlbGxvci1hcGknLFxuICAgICd0ZWFtLW93bmVyLXdvcmtzcGFjZSc6ICcvdGVhbS1vd25lci1hcGknLFxuICAgICdhZG1pc3Npb25zLWNvdW5zZWxsb3Itd29ya3NwYWNlJzogJy9hZG1pc3Npb25zLWNvdW5zZWxsb3ItYXBpJyxcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IEF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9hcHBsaWNhdGlvbi1zdG9yZSc7XG5pbXBvcnQgeyBpbnN0aXR1dGlvbkNvZGUsIGlzRGV2ZWxvcG1lbnQsIHRlbmFudENvZGUsIHdvcmtzcGFjZSwgd29ya3NwYWNlQXBpTWFwcGluZywgfSBmcm9tICcuLi91dGlscy9jb25zdGFudHMnO1xuLy8gR2V0IGJhc2UgVVJMIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG52YXIgZ2V0QmFzZVVybCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBGb3IgQ3JlYXRlIFJlYWN0IEFwcFxuICAgIHJldHVybiBwcm9jZXNzLmVudi5SRUFDVF9BUFBfQVBJX0hPU1QgfHwgJyc7XG59O1xuLy8gRm9ybWF0IHF1ZXJ5IHBhcmFtZXRlcnNcbnZhciBmb3JtYXRQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXJhbXMgIT09IG51bGwgJiYgcGFyYW1zICE9PSB2b2lkIDAgPyBwYXJhbXMgOiB7fSkubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSA9PT0gJ19fZW1wdHlfXycgPyAnJyA6IHZhbHVlLFxuICAgICAgICBdO1xuICAgIH0pKTtcbn07XG4vLyBDcmVhdGUgYXhpb3MgaW5zdGFuY2VcbmV4cG9ydCB2YXIgYXhpb3MgPSBBeGlvcy5jcmVhdGUoe1xuICAgIGJhc2VVUkw6IGdldEJhc2VVcmwoKSxcbiAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgaGVhZGVyczoge1xuICAgICAgICAneC10ZW5hbnQtaWQnOiB0ZW5hbnRDb2RlLFxuICAgICAgICAneC1pbnN0aXR1dGlvbi1jb2RlJzogaW5zdGl0dXRpb25Db2RlLFxuICAgIH0sXG59KTtcbi8vIFJlcXVlc3QgaW50ZXJjZXB0b3JcbmF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgLy8gRm9ybWF0IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICB2YXIgcGFyYW1zID0gZm9ybWF0UGFyYW1zKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5wYXJhbXMpO1xuICAgIC8vIEhhbmRsZSB3b3Jrc3BhY2Ugcm91dGluZyAoZGVmYXVsdDogdHJ1ZSlcbiAgICBpZiAoY29uZmlnLndvcmtzcGFjZSAhPT0gZmFsc2UgJiZcbiAgICAgICAgd29ya3NwYWNlICYmXG4gICAgICAgIHdvcmtzcGFjZUFwaU1hcHBpbmdbd29ya3NwYWNlXSAmJlxuICAgICAgICB3b3Jrc3BhY2UgIT09ICdjb21tb24td29ya3NwYWNlJykge1xuICAgICAgICB2YXIgd29ya3NwYWNlUHJlZml4ID0gd29ya3NwYWNlQXBpTWFwcGluZ1t3b3Jrc3BhY2VdO1xuICAgICAgICBjb25maWcudXJsID0gXCJcIi5jb25jYXQod29ya3NwYWNlUHJlZml4KS5jb25jYXQoY29uZmlnLnVybCk7XG4gICAgfVxuICAgIC8vIEFkZCBzZXNzaW9uIHRva2VucyBmcm9tIGNvb2tpZXMgaWYgaW4gZGV2ZWxvcG1lbnRcbiAgICB2YXIgc2Vzc2lvbktleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zZXNzaW9uX2tleScpO1xuICAgIHZhciBvcGVuUGF5bWVudHNLZXkgPSBDb29raWVzLmdldCgnY2FtcHhfb3Blbl9wYXltZW50c19rZXknKTtcbiAgICB2YXIgc3R1ZGVudFNlc3Npb25LZXkgPSBDb29raWVzLmdldCgnY2FtcHhfc3R1ZGVudF9rZXknKTtcbiAgICBpZiAoaXNEZXZlbG9wbWVudCAmJiBzZXNzaW9uS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfc2Vzc2lvbl9rZXknLCBzZXNzaW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKGlzRGV2ZWxvcG1lbnQgJiYgc3R1ZGVudFNlc3Npb25LZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9zdHVkZW50X2tleScsIHN0dWRlbnRTZXNzaW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKG9wZW5QYXltZW50c0tleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X29wZW5fcGF5bWVudHNfa2V5Jywgb3BlblBheW1lbnRzS2V5KTtcbiAgICB9XG4gICAgLy8gU2tpcCBzZW5kaW5nIFgtaW5zdGl0dXRpb24tY29kZSBpZiB0aGUgZmxhZyBpcyBzZXRcbiAgICBpZiAoY29uZmlnLnNraXBJbnN0aXR1dGlvbkNvZGUpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuZGVsZXRlKCd4LWluc3RpdHV0aW9uLWNvZGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb25maWcpLCB7IHBhcmFtczogcGFyYW1zIH0pO1xufSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbn0pO1xuLy8gUmVzcG9uc2UgaW50ZXJjZXB0b3JcbmF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vIENoZWNrIGlmIHRoZSByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2EgPSByZXNwb25zZS5kYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgc3VjY2Vzc2Z1bCByZXNwb25zZXNcbiAgICBpZiAoIXNob3VsZEhpZGVTbmFja2JhciAmJlxuICAgICAgICByZXNwb25zZS5jb25maWcubWV0aG9kICYmXG4gICAgICAgIFsncHV0JywgJ3Bvc3QnLCAnZGVsZXRlJywgJ3BhdGNoJ10uaW5jbHVkZXMocmVzcG9uc2UuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWzIwMCwgMjAxLCAyMDJdLmluY2x1ZGVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gcmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdPcGVyYXRpb24gc3VjY2Vzc2Z1bCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ3N1Y2Nlc3MnO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufSwgZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAvLyBDaGVjayBpZiB0aGUgZXJyb3IgcmVzcG9uc2UgaGFzIGhpZGVTbmFja2JhciBwcm9wZXJ0eVxuICAgIHZhciBzaG91bGRIaWRlU25hY2tiYXIgPSAoKF9iID0gKF9hID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGF0YSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhpZGVTbmFja2JhcikgPT09IHRydWU7XG4gICAgLy8gSGFuZGxlIGVycm9yIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmIFs0MDAsIDQyMiwgNDEzXS5pbmNsdWRlcygoX2MgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBlcnJvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IGVyci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ0JhZCBSZXF1ZXN0JztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnZXJyb3InO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiZcbiAgICAgICAgKChfZCA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFsncHV0JywgJ3Bvc3QnLCAnZGVsZXRlJywgJ3BhdGNoJ10uaW5jbHVkZXMoZXJyLnJlc3BvbnNlLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFs0MDRdLmluY2x1ZGVzKGVyci5yZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBub3QgZm91bmQgZXJyb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSBlcnIucmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdOb3QgRm91bmQnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdlcnJvcic7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYXhpb3M7XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJzYnVpbGRTaGFyZWRDb25maWcoZGVwZW5kZW5jaWVzLCBhbHdheXNFYWdlciwgc2hhcmVkRGVwZW5kZW5jaWVzTGlzdCkge1xuICAgIHJldHVybiBzaGFyZWREZXBlbmRlbmNpZXNMaXN0LnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwa2cpIHtcbiAgICAgICAgdmFyIHZlcnNpb24gPSBkZXBlbmRlbmNpZXNbcGtnXTtcbiAgICAgICAgaWYgKHZlcnNpb24pIHtcbiAgICAgICAgICAgIGFjY1twa2ddID0gX19hc3NpZ24oeyBzaW5nbGV0b246IHRydWUsIHJlcXVpcmVkVmVyc2lvbjogdmVyc2lvbiwgdmVyc2lvbjogdmVyc2lvbi5yZXBsYWNlKC9eW1xcXn5dLywgJycpIH0sIChhbHdheXNFYWdlci5pbmNsdWRlcyhwa2cpID8geyBlYWdlcjogdHJ1ZSB9IDoge30pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L2FwcGxpY2F0aW9uLXN0b3JlJztcbmltcG9ydCB7IGluc3RpdHV0aW9uQ29kZSwgaXNEZXZlbG9wbWVudCwgdGVuYW50Q29kZSB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG4vLyBHZXQgYmFzZSBVUkwgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbnZhciBnZXRCYXNlVXJsID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIEZvciBDcmVhdGUgUmVhY3QgQXBwXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUElfSE9TVCB8fCAnJztcbn07XG4vLyBGb3JtYXQgcXVlcnkgcGFyYW1ldGVyc1xudmFyIGZvcm1hdFBhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHBhcmFtcyAhPT0gbnVsbCAmJiBwYXJhbXMgIT09IHZvaWQgMCA/IHBhcmFtcyA6IHt9KS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlID09PSAnX19lbXB0eV9fJyA/ICcnIDogdmFsdWUsXG4gICAgICAgIF07XG4gICAgfSkpO1xufTtcbi8vIENyZWF0ZSBheGlvcyBpbnN0YW5jZSBmb3Igc2VsZWN0b3JzIHdpdGggd29ya3NwYWNlOiBmYWxzZVxuZXhwb3J0IHZhciBub25Xb3Jrc3BhY2VBeGlvcyA9IEF4aW9zLmNyZWF0ZSh7XG4gICAgYmFzZVVSTDogZ2V0QmFzZVVybCgpLFxuICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICB3b3Jrc3BhY2U6IGZhbHNlLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ3gtdGVuYW50LWlkJzogdGVuYW50Q29kZSxcbiAgICAgICAgJ3gtaW5zdGl0dXRpb24tY29kZSc6IGluc3RpdHV0aW9uQ29kZSxcbiAgICB9LFxufSk7XG4vLyBSZXF1ZXN0IGludGVyY2VwdG9yXG5ub25Xb3Jrc3BhY2VBeGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIC8vIEZvcm1hdCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgdmFyIHBhcmFtcyA9IGZvcm1hdFBhcmFtcyhjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcucGFyYW1zKTtcbiAgICAvLyBTa2lwIHdvcmtzcGFjZSByb3V0aW5nIHNpbmNlIHdvcmtzcGFjZSBpcyBzZXQgdG8gZmFsc2VcbiAgICAvLyBObyB3b3Jrc3BhY2Ugcm91dGluZyBsb2dpYyBuZWVkZWQgaGVyZVxuICAgIC8vIEFkZCBzZXNzaW9uIHRva2VucyBmcm9tIGNvb2tpZXMgaWYgaW4gZGV2ZWxvcG1lbnRcbiAgICB2YXIgc2Vzc2lvbktleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zZXNzaW9uX2tleScpO1xuICAgIHZhciBvcGVuUGF5bWVudHNLZXkgPSBDb29raWVzLmdldCgnY2FtcHhfb3Blbl9wYXltZW50c19rZXknKTtcbiAgICB2YXIgc3R1ZGVudFNlc3Npb25LZXkgPSBDb29raWVzLmdldCgnY2FtcHhfc3R1ZGVudF9rZXknKTtcbiAgICBpZiAoaXNEZXZlbG9wbWVudCAmJiBzZXNzaW9uS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfc2Vzc2lvbl9rZXknLCBzZXNzaW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKGlzRGV2ZWxvcG1lbnQgJiYgc3R1ZGVudFNlc3Npb25LZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9zdHVkZW50X2tleScsIHN0dWRlbnRTZXNzaW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKG9wZW5QYXltZW50c0tleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X29wZW5fcGF5bWVudHNfa2V5Jywgb3BlblBheW1lbnRzS2V5KTtcbiAgICB9XG4gICAgLy8gU2tpcCBzZW5kaW5nIFgtaW5zdGl0dXRpb24tY29kZSBpZiB0aGUgZmxhZyBpcyBzZXRcbiAgICBpZiAoY29uZmlnLnNraXBJbnN0aXR1dGlvbkNvZGUpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuZGVsZXRlKCd4LWluc3RpdHV0aW9uLWNvZGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb25maWcpLCB7IHBhcmFtczogcGFyYW1zIH0pO1xufSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbn0pO1xuLy8gUmVzcG9uc2UgaW50ZXJjZXB0b3Jcbm5vbldvcmtzcGFjZUF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vIENoZWNrIGlmIHRoZSByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2EgPSByZXNwb25zZS5kYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgc3VjY2Vzc2Z1bCByZXNwb25zZXNcbiAgICBpZiAoIXNob3VsZEhpZGVTbmFja2JhciAmJlxuICAgICAgICByZXNwb25zZS5jb25maWcubWV0aG9kICYmXG4gICAgICAgIFsncHV0JywgJ3Bvc3QnLCAnZGVsZXRlJywgJ3BhdGNoJ10uaW5jbHVkZXMocmVzcG9uc2UuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWzIwMCwgMjAxLCAyMDJdLmluY2x1ZGVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gcmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdPcGVyYXRpb24gc3VjY2Vzc2Z1bCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ3N1Y2Nlc3MnO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufSwgZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAvLyBDaGVjayBpZiB0aGUgZXJyb3IgcmVzcG9uc2UgaGFzIGhpZGVTbmFja2JhciBwcm9wZXJ0eVxuICAgIHZhciBzaG91bGRIaWRlU25hY2tiYXIgPSAoKF9iID0gKF9hID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGF0YSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhpZGVTbmFja2JhcikgPT09IHRydWU7XG4gICAgLy8gSGFuZGxlIGVycm9yIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmIFs0MDAsIDQyMl0uaW5jbHVkZXMoKF9jID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Muc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3IgZXJyb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSBlcnIucmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdCYWQgUmVxdWVzdCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ2Vycm9yJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmXG4gICAgICAgICgoX2QgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbJ3B1dCcsICdwb3N0JywgJ2RlbGV0ZScsICdwYXRjaCddLmluY2x1ZGVzKGVyci5yZXNwb25zZS5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbNDA0XS5pbmNsdWRlcyhlcnIucmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3Igbm90IGZvdW5kIGVycm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gZXJyLnJlc3BvbnNlLmRhdGEubWVzc2FnZSB8fCAnTm90IEZvdW5kJztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnZXJyb3InO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG5vbldvcmtzcGFjZUF4aW9zO1xuIiwiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IENvbmZpcm1EaWFsb2cgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblN0b3JlIH0gZnJvbSAnLi9hcHBsaWNhdGlvbi1zdG9yZSc7XG52YXIgQ29uZmlybUNvbnRleHQgPSBjcmVhdGVDb250ZXh0KHtcbiAgICBzaG93Q29uZmlybURpYWxvZzogZnVuY3Rpb24gKCkgeyB9LFxufSk7XG5leHBvcnQgdmFyIENvbmZpcm1EaWFsb2dQcm92aWRlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuO1xuICAgIHZhciBjb25maXJtRGlhbG9nID0gQXBwbGljYXRpb25TdG9yZS51c2VTdGF0ZShmdW5jdGlvbiAocykgeyByZXR1cm4gcy5jb25maXJtRGlhbG9nOyB9KTtcbiAgICB2YXIgc2hvd0NvbmZpcm1EaWFsb2cgPSBmdW5jdGlvbiAodGl0bGUsIG1lc3NhZ2UsIG9uQ29uZmlybSwgb25DYW5jZWwsIHR5cGUsIGNvbmZpcm1CdXR0b25UZXh0LCBjYW5jZWxCdXR0b25UZXh0KSB7XG4gICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9ICdjb25maXJtJzsgfVxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5jb25maXJtRGlhbG9nID0ge1xuICAgICAgICAgICAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBvbkNvbmZpcm06IG9uQ29uZmlybSxcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogb25DYW5jZWwsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogY29uZmlybUJ1dHRvblRleHQsXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogY2FuY2VsQnV0dG9uVGV4dCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZUNsb3NlRGlhbG9nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5jb25maXJtRGlhbG9nLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiAoX2pzeHMoQ29uZmlybUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHsgc2hvd0NvbmZpcm1EaWFsb2c6IHNob3dDb25maXJtRGlhbG9nIH0sIGNoaWxkcmVuOiBbY2hpbGRyZW4sIF9qc3goQ29uZmlybURpYWxvZywgeyBpc09wZW46IGNvbmZpcm1EaWFsb2cuaXNPcGVuLCB0aXRsZTogY29uZmlybURpYWxvZy50aXRsZSwgbWVzc2FnZTogY29uZmlybURpYWxvZy5tZXNzYWdlLCB0eXBlOiBjb25maXJtRGlhbG9nLnR5cGUsIGNvbmZpcm1CdXR0b25UZXh0OiBjb25maXJtRGlhbG9nLmNvbmZpcm1CdXR0b25UZXh0LCBjYW5jZWxCdXR0b25UZXh0OiBjb25maXJtRGlhbG9nLmNhbmNlbEJ1dHRvblRleHQsIG9uQ29uZmlybTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25maXJtRGlhbG9nLm9uQ29uZmlybSgpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZURpYWxvZygpO1xuICAgICAgICAgICAgICAgIH0sIG9uQ2FuY2VsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1EaWFsb2cub25DYW5jZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2VEaWFsb2coKTtcbiAgICAgICAgICAgICAgICB9IH0pXSB9KSk7XG59O1xuIiwiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQsIGUpIHtcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyA9IGUsIHQ7XG4gIH0sIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9zZXRQcm90b3R5cGVPZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG52YXIgY2hhbmdlZEFycmF5ID0gZnVuY3Rpb24gY2hhbmdlZEFycmF5KGEsIGIpIHtcbiAgaWYgKGEgPT09IHZvaWQgMCkge1xuICAgIGEgPSBbXTtcbiAgfVxuXG4gIGlmIChiID09PSB2b2lkIDApIHtcbiAgICBiID0gW107XG4gIH1cblxuICByZXR1cm4gYS5sZW5ndGggIT09IGIubGVuZ3RoIHx8IGEuc29tZShmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICByZXR1cm4gIU9iamVjdC5pcyhpdGVtLCBiW2luZGV4XSk7XG4gIH0pO1xufTtcblxudmFyIGluaXRpYWxTdGF0ZSA9IHtcbiAgZXJyb3I6IG51bGxcbn07XG5cbnZhciBFcnJvckJvdW5kYXJ5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKEVycm9yQm91bmRhcnksIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEVycm9yQm91bmRhcnkoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF9hcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgX2FyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChfYXJncykpIHx8IHRoaXM7XG4gICAgX3RoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7XG5cbiAgICBfdGhpcy5yZXNldEVycm9yQm91bmRhcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM7XG5cbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnByb3BzLm9uUmVzZXQgPT0gbnVsbCA/IHZvaWQgMCA6IChfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzKS5vblJlc2V0LmFwcGx5KF90aGlzJHByb3BzLCBhcmdzKTtcblxuICAgICAgX3RoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgRXJyb3JCb3VuZGFyeS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPSBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGVycm9yXG4gICAgfTtcbiAgfTtcblxuICB2YXIgX3Byb3RvID0gRXJyb3JCb3VuZGFyeS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRDYXRjaCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBpbmZvKSB7XG4gICAgdmFyIF90aGlzJHByb3BzJG9uRXJyb3IsIF90aGlzJHByb3BzMjtcblxuICAgIChfdGhpcyRwcm9wcyRvbkVycm9yID0gKF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMpLm9uRXJyb3IpID09IG51bGwgPyB2b2lkIDAgOiBfdGhpcyRwcm9wcyRvbkVycm9yLmNhbGwoX3RoaXMkcHJvcHMyLCBlcnJvciwgaW5mbyk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIHZhciBlcnJvciA9IHRoaXMuc3RhdGUuZXJyb3I7XG4gICAgdmFyIHJlc2V0S2V5cyA9IHRoaXMucHJvcHMucmVzZXRLZXlzOyAvLyBUaGVyZSdzIGFuIGVkZ2UgY2FzZSB3aGVyZSBpZiB0aGUgdGhpbmcgdGhhdCB0cmlnZ2VyZWQgdGhlIGVycm9yXG4gICAgLy8gaGFwcGVucyB0byAqYWxzbyogYmUgaW4gdGhlIHJlc2V0S2V5cyBhcnJheSwgd2UnZCBlbmQgdXAgcmVzZXR0aW5nXG4gICAgLy8gdGhlIGVycm9yIGJvdW5kYXJ5IGltbWVkaWF0ZWx5LiBUaGlzIHdvdWxkIGxpa2VseSB0cmlnZ2VyIGEgc2Vjb25kXG4gICAgLy8gZXJyb3IgdG8gYmUgdGhyb3duLlxuICAgIC8vIFNvIHdlIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoZSByZXNldEtleXMgb24gdGhlIGZpcnN0IGNhbGxcbiAgICAvLyBvZiBjRFUgYWZ0ZXIgdGhlIGVycm9yIGlzIHNldFxuXG4gICAgaWYgKGVycm9yICE9PSBudWxsICYmIHByZXZTdGF0ZS5lcnJvciAhPT0gbnVsbCAmJiBjaGFuZ2VkQXJyYXkocHJldlByb3BzLnJlc2V0S2V5cywgcmVzZXRLZXlzKSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzJG9uUmVzZXRLZSwgX3RoaXMkcHJvcHMzO1xuXG4gICAgICAoX3RoaXMkcHJvcHMkb25SZXNldEtlID0gKF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMpLm9uUmVzZXRLZXlzQ2hhbmdlKSA9PSBudWxsID8gdm9pZCAwIDogX3RoaXMkcHJvcHMkb25SZXNldEtlLmNhbGwoX3RoaXMkcHJvcHMzLCBwcmV2UHJvcHMucmVzZXRLZXlzLCByZXNldEtleXMpO1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBlcnJvciA9IHRoaXMuc3RhdGUuZXJyb3I7XG4gICAgdmFyIF90aGlzJHByb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgIGZhbGxiYWNrUmVuZGVyID0gX3RoaXMkcHJvcHM0LmZhbGxiYWNrUmVuZGVyLFxuICAgICAgICBGYWxsYmFja0NvbXBvbmVudCA9IF90aGlzJHByb3BzNC5GYWxsYmFja0NvbXBvbmVudCxcbiAgICAgICAgZmFsbGJhY2sgPSBfdGhpcyRwcm9wczQuZmFsbGJhY2s7XG5cbiAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgIHZhciBfcHJvcHMgPSB7XG4gICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgcmVzZXRFcnJvckJvdW5kYXJ5OiB0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeVxuICAgICAgfTtcblxuICAgICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoZmFsbGJhY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZhbGxiYWNrUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFja1JlbmRlcihfcHJvcHMpO1xuICAgICAgfSBlbHNlIGlmIChGYWxsYmFja0NvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmFsbGJhY2tDb21wb25lbnQsIF9wcm9wcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlYWN0LWVycm9yLWJvdW5kYXJ5IHJlcXVpcmVzIGVpdGhlciBhIGZhbGxiYWNrLCBmYWxsYmFja1JlbmRlciwgb3IgRmFsbGJhY2tDb21wb25lbnQgcHJvcCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICB9O1xuXG4gIHJldHVybiBFcnJvckJvdW5kYXJ5O1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5mdW5jdGlvbiB3aXRoRXJyb3JCb3VuZGFyeShDb21wb25lbnQsIGVycm9yQm91bmRhcnlQcm9wcykge1xuICB2YXIgV3JhcHBlZCA9IGZ1bmN0aW9uIFdyYXBwZWQocHJvcHMpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXJyb3JCb3VuZGFyeSwgZXJyb3JCb3VuZGFyeVByb3BzLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHByb3BzKSk7XG4gIH07IC8vIEZvcm1hdCBmb3IgZGlzcGxheSBpbiBEZXZUb29sc1xuXG5cbiAgdmFyIG5hbWUgPSBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ1Vua25vd24nO1xuICBXcmFwcGVkLmRpc3BsYXlOYW1lID0gXCJ3aXRoRXJyb3JCb3VuZGFyeShcIiArIG5hbWUgKyBcIilcIjtcbiAgcmV0dXJuIFdyYXBwZWQ7XG59XG5cbmZ1bmN0aW9uIHVzZUVycm9ySGFuZGxlcihnaXZlbkVycm9yKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICAgIGVycm9yID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgICAgc2V0RXJyb3IgPSBfUmVhY3QkdXNlU3RhdGVbMV07XG5cbiAgaWYgKGdpdmVuRXJyb3IgIT0gbnVsbCkgdGhyb3cgZ2l2ZW5FcnJvcjtcbiAgaWYgKGVycm9yICE9IG51bGwpIHRocm93IGVycm9yO1xuICByZXR1cm4gc2V0RXJyb3I7XG59XG4vKlxuZXNsaW50XG4gIEB0eXBlc2NyaXB0LWVzbGludC9zb3J0LXR5cGUtdW5pb24taW50ZXJzZWN0aW9uLW1lbWJlcnM6IFwib2ZmXCIsXG4gIEB0eXBlc2NyaXB0LWVzbGludC9uby10aHJvdy1saXRlcmFsOiBcIm9mZlwiLFxuICBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZzogXCJvZmZcIlxuKi9cblxuZXhwb3J0IHsgRXJyb3JCb3VuZGFyeSwgdXNlRXJyb3JIYW5kbGVyLCB3aXRoRXJyb3JCb3VuZGFyeSB9O1xuIiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSh0LCBvKSB7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gdCwgc2V0UHJvdG90eXBlT2YodCwgbyk7XG59XG5leHBvcnQgeyBfaW5oZXJpdHNMb29zZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0e3ZhbGlkYXRlRmllbGRzTmF0aXZlbHkgYXMgZSx0b05lc3RFcnJvciBhcyB0fWZyb21cIkBob29rZm9ybS9yZXNvbHZlcnNcIjtpbXBvcnR7YXBwZW5kRXJyb3JzIGFzIHJ9ZnJvbVwicmVhY3QtaG9vay1mb3JtXCI7dmFyIG89ZnVuY3Rpb24obyxuLGEpe3JldHVybiB2b2lkIDA9PT1uJiYobj17fSksdm9pZCAwPT09YSYmKGE9e30pLGZ1bmN0aW9uKHMsaSxjKXt0cnl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShmdW5jdGlvbih0LHIpe3RyeXt2YXIgdT0obi5jb250ZXh0JiZcImRldmVsb3BtZW50XCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOViYmY29uc29sZS53YXJuKFwiWW91IHNob3VsZCBub3QgdXNlZCB0aGUgeXVwIG9wdGlvbnMgY29udGV4dC4gUGxlYXNlLCB1c2UgdGhlICd1c2VGb3JtJyBjb250ZXh0IG9iamVjdCBpbnN0ZWFkXCIpLFByb21pc2UucmVzb2x2ZShvW1wic3luY1wiPT09YS5tb2RlP1widmFsaWRhdGVTeW5jXCI6XCJ2YWxpZGF0ZVwiXShzLE9iamVjdC5hc3NpZ24oe2Fib3J0RWFybHk6ITF9LG4se2NvbnRleHQ6aX0pKSkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gYy5zaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uJiZlKHt9LGMpLHt2YWx1ZXM6YS5yYXdWYWx1ZXM/czp0LGVycm9yczp7fX19KSl9Y2F0Y2goZSl7cmV0dXJuIHIoZSl9cmV0dXJuIHUmJnUudGhlbj91LnRoZW4odm9pZCAwLHIpOnV9KDAsZnVuY3Rpb24oZSl7aWYoIWUuaW5uZXIpdGhyb3cgZTtyZXR1cm57dmFsdWVzOnt9LGVycm9yczp0KChvPWUsbj0hYy5zaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uJiZcImFsbFwiPT09Yy5jcml0ZXJpYU1vZGUsKG8uaW5uZXJ8fFtdKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtpZihlW3QucGF0aF18fChlW3QucGF0aF09e21lc3NhZ2U6dC5tZXNzYWdlLHR5cGU6dC50eXBlfSksbil7dmFyIG89ZVt0LnBhdGhdLnR5cGVzLGE9byYmb1t0LnR5cGVdO2VbdC5wYXRoXT1yKHQucGF0aCxuLGUsdC50eXBlLGE/W10uY29uY2F0KGEsdC5tZXNzYWdlKTp0Lm1lc3NhZ2UpfXJldHVybiBlfSx7fSkpLGMpfTt2YXIgbyxufSkpfWNhdGNoKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX19fTtleHBvcnR7byBhcyB5dXBSZXNvbHZlcn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD15dXAubW9kdWxlLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBCdXR0b24sIEljb25zLCBQYXNzd29yZEZpZWxkLCBUZXh0RmllbGQsIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyB5dXBSZXNvbHZlciB9IGZyb20gJ0Bob29rZm9ybS9yZXNvbHZlcnMveXVwJztcbmltcG9ydCBEZXZpY2VEZXRlY3RvciBmcm9tICdkZXZpY2UtZGV0ZWN0b3ItanMnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb250cm9sbGVyLCB1c2VGb3JtIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZU11dGF0aW9uIH0gZnJvbSAncmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCAqIGFzIFl1cCBmcm9tICd5dXAnO1xuaW1wb3J0IHsgYXhpb3MgfSBmcm9tICcuLi8uLi9jb25maWcvYXhpb3MnO1xuaW1wb3J0IHsgaXNEZXZlbG9wbWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbnN0YW50cyc7XG52YXIgcGVyZm9ybUxvZ2luID0gZnVuY3Rpb24gKGJvZHkpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3BvbnNlLCBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGlmICghKCFib2R5LmxhdGl0dWRlIHx8ICFib2R5LmxvbmdpdHVkZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGZldGNoKCdodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9nZW9sb2NhdGlvbi92MS9nZW9sb2NhdGU/a2V5PUFJemFTeUIyWUNwbzF5aTEwN1JZajFMZFp1MkRDY3BjTzkzcmVGWScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNpZGVySXA6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmVzcG9uc2UuanNvbigpXTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBkYXRhID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgIGJvZHkubGF0aXR1ZGUgPSBkYXRhLmxvY2F0aW9uLmxhdDtcbiAgICAgICAgICAgICAgICBib2R5LmxvbmdpdHVkZSA9IGRhdGEubG9jYXRpb24ubG5nO1xuICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGF4aW9zXG4gICAgICAgICAgICAgICAgICAgIC5wb3N0KFwiL2F1dGgtc2VydmVyL2F1dGgtdjIvbG9naW5cIiwgYm9keSwge1xuICAgICAgICAgICAgICAgICAgICB3b3Jrc3BhY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIHJlcy5kYXRhOyB9KV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xudmFyIHZhbGlkYXRpb25TY2hlbWEgPSBZdXAub2JqZWN0KCkuc2hhcGUoe1xuICAgIHVzZXJuYW1lOiBZdXAuc3RyaW5nKCkucmVxdWlyZWQoJ1VzZXJuYW1lIGlzIHJlcXVpcmVkJyksXG4gICAgcGFzc3dvcmQ6IFl1cC5zdHJpbmcoKS5yZXF1aXJlZCgnUGFzc3dvcmQgaXMgcmVxdWlyZWQnKSxcbn0pO1xuZXhwb3J0IHZhciBMb2dpbiA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjbG9zZSA9IF9hLmNsb3NlO1xuICAgIHZhciBfYiA9IHVzZVN0YXRlKHtcbiAgICAgICAgZGV2aWNlSW5mb3JtYXRpb246IHtcbiAgICAgICAgICAgIGRldmljZVR5cGU6ICdicm93c2VyJyxcbiAgICAgICAgICAgIGNsaWVudE5hbWU6ICd1bmtub3duJyxcbiAgICAgICAgICAgIG9zOiAndW5rbm93bicsXG4gICAgICAgICAgICBvc1ZlcnNpb246ICd1bmtub3duJyxcbiAgICAgICAgICAgIGxhdGl0dWRlOiBudWxsLFxuICAgICAgICAgICAgbG9uZ2l0dWRlOiBudWxsLFxuICAgICAgICAgICAgdG9rZW5UeXBlOiAnV0VCJyxcbiAgICAgICAgfSxcbiAgICAgICAgaXNMb2NhdGlvbkFsbG93ZWQ6IHRydWUsXG4gICAgfSksIGRldmljZVN0YXRlID0gX2JbMF0sIHNldERldmljZVN0YXRlID0gX2JbMV07XG4gICAgdmFyIG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGZ1bmN0aW9uIChwb3NpdGlvbikge1xuICAgICAgICAgICAgc2V0RGV2aWNlU3RhdGUoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcyksIHsgZGV2aWNlSW5mb3JtYXRpb246IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzLmRldmljZUluZm9ybWF0aW9uKSwgeyBsYXRpdHVkZTogcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlLCBsb25naXR1ZGU6IHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUgfSkgfSkpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG5hdmlnYXRvci5wZXJtaXNzaW9uc1xuICAgICAgICAgICAgLnF1ZXJ5KHsgbmFtZTogJ2dlb2xvY2F0aW9uJyB9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHBlcm1pc3Npb25TdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uU3RhdHVzLnN0YXRlID09PSAnZGVuaWVkJykge1xuICAgICAgICAgICAgICAgIHNldERldmljZVN0YXRlKGZ1bmN0aW9uIChzKSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHMpLCB7IGlzTG9jYXRpb25BbGxvd2VkOiBmYWxzZSB9KSk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGRldGVjdG9yID0gbmV3IERldmljZURldGVjdG9yKCk7XG4gICAgICAgIHZhciBkZXZpY2VJbmZvID0gZGV0ZWN0b3IucGFyc2UobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICAgIHNldERldmljZVN0YXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgIHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHMpLCB7IGRldmljZUluZm9ybWF0aW9uOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcy5kZXZpY2VJbmZvcm1hdGlvbiksIHsgY2xpZW50TmFtZTogKChfYSA9IGRldmljZUluZm8uY2xpZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmFtZSkgfHwgcy5kZXZpY2VJbmZvcm1hdGlvbi5jbGllbnROYW1lLCBvczogKChfYiA9IGRldmljZUluZm8ub3MpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5uYW1lKSB8fCBzLmRldmljZUluZm9ybWF0aW9uLm9zLCBvc1ZlcnNpb246ICgoX2MgPSBkZXZpY2VJbmZvLm9zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudmVyc2lvbikgfHwgcy5kZXZpY2VJbmZvcm1hdGlvbi5vc1ZlcnNpb24gfSkgfSkpO1xuICAgICAgICB9KTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIF9jID0gdXNlRm9ybSh7XG4gICAgICAgIHJlc29sdmVyOiB5dXBSZXNvbHZlcih2YWxpZGF0aW9uU2NoZW1hKSxcbiAgICB9KSwgaGFuZGxlU3VibWl0ID0gX2MuaGFuZGxlU3VibWl0LCBjb250cm9sID0gX2MuY29udHJvbCwgZXJyb3JzID0gX2MuZm9ybVN0YXRlLmVycm9ycztcbiAgICB2YXIgX2QgPSB1c2VNdXRhdGlvbihwZXJmb3JtTG9naW4sIHtcbiAgICAgICAgb25TdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKGlzRGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBDb29raWVzLnJlbW92ZSgnY2FtcHhfc2Vzc2lvbl9rZXknKTtcbiAgICAgICAgICAgICAgICBDb29raWVzLnNldCgnY2FtcHhfc2Vzc2lvbl9rZXknLCBkYXRhLnNlc3Npb24udG9rZW4pO1xuICAgICAgICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgICAgICAgICAgbmF2aWdhdGUoXCIvXCIuY29uY2F0KGRhdGEuc2Vzc2lvbi5pbnN0aXR1dGlvbkNvZGUsIFwiL3dvcmtzcGFjZVwiKSk7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pLCBtdXRhdGUgPSBfZC5tdXRhdGUsIGlzTG9hZGluZyA9IF9kLmlzTG9hZGluZztcbiAgICB2YXIgb25TdWJtaXQgPSBmdW5jdGlvbiAoYm9keSkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgbXV0YXRlKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBib2R5KSwgZGV2aWNlU3RhdGUuZGV2aWNlSW5mb3JtYXRpb24pLCB7IGxvZ2luSWQ6IGJvZHkudXNlcm5hbWUsIGxvZ2luVHlwZTogJ1VTRVInIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgfSk7XG4gICAgfSk7IH07XG4gICAgcmV0dXJuIChfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGZsZXgtY29sIGdhcC04IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBwLThcIiwgY2hpbGRyZW46IFtfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtOSB3LTQ4XCIsIGNoaWxkcmVuOiBfanN4KEljb25zLkNhbXB4RnVsbExvZ29JY29uLCB7fSkgfSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggZmxleC1jb2wgZ2FwLTQgdy1mdWxsIG1heC13LVs0MDBweF1cIiwgY2hpbGRyZW46IFtfanN4KENvbnRyb2xsZXIsIHsgY29udHJvbDogY29udHJvbCwgcmVuZGVyOiBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBfYS5maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9qc3goVGV4dEZpZWxkLCB7IG5hbWU6IFwidXNlcm5hbWVcIiwgcGxhY2Vob2xkZXI6IFwiRW50ZXIgVXNlcm5hbWUgb3IgRW1haWxcIiwgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLCBsYWJlbDogXCJVc2VybmFtZSBvciBFbWFpbFwiLCBlcnJvcjogISFlcnJvcnMudXNlcm5hbWUsIHJlcXVpcmVkOiB0cnVlLCBmdWxsV2lkdGg6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgbmFtZTogXCJ1c2VybmFtZVwiIH0pLCBfanN4KENvbnRyb2xsZXIsIHsgY29udHJvbDogY29udHJvbCwgcmVuZGVyOiBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBfYS5maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9qc3goUGFzc3dvcmRGaWVsZCwgeyBuYW1lOiBcInBhc3N3b3JkXCIsIHBsYWNlaG9sZGVyOiBcIkVudGVyIHBhc3N3b3JkXCIsIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSwgbGFiZWw6IFwiUGFzc3dvcmRcIiwgZXJyb3I6ICEhZXJyb3JzLnBhc3N3b3JkLCByZXF1aXJlZDogdHJ1ZSwgZnVsbFdpZHRoOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG5hbWU6IFwicGFzc3dvcmRcIiB9KSwgX2pzeChCdXR0b24sIHsgdHlwZTogXCJzdWJtaXRcIiwgY29sb3I6IFwicHJpbWFyeVwiLCB2YXJpYW50OiBcImRlZmF1bHRcIiwgb25DbGljazogaGFuZGxlU3VibWl0KG9uU3VibWl0KSwgZGlzYWJsZWQ6IGlzTG9hZGluZywgbG9hZGluZzogaXNMb2FkaW5nLCBmdWxsV2lkdGg6IHRydWUsIGNoaWxkcmVuOiBcIkxvZ2luXCIgfSldIH0pXSB9KSk7XG59O1xuIiwiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgQnV0dG9uLCBEaWFsb2csIEludGVybmFsU2VydmVyRXJyb3IsIE5vSW50ZXJuZUNvbm5lY3Rpb24sIFJlc291cmNlTm90Rm91bmQsIFVuQXV0aG9yaXplZCwgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEVycm9yQm91bmRhcnkgYXMgUmVhY3RFcnJvckJvdW5kYXJ5IH0gZnJvbSAncmVhY3QtZXJyb3ItYm91bmRhcnknO1xuaW1wb3J0IHsgUXVlcnlFcnJvclJlc2V0Qm91bmRhcnkgfSBmcm9tICdyZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyB1c2VMb2NhdGlvbiwgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCB7IGluc3RpdHV0aW9uQ29kZSwgd29ya3NwYWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uc3RhbnRzJztcbmltcG9ydCB7IExvZ2luIH0gZnJvbSAnLi9Mb2dpbic7XG5leHBvcnQgdmFyIEVycm9yQm91bmRhcnkgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICB2YXIgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICAgIHJldHVybiAoX2pzeChRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSwgeyBjaGlsZHJlbjogZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICB2YXIgcmVzZXQgPSBfYS5yZXNldDtcbiAgICAgICAgICAgIHJldHVybiAoX2pzeChSZWFjdEVycm9yQm91bmRhcnksIHsgb25SZXNldDogcmVzZXQsIEZhbGxiYWNrQ29tcG9uZW50OiBFcnJvckZhbGxiYWNrLCBjaGlsZHJlbjogcHJvcHMuY2hpbGRyZW4gfSwgbG9jYXRpb24gPT09IG51bGwgfHwgbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2F0aW9uLnBhdGhuYW1lKSk7XG4gICAgICAgIH0gfSkpO1xufTtcbnZhciBFcnJvckZhbGxiYWNrID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oO1xuICAgIHZhciBlcnJvciA9IF9hLmVycm9yLCByZXNldEVycm9yQm91bmRhcnkgPSBfYS5yZXNldEVycm9yQm91bmRhcnk7XG4gICAgaWYgKChfYiA9IGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnN0YXR1cykge1xuICAgICAgICBzd2l0Y2ggKChfYyA9IGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnN0YXR1cykge1xuICAgICAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9qc3goVW5BdXRoLCB7fSk7XG4gICAgICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2pzeChJbnRlcm5hbFNlcnZlckVycm9yLCB7IHJlc2V0Qm91bmRhcnk6IHJlc2V0RXJyb3JCb3VuZGFyeSB9KTtcbiAgICAgICAgICAgIGNhc2UgNDA0OlxuICAgICAgICAgICAgICAgIHJldHVybiBfanN4KFJlc291cmNlTm90Rm91bmQsIHsgbWVzc2FnZTogKF9lID0gKF9kID0gZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuZGF0YSkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLm1lc3NhZ2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IuY29kZSkgPT09ICdFUlJfTkVUV09SSycpIHtcbiAgICAgICAgcmV0dXJuIF9qc3goTm9JbnRlcm5lQ29ubmVjdGlvbiwgeyByZXNldEJvdW5kYXJ5OiByZXNldEVycm9yQm91bmRhcnkgfSk7XG4gICAgfVxuICAgIHJldHVybiAoX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJtdC00IHAtNVwiLCBjaGlsZHJlbjogX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwicmVsYXRpdmUgaC0xNSBib3JkZXIgYm9yZGVyLXJlZC0yMDAgYmctcmVkLTUwIGZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtbWQgIHB4LTJcIiwgY2hpbGRyZW46IFtfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXgtMSB0ZXh0LXJlZC03MDAgYmctdHJhbnNwYXJlbnRcIiwgY2hpbGRyZW46IChfaCA9IChfZyA9IChfZiA9IGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLmRhdGEpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IubWVzc2FnZSB9KSwgX2pzeChCdXR0b24sIHsgb25DbGljazogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzZXRFcnJvckJvdW5kYXJ5KCk7IH0sIHNpemU6IFwic21cIiwgdmFyaWFudDogXCJsaW5rXCIsIGNsYXNzTmFtZTogXCJob3Zlcjpuby11bmRlcmxpbmUgdGV4dC1kZXN0cnVjdGl2ZVwiLCBjaGlsZHJlbjogXCJUcnkgQWdhaW5cIiB9KV0gfSkgfSkpO1xufTtcbnZhciBVbkF1dGggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcbiAgICB2YXIgX2EgPSB1c2VTdGF0ZShmYWxzZSksIGlzTW9kYWxPcGVuID0gX2FbMF0sIHNldE1vZGFsT3BlbiA9IF9hWzFdO1xuICAgIHZhciBzZXNzaW9uQ29va2llID0gQ29va2llcy5nZXQoJ2NhbXB4X3Nlc3Npb25fa2V5Jyk7XG4gICAgdmFyIGhhbmRsZUxvZ2luQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc3BsaXQoJy4nKVsxXSA9PT0gJ2xvY2FsaG9zdCcpIHtcbiAgICAgICAgICAgIHNldE1vZGFsT3Blbih0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghc2Vzc2lvbkNvb2tpZSkge1xuICAgICAgICAgICAgICAgIGlmICh3b3Jrc3BhY2UgPT09ICdwcm9zcGVjdC13b3Jrc3BhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRlKFwiXCIuY29uY2F0KGluc3RpdHV0aW9uQ29kZSwgXCIvYXRzL2xvZ2luXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0ZSgnL2F1dGgvbG9naW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIChfanN4KFVuQXV0aG9yaXplZCwgeyBjb21wb25lbnQ6IF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goQnV0dG9uLCB7IGNsYXNzTmFtZTogXCJtdC01XCIsIHZhcmlhbnQ6IFwiZGVmYXVsdFwiLCBvbkNsaWNrOiBoYW5kbGVMb2dpbkNsaWNrLCBjaGlsZHJlbjogXCJDbGljayBIZXJlIFRvIExvZ2luXCIgfSksIF9qc3goRGlhbG9nLCB7IG9wZW46IGlzTW9kYWxPcGVuLCBvbkNsb3NlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBzZXRNb2RhbE9wZW4oZmFsc2UpOyB9LCBjb250ZW50OiBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9zZSA9IF9hLmNsb3NlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9qc3goTG9naW4sIHsgY2xvc2U6IGNsb3NlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IH0pXSB9KSB9KSk7XG59O1xuIiwiLy8gc3JjL3V0aWxzL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UudHNcbmZ1bmN0aW9uIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoY29kZSkge1xuICByZXR1cm4gYE1pbmlmaWVkIFJlZHV4IGVycm9yICMke2NvZGV9OyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT0ke2NvZGV9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMuIGA7XG59XG5cbi8vIHNyYy91dGlscy9zeW1ib2wtb2JzZXJ2YWJsZS50c1xudmFyICQkb2JzZXJ2YWJsZSA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5vYnNlcnZhYmxlIHx8IFwiQEBvYnNlcnZhYmxlXCIpKCk7XG52YXIgc3ltYm9sX29ic2VydmFibGVfZGVmYXVsdCA9ICQkb2JzZXJ2YWJsZTtcblxuLy8gc3JjL3V0aWxzL2FjdGlvblR5cGVzLnRzXG52YXIgcmFuZG9tU3RyaW5nID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KFwiXCIpLmpvaW4oXCIuXCIpO1xudmFyIEFjdGlvblR5cGVzID0ge1xuICBJTklUOiBgQEByZWR1eC9JTklUJHsvKiBAX19QVVJFX18gKi8gcmFuZG9tU3RyaW5nKCl9YCxcbiAgUkVQTEFDRTogYEBAcmVkdXgvUkVQTEFDRSR7LyogQF9fUFVSRV9fICovIHJhbmRvbVN0cmluZygpfWAsXG4gIFBST0JFX1VOS05PV05fQUNUSU9OOiAoKSA9PiBgQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTiR7cmFuZG9tU3RyaW5nKCl9YFxufTtcbnZhciBhY3Rpb25UeXBlc19kZWZhdWx0ID0gQWN0aW9uVHlwZXM7XG5cbi8vIHNyYy91dGlscy9pc1BsYWluT2JqZWN0LnRzXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fCBvYmogPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBsZXQgcHJvdG8gPSBvYmo7XG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gcHJvdG8gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IG51bGw7XG59XG5cbi8vIHNyYy91dGlscy9raW5kT2YudHNcbmZ1bmN0aW9uIG1pbmlLaW5kT2YodmFsKSB7XG4gIGlmICh2YWwgPT09IHZvaWQgMClcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKHZhbCA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcInN5bWJvbFwiOlxuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSlcbiAgICByZXR1cm4gXCJhcnJheVwiO1xuICBpZiAoaXNEYXRlKHZhbCkpXG4gICAgcmV0dXJuIFwiZGF0ZVwiO1xuICBpZiAoaXNFcnJvcih2YWwpKVxuICAgIHJldHVybiBcImVycm9yXCI7XG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG4gIHN3aXRjaCAoY29uc3RydWN0b3JOYW1lKSB7XG4gICAgY2FzZSBcIlN5bWJvbFwiOlxuICAgIGNhc2UgXCJQcm9taXNlXCI6XG4gICAgY2FzZSBcIldlYWtNYXBcIjpcbiAgICBjYXNlIFwiV2Vha1NldFwiOlxuICAgIGNhc2UgXCJNYXBcIjpcbiAgICBjYXNlIFwiU2V0XCI6XG4gICAgICByZXR1cm4gY29uc3RydWN0b3JOYW1lO1xuICB9XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgXCJcIik7XG59XG5mdW5jdGlvbiBjdG9yTmFtZSh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRXJyb3IodmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgdmFsLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSBcIm51bWJlclwiO1xufVxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHR5cGVvZiB2YWwudG9EYXRlU3RyaW5nID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHZhbC5nZXREYXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIGxldCB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG4gIHJldHVybiB0eXBlT2ZWYWw7XG59XG5cbi8vIHNyYy9jcmVhdGVTdG9yZS50c1xuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIGlmICh0eXBlb2YgcmVkdWNlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBgRXhwZWN0ZWQgdGhlIHJvb3QgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKHJlZHVjZXIpfSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGVuaGFuY2VyID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIGVuaGFuY2VyID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMCkgOiBcIkl0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvIGNyZWF0ZVN0b3JlKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgY29tcG9zZSB0aGVtIHRvZ2V0aGVyIHRvIGEgc2luZ2xlIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjY3JlYXRpbmctYS1zdG9yZS13aXRoLWVuaGFuY2VycyBmb3IgYW4gZXhhbXBsZS5cIik7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgcHJlbG9hZGVkU3RhdGUgPSB2b2lkIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMSkgOiBgRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YoZW5oYW5jZXIpfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuaGFuY2VyKGNyZWF0ZVN0b3JlKShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gIH1cbiAgbGV0IGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgbGV0IGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICBsZXQgY3VycmVudExpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGxldCBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycztcbiAgbGV0IGxpc3RlbmVySWRDb3VudGVyID0gMDtcbiAgbGV0IGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpIHtcbiAgICBpZiAobmV4dExpc3RlbmVycyA9PT0gY3VycmVudExpc3RlbmVycykge1xuICAgICAgbmV4dExpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyLCBrZXkpID0+IHtcbiAgICAgICAgbmV4dExpc3RlbmVycy5zZXQoa2V5LCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMpIDogXCJZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLmdldFN0YXRlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiBUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuIFBhc3MgaXQgZG93biBmcm9tIHRoZSB0b3AgcmVkdWNlciBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSB0aGUgc3RvcmUuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNCkgOiBgRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YobGlzdGVuZXIpfSdgKTtcbiAgICB9XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogXCJZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gSWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgbm90aWZpZWQgYWZ0ZXIgdGhlIHN0b3JlIGhhcyBiZWVuIHVwZGF0ZWQsIHN1YnNjcmliZSBmcm9tIGEgY29tcG9uZW50IGFuZCBpbnZva2Ugc3RvcmUuZ2V0U3RhdGUoKSBpbiB0aGUgY2FsbGJhY2sgdG8gYWNjZXNzIHRoZSBsYXRlc3Qgc3RhdGUuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy5cIik7XG4gICAgfVxuICAgIGxldCBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICBjb25zdCBsaXN0ZW5lcklkID0gbGlzdGVuZXJJZENvdW50ZXIrKztcbiAgICBuZXh0TGlzdGVuZXJzLnNldChsaXN0ZW5lcklkLCBsaXN0ZW5lcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNikgOiBcIllvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy5cIik7XG4gICAgICB9XG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIG5leHRMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVySWQpO1xuICAgICAgY3VycmVudExpc3RlbmVycyA9IG51bGw7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBgQWN0aW9ucyBtdXN0IGJlIHBsYWluIG9iamVjdHMuIEluc3RlYWQsIHRoZSBhY3R1YWwgdHlwZSB3YXM6ICcke2tpbmRPZihhY3Rpb24pfScuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLmApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg4KSA6ICdBY3Rpb25zIG1heSBub3QgaGF2ZSBhbiB1bmRlZmluZWQgXCJ0eXBlXCIgcHJvcGVydHkuIFlvdSBtYXkgaGF2ZSBtaXNzcGVsbGVkIGFuIGFjdGlvbiB0eXBlIHN0cmluZyBjb25zdGFudC4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTcpIDogYEFjdGlvbiBcInR5cGVcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nLiBJbnN0ZWFkLCB0aGUgYWN0dWFsIHR5cGUgd2FzOiAnJHtraW5kT2YoYWN0aW9uLnR5cGUpfScuIFZhbHVlIHdhczogJyR7YWN0aW9uLnR5cGV9JyAoc3RyaW5naWZpZWQpYCk7XG4gICAgfVxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg5KSA6IFwiUmVkdWNlcnMgbWF5IG5vdCBkaXNwYXRjaCBhY3Rpb25zLlwiKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMgPSBuZXh0TGlzdGVuZXJzO1xuICAgIGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIHJlcGxhY2VSZWR1Y2VyKG5leHRSZWR1Y2VyKSB7XG4gICAgaWYgKHR5cGVvZiBuZXh0UmVkdWNlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBgRXhwZWN0ZWQgdGhlIG5leHRSZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YobmV4dFJlZHVjZXIpfWApO1xuICAgIH1cbiAgICBjdXJyZW50UmVkdWNlciA9IG5leHRSZWR1Y2VyO1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuUkVQTEFDRVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIG9ic2VydmFibGUoKSB7XG4gICAgY29uc3Qgb3V0ZXJTdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciAhPT0gXCJvYmplY3RcIiB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IGBFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKG9ic2VydmVyKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGNvbnN0IG9ic2VydmVyQXNPYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgICAgIGlmIChvYnNlcnZlckFzT2JzZXJ2ZXIubmV4dCkge1xuICAgICAgICAgICAgb2JzZXJ2ZXJBc09ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmVcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBbc3ltYm9sX29ic2VydmFibGVfZGVmYXVsdF0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZGlzcGF0Y2goe1xuICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuSU5JVFxuICB9KTtcbiAgY29uc3Qgc3RvcmUgPSB7XG4gICAgZGlzcGF0Y2gsXG4gICAgc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlLFxuICAgIHJlcGxhY2VSZWR1Y2VyLFxuICAgIFtzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0XTogb2JzZXJ2YWJsZVxuICB9O1xuICByZXR1cm4gc3RvcmU7XG59XG5mdW5jdGlvbiBsZWdhY3lfY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHJldHVybiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpO1xufVxuXG4vLyBzcmMvdXRpbHMvd2FybmluZy50c1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICB0cnkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG59XG5cbi8vIHNyYy9jb21iaW5lUmVkdWNlcnMudHNcbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIGNvbnN0IHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICBjb25zdCBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IGFjdGlvblR5cGVzX2RlZmF1bHQuSU5JVCA/IFwicHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlXCIgOiBcInByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyXCI7XG4gIGlmIChyZWR1Y2VyS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gXCJTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLlwiO1xuICB9XG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBgVGhlICR7YXJndW1lbnROYW1lfSBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFwiJHtraW5kT2YoaW5wdXRTdGF0ZSl9XCIuIEV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czogXCIke3JlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpfVwiYDtcbiAgfVxuICBjb25zdCB1bmV4cGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKGlucHV0U3RhdGUpLmZpbHRlcigoa2V5KSA9PiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBhY3Rpb25UeXBlc19kZWZhdWx0LlJFUExBQ0UpXG4gICAgcmV0dXJuO1xuICBpZiAodW5leHBlY3RlZEtleXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBgVW5leHBlY3RlZCAke3VuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyBcImtleXNcIiA6IFwia2V5XCJ9IFwiJHt1bmV4cGVjdGVkS2V5cy5qb2luKCdcIiwgXCInKX1cIiBmb3VuZCBpbiAke2FyZ3VtZW50TmFtZX0uIEV4cGVjdGVkIHRvIGZpbmQgb25lIG9mIHRoZSBrbm93biByZWR1Y2VyIGtleXMgaW5zdGVhZDogXCIke3JlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpfVwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLmA7XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydFJlZHVjZXJTaGFwZShyZWR1Y2Vycykge1xuICBPYmplY3Qua2V5cyhyZWR1Y2VycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih2b2lkIDAsIHtcbiAgICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuSU5JVFxuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMikgOiBgVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7a2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIElmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQuIElmIHlvdSBkb24ndCB3YW50IHRvIHNldCBhIHZhbHVlIGZvciB0aGlzIHJlZHVjZXIsIHlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVkdWNlcih2b2lkIDAsIHtcbiAgICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMykgOiBgVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7a2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIHByb2JlZCB3aXRoIGEgcmFuZG9tIHR5cGUuIERvbid0IHRyeSB0byBoYW5kbGUgJyR7YWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUfScgb3Igb3RoZXIgYWN0aW9ucyBpbiBcInJlZHV4LypcIiBuYW1lc3BhY2UuIFRoZXkgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4gSW5zdGVhZCwgeW91IG11c3QgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBpbiB3aGljaCBjYXNlIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgYWN0aW9uIHR5cGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLCBidXQgY2FuIGJlIG51bGwuYCk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICBjb25zdCByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgY29uc3QgZmluYWxSZWR1Y2VycyA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcmVkdWNlcktleXNbaV07XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHdhcm5pbmcoYE5vIHJlZHVjZXIgcHJvdmlkZWQgZm9yIGtleSBcIiR7a2V5fVwiYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaW5hbFJlZHVjZXJzW2tleV0gPSByZWR1Y2Vyc1trZXldO1xuICAgIH1cbiAgfVxuICBjb25zdCBmaW5hbFJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMoZmluYWxSZWR1Y2Vycyk7XG4gIGxldCB1bmV4cGVjdGVkS2V5Q2FjaGU7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGUgPSB7fTtcbiAgfVxuICBsZXQgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgdHJ5IHtcbiAgICBhc3NlcnRSZWR1Y2VyU2hhcGUoZmluYWxSZWR1Y2Vycyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaGFwZUFzc2VydGlvbkVycm9yID0gZTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gY29tYmluYXRpb24oc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgaWYgKHNoYXBlQXNzZXJ0aW9uRXJyb3IpIHtcbiAgICAgIHRocm93IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuICAgICAgaWYgKHdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIHdhcm5pbmcod2FybmluZ01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tpXTtcbiAgICAgIGNvbnN0IHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW2tleV07XG4gICAgICBjb25zdCBwcmV2aW91c1N0YXRlRm9yS2V5ID0gc3RhdGVba2V5XTtcbiAgICAgIGNvbnN0IG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFN0YXRlRm9yS2V5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvblR5cGUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE0KSA6IGBXaGVuIGNhbGxlZCB3aXRoIGFuIGFjdGlvbiBvZiB0eXBlICR7YWN0aW9uVHlwZSA/IGBcIiR7U3RyaW5nKGFjdGlvblR5cGUpfVwiYCA6IFwiKHVua25vd24gdHlwZSlcIn0sIHRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke2tleX1cIiByZXR1cm5lZCB1bmRlZmluZWQuIFRvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuYCk7XG4gICAgICB9XG4gICAgICBuZXh0U3RhdGVba2V5XSA9IG5leHRTdGF0ZUZvcktleTtcbiAgICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IG5leHRTdGF0ZUZvcktleSAhPT0gcHJldmlvdXNTdGF0ZUZvcktleTtcbiAgICB9XG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuLy8gc3JjL2JpbmRBY3Rpb25DcmVhdG9ycy50c1xuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmdzKSk7XG4gIH07XG59XG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpO1xuICB9XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09IFwib2JqZWN0XCIgfHwgYWN0aW9uQ3JlYXRvcnMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNikgOiBgYmluZEFjdGlvbkNyZWF0b3JzIGV4cGVjdGVkIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLCBidXQgaW5zdGVhZCByZWNlaXZlZDogJyR7a2luZE9mKGFjdGlvbkNyZWF0b3JzKX0nLiBEaWQgeW91IHdyaXRlIFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cIiBpbnN0ZWFkIG9mIFwiaW1wb3J0ICogYXMgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiP2ApO1xuICB9XG4gIGNvbnN0IGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYWN0aW9uQ3JlYXRvcnMpIHtcbiAgICBjb25zdCBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm91bmRBY3Rpb25DcmVhdG9ycztcbn1cblxuLy8gc3JjL2NvbXBvc2UudHNcbmZ1bmN0aW9uIGNvbXBvc2UoLi4uZnVuY3MpIHtcbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYXJnKSA9PiBhcmc7XG4gIH1cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuICByZXR1cm4gZnVuY3MucmVkdWNlKChhLCBiKSA9PiAoLi4uYXJncykgPT4gYShiKC4uLmFyZ3MpKSk7XG59XG5cbi8vIHNyYy9hcHBseU1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGFwcGx5TWlkZGxld2FyZSguLi5taWRkbGV3YXJlcykge1xuICByZXR1cm4gKGNyZWF0ZVN0b3JlMikgPT4gKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZTIocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICAgIGxldCBkaXNwYXRjaCA9ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6IFwiRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gT3RoZXIgbWlkZGxld2FyZSB3b3VsZCBub3QgYmUgYXBwbGllZCB0byB0aGlzIGRpc3BhdGNoLlwiKTtcbiAgICB9O1xuICAgIGNvbnN0IG1pZGRsZXdhcmVBUEkgPSB7XG4gICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICBkaXNwYXRjaDogKGFjdGlvbiwgLi4uYXJncykgPT4gZGlzcGF0Y2goYWN0aW9uLCAuLi5hcmdzKVxuICAgIH07XG4gICAgY29uc3QgY2hhaW4gPSBtaWRkbGV3YXJlcy5tYXAoKG1pZGRsZXdhcmUpID0+IG1pZGRsZXdhcmUobWlkZGxld2FyZUFQSSkpO1xuICAgIGRpc3BhdGNoID0gY29tcG9zZSguLi5jaGFpbikoc3RvcmUuZGlzcGF0Y2gpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdG9yZSxcbiAgICAgIGRpc3BhdGNoXG4gICAgfTtcbiAgfTtcbn1cblxuLy8gc3JjL3V0aWxzL2lzQWN0aW9uLnRzXG5mdW5jdGlvbiBpc0FjdGlvbihhY3Rpb24pIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QoYWN0aW9uKSAmJiBcInR5cGVcIiBpbiBhY3Rpb24gJiYgdHlwZW9mIGFjdGlvbi50eXBlID09PSBcInN0cmluZ1wiO1xufVxuZXhwb3J0IHtcbiAgYWN0aW9uVHlwZXNfZGVmYXVsdCBhcyBfX0RPX05PVF9VU0VfX0FjdGlvblR5cGVzLFxuICBhcHBseU1pZGRsZXdhcmUsXG4gIGJpbmRBY3Rpb25DcmVhdG9ycyxcbiAgY29tYmluZVJlZHVjZXJzLFxuICBjb21wb3NlLFxuICBjcmVhdGVTdG9yZSxcbiAgaXNBY3Rpb24sXG4gIGlzUGxhaW5PYmplY3QsXG4gIGxlZ2FjeV9jcmVhdGVTdG9yZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZHV4Lm1qcy5tYXAiLCIvLyBzcmMvdXRpbHMvZW52LnRzXG52YXIgTk9USElORyA9IFN5bWJvbC5mb3IoXCJpbW1lci1ub3RoaW5nXCIpO1xudmFyIERSQUZUQUJMRSA9IFN5bWJvbC5mb3IoXCJpbW1lci1kcmFmdGFibGVcIik7XG52YXIgRFJBRlRfU1RBVEUgPSBTeW1ib2wuZm9yKFwiaW1tZXItc3RhdGVcIik7XG5cbi8vIHNyYy91dGlscy9lcnJvcnMudHNcbnZhciBlcnJvcnMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBbXG4gIC8vIEFsbCBlcnJvciBjb2Rlcywgc3RhcnRpbmcgYnkgMDpcbiAgZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgcmV0dXJuIGBUaGUgcGx1Z2luIGZvciAnJHtwbHVnaW59JyBoYXMgbm90IGJlZW4gbG9hZGVkIGludG8gSW1tZXIuIFRvIGVuYWJsZSB0aGUgcGx1Z2luLCBpbXBvcnQgYW5kIGNhbGwgXFxgZW5hYmxlJHtwbHVnaW59KClcXGAgd2hlbiBpbml0aWFsaXppbmcgeW91ciBhcHBsaWNhdGlvbi5gO1xuICB9LFxuICBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiBgcHJvZHVjZSBjYW4gb25seSBiZSBjYWxsZWQgb24gdGhpbmdzIHRoYXQgYXJlIGRyYWZ0YWJsZTogcGxhaW4gb2JqZWN0cywgYXJyYXlzLCBNYXAsIFNldCBvciBjbGFzc2VzIHRoYXQgYXJlIG1hcmtlZCB3aXRoICdbaW1tZXJhYmxlXTogdHJ1ZScuIEdvdCAnJHt0aGluZ30nYDtcbiAgfSxcbiAgXCJUaGlzIG9iamVjdCBoYXMgYmVlbiBmcm96ZW4gYW5kIHNob3VsZCBub3QgYmUgbXV0YXRlZFwiLFxuICBmdW5jdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIFwiQ2Fubm90IHVzZSBhIHByb3h5IHRoYXQgaGFzIGJlZW4gcmV2b2tlZC4gRGlkIHlvdSBwYXNzIGFuIG9iamVjdCBmcm9tIGluc2lkZSBhbiBpbW1lciBmdW5jdGlvbiB0byBhbiBhc3luYyBwcm9jZXNzPyBcIiArIGRhdGE7XG4gIH0sXG4gIFwiQW4gaW1tZXIgcHJvZHVjZXIgcmV0dXJuZWQgYSBuZXcgdmFsdWUgKmFuZCogbW9kaWZpZWQgaXRzIGRyYWZ0LiBFaXRoZXIgcmV0dXJuIGEgbmV3IHZhbHVlICpvciogbW9kaWZ5IHRoZSBkcmFmdC5cIixcbiAgXCJJbW1lciBmb3JiaWRzIGNpcmN1bGFyIHJlZmVyZW5jZXNcIixcbiAgXCJUaGUgZmlyc3Qgb3Igc2Vjb25kIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb25cIixcbiAgXCJUaGUgdGhpcmQgYXJndW1lbnQgdG8gYHByb2R1Y2VgIG11c3QgYmUgYSBmdW5jdGlvbiBvciB1bmRlZmluZWRcIixcbiAgXCJGaXJzdCBhcmd1bWVudCB0byBgY3JlYXRlRHJhZnRgIG11c3QgYmUgYSBwbGFpbiBvYmplY3QsIGFuIGFycmF5LCBvciBhbiBpbW1lcmFibGUgb2JqZWN0XCIsXG4gIFwiRmlyc3QgYXJndW1lbnQgdG8gYGZpbmlzaERyYWZ0YCBtdXN0IGJlIGEgZHJhZnQgcmV0dXJuZWQgYnkgYGNyZWF0ZURyYWZ0YFwiLFxuICBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiBgJ2N1cnJlbnQnIGV4cGVjdHMgYSBkcmFmdCwgZ290OiAke3RoaW5nfWA7XG4gIH0sXG4gIFwiT2JqZWN0LmRlZmluZVByb3BlcnR5KCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIixcbiAgXCJPYmplY3Quc2V0UHJvdG90eXBlT2YoKSBjYW5ub3QgYmUgdXNlZCBvbiBhbiBJbW1lciBkcmFmdFwiLFxuICBcIkltbWVyIG9ubHkgc3VwcG9ydHMgZGVsZXRpbmcgYXJyYXkgaW5kaWNlc1wiLFxuICBcIkltbWVyIG9ubHkgc3VwcG9ydHMgc2V0dGluZyBhcnJheSBpbmRpY2VzIGFuZCB0aGUgJ2xlbmd0aCcgcHJvcGVydHlcIixcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYCdvcmlnaW5hbCcgZXhwZWN0cyBhIGRyYWZ0LCBnb3Q6ICR7dGhpbmd9YDtcbiAgfVxuICAvLyBOb3RlOiBpZiBtb3JlIGVycm9ycyBhcmUgYWRkZWQsIHRoZSBlcnJvck9mZnNldCBpbiBQYXRjaGVzLnRzIHNob3VsZCBiZSBpbmNyZWFzZWRcbiAgLy8gU2VlIFBhdGNoZXMudHMgZm9yIGFkZGl0aW9uYWwgZXJyb3JzXG5dIDogW107XG5mdW5jdGlvbiBkaWUoZXJyb3IsIC4uLmFyZ3MpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnN0IGUgPSBlcnJvcnNbZXJyb3JdO1xuICAgIGNvbnN0IG1zZyA9IHR5cGVvZiBlID09PSBcImZ1bmN0aW9uXCIgPyBlLmFwcGx5KG51bGwsIGFyZ3MpIDogZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFtJbW1lcl0gJHttc2d9YCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBbSW1tZXJdIG1pbmlmaWVkIGVycm9yIG5yOiAke2Vycm9yfS4gRnVsbCBlcnJvciBhdDogaHR0cHM6Ly9iaXQubHkvM2NYRUtXZmBcbiAgKTtcbn1cblxuLy8gc3JjL3V0aWxzL2NvbW1vbi50c1xudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuZnVuY3Rpb24gaXNEcmFmdCh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiAhIXZhbHVlW0RSQUZUX1NUQVRFXTtcbn1cbmZ1bmN0aW9uIGlzRHJhZnRhYmxlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgISF2YWx1ZVtEUkFGVEFCTEVdIHx8ICEhdmFsdWUuY29uc3RydWN0b3I/LltEUkFGVEFCTEVdIHx8IGlzTWFwKHZhbHVlKSB8fCBpc1NldCh2YWx1ZSk7XG59XG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IudG9TdHJpbmcoKTtcbnZhciBjYWNoZWRDdG9yU3RyaW5ncyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsIHx8IHByb3RvID09PSBPYmplY3QucHJvdG90eXBlKVxuICAgIHJldHVybiB0cnVlO1xuICBjb25zdCBDdG9yID0gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIFwiY29uc3RydWN0b3JcIikgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIGlmIChDdG9yID09PSBPYmplY3QpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmICh0eXBlb2YgQ3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IGN0b3JTdHJpbmcgPSBjYWNoZWRDdG9yU3RyaW5ncy5nZXQoQ3Rvcik7XG4gIGlmIChjdG9yU3RyaW5nID09PSB2b2lkIDApIHtcbiAgICBjdG9yU3RyaW5nID0gRnVuY3Rpb24udG9TdHJpbmcuY2FsbChDdG9yKTtcbiAgICBjYWNoZWRDdG9yU3RyaW5ncy5zZXQoQ3RvciwgY3RvclN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIGN0b3JTdHJpbmcgPT09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5mdW5jdGlvbiBvcmlnaW5hbCh2YWx1ZSkge1xuICBpZiAoIWlzRHJhZnQodmFsdWUpKVxuICAgIGRpZSgxNSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWVbRFJBRlRfU1RBVEVdLmJhc2VfO1xufVxuZnVuY3Rpb24gZWFjaChvYmosIGl0ZXIsIHN0cmljdCA9IHRydWUpIHtcbiAgaWYgKGdldEFyY2h0eXBlKG9iaikgPT09IDAgLyogT2JqZWN0ICovKSB7XG4gICAgY29uc3Qga2V5cyA9IHN0cmljdCA/IFJlZmxlY3Qub3duS2V5cyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaXRlcihrZXksIG9ialtrZXldLCBvYmopO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iai5mb3JFYWNoKChlbnRyeSwgaW5kZXgpID0+IGl0ZXIoaW5kZXgsIGVudHJ5LCBvYmopKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0QXJjaHR5cGUodGhpbmcpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGluZ1tEUkFGVF9TVEFURV07XG4gIHJldHVybiBzdGF0ZSA/IHN0YXRlLnR5cGVfIDogQXJyYXkuaXNBcnJheSh0aGluZykgPyAxIC8qIEFycmF5ICovIDogaXNNYXAodGhpbmcpID8gMiAvKiBNYXAgKi8gOiBpc1NldCh0aGluZykgPyAzIC8qIFNldCAqLyA6IDAgLyogT2JqZWN0ICovO1xufVxuZnVuY3Rpb24gaGFzKHRoaW5nLCBwcm9wKSB7XG4gIHJldHVybiBnZXRBcmNodHlwZSh0aGluZykgPT09IDIgLyogTWFwICovID8gdGhpbmcuaGFzKHByb3ApIDogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaW5nLCBwcm9wKTtcbn1cbmZ1bmN0aW9uIGdldCh0aGluZywgcHJvcCkge1xuICByZXR1cm4gZ2V0QXJjaHR5cGUodGhpbmcpID09PSAyIC8qIE1hcCAqLyA/IHRoaW5nLmdldChwcm9wKSA6IHRoaW5nW3Byb3BdO1xufVxuZnVuY3Rpb24gc2V0KHRoaW5nLCBwcm9wT3JPbGRWYWx1ZSwgdmFsdWUpIHtcbiAgY29uc3QgdCA9IGdldEFyY2h0eXBlKHRoaW5nKTtcbiAgaWYgKHQgPT09IDIgLyogTWFwICovKVxuICAgIHRoaW5nLnNldChwcm9wT3JPbGRWYWx1ZSwgdmFsdWUpO1xuICBlbHNlIGlmICh0ID09PSAzIC8qIFNldCAqLykge1xuICAgIHRoaW5nLmFkZCh2YWx1ZSk7XG4gIH0gZWxzZVxuICAgIHRoaW5nW3Byb3BPck9sZFZhbHVlXSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5mdW5jdGlvbiBpc01hcCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIE1hcDtcbn1cbmZ1bmN0aW9uIGlzU2V0KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgU2V0O1xufVxuZnVuY3Rpb24gbGF0ZXN0KHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5jb3B5XyB8fCBzdGF0ZS5iYXNlXztcbn1cbmZ1bmN0aW9uIHNoYWxsb3dDb3B5KGJhc2UsIHN0cmljdCkge1xuICBpZiAoaXNNYXAoYmFzZSkpIHtcbiAgICByZXR1cm4gbmV3IE1hcChiYXNlKTtcbiAgfVxuICBpZiAoaXNTZXQoYmFzZSkpIHtcbiAgICByZXR1cm4gbmV3IFNldChiYXNlKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShiYXNlKSlcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYmFzZSk7XG4gIGNvbnN0IGlzUGxhaW4gPSBpc1BsYWluT2JqZWN0KGJhc2UpO1xuICBpZiAoc3RyaWN0ID09PSB0cnVlIHx8IHN0cmljdCA9PT0gXCJjbGFzc19vbmx5XCIgJiYgIWlzUGxhaW4pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGJhc2UpO1xuICAgIGRlbGV0ZSBkZXNjcmlwdG9yc1tEUkFGVF9TVEFURV07XG4gICAgbGV0IGtleXMgPSBSZWZsZWN0Lm93bktleXMoZGVzY3JpcHRvcnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IGRlc2MgPSBkZXNjcmlwdG9yc1trZXldO1xuICAgICAgaWYgKGRlc2Mud3JpdGFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGRlc2Mud3JpdGFibGUgPSB0cnVlO1xuICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpXG4gICAgICAgIGRlc2NyaXB0b3JzW2tleV0gPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIC8vIGNvdWxkIGxpdmUgd2l0aCAhIWRlc2Muc2V0IGFzIHdlbGwgaGVyZS4uLlxuICAgICAgICAgIGVudW1lcmFibGU6IGRlc2MuZW51bWVyYWJsZSxcbiAgICAgICAgICB2YWx1ZTogYmFzZVtrZXldXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKGdldFByb3RvdHlwZU9mKGJhc2UpLCBkZXNjcmlwdG9ycyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihiYXNlKTtcbiAgICBpZiAocHJvdG8gIT09IG51bGwgJiYgaXNQbGFpbikge1xuICAgICAgcmV0dXJuIHsgLi4uYmFzZSB9O1xuICAgIH1cbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvYmosIGJhc2UpO1xuICB9XG59XG5mdW5jdGlvbiBmcmVlemUob2JqLCBkZWVwID0gZmFsc2UpIHtcbiAgaWYgKGlzRnJvemVuKG9iaikgfHwgaXNEcmFmdChvYmopIHx8ICFpc0RyYWZ0YWJsZShvYmopKVxuICAgIHJldHVybiBvYmo7XG4gIGlmIChnZXRBcmNodHlwZShvYmopID4gMSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwge1xuICAgICAgc2V0OiBkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGUsXG4gICAgICBhZGQ6IGRvbnRNdXRhdGVNZXRob2RPdmVycmlkZSxcbiAgICAgIGNsZWFyOiBkb250TXV0YXRlTWV0aG9kT3ZlcnJpZGUsXG4gICAgICBkZWxldGU6IGRvbnRNdXRhdGVNZXRob2RPdmVycmlkZVxuICAgIH0pO1xuICB9XG4gIE9iamVjdC5mcmVlemUob2JqKTtcbiAgaWYgKGRlZXApXG4gICAgT2JqZWN0LnZhbHVlcyhvYmopLmZvckVhY2goKHZhbHVlKSA9PiBmcmVlemUodmFsdWUsIHRydWUpKTtcbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIGRvbnRNdXRhdGVGcm96ZW5Db2xsZWN0aW9ucygpIHtcbiAgZGllKDIpO1xufVxudmFyIGRvbnRNdXRhdGVNZXRob2RPdmVycmlkZSA9IHtcbiAgdmFsdWU6IGRvbnRNdXRhdGVGcm96ZW5Db2xsZWN0aW9uc1xufTtcbmZ1bmN0aW9uIGlzRnJvemVuKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBPYmplY3QuaXNGcm96ZW4ob2JqKTtcbn1cblxuLy8gc3JjL3V0aWxzL3BsdWdpbnMudHNcbnZhciBwbHVnaW5zID0ge307XG5mdW5jdGlvbiBnZXRQbHVnaW4ocGx1Z2luS2V5KSB7XG4gIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnNbcGx1Z2luS2V5XTtcbiAgaWYgKCFwbHVnaW4pIHtcbiAgICBkaWUoMCwgcGx1Z2luS2V5KTtcbiAgfVxuICByZXR1cm4gcGx1Z2luO1xufVxuZnVuY3Rpb24gbG9hZFBsdWdpbihwbHVnaW5LZXksIGltcGxlbWVudGF0aW9uKSB7XG4gIGlmICghcGx1Z2luc1twbHVnaW5LZXldKVxuICAgIHBsdWdpbnNbcGx1Z2luS2V5XSA9IGltcGxlbWVudGF0aW9uO1xufVxuXG4vLyBzcmMvY29yZS9zY29wZS50c1xudmFyIGN1cnJlbnRTY29wZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRTY29wZSgpIHtcbiAgcmV0dXJuIGN1cnJlbnRTY29wZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNjb3BlKHBhcmVudF8sIGltbWVyXykge1xuICByZXR1cm4ge1xuICAgIGRyYWZ0c186IFtdLFxuICAgIHBhcmVudF8sXG4gICAgaW1tZXJfLFxuICAgIC8vIFdoZW5ldmVyIHRoZSBtb2RpZmllZCBkcmFmdCBjb250YWlucyBhIGRyYWZ0IGZyb20gYW5vdGhlciBzY29wZSwgd2VcbiAgICAvLyBuZWVkIHRvIHByZXZlbnQgYXV0by1mcmVlemluZyBzbyB0aGUgdW5vd25lZCBkcmFmdCBjYW4gYmUgZmluYWxpemVkLlxuICAgIGNhbkF1dG9GcmVlemVfOiB0cnVlLFxuICAgIHVuZmluYWxpemVkRHJhZnRzXzogMFxuICB9O1xufVxuZnVuY3Rpb24gdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpIHtcbiAgaWYgKHBhdGNoTGlzdGVuZXIpIHtcbiAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpO1xuICAgIHNjb3BlLnBhdGNoZXNfID0gW107XG4gICAgc2NvcGUuaW52ZXJzZVBhdGNoZXNfID0gW107XG4gICAgc2NvcGUucGF0Y2hMaXN0ZW5lcl8gPSBwYXRjaExpc3RlbmVyO1xuICB9XG59XG5mdW5jdGlvbiByZXZva2VTY29wZShzY29wZSkge1xuICBsZWF2ZVNjb3BlKHNjb3BlKTtcbiAgc2NvcGUuZHJhZnRzXy5mb3JFYWNoKHJldm9rZURyYWZ0KTtcbiAgc2NvcGUuZHJhZnRzXyA9IG51bGw7XG59XG5mdW5jdGlvbiBsZWF2ZVNjb3BlKHNjb3BlKSB7XG4gIGlmIChzY29wZSA9PT0gY3VycmVudFNjb3BlKSB7XG4gICAgY3VycmVudFNjb3BlID0gc2NvcGUucGFyZW50XztcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJTY29wZShpbW1lcjIpIHtcbiAgcmV0dXJuIGN1cnJlbnRTY29wZSA9IGNyZWF0ZVNjb3BlKGN1cnJlbnRTY29wZSwgaW1tZXIyKTtcbn1cbmZ1bmN0aW9uIHJldm9rZURyYWZ0KGRyYWZ0KSB7XG4gIGNvbnN0IHN0YXRlID0gZHJhZnRbRFJBRlRfU1RBVEVdO1xuICBpZiAoc3RhdGUudHlwZV8gPT09IDAgLyogT2JqZWN0ICovIHx8IHN0YXRlLnR5cGVfID09PSAxIC8qIEFycmF5ICovKVxuICAgIHN0YXRlLnJldm9rZV8oKTtcbiAgZWxzZVxuICAgIHN0YXRlLnJldm9rZWRfID0gdHJ1ZTtcbn1cblxuLy8gc3JjL2NvcmUvZmluYWxpemUudHNcbmZ1bmN0aW9uIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSkge1xuICBzY29wZS51bmZpbmFsaXplZERyYWZ0c18gPSBzY29wZS5kcmFmdHNfLmxlbmd0aDtcbiAgY29uc3QgYmFzZURyYWZ0ID0gc2NvcGUuZHJhZnRzX1swXTtcbiAgY29uc3QgaXNSZXBsYWNlZCA9IHJlc3VsdCAhPT0gdm9pZCAwICYmIHJlc3VsdCAhPT0gYmFzZURyYWZ0O1xuICBpZiAoaXNSZXBsYWNlZCkge1xuICAgIGlmIChiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLm1vZGlmaWVkXykge1xuICAgICAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICAgICAgZGllKDQpO1xuICAgIH1cbiAgICBpZiAoaXNEcmFmdGFibGUocmVzdWx0KSkge1xuICAgICAgcmVzdWx0ID0gZmluYWxpemUoc2NvcGUsIHJlc3VsdCk7XG4gICAgICBpZiAoIXNjb3BlLnBhcmVudF8pXG4gICAgICAgIG1heWJlRnJlZXplKHNjb3BlLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAoc2NvcGUucGF0Y2hlc18pIHtcbiAgICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKFxuICAgICAgICBiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLmJhc2VfLFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHNjb3BlLnBhdGNoZXNfLFxuICAgICAgICBzY29wZS5pbnZlcnNlUGF0Y2hlc19cbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGZpbmFsaXplKHNjb3BlLCBiYXNlRHJhZnQsIFtdKTtcbiAgfVxuICByZXZva2VTY29wZShzY29wZSk7XG4gIGlmIChzY29wZS5wYXRjaGVzXykge1xuICAgIHNjb3BlLnBhdGNoTGlzdGVuZXJfKHNjb3BlLnBhdGNoZXNfLCBzY29wZS5pbnZlcnNlUGF0Y2hlc18pO1xuICB9XG4gIHJldHVybiByZXN1bHQgIT09IE5PVEhJTkcgPyByZXN1bHQgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBmaW5hbGl6ZShyb290U2NvcGUsIHZhbHVlLCBwYXRoKSB7XG4gIGlmIChpc0Zyb3plbih2YWx1ZSkpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBjb25zdCB1c2VTdHJpY3RJdGVyYXRpb24gPSByb290U2NvcGUuaW1tZXJfLnNob3VsZFVzZVN0cmljdEl0ZXJhdGlvbigpO1xuICBjb25zdCBzdGF0ZSA9IHZhbHVlW0RSQUZUX1NUQVRFXTtcbiAgaWYgKCFzdGF0ZSkge1xuICAgIGVhY2goXG4gICAgICB2YWx1ZSxcbiAgICAgIChrZXksIGNoaWxkVmFsdWUpID0+IGZpbmFsaXplUHJvcGVydHkocm9vdFNjb3BlLCBzdGF0ZSwgdmFsdWUsIGtleSwgY2hpbGRWYWx1ZSwgcGF0aCksXG4gICAgICB1c2VTdHJpY3RJdGVyYXRpb25cbiAgICApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoc3RhdGUuc2NvcGVfICE9PSByb290U2NvcGUpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgc3RhdGUuYmFzZV8sIHRydWUpO1xuICAgIHJldHVybiBzdGF0ZS5iYXNlXztcbiAgfVxuICBpZiAoIXN0YXRlLmZpbmFsaXplZF8pIHtcbiAgICBzdGF0ZS5maW5hbGl6ZWRfID0gdHJ1ZTtcbiAgICBzdGF0ZS5zY29wZV8udW5maW5hbGl6ZWREcmFmdHNfLS07XG4gICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuY29weV87XG4gICAgbGV0IHJlc3VsdEVhY2ggPSByZXN1bHQ7XG4gICAgbGV0IGlzU2V0MiA9IGZhbHNlO1xuICAgIGlmIChzdGF0ZS50eXBlXyA9PT0gMyAvKiBTZXQgKi8pIHtcbiAgICAgIHJlc3VsdEVhY2ggPSBuZXcgU2V0KHJlc3VsdCk7XG4gICAgICByZXN1bHQuY2xlYXIoKTtcbiAgICAgIGlzU2V0MiA9IHRydWU7XG4gICAgfVxuICAgIGVhY2goXG4gICAgICByZXN1bHRFYWNoLFxuICAgICAgKGtleSwgY2hpbGRWYWx1ZSkgPT4gZmluYWxpemVQcm9wZXJ0eShcbiAgICAgICAgcm9vdFNjb3BlLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBrZXksXG4gICAgICAgIGNoaWxkVmFsdWUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGlzU2V0MlxuICAgICAgKSxcbiAgICAgIHVzZVN0cmljdEl0ZXJhdGlvblxuICAgICk7XG4gICAgbWF5YmVGcmVlemUocm9vdFNjb3BlLCByZXN1bHQsIGZhbHNlKTtcbiAgICBpZiAocGF0aCAmJiByb290U2NvcGUucGF0Y2hlc18pIHtcbiAgICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVQYXRjaGVzXyhcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHJvb3RTY29wZS5wYXRjaGVzXyxcbiAgICAgICAgcm9vdFNjb3BlLmludmVyc2VQYXRjaGVzX1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmNvcHlfO1xufVxuZnVuY3Rpb24gZmluYWxpemVQcm9wZXJ0eShyb290U2NvcGUsIHBhcmVudFN0YXRlLCB0YXJnZXRPYmplY3QsIHByb3AsIGNoaWxkVmFsdWUsIHJvb3RQYXRoLCB0YXJnZXRJc1NldCkge1xuICBpZiAoY2hpbGRWYWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0eXBlb2YgY2hpbGRWYWx1ZSAhPT0gXCJvYmplY3RcIiAmJiAhdGFyZ2V0SXNTZXQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY2hpbGRJc0Zyb3plbiA9IGlzRnJvemVuKGNoaWxkVmFsdWUpO1xuICBpZiAoY2hpbGRJc0Zyb3plbiAmJiAhdGFyZ2V0SXNTZXQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBjaGlsZFZhbHVlID09PSB0YXJnZXRPYmplY3QpXG4gICAgZGllKDUpO1xuICBpZiAoaXNEcmFmdChjaGlsZFZhbHVlKSkge1xuICAgIGNvbnN0IHBhdGggPSByb290UGF0aCAmJiBwYXJlbnRTdGF0ZSAmJiBwYXJlbnRTdGF0ZS50eXBlXyAhPT0gMyAvKiBTZXQgKi8gJiYgLy8gU2V0IG9iamVjdHMgYXJlIGF0b21pYyBzaW5jZSB0aGV5IGhhdmUgbm8ga2V5cy5cbiAgICAhaGFzKHBhcmVudFN0YXRlLmFzc2lnbmVkXywgcHJvcCkgPyByb290UGF0aC5jb25jYXQocHJvcCkgOiB2b2lkIDA7XG4gICAgY29uc3QgcmVzID0gZmluYWxpemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlLCBwYXRoKTtcbiAgICBzZXQodGFyZ2V0T2JqZWN0LCBwcm9wLCByZXMpO1xuICAgIGlmIChpc0RyYWZ0KHJlcykpIHtcbiAgICAgIHJvb3RTY29wZS5jYW5BdXRvRnJlZXplXyA9IGZhbHNlO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKHRhcmdldElzU2V0KSB7XG4gICAgdGFyZ2V0T2JqZWN0LmFkZChjaGlsZFZhbHVlKTtcbiAgfVxuICBpZiAoaXNEcmFmdGFibGUoY2hpbGRWYWx1ZSkgJiYgIWNoaWxkSXNGcm96ZW4pIHtcbiAgICBpZiAoIXJvb3RTY29wZS5pbW1lcl8uYXV0b0ZyZWV6ZV8gJiYgcm9vdFNjb3BlLnVuZmluYWxpemVkRHJhZnRzXyA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHBhcmVudFN0YXRlICYmIHBhcmVudFN0YXRlLmJhc2VfICYmIHBhcmVudFN0YXRlLmJhc2VfW3Byb3BdID09PSBjaGlsZFZhbHVlICYmIGNoaWxkSXNGcm96ZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmluYWxpemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlKTtcbiAgICBpZiAoKCFwYXJlbnRTdGF0ZSB8fCAhcGFyZW50U3RhdGUuc2NvcGVfLnBhcmVudF8pICYmIHR5cGVvZiBwcm9wICE9PSBcInN5bWJvbFwiICYmIChpc01hcCh0YXJnZXRPYmplY3QpID8gdGFyZ2V0T2JqZWN0Lmhhcyhwcm9wKSA6IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0YXJnZXRPYmplY3QsIHByb3ApKSlcbiAgICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgY2hpbGRWYWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG1heWJlRnJlZXplKHNjb3BlLCB2YWx1ZSwgZGVlcCA9IGZhbHNlKSB7XG4gIGlmICghc2NvcGUucGFyZW50XyAmJiBzY29wZS5pbW1lcl8uYXV0b0ZyZWV6ZV8gJiYgc2NvcGUuY2FuQXV0b0ZyZWV6ZV8pIHtcbiAgICBmcmVlemUodmFsdWUsIGRlZXApO1xuICB9XG59XG5cbi8vIHNyYy9jb3JlL3Byb3h5LnRzXG5mdW5jdGlvbiBjcmVhdGVQcm94eVByb3h5KGJhc2UsIHBhcmVudCkge1xuICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShiYXNlKTtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgdHlwZV86IGlzQXJyYXkgPyAxIC8qIEFycmF5ICovIDogMCAvKiBPYmplY3QgKi8sXG4gICAgLy8gVHJhY2sgd2hpY2ggcHJvZHVjZSBjYWxsIHRoaXMgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgIHNjb3BlXzogcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpLFxuICAgIC8vIFRydWUgZm9yIGJvdGggc2hhbGxvdyBhbmQgZGVlcCBjaGFuZ2VzLlxuICAgIG1vZGlmaWVkXzogZmFsc2UsXG4gICAgLy8gVXNlZCBkdXJpbmcgZmluYWxpemF0aW9uLlxuICAgIGZpbmFsaXplZF86IGZhbHNlLFxuICAgIC8vIFRyYWNrIHdoaWNoIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGFzc2lnbmVkICh0cnVlKSBvciBkZWxldGVkIChmYWxzZSkuXG4gICAgYXNzaWduZWRfOiB7fSxcbiAgICAvLyBUaGUgcGFyZW50IGRyYWZ0IHN0YXRlLlxuICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAvLyBUaGUgYmFzZSBzdGF0ZS5cbiAgICBiYXNlXzogYmFzZSxcbiAgICAvLyBUaGUgYmFzZSBwcm94eS5cbiAgICBkcmFmdF86IG51bGwsXG4gICAgLy8gc2V0IGJlbG93XG4gICAgLy8gVGhlIGJhc2UgY29weSB3aXRoIGFueSB1cGRhdGVkIHZhbHVlcy5cbiAgICBjb3B5XzogbnVsbCxcbiAgICAvLyBDYWxsZWQgYnkgdGhlIGBwcm9kdWNlYCBmdW5jdGlvbi5cbiAgICByZXZva2VfOiBudWxsLFxuICAgIGlzTWFudWFsXzogZmFsc2VcbiAgfTtcbiAgbGV0IHRhcmdldCA9IHN0YXRlO1xuICBsZXQgdHJhcHMgPSBvYmplY3RUcmFwcztcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICB0YXJnZXQgPSBbc3RhdGVdO1xuICAgIHRyYXBzID0gYXJyYXlUcmFwcztcbiAgfVxuICBjb25zdCB7IHJldm9rZSwgcHJveHkgfSA9IFByb3h5LnJldm9jYWJsZSh0YXJnZXQsIHRyYXBzKTtcbiAgc3RhdGUuZHJhZnRfID0gcHJveHk7XG4gIHN0YXRlLnJldm9rZV8gPSByZXZva2U7XG4gIHJldHVybiBwcm94eTtcbn1cbnZhciBvYmplY3RUcmFwcyA9IHtcbiAgZ2V0KHN0YXRlLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IERSQUZUX1NUQVRFKVxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIGNvbnN0IHNvdXJjZSA9IGxhdGVzdChzdGF0ZSk7XG4gICAgaWYgKCFoYXMoc291cmNlLCBwcm9wKSkge1xuICAgICAgcmV0dXJuIHJlYWRQcm9wRnJvbVByb3RvKHN0YXRlLCBzb3VyY2UsIHByb3ApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtwcm9wXTtcbiAgICBpZiAoc3RhdGUuZmluYWxpemVkXyB8fCAhaXNEcmFmdGFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gcGVlayhzdGF0ZS5iYXNlXywgcHJvcCkpIHtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5X1twcm9wXSA9IGNyZWF0ZVByb3h5KHZhbHVlLCBzdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgaGFzKHN0YXRlLCBwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AgaW4gbGF0ZXN0KHN0YXRlKTtcbiAgfSxcbiAgb3duS2V5cyhzdGF0ZSkge1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMobGF0ZXN0KHN0YXRlKSk7XG4gIH0sXG4gIHNldChzdGF0ZSwgcHJvcCwgdmFsdWUpIHtcbiAgICBjb25zdCBkZXNjID0gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhsYXRlc3Qoc3RhdGUpLCBwcm9wKTtcbiAgICBpZiAoZGVzYz8uc2V0KSB7XG4gICAgICBkZXNjLnNldC5jYWxsKHN0YXRlLmRyYWZ0XywgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgICBjb25zdCBjdXJyZW50MiA9IHBlZWsobGF0ZXN0KHN0YXRlKSwgcHJvcCk7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBjdXJyZW50Mj8uW0RSQUZUX1NUQVRFXTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUgJiYgY3VycmVudFN0YXRlLmJhc2VfID09PSB2YWx1ZSkge1xuICAgICAgICBzdGF0ZS5jb3B5X1twcm9wXSA9IHZhbHVlO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXModmFsdWUsIGN1cnJlbnQyKSAmJiAodmFsdWUgIT09IHZvaWQgMCB8fCBoYXMoc3RhdGUuYmFzZV8sIHByb3ApKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBwcmVwYXJlQ29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3B5X1twcm9wXSA9PT0gdmFsdWUgJiYgLy8gc3BlY2lhbCBjYXNlOiBoYW5kbGUgbmV3IHByb3BzIHdpdGggdmFsdWUgJ3VuZGVmaW5lZCdcbiAgICAodmFsdWUgIT09IHZvaWQgMCB8fCBwcm9wIGluIHN0YXRlLmNvcHlfKSB8fCAvLyBzcGVjaWFsIGNhc2U6IE5hTlxuICAgIE51bWJlci5pc05hTih2YWx1ZSkgJiYgTnVtYmVyLmlzTmFOKHN0YXRlLmNvcHlfW3Byb3BdKSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHN0YXRlLmNvcHlfW3Byb3BdID0gdmFsdWU7XG4gICAgc3RhdGUuYXNzaWduZWRfW3Byb3BdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkoc3RhdGUsIHByb3ApIHtcbiAgICBpZiAocGVlayhzdGF0ZS5iYXNlXywgcHJvcCkgIT09IHZvaWQgMCB8fCBwcm9wIGluIHN0YXRlLmJhc2VfKSB7XG4gICAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSBmYWxzZTtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHN0YXRlLmFzc2lnbmVkX1twcm9wXTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcHlfKSB7XG4gICAgICBkZWxldGUgc3RhdGUuY29weV9bcHJvcF07XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBOb3RlOiBXZSBuZXZlciBjb2VyY2UgYGRlc2MudmFsdWVgIGludG8gYW4gSW1tZXIgZHJhZnQsIGJlY2F1c2Ugd2UgY2FuJ3QgbWFrZVxuICAvLyB0aGUgc2FtZSBndWFyYW50ZWUgaW4gRVM1IG1vZGUuXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdGF0ZSwgcHJvcCkge1xuICAgIGNvbnN0IG93bmVyID0gbGF0ZXN0KHN0YXRlKTtcbiAgICBjb25zdCBkZXNjID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob3duZXIsIHByb3ApO1xuICAgIGlmICghZGVzYylcbiAgICAgIHJldHVybiBkZXNjO1xuICAgIHJldHVybiB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogc3RhdGUudHlwZV8gIT09IDEgLyogQXJyYXkgKi8gfHwgcHJvcCAhPT0gXCJsZW5ndGhcIixcbiAgICAgIGVudW1lcmFibGU6IGRlc2MuZW51bWVyYWJsZSxcbiAgICAgIHZhbHVlOiBvd25lcltwcm9wXVxuICAgIH07XG4gIH0sXG4gIGRlZmluZVByb3BlcnR5KCkge1xuICAgIGRpZSgxMSk7XG4gIH0sXG4gIGdldFByb3RvdHlwZU9mKHN0YXRlKSB7XG4gICAgcmV0dXJuIGdldFByb3RvdHlwZU9mKHN0YXRlLmJhc2VfKTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoKSB7XG4gICAgZGllKDEyKTtcbiAgfVxufTtcbnZhciBhcnJheVRyYXBzID0ge307XG5lYWNoKG9iamVjdFRyYXBzLCAoa2V5LCBmbikgPT4ge1xuICBhcnJheVRyYXBzW2tleV0gPSBmdW5jdGlvbigpIHtcbiAgICBhcmd1bWVudHNbMF0gPSBhcmd1bWVudHNbMF1bMF07XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KTtcbmFycmF5VHJhcHMuZGVsZXRlUHJvcGVydHkgPSBmdW5jdGlvbihzdGF0ZSwgcHJvcCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGlzTmFOKHBhcnNlSW50KHByb3ApKSlcbiAgICBkaWUoMTMpO1xuICByZXR1cm4gYXJyYXlUcmFwcy5zZXQuY2FsbCh0aGlzLCBzdGF0ZSwgcHJvcCwgdm9pZCAwKTtcbn07XG5hcnJheVRyYXBzLnNldCA9IGZ1bmN0aW9uKHN0YXRlLCBwcm9wLCB2YWx1ZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIHByb3AgIT09IFwibGVuZ3RoXCIgJiYgaXNOYU4ocGFyc2VJbnQocHJvcCkpKVxuICAgIGRpZSgxNCk7XG4gIHJldHVybiBvYmplY3RUcmFwcy5zZXQuY2FsbCh0aGlzLCBzdGF0ZVswXSwgcHJvcCwgdmFsdWUsIHN0YXRlWzBdKTtcbn07XG5mdW5jdGlvbiBwZWVrKGRyYWZ0LCBwcm9wKSB7XG4gIGNvbnN0IHN0YXRlID0gZHJhZnRbRFJBRlRfU1RBVEVdO1xuICBjb25zdCBzb3VyY2UgPSBzdGF0ZSA/IGxhdGVzdChzdGF0ZSkgOiBkcmFmdDtcbiAgcmV0dXJuIHNvdXJjZVtwcm9wXTtcbn1cbmZ1bmN0aW9uIHJlYWRQcm9wRnJvbVByb3RvKHN0YXRlLCBzb3VyY2UsIHByb3ApIHtcbiAgY29uc3QgZGVzYyA9IGdldERlc2NyaXB0b3JGcm9tUHJvdG8oc291cmNlLCBwcm9wKTtcbiAgcmV0dXJuIGRlc2MgPyBgdmFsdWVgIGluIGRlc2MgPyBkZXNjLnZhbHVlIDogKFxuICAgIC8vIFRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZSwgaWYgdGhlIHByb3AgaXMgYSBnZXR0ZXIgZGVmaW5lZCBieSB0aGVcbiAgICAvLyBwcm90b3R5cGUsIHdlIHNob3VsZCBpbnZva2UgaXQgd2l0aCB0aGUgZHJhZnQgYXMgY29udGV4dCFcbiAgICBkZXNjLmdldD8uY2FsbChzdGF0ZS5kcmFmdF8pXG4gICkgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBnZXREZXNjcmlwdG9yRnJvbVByb3RvKHNvdXJjZSwgcHJvcCkge1xuICBpZiAoIShwcm9wIGluIHNvdXJjZSkpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlKTtcbiAgd2hpbGUgKHByb3RvKSB7XG4gICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHByb3ApO1xuICAgIGlmIChkZXNjKVxuICAgICAgcmV0dXJuIGRlc2M7XG4gICAgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIG1hcmtDaGFuZ2VkKHN0YXRlKSB7XG4gIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgc3RhdGUubW9kaWZpZWRfID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUucGFyZW50Xykge1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUucGFyZW50Xyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlQ29weShzdGF0ZSkge1xuICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgc3RhdGUuY29weV8gPSBzaGFsbG93Q29weShcbiAgICAgIHN0YXRlLmJhc2VfLFxuICAgICAgc3RhdGUuc2NvcGVfLmltbWVyXy51c2VTdHJpY3RTaGFsbG93Q29weV9cbiAgICApO1xuICB9XG59XG5cbi8vIHNyYy9jb3JlL2ltbWVyQ2xhc3MudHNcbnZhciBJbW1lcjIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuYXV0b0ZyZWV6ZV8gPSB0cnVlO1xuICAgIHRoaXMudXNlU3RyaWN0U2hhbGxvd0NvcHlfID0gZmFsc2U7XG4gICAgdGhpcy51c2VTdHJpY3RJdGVyYXRpb25fID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYHByb2R1Y2VgIGZ1bmN0aW9uIHRha2VzIGEgdmFsdWUgYW5kIGEgXCJyZWNpcGUgZnVuY3Rpb25cIiAod2hvc2VcbiAgICAgKiByZXR1cm4gdmFsdWUgb2Z0ZW4gZGVwZW5kcyBvbiB0aGUgYmFzZSBzdGF0ZSkuIFRoZSByZWNpcGUgZnVuY3Rpb24gaXNcbiAgICAgKiBmcmVlIHRvIG11dGF0ZSBpdHMgZmlyc3QgYXJndW1lbnQgaG93ZXZlciBpdCB3YW50cy4gQWxsIG11dGF0aW9ucyBhcmVcbiAgICAgKiBvbmx5IGV2ZXIgYXBwbGllZCB0byBhIF9fY29weV9fIG9mIHRoZSBiYXNlIHN0YXRlLlxuICAgICAqXG4gICAgICogUGFzcyBvbmx5IGEgZnVuY3Rpb24gdG8gY3JlYXRlIGEgXCJjdXJyaWVkIHByb2R1Y2VyXCIgd2hpY2ggcmVsaWV2ZXMgeW91XG4gICAgICogZnJvbSBwYXNzaW5nIHRoZSByZWNpcGUgZnVuY3Rpb24gZXZlcnkgdGltZS5cbiAgICAgKlxuICAgICAqIE9ubHkgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzIGFyZSBtYWRlIG11dGFibGUuIEFsbCBvdGhlciBvYmplY3RzIGFyZVxuICAgICAqIGNvbnNpZGVyZWQgdW5jb3B5YWJsZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgX19ib3VuZF9fIHRvIGl0cyBgSW1tZXJgIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHthbnl9IGJhc2UgLSB0aGUgaW5pdGlhbCBzdGF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlY2lwZSAtIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBwcm94eSBvZiB0aGUgYmFzZSBzdGF0ZSBhcyBmaXJzdCBhcmd1bWVudCBhbmQgd2hpY2ggY2FuIGJlIGZyZWVseSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhdGNoTGlzdGVuZXIgLSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHRoZSBwYXRjaGVzIHByb2R1Y2VkIGhlcmVcbiAgICAgKiBAcmV0dXJucyB7YW55fSBhIG5ldyBzdGF0ZSwgb3IgdGhlIGluaXRpYWwgc3RhdGUgaWYgbm90aGluZyB3YXMgbW9kaWZpZWRcbiAgICAgKi9cbiAgICB0aGlzLnByb2R1Y2UgPSAoYmFzZSwgcmVjaXBlLCBwYXRjaExpc3RlbmVyKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGJhc2UgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgcmVjaXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdEJhc2UgPSByZWNpcGU7XG4gICAgICAgIHJlY2lwZSA9IGJhc2U7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gY3VycmllZFByb2R1Y2UoYmFzZTIgPSBkZWZhdWx0QmFzZSwgLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiBzZWxmLnByb2R1Y2UoYmFzZTIsIChkcmFmdCkgPT4gcmVjaXBlLmNhbGwodGhpcywgZHJhZnQsIC4uLmFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcmVjaXBlICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGRpZSg2KTtcbiAgICAgIGlmIChwYXRjaExpc3RlbmVyICE9PSB2b2lkIDAgJiYgdHlwZW9mIHBhdGNoTGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZGllKDcpO1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIGlmIChpc0RyYWZ0YWJsZShiYXNlKSkge1xuICAgICAgICBjb25zdCBzY29wZSA9IGVudGVyU2NvcGUodGhpcyk7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gY3JlYXRlUHJveHkoYmFzZSwgdm9pZCAwKTtcbiAgICAgICAgbGV0IGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSByZWNpcGUocHJveHkpO1xuICAgICAgICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKGhhc0Vycm9yKVxuICAgICAgICAgICAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxlYXZlU2NvcGUoc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSk7XG4gICAgICB9IGVsc2UgaWYgKCFiYXNlIHx8IHR5cGVvZiBiYXNlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlY2lwZShiYXNlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKVxuICAgICAgICAgIHJlc3VsdCA9IGJhc2U7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IE5PVEhJTkcpXG4gICAgICAgICAgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICBpZiAodGhpcy5hdXRvRnJlZXplXylcbiAgICAgICAgICBmcmVlemUocmVzdWx0LCB0cnVlKTtcbiAgICAgICAgaWYgKHBhdGNoTGlzdGVuZXIpIHtcbiAgICAgICAgICBjb25zdCBwID0gW107XG4gICAgICAgICAgY29uc3QgaXAgPSBbXTtcbiAgICAgICAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhiYXNlLCByZXN1bHQsIHAsIGlwKTtcbiAgICAgICAgICBwYXRjaExpc3RlbmVyKHAsIGlwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlXG4gICAgICAgIGRpZSgxLCBiYXNlKTtcbiAgICB9O1xuICAgIHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzID0gKGJhc2UsIHJlY2lwZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBiYXNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIChzdGF0ZSwgLi4uYXJncykgPT4gdGhpcy5wcm9kdWNlV2l0aFBhdGNoZXMoc3RhdGUsIChkcmFmdCkgPT4gYmFzZShkcmFmdCwgLi4uYXJncykpO1xuICAgICAgfVxuICAgICAgbGV0IHBhdGNoZXMsIGludmVyc2VQYXRjaGVzO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9kdWNlKGJhc2UsIHJlY2lwZSwgKHAsIGlwKSA9PiB7XG4gICAgICAgIHBhdGNoZXMgPSBwO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcyA9IGlwO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gW3Jlc3VsdCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXNdO1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBjb25maWc/LmF1dG9GcmVlemUgPT09IFwiYm9vbGVhblwiKVxuICAgICAgdGhpcy5zZXRBdXRvRnJlZXplKGNvbmZpZy5hdXRvRnJlZXplKTtcbiAgICBpZiAodHlwZW9mIGNvbmZpZz8udXNlU3RyaWN0U2hhbGxvd0NvcHkgPT09IFwiYm9vbGVhblwiKVxuICAgICAgdGhpcy5zZXRVc2VTdHJpY3RTaGFsbG93Q29weShjb25maWcudXNlU3RyaWN0U2hhbGxvd0NvcHkpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnPy51c2VTdHJpY3RJdGVyYXRpb24gPT09IFwiYm9vbGVhblwiKVxuICAgICAgdGhpcy5zZXRVc2VTdHJpY3RJdGVyYXRpb24oY29uZmlnLnVzZVN0cmljdEl0ZXJhdGlvbik7XG4gIH1cbiAgY3JlYXRlRHJhZnQoYmFzZSkge1xuICAgIGlmICghaXNEcmFmdGFibGUoYmFzZSkpXG4gICAgICBkaWUoOCk7XG4gICAgaWYgKGlzRHJhZnQoYmFzZSkpXG4gICAgICBiYXNlID0gY3VycmVudChiYXNlKTtcbiAgICBjb25zdCBzY29wZSA9IGVudGVyU2NvcGUodGhpcyk7XG4gICAgY29uc3QgcHJveHkgPSBjcmVhdGVQcm94eShiYXNlLCB2b2lkIDApO1xuICAgIHByb3h5W0RSQUZUX1NUQVRFXS5pc01hbnVhbF8gPSB0cnVlO1xuICAgIGxlYXZlU2NvcGUoc2NvcGUpO1xuICAgIHJldHVybiBwcm94eTtcbiAgfVxuICBmaW5pc2hEcmFmdChkcmFmdCwgcGF0Y2hMaXN0ZW5lcikge1xuICAgIGNvbnN0IHN0YXRlID0gZHJhZnQgJiYgZHJhZnRbRFJBRlRfU1RBVEVdO1xuICAgIGlmICghc3RhdGUgfHwgIXN0YXRlLmlzTWFudWFsXylcbiAgICAgIGRpZSg5KTtcbiAgICBjb25zdCB7IHNjb3BlXzogc2NvcGUgfSA9IHN0YXRlO1xuICAgIHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKTtcbiAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdCh2b2lkIDAsIHNjb3BlKTtcbiAgfVxuICAvKipcbiAgICogUGFzcyB0cnVlIHRvIGF1dG9tYXRpY2FsbHkgZnJlZXplIGFsbCBjb3BpZXMgY3JlYXRlZCBieSBJbW1lci5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgYXV0by1mcmVlemluZyBpcyBlbmFibGVkLlxuICAgKi9cbiAgc2V0QXV0b0ZyZWV6ZSh2YWx1ZSkge1xuICAgIHRoaXMuYXV0b0ZyZWV6ZV8gPSB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogUGFzcyB0cnVlIHRvIGVuYWJsZSBzdHJpY3Qgc2hhbGxvdyBjb3B5LlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBpbW1lciBkb2VzIG5vdCBjb3B5IHRoZSBvYmplY3QgZGVzY3JpcHRvcnMgc3VjaCBhcyBnZXR0ZXIsIHNldHRlciBhbmQgbm9uLWVudW1yYWJsZSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkodmFsdWUpIHtcbiAgICB0aGlzLnVzZVN0cmljdFNoYWxsb3dDb3B5XyA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBQYXNzIGZhbHNlIHRvIHVzZSBmYXN0ZXIgaXRlcmF0aW9uIHRoYXQgc2tpcHMgbm9uLWVudW1lcmFibGUgcHJvcGVydGllc1xuICAgKiBidXQgc3RpbGwgaGFuZGxlcyBzeW1ib2xzIGZvciBjb21wYXRpYmlsaXR5LlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzdHJpY3QgaXRlcmF0aW9uIGlzIGVuYWJsZWQgKGluY2x1ZGVzIGFsbCBvd24gcHJvcGVydGllcykuXG4gICAqL1xuICBzZXRVc2VTdHJpY3RJdGVyYXRpb24odmFsdWUpIHtcbiAgICB0aGlzLnVzZVN0cmljdEl0ZXJhdGlvbl8gPSB2YWx1ZTtcbiAgfVxuICBzaG91bGRVc2VTdHJpY3RJdGVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudXNlU3RyaWN0SXRlcmF0aW9uXztcbiAgfVxuICBhcHBseVBhdGNoZXMoYmFzZSwgcGF0Y2hlcykge1xuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IHBhdGNoZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHBhdGNoID0gcGF0Y2hlc1tpXTtcbiAgICAgIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA9PT0gMCAmJiBwYXRjaC5vcCA9PT0gXCJyZXBsYWNlXCIpIHtcbiAgICAgICAgYmFzZSA9IHBhdGNoLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPiAtMSkge1xuICAgICAgcGF0Y2hlcyA9IHBhdGNoZXMuc2xpY2UoaSArIDEpO1xuICAgIH1cbiAgICBjb25zdCBhcHBseVBhdGNoZXNJbXBsID0gZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5hcHBseVBhdGNoZXNfO1xuICAgIGlmIChpc0RyYWZ0KGJhc2UpKSB7XG4gICAgICByZXR1cm4gYXBwbHlQYXRjaGVzSW1wbChiYXNlLCBwYXRjaGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJvZHVjZShcbiAgICAgIGJhc2UsXG4gICAgICAoZHJhZnQpID0+IGFwcGx5UGF0Y2hlc0ltcGwoZHJhZnQsIHBhdGNoZXMpXG4gICAgKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZVByb3h5KHZhbHVlLCBwYXJlbnQpIHtcbiAgY29uc3QgZHJhZnQgPSBpc01hcCh2YWx1ZSkgPyBnZXRQbHVnaW4oXCJNYXBTZXRcIikucHJveHlNYXBfKHZhbHVlLCBwYXJlbnQpIDogaXNTZXQodmFsdWUpID8gZ2V0UGx1Z2luKFwiTWFwU2V0XCIpLnByb3h5U2V0Xyh2YWx1ZSwgcGFyZW50KSA6IGNyZWF0ZVByb3h5UHJveHkodmFsdWUsIHBhcmVudCk7XG4gIGNvbnN0IHNjb3BlID0gcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpO1xuICBzY29wZS5kcmFmdHNfLnB1c2goZHJhZnQpO1xuICByZXR1cm4gZHJhZnQ7XG59XG5cbi8vIHNyYy9jb3JlL2N1cnJlbnQudHNcbmZ1bmN0aW9uIGN1cnJlbnQodmFsdWUpIHtcbiAgaWYgKCFpc0RyYWZ0KHZhbHVlKSlcbiAgICBkaWUoMTAsIHZhbHVlKTtcbiAgcmV0dXJuIGN1cnJlbnRJbXBsKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGN1cnJlbnRJbXBsKHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdGFibGUodmFsdWUpIHx8IGlzRnJvemVuKHZhbHVlKSlcbiAgICByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHN0YXRlID0gdmFsdWVbRFJBRlRfU1RBVEVdO1xuICBsZXQgY29weTtcbiAgbGV0IHN0cmljdCA9IHRydWU7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICghc3RhdGUubW9kaWZpZWRfKVxuICAgICAgcmV0dXJuIHN0YXRlLmJhc2VfO1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSB0cnVlO1xuICAgIGNvcHkgPSBzaGFsbG93Q29weSh2YWx1ZSwgc3RhdGUuc2NvcGVfLmltbWVyXy51c2VTdHJpY3RTaGFsbG93Q29weV8pO1xuICAgIHN0cmljdCA9IHN0YXRlLnNjb3BlXy5pbW1lcl8uc2hvdWxkVXNlU3RyaWN0SXRlcmF0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgY29weSA9IHNoYWxsb3dDb3B5KHZhbHVlLCB0cnVlKTtcbiAgfVxuICBlYWNoKFxuICAgIGNvcHksXG4gICAgKGtleSwgY2hpbGRWYWx1ZSkgPT4ge1xuICAgICAgc2V0KGNvcHksIGtleSwgY3VycmVudEltcGwoY2hpbGRWYWx1ZSkpO1xuICAgIH0sXG4gICAgc3RyaWN0XG4gICk7XG4gIGlmIChzdGF0ZSkge1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLy8gc3JjL3BsdWdpbnMvcGF0Y2hlcy50c1xuZnVuY3Rpb24gZW5hYmxlUGF0Y2hlcygpIHtcbiAgY29uc3QgZXJyb3JPZmZzZXQgPSAxNjtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgJ1NldHMgY2Fubm90IGhhdmUgXCJyZXBsYWNlXCIgcGF0Y2hlcy4nLFxuICAgICAgZnVuY3Rpb24ob3ApIHtcbiAgICAgICAgcmV0dXJuIFwiVW5zdXBwb3J0ZWQgcGF0Y2ggb3BlcmF0aW9uOiBcIiArIG9wO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIFwiQ2Fubm90IGFwcGx5IHBhdGNoLCBwYXRoIGRvZXNuJ3QgcmVzb2x2ZTogXCIgKyBwYXRoO1xuICAgICAgfSxcbiAgICAgIFwiUGF0Y2hpbmcgcmVzZXJ2ZWQgYXR0cmlidXRlcyBsaWtlIF9fcHJvdG9fXywgcHJvdG90eXBlIGFuZCBjb25zdHJ1Y3RvciBpcyBub3QgYWxsb3dlZFwiXG4gICAgKTtcbiAgfVxuICBjb25zdCBSRVBMQUNFID0gXCJyZXBsYWNlXCI7XG4gIGNvbnN0IEFERCA9IFwiYWRkXCI7XG4gIGNvbnN0IFJFTU9WRSA9IFwicmVtb3ZlXCI7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlUGF0Y2hlc18oc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIHN3aXRjaCAoc3RhdGUudHlwZV8pIHtcbiAgICAgIGNhc2UgMCAvKiBPYmplY3QgKi86XG4gICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVQYXRjaGVzRnJvbUFzc2lnbmVkKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGJhc2VQYXRoLFxuICAgICAgICAgIHBhdGNoZXMsXG4gICAgICAgICAgaW52ZXJzZVBhdGNoZXNcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlQXJyYXlQYXRjaGVzKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpO1xuICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlU2V0UGF0Y2hlcyhcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICBwYXRjaGVzLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlQXJyYXlQYXRjaGVzKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBsZXQgeyBiYXNlXywgYXNzaWduZWRfIH0gPSBzdGF0ZTtcbiAgICBsZXQgY29weV8gPSBzdGF0ZS5jb3B5XztcbiAgICBpZiAoY29weV8ubGVuZ3RoIDwgYmFzZV8ubGVuZ3RoKSB7XG4gICAgICA7XG4gICAgICBbYmFzZV8sIGNvcHlfXSA9IFtjb3B5XywgYmFzZV9dO1xuICAgICAgW3BhdGNoZXMsIGludmVyc2VQYXRjaGVzXSA9IFtpbnZlcnNlUGF0Y2hlcywgcGF0Y2hlc107XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZV8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhc3NpZ25lZF9baV0gJiYgY29weV9baV0gIT09IGJhc2VfW2ldKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogUkVQTEFDRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIC8vIE5lZWQgdG8gbWF5YmUgY2xvbmUgaXQsIGFzIGl0IGNhbiBpbiBmYWN0IGJlIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICAgIC8vIGR1ZSB0byB0aGUgYmFzZS9jb3B5IGludmVyc2lvbiBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvblxuICAgICAgICAgIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChjb3B5X1tpXSlcbiAgICAgICAgfSk7XG4gICAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGJhc2VfW2ldKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IGJhc2VfLmxlbmd0aDsgaSA8IGNvcHlfLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICBvcDogQURELFxuICAgICAgICBwYXRoLFxuICAgICAgICAvLyBOZWVkIHRvIG1heWJlIGNsb25lIGl0LCBhcyBpdCBjYW4gaW4gZmFjdCBiZSB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgICAgLy8gZHVlIHRvIHRoZSBiYXNlL2NvcHkgaW52ZXJzaW9uIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChjb3B5X1tpXSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gY29weV8ubGVuZ3RoIC0gMTsgYmFzZV8ubGVuZ3RoIDw9IGk7IC0taSkge1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaCh7XG4gICAgICAgIG9wOiBSRU1PVkUsXG4gICAgICAgIHBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZVBhdGNoZXNGcm9tQXNzaWduZWQoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIGNvbnN0IHsgYmFzZV8sIGNvcHlfIH0gPSBzdGF0ZTtcbiAgICBlYWNoKHN0YXRlLmFzc2lnbmVkXywgKGtleSwgYXNzaWduZWRWYWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ1ZhbHVlID0gZ2V0KGJhc2VfLCBrZXkpO1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXQoY29weV8sIGtleSk7XG4gICAgICBjb25zdCBvcCA9ICFhc3NpZ25lZFZhbHVlID8gUkVNT1ZFIDogaGFzKGJhc2VfLCBrZXkpID8gUkVQTEFDRSA6IEFERDtcbiAgICAgIGlmIChvcmlnVmFsdWUgPT09IHZhbHVlICYmIG9wID09PSBSRVBMQUNFKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KGtleSk7XG4gICAgICBwYXRjaGVzLnB1c2gob3AgPT09IFJFTU9WRSA/IHsgb3AsIHBhdGggfSA6IHsgb3AsIHBhdGgsIHZhbHVlIH0pO1xuICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaChcbiAgICAgICAgb3AgPT09IEFERCA/IHsgb3A6IFJFTU9WRSwgcGF0aCB9IDogb3AgPT09IFJFTU9WRSA/IHsgb3A6IEFERCwgcGF0aCwgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKG9yaWdWYWx1ZSkgfSA6IHsgb3A6IFJFUExBQ0UsIHBhdGgsIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChvcmlnVmFsdWUpIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVTZXRQYXRjaGVzKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBsZXQgeyBiYXNlXywgY29weV8gfSA9IHN0YXRlO1xuICAgIGxldCBpID0gMDtcbiAgICBiYXNlXy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFjb3B5Xy5oYXModmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogUkVNT1ZFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGludmVyc2VQYXRjaGVzLnVuc2hpZnQoe1xuICAgICAgICAgIG9wOiBBREQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9KTtcbiAgICBpID0gMDtcbiAgICBjb3B5Xy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFiYXNlXy5oYXModmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogQURELFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGludmVyc2VQYXRjaGVzLnVuc2hpZnQoe1xuICAgICAgICAgIG9wOiBSRU1PVkUsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18oYmFzZVZhbHVlLCByZXBsYWNlbWVudCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICBwYXRoOiBbXSxcbiAgICAgIHZhbHVlOiByZXBsYWNlbWVudCA9PT0gTk9USElORyA/IHZvaWQgMCA6IHJlcGxhY2VtZW50XG4gICAgfSk7XG4gICAgaW52ZXJzZVBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogUkVQTEFDRSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgdmFsdWU6IGJhc2VWYWx1ZVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGFwcGx5UGF0Y2hlc18oZHJhZnQsIHBhdGNoZXMpIHtcbiAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICBjb25zdCB7IHBhdGgsIG9wIH0gPSBwYXRjaDtcbiAgICAgIGxldCBiYXNlID0gZHJhZnQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFR5cGUgPSBnZXRBcmNodHlwZShiYXNlKTtcbiAgICAgICAgbGV0IHAgPSBwYXRoW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHAgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHAgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBwID0gXCJcIiArIHA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwYXJlbnRUeXBlID09PSAwIC8qIE9iamVjdCAqLyB8fCBwYXJlbnRUeXBlID09PSAxIC8qIEFycmF5ICovKSAmJiAocCA9PT0gXCJfX3Byb3RvX19cIiB8fCBwID09PSBcImNvbnN0cnVjdG9yXCIpKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDMpO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2UgPT09IFwiZnVuY3Rpb25cIiAmJiBwID09PSBcInByb3RvdHlwZVwiKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDMpO1xuICAgICAgICBiYXNlID0gZ2V0KGJhc2UsIHApO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2UgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMiwgcGF0aC5qb2luKFwiL1wiKSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlID0gZ2V0QXJjaHR5cGUoYmFzZSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRlZXBDbG9uZVBhdGNoVmFsdWUocGF0Y2gudmFsdWUpO1xuICAgICAgY29uc3Qga2V5ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgICAgc3dpdGNoIChvcCkge1xuICAgICAgICBjYXNlIFJFUExBQ0U6XG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBBREQ6XG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDEgLyogQXJyYXkgKi86XG4gICAgICAgICAgICAgIHJldHVybiBrZXkgPT09IFwiLVwiID8gYmFzZS5wdXNoKHZhbHVlKSA6IGJhc2Uuc3BsaWNlKGtleSwgMCwgdmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuYWRkKHZhbHVlKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgUkVNT1ZFOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAxIC8qIEFycmF5ICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5zcGxpY2Uoa2V5LCAxKTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZGVsZXRlKHBhdGNoLnZhbHVlKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBkZWxldGUgYmFzZVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAxLCBvcCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRyYWZ0O1xuICB9XG4gIGZ1bmN0aW9uIGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqKSB7XG4gICAgaWYgKCFpc0RyYWZ0YWJsZShvYmopKVxuICAgICAgcmV0dXJuIG9iajtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKVxuICAgICAgcmV0dXJuIG9iai5tYXAoZGVlcENsb25lUGF0Y2hWYWx1ZSk7XG4gICAgaWYgKGlzTWFwKG9iaikpXG4gICAgICByZXR1cm4gbmV3IE1hcChcbiAgICAgICAgQXJyYXkuZnJvbShvYmouZW50cmllcygpKS5tYXAoKFtrLCB2XSkgPT4gW2ssIGRlZXBDbG9uZVBhdGNoVmFsdWUodildKVxuICAgICAgKTtcbiAgICBpZiAoaXNTZXQob2JqKSlcbiAgICAgIHJldHVybiBuZXcgU2V0KEFycmF5LmZyb20ob2JqKS5tYXAoZGVlcENsb25lUGF0Y2hWYWx1ZSkpO1xuICAgIGNvbnN0IGNsb25lZCA9IE9iamVjdC5jcmVhdGUoZ2V0UHJvdG90eXBlT2Yob2JqKSk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKVxuICAgICAgY2xvbmVkW2tleV0gPSBkZWVwQ2xvbmVQYXRjaFZhbHVlKG9ialtrZXldKTtcbiAgICBpZiAoaGFzKG9iaiwgRFJBRlRBQkxFKSlcbiAgICAgIGNsb25lZFtEUkFGVEFCTEVdID0gb2JqW0RSQUZUQUJMRV07XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxuICBmdW5jdGlvbiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChvYmopIHtcbiAgICBpZiAoaXNEcmFmdChvYmopKSB7XG4gICAgICByZXR1cm4gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmopO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuIG9iajtcbiAgfVxuICBsb2FkUGx1Z2luKFwiUGF0Y2hlc1wiLCB7XG4gICAgYXBwbHlQYXRjaGVzXyxcbiAgICBnZW5lcmF0ZVBhdGNoZXNfLFxuICAgIGdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzX1xuICB9KTtcbn1cblxuLy8gc3JjL3BsdWdpbnMvbWFwc2V0LnRzXG5mdW5jdGlvbiBlbmFibGVNYXBTZXQoKSB7XG4gIGNsYXNzIERyYWZ0TWFwIGV4dGVuZHMgTWFwIHtcbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIHBhcmVudCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXNbRFJBRlRfU1RBVEVdID0ge1xuICAgICAgICB0eXBlXzogMiAvKiBNYXAgKi8sXG4gICAgICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAgICAgc2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCksXG4gICAgICAgIG1vZGlmaWVkXzogZmFsc2UsXG4gICAgICAgIGZpbmFsaXplZF86IGZhbHNlLFxuICAgICAgICBjb3B5Xzogdm9pZCAwLFxuICAgICAgICBhc3NpZ25lZF86IHZvaWQgMCxcbiAgICAgICAgYmFzZV86IHRhcmdldCxcbiAgICAgICAgZHJhZnRfOiB0aGlzLFxuICAgICAgICBpc01hbnVhbF86IGZhbHNlLFxuICAgICAgICByZXZva2VkXzogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuc2l6ZTtcbiAgICB9XG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuaGFzKGtleSk7XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghbGF0ZXN0KHN0YXRlKS5oYXMoa2V5KSB8fCBsYXRlc3Qoc3RhdGUpLmdldChrZXkpICE9PSB2YWx1ZSkge1xuICAgICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIHRydWUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICBpZiAoIXRoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICBpZiAoc3RhdGUuYmFzZV8uaGFzKGtleSkpIHtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmNvcHlfLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAobGF0ZXN0KHN0YXRlKS5zaXplKSB7XG4gICAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgICBlYWNoKHN0YXRlLmJhc2VfLCAoa2V5KSA9PiB7XG4gICAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvckVhY2goY2IsIHRoaXNBcmcpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBsYXRlc3Qoc3RhdGUpLmZvckVhY2goKF92YWx1ZSwga2V5LCBfbWFwKSA9PiB7XG4gICAgICAgIGNiLmNhbGwodGhpc0FyZywgdGhpcy5nZXQoa2V5KSwga2V5LCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQoa2V5KSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gbGF0ZXN0KHN0YXRlKS5nZXQoa2V5KTtcbiAgICAgIGlmIChzdGF0ZS5maW5hbGl6ZWRfIHx8ICFpc0RyYWZ0YWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlICE9PSBzdGF0ZS5iYXNlXy5nZXQoa2V5KSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkcmFmdCA9IGNyZWF0ZVByb3h5KHZhbHVlLCBzdGF0ZSk7XG4gICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICBzdGF0ZS5jb3B5Xy5zZXQoa2V5LCBkcmFmdCk7XG4gICAgICByZXR1cm4gZHJhZnQ7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5rZXlzKCk7XG4gICAgfVxuICAgIHZhbHVlcygpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5rZXlzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gdGhpcy52YWx1ZXMoKSxcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHIgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHIuZG9uZSlcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoci52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBlbnRyaWVzKCkge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLmtleXMoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB0aGlzLmVudHJpZXMoKSxcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHIgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHIuZG9uZSlcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoci52YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IFtyLnZhbHVlLCB2YWx1ZV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBbKERSQUZUX1NUQVRFLCBTeW1ib2wuaXRlcmF0b3IpXSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJveHlNYXBfKHRhcmdldCwgcGFyZW50KSB7XG4gICAgcmV0dXJuIG5ldyBEcmFmdE1hcCh0YXJnZXQsIHBhcmVudCk7XG4gIH1cbiAgZnVuY3Rpb24gcHJlcGFyZU1hcENvcHkoc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgICBzdGF0ZS5hc3NpZ25lZF8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgc3RhdGUuY29weV8gPSBuZXcgTWFwKHN0YXRlLmJhc2VfKTtcbiAgICB9XG4gIH1cbiAgY2xhc3MgRHJhZnRTZXQgZXh0ZW5kcyBTZXQge1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgcGFyZW50KSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpc1tEUkFGVF9TVEFURV0gPSB7XG4gICAgICAgIHR5cGVfOiAzIC8qIFNldCAqLyxcbiAgICAgICAgcGFyZW50XzogcGFyZW50LFxuICAgICAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAgICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAgICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgICAgIGNvcHlfOiB2b2lkIDAsXG4gICAgICAgIGJhc2VfOiB0YXJnZXQsXG4gICAgICAgIGRyYWZ0XzogdGhpcyxcbiAgICAgICAgZHJhZnRzXzogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSxcbiAgICAgICAgcmV2b2tlZF86IGZhbHNlLFxuICAgICAgICBpc01hbnVhbF86IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLnNpemU7XG4gICAgfVxuICAgIGhhcyh2YWx1ZSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5iYXNlXy5oYXModmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmNvcHlfLmhhcyh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHN0YXRlLmRyYWZ0c18uaGFzKHZhbHVlKSAmJiBzdGF0ZS5jb3B5Xy5oYXMoc3RhdGUuZHJhZnRzXy5nZXQodmFsdWUpKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGFkZCh2YWx1ZSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAoIXRoaXMuaGFzKHZhbHVlKSkge1xuICAgICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuY29weV8uYWRkKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZWxldGUodmFsdWUpIHtcbiAgICAgIGlmICghdGhpcy5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLmRlbGV0ZSh2YWx1ZSkgfHwgKHN0YXRlLmRyYWZ0c18uaGFzKHZhbHVlKSA/IHN0YXRlLmNvcHlfLmRlbGV0ZShzdGF0ZS5kcmFmdHNfLmdldCh2YWx1ZSkpIDogKFxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBmYWxzZVxuICAgICAgKSk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAobGF0ZXN0KHN0YXRlKS5zaXplKSB7XG4gICAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YWx1ZXMoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5Xy52YWx1ZXMoKTtcbiAgICB9XG4gICAgZW50cmllcygpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLmVudHJpZXMoKTtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpO1xuICAgIH1cbiAgICBbKERSQUZUX1NUQVRFLCBTeW1ib2wuaXRlcmF0b3IpXSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpO1xuICAgIH1cbiAgICBmb3JFYWNoKGNiLCB0aGlzQXJnKSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMudmFsdWVzKCk7XG4gICAgICBsZXQgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICBjYi5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZSwgcmVzdWx0LnZhbHVlLCB0aGlzKTtcbiAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwcm94eVNldF8odGFyZ2V0LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gbmV3IERyYWZ0U2V0KHRhcmdldCwgcGFyZW50KTtcbiAgfVxuICBmdW5jdGlvbiBwcmVwYXJlU2V0Q29weShzdGF0ZSkge1xuICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgIHN0YXRlLmNvcHlfID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICAgIHN0YXRlLmJhc2VfLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpc0RyYWZ0YWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBkcmFmdCA9IGNyZWF0ZVByb3h5KHZhbHVlLCBzdGF0ZSk7XG4gICAgICAgICAgc3RhdGUuZHJhZnRzXy5zZXQodmFsdWUsIGRyYWZ0KTtcbiAgICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQoZHJhZnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLmNvcHlfLmFkZCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhc3NlcnRVbnJldm9rZWQoc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUucmV2b2tlZF8pXG4gICAgICBkaWUoMywgSlNPTi5zdHJpbmdpZnkobGF0ZXN0KHN0YXRlKSkpO1xuICB9XG4gIGxvYWRQbHVnaW4oXCJNYXBTZXRcIiwgeyBwcm94eU1hcF8sIHByb3h5U2V0XyB9KTtcbn1cblxuLy8gc3JjL2ltbWVyLnRzXG52YXIgaW1tZXIgPSBuZXcgSW1tZXIyKCk7XG52YXIgcHJvZHVjZSA9IGltbWVyLnByb2R1Y2U7XG52YXIgcHJvZHVjZVdpdGhQYXRjaGVzID0gLyogQF9fUFVSRV9fICovIGltbWVyLnByb2R1Y2VXaXRoUGF0Y2hlcy5iaW5kKFxuICBpbW1lclxuKTtcbnZhciBzZXRBdXRvRnJlZXplID0gLyogQF9fUFVSRV9fICovIGltbWVyLnNldEF1dG9GcmVlemUuYmluZChpbW1lcik7XG52YXIgc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkuYmluZChcbiAgaW1tZXJcbik7XG52YXIgc2V0VXNlU3RyaWN0SXRlcmF0aW9uID0gLyogQF9fUFVSRV9fICovIGltbWVyLnNldFVzZVN0cmljdEl0ZXJhdGlvbi5iaW5kKFxuICBpbW1lclxuKTtcbnZhciBhcHBseVBhdGNoZXMgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuYXBwbHlQYXRjaGVzLmJpbmQoaW1tZXIpO1xudmFyIGNyZWF0ZURyYWZ0ID0gLyogQF9fUFVSRV9fICovIGltbWVyLmNyZWF0ZURyYWZ0LmJpbmQoaW1tZXIpO1xudmFyIGZpbmlzaERyYWZ0ID0gLyogQF9fUFVSRV9fICovIGltbWVyLmZpbmlzaERyYWZ0LmJpbmQoaW1tZXIpO1xuZnVuY3Rpb24gY2FzdERyYWZ0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNhc3RJbW11dGFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IHtcbiAgSW1tZXIyIGFzIEltbWVyLFxuICBhcHBseVBhdGNoZXMsXG4gIGNhc3REcmFmdCxcbiAgY2FzdEltbXV0YWJsZSxcbiAgY3JlYXRlRHJhZnQsXG4gIGN1cnJlbnQsXG4gIGVuYWJsZU1hcFNldCxcbiAgZW5hYmxlUGF0Y2hlcyxcbiAgZmluaXNoRHJhZnQsXG4gIGZyZWV6ZSxcbiAgRFJBRlRBQkxFIGFzIGltbWVyYWJsZSxcbiAgaXNEcmFmdCxcbiAgaXNEcmFmdGFibGUsXG4gIE5PVEhJTkcgYXMgbm90aGluZyxcbiAgb3JpZ2luYWwsXG4gIHByb2R1Y2UsXG4gIHByb2R1Y2VXaXRoUGF0Y2hlcyxcbiAgc2V0QXV0b0ZyZWV6ZSxcbiAgc2V0VXNlU3RyaWN0SXRlcmF0aW9uLFxuICBzZXRVc2VTdHJpY3RTaGFsbG93Q29weVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWltbWVyLm1qcy5tYXAiLCIvLyBzcmMvaW5kZXgudHNcbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYWN0aW9uKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmFBcmd1bWVudCk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gIH07XG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxudmFyIHRodW5rID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlKCk7XG52YXIgd2l0aEV4dHJhQXJndW1lbnQgPSBjcmVhdGVUaHVua01pZGRsZXdhcmU7XG5leHBvcnQge1xuICB0aHVuayxcbiAgd2l0aEV4dHJhQXJndW1lbnRcbn07XG4iLCIvLyBzcmMvaW5kZXgudHNcbmV4cG9ydCAqIGZyb20gXCJyZWR1eFwiO1xuaW1wb3J0IHsgZnJlZXplLCBvcmlnaW5hbCBhcyBvcmlnaW5hbDIgfSBmcm9tIFwiaW1tZXJcIjtcblxuLy8gc3JjL2ltbWVySW1wb3J0cy50c1xuaW1wb3J0IHsgY3VycmVudCwgaXNEcmFmdCwgcHJvZHVjZSwgaXNEcmFmdGFibGUsIHNldFVzZVN0cmljdEl0ZXJhdGlvbiB9IGZyb20gXCJpbW1lclwiO1xuXG4vLyBzcmMvaW5kZXgudHNcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yLCBscnVNZW1vaXplIH0gZnJvbSBcInJlc2VsZWN0XCI7XG5cbi8vIHNyYy9yZXNlbGVjdEltcG9ydHMudHNcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yQ3JlYXRvciwgd2Vha01hcE1lbW9pemUgfSBmcm9tIFwicmVzZWxlY3RcIjtcblxuLy8gc3JjL2NyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yLnRzXG52YXIgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JDcmVhdG9yID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgY3JlYXRlU2VsZWN0b3IyID0gY3JlYXRlU2VsZWN0b3JDcmVhdG9yKC4uLmFyZ3MpO1xuICBjb25zdCBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjIgPSBPYmplY3QuYXNzaWduKCguLi5hcmdzMikgPT4ge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IyKC4uLmFyZ3MyKTtcbiAgICBjb25zdCB3cmFwcGVkU2VsZWN0b3IgPSAodmFsdWUsIC4uLnJlc3QpID0+IHNlbGVjdG9yKGlzRHJhZnQodmFsdWUpID8gY3VycmVudCh2YWx1ZSkgOiB2YWx1ZSwgLi4ucmVzdCk7XG4gICAgT2JqZWN0LmFzc2lnbih3cmFwcGVkU2VsZWN0b3IsIHNlbGVjdG9yKTtcbiAgICByZXR1cm4gd3JhcHBlZFNlbGVjdG9yO1xuICB9LCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjJcbiAgfSk7XG4gIHJldHVybiBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjI7XG59O1xudmFyIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yQ3JlYXRvcih3ZWFrTWFwTWVtb2l6ZSk7XG5cbi8vIHNyYy9yZWR1eEltcG9ydHMudHNcbmltcG9ydCB7IGNyZWF0ZVN0b3JlLCBjb21iaW5lUmVkdWNlcnMsIGFwcGx5TWlkZGxld2FyZSwgY29tcG9zZSwgaXNQbGFpbk9iamVjdCwgaXNBY3Rpb24gfSBmcm9tIFwicmVkdXhcIjtcblxuLy8gc3JjL2RldnRvb2xzRXh0ZW5zaW9uLnRzXG52YXIgY29tcG9zZVdpdGhEZXZUb29scyA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXyA/IHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18gOiBmdW5jdGlvbigpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB2b2lkIDA7XG4gIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKSByZXR1cm4gY29tcG9zZTtcbiAgcmV0dXJuIGNvbXBvc2UuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn07XG52YXIgZGV2VG9vbHNFbmhhbmNlciA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gPyB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyA6IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZnVuY3Rpb24obm9vcDMpIHtcbiAgICByZXR1cm4gbm9vcDM7XG4gIH07XG59O1xuXG4vLyBzcmMvZ2V0RGVmYXVsdE1pZGRsZXdhcmUudHNcbmltcG9ydCB7IHRodW5rIGFzIHRodW5rTWlkZGxld2FyZSwgd2l0aEV4dHJhQXJndW1lbnQgfSBmcm9tIFwicmVkdXgtdGh1bmtcIjtcblxuLy8gc3JjL3RzSGVscGVycy50c1xudmFyIGhhc01hdGNoRnVuY3Rpb24gPSAodikgPT4ge1xuICByZXR1cm4gdiAmJiB0eXBlb2Ygdi5tYXRjaCA9PT0gXCJmdW5jdGlvblwiO1xufTtcblxuLy8gc3JjL2NyZWF0ZUFjdGlvbi50c1xuZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIHByZXBhcmVBY3Rpb24pIHtcbiAgZnVuY3Rpb24gYWN0aW9uQ3JlYXRvciguLi5hcmdzKSB7XG4gICAgaWYgKHByZXBhcmVBY3Rpb24pIHtcbiAgICAgIGxldCBwcmVwYXJlZCA9IHByZXBhcmVBY3Rpb24oLi4uYXJncyk7XG4gICAgICBpZiAoIXByZXBhcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogXCJwcmVwYXJlQWN0aW9uIGRpZCBub3QgcmV0dXJuIGFuIG9iamVjdFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHBheWxvYWQ6IHByZXBhcmVkLnBheWxvYWQsXG4gICAgICAgIC4uLlwibWV0YVwiIGluIHByZXBhcmVkICYmIHtcbiAgICAgICAgICBtZXRhOiBwcmVwYXJlZC5tZXRhXG4gICAgICAgIH0sXG4gICAgICAgIC4uLlwiZXJyb3JcIiBpbiBwcmVwYXJlZCAmJiB7XG4gICAgICAgICAgZXJyb3I6IHByZXBhcmVkLmVycm9yXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlLFxuICAgICAgcGF5bG9hZDogYXJnc1swXVxuICAgIH07XG4gIH1cbiAgYWN0aW9uQ3JlYXRvci50b1N0cmluZyA9ICgpID0+IGAke3R5cGV9YDtcbiAgYWN0aW9uQ3JlYXRvci50eXBlID0gdHlwZTtcbiAgYWN0aW9uQ3JlYXRvci5tYXRjaCA9IChhY3Rpb24pID0+IGlzQWN0aW9uKGFjdGlvbikgJiYgYWN0aW9uLnR5cGUgPT09IHR5cGU7XG4gIHJldHVybiBhY3Rpb25DcmVhdG9yO1xufVxuZnVuY3Rpb24gaXNBY3Rpb25DcmVhdG9yKGFjdGlvbikge1xuICByZXR1cm4gdHlwZW9mIGFjdGlvbiA9PT0gXCJmdW5jdGlvblwiICYmIFwidHlwZVwiIGluIGFjdGlvbiAmJiAvLyBoYXNNYXRjaEZ1bmN0aW9uIG9ubHkgd2FudHMgTWF0Y2hlcnMgYnV0IEkgZG9uJ3Qgc2VlIHRoZSBwb2ludCBpbiByZXdyaXRpbmcgaXRcbiAgaGFzTWF0Y2hGdW5jdGlvbihhY3Rpb24pO1xufVxuZnVuY3Rpb24gaXNGU0EoYWN0aW9uKSB7XG4gIHJldHVybiBpc0FjdGlvbihhY3Rpb24pICYmIE9iamVjdC5rZXlzKGFjdGlvbikuZXZlcnkoaXNWYWxpZEtleSk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleSkge1xuICByZXR1cm4gW1widHlwZVwiLCBcInBheWxvYWRcIiwgXCJlcnJvclwiLCBcIm1ldGFcIl0uaW5kZXhPZihrZXkpID4gLTE7XG59XG5cbi8vIHNyYy9hY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gZ2V0TWVzc2FnZSh0eXBlKSB7XG4gIGNvbnN0IHNwbGl0VHlwZSA9IHR5cGUgPyBgJHt0eXBlfWAuc3BsaXQoXCIvXCIpIDogW107XG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBzcGxpdFR5cGVbc3BsaXRUeXBlLmxlbmd0aCAtIDFdIHx8IFwiYWN0aW9uQ3JlYXRvclwiO1xuICByZXR1cm4gYERldGVjdGVkIGFuIGFjdGlvbiBjcmVhdG9yIHdpdGggdHlwZSBcIiR7dHlwZSB8fCBcInVua25vd25cIn1cIiBiZWluZyBkaXNwYXRjaGVkLiBcbk1ha2Ugc3VyZSB5b3UncmUgY2FsbGluZyB0aGUgYWN0aW9uIGNyZWF0b3IgYmVmb3JlIGRpc3BhdGNoaW5nLCBpLmUuIFxcYGRpc3BhdGNoKCR7YWN0aW9uTmFtZX0oKSlcXGAgaW5zdGVhZCBvZiBcXGBkaXNwYXRjaCgke2FjdGlvbk5hbWV9KVxcYC4gVGhpcyBpcyBuZWNlc3NhcnkgZXZlbiBpZiB0aGUgYWN0aW9uIGhhcyBubyBwYXlsb2FkLmA7XG59XG5mdW5jdGlvbiBjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4gbmV4dChhY3Rpb24pO1xuICB9XG4gIGNvbnN0IHtcbiAgICBpc0FjdGlvbkNyZWF0b3I6IGlzQWN0aW9uQ3JlYXRvcjIgPSBpc0FjdGlvbkNyZWF0b3JcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmIChpc0FjdGlvbkNyZWF0b3IyKGFjdGlvbikpIHtcbiAgICAgIGNvbnNvbGUud2FybihnZXRNZXNzYWdlKGFjdGlvbi50eXBlKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gIH07XG59XG5cbi8vIHNyYy91dGlscy50c1xuZnVuY3Rpb24gZ2V0VGltZU1lYXN1cmVVdGlscyhtYXhEZWxheSwgZm5OYW1lKSB7XG4gIGxldCBlbGFwc2VkID0gMDtcbiAgcmV0dXJuIHtcbiAgICBtZWFzdXJlVGltZShmbikge1xuICAgICAgY29uc3Qgc3RhcnRlZCA9IERhdGUubm93KCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkID0gRGF0ZS5ub3coKTtcbiAgICAgICAgZWxhcHNlZCArPSBmaW5pc2hlZCAtIHN0YXJ0ZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgICB3YXJuSWZFeGNlZWRlZCgpIHtcbiAgICAgIGlmIChlbGFwc2VkID4gbWF4RGVsYXkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAke2ZuTmFtZX0gdG9vayAke2VsYXBzZWR9bXMsIHdoaWNoIGlzIG1vcmUgdGhhbiB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJHttYXhEZWxheX1tcy4gXG5JZiB5b3VyIHN0YXRlIG9yIGFjdGlvbnMgYXJlIHZlcnkgbGFyZ2UsIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIHRoZSBtaWRkbGV3YXJlIGFzIGl0IG1pZ2h0IGNhdXNlIHRvbyBtdWNoIG9mIGEgc2xvd2Rvd24gaW4gZGV2ZWxvcG1lbnQgbW9kZS4gU2VlIGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2dldERlZmF1bHRNaWRkbGV3YXJlIGZvciBpbnN0cnVjdGlvbnMuXG5JdCBpcyBkaXNhYmxlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcywgc28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdC5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG52YXIgVHVwbGUgPSBjbGFzcyBfVHVwbGUgZXh0ZW5kcyBBcnJheSB7XG4gIGNvbnN0cnVjdG9yKC4uLml0ZW1zKSB7XG4gICAgc3VwZXIoLi4uaXRlbXMpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBfVHVwbGUucHJvdG90eXBlKTtcbiAgfVxuICBzdGF0aWMgZ2V0IFtTeW1ib2wuc3BlY2llc10oKSB7XG4gICAgcmV0dXJuIF9UdXBsZTtcbiAgfVxuICBjb25jYXQoLi4uYXJyKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNvbmNhdC5hcHBseSh0aGlzLCBhcnIpO1xuICB9XG4gIHByZXBlbmQoLi4uYXJyKSB7XG4gICAgaWYgKGFyci5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcnJbMF0pKSB7XG4gICAgICByZXR1cm4gbmV3IF9UdXBsZSguLi5hcnJbMF0uY29uY2F0KHRoaXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBfVHVwbGUoLi4uYXJyLmNvbmNhdCh0aGlzKSk7XG4gIH1cbn07XG5mdW5jdGlvbiBmcmVlemVEcmFmdGFibGUodmFsKSB7XG4gIHJldHVybiBpc0RyYWZ0YWJsZSh2YWwpID8gcHJvZHVjZSh2YWwsICgpID0+IHtcbiAgfSkgOiB2YWw7XG59XG5mdW5jdGlvbiBnZXRPckluc2VydENvbXB1dGVkKG1hcCwga2V5LCBjb21wdXRlKSB7XG4gIGlmIChtYXAuaGFzKGtleSkpIHJldHVybiBtYXAuZ2V0KGtleSk7XG4gIHJldHVybiBtYXAuc2V0KGtleSwgY29tcHV0ZShrZXkpKS5nZXQoa2V5KTtcbn1cblxuLy8gc3JjL2ltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gaXNJbW11dGFibGVEZWZhdWx0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT0gbnVsbCB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpO1xufVxuZnVuY3Rpb24gdHJhY2tGb3JNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCBvYmopIHtcbiAgY29uc3QgdHJhY2tlZFByb3BlcnRpZXMgPSB0cmFja1Byb3BlcnRpZXMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCBvYmopO1xuICByZXR1cm4ge1xuICAgIGRldGVjdE11dGF0aW9ucygpIHtcbiAgICAgIHJldHVybiBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCB0cmFja2VkUHJvcGVydGllcywgb2JqKTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiB0cmFja1Byb3BlcnRpZXMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzID0gW10sIG9iaiwgcGF0aCA9IFwiXCIsIGNoZWNrZWRPYmplY3RzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkge1xuICBjb25zdCB0cmFja2VkID0ge1xuICAgIHZhbHVlOiBvYmpcbiAgfTtcbiAgaWYgKCFpc0ltbXV0YWJsZShvYmopICYmICFjaGVja2VkT2JqZWN0cy5oYXMob2JqKSkge1xuICAgIGNoZWNrZWRPYmplY3RzLmFkZChvYmopO1xuICAgIHRyYWNrZWQuY2hpbGRyZW4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGggPyBwYXRoICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgICBpZiAoaWdub3JlUGF0aHMubGVuZ3RoICYmIGlnbm9yZVBhdGhzLmluZGV4T2YoY2hpbGRQYXRoKSAhPT0gLTEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0cmFja2VkLmNoaWxkcmVuW2tleV0gPSB0cmFja1Byb3BlcnRpZXMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCBvYmpba2V5XSwgY2hpbGRQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRyYWNrZWQ7XG59XG5mdW5jdGlvbiBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZWRQYXRocyA9IFtdLCB0cmFja2VkUHJvcGVydHksIG9iaiwgc2FtZVBhcmVudFJlZiA9IGZhbHNlLCBwYXRoID0gXCJcIikge1xuICBjb25zdCBwcmV2T2JqID0gdHJhY2tlZFByb3BlcnR5ID8gdHJhY2tlZFByb3BlcnR5LnZhbHVlIDogdm9pZCAwO1xuICBjb25zdCBzYW1lUmVmID0gcHJldk9iaiA9PT0gb2JqO1xuICBpZiAoc2FtZVBhcmVudFJlZiAmJiAhc2FtZVJlZiAmJiAhTnVtYmVyLmlzTmFOKG9iaikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2FzTXV0YXRlZDogdHJ1ZSxcbiAgICAgIHBhdGhcbiAgICB9O1xuICB9XG4gIGlmIChpc0ltbXV0YWJsZShwcmV2T2JqKSB8fCBpc0ltbXV0YWJsZShvYmopKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhc011dGF0ZWQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjb25zdCBrZXlzVG9EZXRlY3QgPSB7fTtcbiAgZm9yIChsZXQga2V5IGluIHRyYWNrZWRQcm9wZXJ0eS5jaGlsZHJlbikge1xuICAgIGtleXNUb0RldGVjdFtrZXldID0gdHJ1ZTtcbiAgfVxuICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAga2V5c1RvRGV0ZWN0W2tleV0gPSB0cnVlO1xuICB9XG4gIGNvbnN0IGhhc0lnbm9yZWRQYXRocyA9IGlnbm9yZWRQYXRocy5sZW5ndGggPiAwO1xuICBmb3IgKGxldCBrZXkgaW4ga2V5c1RvRGV0ZWN0KSB7XG4gICAgY29uc3QgbmVzdGVkUGF0aCA9IHBhdGggPyBwYXRoICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgaWYgKGhhc0lnbm9yZWRQYXRocykge1xuICAgICAgY29uc3QgaGFzTWF0Y2hlcyA9IGlnbm9yZWRQYXRocy5zb21lKChpZ25vcmVkKSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVkIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgcmV0dXJuIGlnbm9yZWQudGVzdChuZXN0ZWRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVzdGVkUGF0aCA9PT0gaWdub3JlZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGhhc01hdGNoZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzLCB0cmFja2VkUHJvcGVydHkuY2hpbGRyZW5ba2V5XSwgb2JqW2tleV0sIHNhbWVSZWYsIG5lc3RlZFBhdGgpO1xuICAgIGlmIChyZXN1bHQud2FzTXV0YXRlZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3YXNNdXRhdGVkOiBmYWxzZVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKG9wdGlvbnMgPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiBuZXh0KGFjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHN0cmluZ2lmeTIgPSBmdW5jdGlvbihvYmosIHNlcmlhbGl6ZXIsIGluZGVudCwgZGVjeWNsZXIpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIGdldFNlcmlhbGl6ZTIoc2VyaWFsaXplciwgZGVjeWNsZXIpLCBpbmRlbnQpO1xuICAgIH0sIGdldFNlcmlhbGl6ZTIgPSBmdW5jdGlvbihzZXJpYWxpemVyLCBkZWN5Y2xlcikge1xuICAgICAgbGV0IHN0YWNrID0gW10sIGtleXMgPSBbXTtcbiAgICAgIGlmICghZGVjeWNsZXIpIGRlY3ljbGVyID0gZnVuY3Rpb24oXywgdmFsdWUpIHtcbiAgICAgICAgaWYgKHN0YWNrWzBdID09PSB2YWx1ZSkgcmV0dXJuIFwiW0NpcmN1bGFyIH5dXCI7XG4gICAgICAgIHJldHVybiBcIltDaXJjdWxhciB+LlwiICsga2V5cy5zbGljZSgwLCBzdGFjay5pbmRleE9mKHZhbHVlKSkuam9pbihcIi5cIikgKyBcIl1cIjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciB0aGlzUG9zID0gc3RhY2suaW5kZXhPZih0aGlzKTtcbiAgICAgICAgICB+dGhpc1BvcyA/IHN0YWNrLnNwbGljZSh0aGlzUG9zICsgMSkgOiBzdGFjay5wdXNoKHRoaXMpO1xuICAgICAgICAgIH50aGlzUG9zID8ga2V5cy5zcGxpY2UodGhpc1BvcywgSW5maW5pdHksIGtleSkgOiBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICBpZiAofnN0YWNrLmluZGV4T2YodmFsdWUpKSB2YWx1ZSA9IGRlY3ljbGVyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBzdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIgPT0gbnVsbCA/IHZhbHVlIDogc2VyaWFsaXplci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBzdHJpbmdpZnkgPSBzdHJpbmdpZnkyLCBnZXRTZXJpYWxpemUgPSBnZXRTZXJpYWxpemUyO1xuICAgIGxldCB7XG4gICAgICBpc0ltbXV0YWJsZSA9IGlzSW1tdXRhYmxlRGVmYXVsdCxcbiAgICAgIGlnbm9yZWRQYXRocyxcbiAgICAgIHdhcm5BZnRlciA9IDMyXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgdHJhY2sgPSB0cmFja0Zvck11dGF0aW9ucy5iaW5kKG51bGwsIGlzSW1tdXRhYmxlLCBpZ25vcmVkUGF0aHMpO1xuICAgIHJldHVybiAoe1xuICAgICAgZ2V0U3RhdGVcbiAgICB9KSA9PiB7XG4gICAgICBsZXQgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgbGV0IHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgcmV0dXJuIChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lYXN1cmVVdGlscyA9IGdldFRpbWVNZWFzdXJlVXRpbHMod2FybkFmdGVyLCBcIkltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZVwiKTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgcmVzdWx0ID0gdHJhY2tlci5kZXRlY3RNdXRhdGlvbnMoKTtcbiAgICAgICAgICB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xuICAgICAgICAgIGlmIChyZXN1bHQud2FzTXV0YXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTkpIDogYEEgc3RhdGUgbXV0YXRpb24gd2FzIGRldGVjdGVkIGJldHdlZW4gZGlzcGF0Y2hlcywgaW4gdGhlIHBhdGggJyR7cmVzdWx0LnBhdGggfHwgXCJcIn0nLiAgVGhpcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yLiAoaHR0cHM6Ly9yZWR1eC5qcy5vcmcvc3R5bGUtZ3VpZGUvc3R5bGUtZ3VpZGUjZG8tbm90LW11dGF0ZS1zdGF0ZSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkaXNwYXRjaGVkQWN0aW9uID0gbmV4dChhY3Rpb24pO1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICByZXN1bHQgPSB0cmFja2VyLmRldGVjdE11dGF0aW9ucygpO1xuICAgICAgICAgIHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC53YXNNdXRhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMCkgOiBgQSBzdGF0ZSBtdXRhdGlvbiB3YXMgZGV0ZWN0ZWQgaW5zaWRlIGEgZGlzcGF0Y2gsIGluIHRoZSBwYXRoOiAke3Jlc3VsdC5wYXRoIHx8IFwiXCJ9LiBUYWtlIGEgbG9vayBhdCB0aGUgcmVkdWNlcihzKSBoYW5kbGluZyB0aGUgYWN0aW9uICR7c3RyaW5naWZ5MihhY3Rpb24pfS4gKGh0dHBzOi8vcmVkdXguanMub3JnL3N0eWxlLWd1aWRlL3N0eWxlLWd1aWRlI2RvLW5vdC1tdXRhdGUtc3RhdGUpYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLndhcm5JZkV4Y2VlZGVkKCk7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaGVkQWN0aW9uO1xuICAgICAgfTtcbiAgICB9O1xuICB9XG59XG5cbi8vIHNyYy9zZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGlzUGxhaW4odmFsKSB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICByZXR1cm4gdmFsID09IG51bGwgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlID09PSBcIm51bWJlclwiIHx8IEFycmF5LmlzQXJyYXkodmFsKSB8fCBpc1BsYWluT2JqZWN0KHZhbCk7XG59XG5mdW5jdGlvbiBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUodmFsdWUsIHBhdGggPSBcIlwiLCBpc1NlcmlhbGl6YWJsZSA9IGlzUGxhaW4sIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocyA9IFtdLCBjYWNoZSkge1xuICBsZXQgZm91bmROZXN0ZWRTZXJpYWxpemFibGU7XG4gIGlmICghaXNTZXJpYWxpemFibGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleVBhdGg6IHBhdGggfHwgXCI8cm9vdD5cIixcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChjYWNoZT8uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBlbnRyaWVzID0gZ2V0RW50cmllcyAhPSBudWxsID8gZ2V0RW50cmllcyh2YWx1ZSkgOiBPYmplY3QuZW50cmllcyh2YWx1ZSk7XG4gIGNvbnN0IGhhc0lnbm9yZWRQYXRocyA9IGlnbm9yZWRQYXRocy5sZW5ndGggPiAwO1xuICBmb3IgKGNvbnN0IFtrZXksIG5lc3RlZFZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbmVzdGVkUGF0aCA9IHBhdGggPyBwYXRoICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgaWYgKGhhc0lnbm9yZWRQYXRocykge1xuICAgICAgY29uc3QgaGFzTWF0Y2hlcyA9IGlnbm9yZWRQYXRocy5zb21lKChpZ25vcmVkKSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVkIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgcmV0dXJuIGlnbm9yZWQudGVzdChuZXN0ZWRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVzdGVkUGF0aCA9PT0gaWdub3JlZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGhhc01hdGNoZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNTZXJpYWxpemFibGUobmVzdGVkVmFsdWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXlQYXRoOiBuZXN0ZWRQYXRoLFxuICAgICAgICB2YWx1ZTogbmVzdGVkVmFsdWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmVzdGVkVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlID0gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKG5lc3RlZFZhbHVlLCBuZXN0ZWRQYXRoLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzLCBjYWNoZSk7XG4gICAgICBpZiAoZm91bmROZXN0ZWRTZXJpYWxpemFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY2FjaGUgJiYgaXNOZXN0ZWRGcm96ZW4odmFsdWUpKSBjYWNoZS5hZGQodmFsdWUpO1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc05lc3RlZEZyb3plbih2YWx1ZSkge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBuZXN0ZWRWYWx1ZSBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgIGlmICh0eXBlb2YgbmVzdGVkVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgbmVzdGVkVmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgIGlmICghaXNOZXN0ZWRGcm96ZW4obmVzdGVkVmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUob3B0aW9ucyA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IG5leHQoYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7XG4gICAgICBpc1NlcmlhbGl6YWJsZSA9IGlzUGxhaW4sXG4gICAgICBnZXRFbnRyaWVzLFxuICAgICAgaWdub3JlZEFjdGlvbnMgPSBbXSxcbiAgICAgIGlnbm9yZWRBY3Rpb25QYXRocyA9IFtcIm1ldGEuYXJnXCIsIFwibWV0YS5iYXNlUXVlcnlNZXRhXCJdLFxuICAgICAgaWdub3JlZFBhdGhzID0gW10sXG4gICAgICB3YXJuQWZ0ZXIgPSAzMixcbiAgICAgIGlnbm9yZVN0YXRlID0gZmFsc2UsXG4gICAgICBpZ25vcmVBY3Rpb25zID0gZmFsc2UsXG4gICAgICBkaXNhYmxlQ2FjaGUgPSBmYWxzZVxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhY2hlID0gIWRpc2FibGVDYWNoZSAmJiBXZWFrU2V0ID8gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIChzdG9yZUFQSSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICAgIGlmICghaXNBY3Rpb24oYWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgY29uc3QgbWVhc3VyZVV0aWxzID0gZ2V0VGltZU1lYXN1cmVVdGlscyh3YXJuQWZ0ZXIsIFwiU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlXCIpO1xuICAgICAgaWYgKCFpZ25vcmVBY3Rpb25zICYmICEoaWdub3JlZEFjdGlvbnMubGVuZ3RoICYmIGlnbm9yZWRBY3Rpb25zLmluZGV4T2YoYWN0aW9uLnR5cGUpICE9PSAtMSkpIHtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlID0gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKGFjdGlvbiwgXCJcIiwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRBY3Rpb25QYXRocywgY2FjaGUpO1xuICAgICAgICAgIGlmIChmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGtleVBhdGgsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9ID0gZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEEgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZSB3YXMgZGV0ZWN0ZWQgaW4gYW4gYWN0aW9uLCBpbiB0aGUgcGF0aDogXFxgJHtrZXlQYXRofVxcYC4gVmFsdWU6YCwgdmFsdWUsIFwiXFxuVGFrZSBhIGxvb2sgYXQgdGhlIGxvZ2ljIHRoYXQgZGlzcGF0Y2hlZCB0aGlzIGFjdGlvbjogXCIsIGFjdGlvbiwgXCJcXG4oU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2ZhcS9hY3Rpb25zI3doeS1zaG91bGQtdHlwZS1iZS1hLXN0cmluZy1vci1hdC1sZWFzdC1zZXJpYWxpemFibGUtd2h5LXNob3VsZC1teS1hY3Rpb24tdHlwZXMtYmUtY29uc3RhbnRzKVwiLCBcIlxcbihUbyBhbGxvdyBub24tc2VyaWFsaXphYmxlIHZhbHVlcyBzZWU6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvdXNhZ2UvdXNhZ2UtZ3VpZGUjd29ya2luZy13aXRoLW5vbi1zZXJpYWxpemFibGUtZGF0YSlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghaWdub3JlU3RhdGUpIHtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlQVBJLmdldFN0YXRlKCk7XG4gICAgICAgICAgY29uc3QgZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlID0gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKHN0YXRlLCBcIlwiLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzLCBjYWNoZSk7XG4gICAgICAgICAgaWYgKGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBrZXlQYXRoLFxuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSA9IGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEEgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIHN0YXRlLCBpbiB0aGUgcGF0aDogXFxgJHtrZXlQYXRofVxcYC4gVmFsdWU6YCwgdmFsdWUsIGBcblRha2UgYSBsb29rIGF0IHRoZSByZWR1Y2VyKHMpIGhhbmRsaW5nIHRoaXMgYWN0aW9uIHR5cGU6ICR7YWN0aW9uLnR5cGV9LlxuKFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9mYXEvb3JnYW5pemluZy1zdGF0ZSNjYW4taS1wdXQtZnVuY3Rpb25zLXByb21pc2VzLW9yLW90aGVyLW5vbi1zZXJpYWxpemFibGUtaXRlbXMtaW4tbXktc3RvcmUtc3RhdGUpYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLndhcm5JZkV4Y2VlZGVkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cbn1cblxuLy8gc3JjL2dldERlZmF1bHRNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBpc0Jvb2xlYW4oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwiYm9vbGVhblwiO1xufVxudmFyIGJ1aWxkR2V0RGVmYXVsdE1pZGRsZXdhcmUgPSAoKSA9PiBmdW5jdGlvbiBnZXREZWZhdWx0TWlkZGxld2FyZShvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICB0aHVuayA9IHRydWUsXG4gICAgaW1tdXRhYmxlQ2hlY2sgPSB0cnVlLFxuICAgIHNlcmlhbGl6YWJsZUNoZWNrID0gdHJ1ZSxcbiAgICBhY3Rpb25DcmVhdG9yQ2hlY2sgPSB0cnVlXG4gIH0gPSBvcHRpb25zID8/IHt9O1xuICBsZXQgbWlkZGxld2FyZUFycmF5ID0gbmV3IFR1cGxlKCk7XG4gIGlmICh0aHVuaykge1xuICAgIGlmIChpc0Jvb2xlYW4odGh1bmspKSB7XG4gICAgICBtaWRkbGV3YXJlQXJyYXkucHVzaCh0aHVua01pZGRsZXdhcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaWRkbGV3YXJlQXJyYXkucHVzaCh3aXRoRXh0cmFBcmd1bWVudCh0aHVuay5leHRyYUFyZ3VtZW50KSk7XG4gICAgfVxuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoaW1tdXRhYmxlQ2hlY2spIHtcbiAgICAgIGxldCBpbW11dGFibGVPcHRpb25zID0ge307XG4gICAgICBpZiAoIWlzQm9vbGVhbihpbW11dGFibGVDaGVjaykpIHtcbiAgICAgICAgaW1tdXRhYmxlT3B0aW9ucyA9IGltbXV0YWJsZUNoZWNrO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZUFycmF5LnVuc2hpZnQoY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKGltbXV0YWJsZU9wdGlvbnMpKTtcbiAgICB9XG4gICAgaWYgKHNlcmlhbGl6YWJsZUNoZWNrKSB7XG4gICAgICBsZXQgc2VyaWFsaXphYmxlT3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKCFpc0Jvb2xlYW4oc2VyaWFsaXphYmxlQ2hlY2spKSB7XG4gICAgICAgIHNlcmlhbGl6YWJsZU9wdGlvbnMgPSBzZXJpYWxpemFibGVDaGVjaztcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKGNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShzZXJpYWxpemFibGVPcHRpb25zKSk7XG4gICAgfVxuICAgIGlmIChhY3Rpb25DcmVhdG9yQ2hlY2spIHtcbiAgICAgIGxldCBhY3Rpb25DcmVhdG9yT3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKCFpc0Jvb2xlYW4oYWN0aW9uQ3JlYXRvckNoZWNrKSkge1xuICAgICAgICBhY3Rpb25DcmVhdG9yT3B0aW9ucyA9IGFjdGlvbkNyZWF0b3JDaGVjaztcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVBcnJheS51bnNoaWZ0KGNyZWF0ZUFjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlKGFjdGlvbkNyZWF0b3JPcHRpb25zKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaWRkbGV3YXJlQXJyYXk7XG59O1xuXG4vLyBzcmMvYXV0b0JhdGNoRW5oYW5jZXIudHNcbnZhciBTSE9VTERfQVVUT0JBVENIID0gXCJSVEtfYXV0b0JhdGNoXCI7XG52YXIgcHJlcGFyZUF1dG9CYXRjaGVkID0gKCkgPT4gKHBheWxvYWQpID0+ICh7XG4gIHBheWxvYWQsXG4gIG1ldGE6IHtcbiAgICBbU0hPVUxEX0FVVE9CQVRDSF06IHRydWVcbiAgfVxufSk7XG52YXIgY3JlYXRlUXVldWVXaXRoVGltZXIgPSAodGltZW91dCkgPT4ge1xuICByZXR1cm4gKG5vdGlmeSkgPT4ge1xuICAgIHNldFRpbWVvdXQobm90aWZ5LCB0aW1lb3V0KTtcbiAgfTtcbn07XG52YXIgYXV0b0JhdGNoRW5oYW5jZXIgPSAob3B0aW9ucyA9IHtcbiAgdHlwZTogXCJyYWZcIlxufSkgPT4gKG5leHQpID0+ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHN0b3JlID0gbmV4dCguLi5hcmdzKTtcbiAgbGV0IG5vdGlmeWluZyA9IHRydWU7XG4gIGxldCBzaG91bGROb3RpZnlBdEVuZE9mVGljayA9IGZhbHNlO1xuICBsZXQgbm90aWZpY2F0aW9uUXVldWVkID0gZmFsc2U7XG4gIGNvbnN0IGxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0IHF1ZXVlQ2FsbGJhY2sgPSBvcHRpb25zLnR5cGUgPT09IFwidGlja1wiID8gcXVldWVNaWNyb3Rhc2sgOiBvcHRpb25zLnR5cGUgPT09IFwicmFmXCIgPyAoXG4gICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHdvbid0IGV4aXN0IGluIFNTUiBlbnZpcm9ubWVudHMuIEZhbGwgYmFjayB0byBhIHZhZ3VlIGFwcHJveGltYXRpb24ganVzdCB0byBrZWVwIGZyb20gZXJyb3JpbmcuXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA6IGNyZWF0ZVF1ZXVlV2l0aFRpbWVyKDEwKVxuICApIDogb3B0aW9ucy50eXBlID09PSBcImNhbGxiYWNrXCIgPyBvcHRpb25zLnF1ZXVlTm90aWZpY2F0aW9uIDogY3JlYXRlUXVldWVXaXRoVGltZXIob3B0aW9ucy50aW1lb3V0KTtcbiAgY29uc3Qgbm90aWZ5TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgIG5vdGlmaWNhdGlvblF1ZXVlZCA9IGZhbHNlO1xuICAgIGlmIChzaG91bGROb3RpZnlBdEVuZE9mVGljaykge1xuICAgICAgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSBmYWxzZTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChsKSA9PiBsKCkpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0b3JlLCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgYHN0b3JlLnN1YnNjcmliZWAgbWV0aG9kIHRvIGtlZXAgb3JpZ2luYWwgbGlzdGVuZXJzXG4gICAgLy8gZnJvbSBydW5uaW5nIGlmIHdlJ3JlIGRlbGF5aW5nIG5vdGlmaWNhdGlvbnNcbiAgICBzdWJzY3JpYmUobGlzdGVuZXIyKSB7XG4gICAgICBjb25zdCB3cmFwcGVkTGlzdGVuZXIgPSAoKSA9PiBub3RpZnlpbmcgJiYgbGlzdGVuZXIyKCk7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN0b3JlLnN1YnNjcmliZSh3cmFwcGVkTGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcjIpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcjIpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGBzdG9yZS5kaXNwYXRjaGAgbWV0aG9kIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGFjdGlvbnNcbiAgICAvLyBmb3IgdGhlIGBzaG91bGRBdXRvQmF0Y2hgIGZsYWcgYW5kIGRldGVybWluZSBpZiBiYXRjaGluZyBpcyBhY3RpdmVcbiAgICBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5vdGlmeWluZyA9ICFhY3Rpb24/Lm1ldGE/LltTSE9VTERfQVVUT0JBVENIXTtcbiAgICAgICAgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSAhbm90aWZ5aW5nO1xuICAgICAgICBpZiAoc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2spIHtcbiAgICAgICAgICBpZiAoIW5vdGlmaWNhdGlvblF1ZXVlZCkge1xuICAgICAgICAgICAgbm90aWZpY2F0aW9uUXVldWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHF1ZXVlQ2FsbGJhY2sobm90aWZ5TGlzdGVuZXJzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoKGFjdGlvbik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBub3RpZnlpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vLyBzcmMvZ2V0RGVmYXVsdEVuaGFuY2Vycy50c1xudmFyIGJ1aWxkR2V0RGVmYXVsdEVuaGFuY2VycyA9IChtaWRkbGV3YXJlRW5oYW5jZXIpID0+IGZ1bmN0aW9uIGdldERlZmF1bHRFbmhhbmNlcnMob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgYXV0b0JhdGNoID0gdHJ1ZVxuICB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgbGV0IGVuaGFuY2VyQXJyYXkgPSBuZXcgVHVwbGUobWlkZGxld2FyZUVuaGFuY2VyKTtcbiAgaWYgKGF1dG9CYXRjaCkge1xuICAgIGVuaGFuY2VyQXJyYXkucHVzaChhdXRvQmF0Y2hFbmhhbmNlcih0eXBlb2YgYXV0b0JhdGNoID09PSBcIm9iamVjdFwiID8gYXV0b0JhdGNoIDogdm9pZCAwKSk7XG4gIH1cbiAgcmV0dXJuIGVuaGFuY2VyQXJyYXk7XG59O1xuXG4vLyBzcmMvY29uZmlndXJlU3RvcmUudHNcbmZ1bmN0aW9uIGNvbmZpZ3VyZVN0b3JlKG9wdGlvbnMpIHtcbiAgY29uc3QgZ2V0RGVmYXVsdE1pZGRsZXdhcmUgPSBidWlsZEdldERlZmF1bHRNaWRkbGV3YXJlKCk7XG4gIGNvbnN0IHtcbiAgICByZWR1Y2VyID0gdm9pZCAwLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgZGV2VG9vbHMgPSB0cnVlLFxuICAgIGR1cGxpY2F0ZU1pZGRsZXdhcmVDaGVjayA9IHRydWUsXG4gICAgcHJlbG9hZGVkU3RhdGUgPSB2b2lkIDAsXG4gICAgZW5oYW5jZXJzID0gdm9pZCAwXG4gIH0gPSBvcHRpb25zIHx8IHt9O1xuICBsZXQgcm9vdFJlZHVjZXI7XG4gIGlmICh0eXBlb2YgcmVkdWNlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcm9vdFJlZHVjZXIgPSByZWR1Y2VyO1xuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QocmVkdWNlcikpIHtcbiAgICByb290UmVkdWNlciA9IGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VyKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiYHJlZHVjZXJgIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQsIGFuZCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0IG9mIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gY29tYmluZVJlZHVjZXJzXCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgbWlkZGxld2FyZSAmJiB0eXBlb2YgbWlkZGxld2FyZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcImBtaWRkbGV3YXJlYCBmaWVsZCBtdXN0IGJlIGEgY2FsbGJhY2tcIik7XG4gIH1cbiAgbGV0IGZpbmFsTWlkZGxld2FyZTtcbiAgaWYgKHR5cGVvZiBtaWRkbGV3YXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBmaW5hbE1pZGRsZXdhcmUgPSBtaWRkbGV3YXJlKGdldERlZmF1bHRNaWRkbGV3YXJlKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFBcnJheS5pc0FycmF5KGZpbmFsTWlkZGxld2FyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMpIDogXCJ3aGVuIHVzaW5nIGEgbWlkZGxld2FyZSBidWlsZGVyIGZ1bmN0aW9uLCBhbiBhcnJheSBvZiBtaWRkbGV3YXJlIG11c3QgYmUgcmV0dXJuZWRcIik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZpbmFsTWlkZGxld2FyZSA9IGdldERlZmF1bHRNaWRkbGV3YXJlKCk7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBmaW5hbE1pZGRsZXdhcmUuc29tZSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gIT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiZWFjaCBtaWRkbGV3YXJlIHByb3ZpZGVkIHRvIGNvbmZpZ3VyZVN0b3JlIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGR1cGxpY2F0ZU1pZGRsZXdhcmVDaGVjaykge1xuICAgIGxldCBtaWRkbGV3YXJlUmVmZXJlbmNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgZmluYWxNaWRkbGV3YXJlLmZvckVhY2goKG1pZGRsZXdhcmUyKSA9PiB7XG4gICAgICBpZiAobWlkZGxld2FyZVJlZmVyZW5jZXMuaGFzKG1pZGRsZXdhcmUyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0MikgOiBcIkR1cGxpY2F0ZSBtaWRkbGV3YXJlIHJlZmVyZW5jZXMgZm91bmQgd2hlbiBjcmVhdGluZyB0aGUgc3RvcmUuIEVuc3VyZSB0aGF0IGVhY2ggbWlkZGxld2FyZSBpcyBvbmx5IGluY2x1ZGVkIG9uY2UuXCIpO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZVJlZmVyZW5jZXMuYWRkKG1pZGRsZXdhcmUyKTtcbiAgICB9KTtcbiAgfVxuICBsZXQgZmluYWxDb21wb3NlID0gY29tcG9zZTtcbiAgaWYgKGRldlRvb2xzKSB7XG4gICAgZmluYWxDb21wb3NlID0gY29tcG9zZVdpdGhEZXZUb29scyh7XG4gICAgICAvLyBFbmFibGUgY2FwdHVyZSBvZiBzdGFjayB0cmFjZXMgZm9yIGRpc3BhdGNoZWQgUmVkdXggYWN0aW9uc1xuICAgICAgdHJhY2U6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIixcbiAgICAgIC4uLnR5cGVvZiBkZXZUb29scyA9PT0gXCJvYmplY3RcIiAmJiBkZXZUb29sc1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IG1pZGRsZXdhcmVFbmhhbmNlciA9IGFwcGx5TWlkZGxld2FyZSguLi5maW5hbE1pZGRsZXdhcmUpO1xuICBjb25zdCBnZXREZWZhdWx0RW5oYW5jZXJzID0gYnVpbGRHZXREZWZhdWx0RW5oYW5jZXJzKG1pZGRsZXdhcmVFbmhhbmNlcik7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZW5oYW5jZXJzICYmIHR5cGVvZiBlbmhhbmNlcnMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogXCJgZW5oYW5jZXJzYCBmaWVsZCBtdXN0IGJlIGEgY2FsbGJhY2tcIik7XG4gIH1cbiAgbGV0IHN0b3JlRW5oYW5jZXJzID0gdHlwZW9mIGVuaGFuY2VycyA9PT0gXCJmdW5jdGlvblwiID8gZW5oYW5jZXJzKGdldERlZmF1bHRFbmhhbmNlcnMpIDogZ2V0RGVmYXVsdEVuaGFuY2VycygpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFBcnJheS5pc0FycmF5KHN0b3JlRW5oYW5jZXJzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogXCJgZW5oYW5jZXJzYCBjYWxsYmFjayBtdXN0IHJldHVybiBhbiBhcnJheVwiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIHN0b3JlRW5oYW5jZXJzLnNvbWUoKGl0ZW0pID0+IHR5cGVvZiBpdGVtICE9PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBcImVhY2ggZW5oYW5jZXIgcHJvdmlkZWQgdG8gY29uZmlndXJlU3RvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZmluYWxNaWRkbGV3YXJlLmxlbmd0aCAmJiAhc3RvcmVFbmhhbmNlcnMuaW5jbHVkZXMobWlkZGxld2FyZUVuaGFuY2VyKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJtaWRkbGV3YXJlcyB3ZXJlIHByb3ZpZGVkLCBidXQgbWlkZGxld2FyZSBlbmhhbmNlciB3YXMgbm90IGluY2x1ZGVkIGluIGZpbmFsIGVuaGFuY2VycyAtIG1ha2Ugc3VyZSB0byBjYWxsIGBnZXREZWZhdWx0RW5oYW5jZXJzYFwiKTtcbiAgfVxuICBjb25zdCBjb21wb3NlZEVuaGFuY2VyID0gZmluYWxDb21wb3NlKC4uLnN0b3JlRW5oYW5jZXJzKTtcbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKHJvb3RSZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgY29tcG9zZWRFbmhhbmNlcik7XG59XG5cbi8vIHNyYy9tYXBCdWlsZGVycy50c1xuZnVuY3Rpb24gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2soYnVpbGRlckNhbGxiYWNrKSB7XG4gIGNvbnN0IGFjdGlvbnNNYXAgPSB7fTtcbiAgY29uc3QgYWN0aW9uTWF0Y2hlcnMgPSBbXTtcbiAgbGV0IGRlZmF1bHRDYXNlUmVkdWNlcjtcbiAgY29uc3QgYnVpbGRlciA9IHtcbiAgICBhZGRDYXNlKHR5cGVPckFjdGlvbkNyZWF0b3IsIHJlZHVjZXIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGFjdGlvbk1hdGNoZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNikgOiBcImBidWlsZGVyLmFkZENhc2VgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGRNYXRjaGVyYFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjcpIDogXCJgYnVpbGRlci5hZGRDYXNlYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYGJ1aWxkZXIuYWRkRGVmYXVsdENhc2VgXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHR5cGVPckFjdGlvbkNyZWF0b3IgPT09IFwic3RyaW5nXCIgPyB0eXBlT3JBY3Rpb25DcmVhdG9yIDogdHlwZU9yQWN0aW9uQ3JlYXRvci50eXBlO1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI4KSA6IFwiYGJ1aWxkZXIuYWRkQ2FzZWAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGFjdGlvbiB0eXBlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgaW4gYWN0aW9uc01hcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyOSkgOiBgXFxgYnVpbGRlci5hZGRDYXNlXFxgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCB0d28gcmVkdWNlcnMgZm9yIHRoZSBzYW1lIGFjdGlvbiB0eXBlICcke3R5cGV9J2ApO1xuICAgICAgfVxuICAgICAgYWN0aW9uc01hcFt0eXBlXSA9IHJlZHVjZXI7XG4gICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9LFxuICAgIGFkZEFzeW5jVGh1bmsoYXN5bmNUaHVuaywgcmVkdWNlcnMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQzKSA6IFwiYGJ1aWxkZXIuYWRkQXN5bmNUaHVua2Agc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlZHVjZXJzLnBlbmRpbmcpIGFjdGlvbnNNYXBbYXN5bmNUaHVuay5wZW5kaW5nLnR5cGVdID0gcmVkdWNlcnMucGVuZGluZztcbiAgICAgIGlmIChyZWR1Y2Vycy5yZWplY3RlZCkgYWN0aW9uc01hcFthc3luY1RodW5rLnJlamVjdGVkLnR5cGVdID0gcmVkdWNlcnMucmVqZWN0ZWQ7XG4gICAgICBpZiAocmVkdWNlcnMuZnVsZmlsbGVkKSBhY3Rpb25zTWFwW2FzeW5jVGh1bmsuZnVsZmlsbGVkLnR5cGVdID0gcmVkdWNlcnMuZnVsZmlsbGVkO1xuICAgICAgaWYgKHJlZHVjZXJzLnNldHRsZWQpIGFjdGlvbk1hdGNoZXJzLnB1c2goe1xuICAgICAgICBtYXRjaGVyOiBhc3luY1RodW5rLnNldHRsZWQsXG4gICAgICAgIHJlZHVjZXI6IHJlZHVjZXJzLnNldHRsZWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGRNYXRjaGVyKG1hdGNoZXIsIHJlZHVjZXIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMwKSA6IFwiYGJ1aWxkZXIuYWRkTWF0Y2hlcmAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWN0aW9uTWF0Y2hlcnMucHVzaCh7XG4gICAgICAgIG1hdGNoZXIsXG4gICAgICAgIHJlZHVjZXJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGREZWZhdWx0Q2FzZShyZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMSkgOiBcImBidWlsZGVyLmFkZERlZmF1bHRDYXNlYCBjYW4gb25seSBiZSBjYWxsZWQgb25jZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVmYXVsdENhc2VSZWR1Y2VyID0gcmVkdWNlcjtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH1cbiAgfTtcbiAgYnVpbGRlckNhbGxiYWNrKGJ1aWxkZXIpO1xuICByZXR1cm4gW2FjdGlvbnNNYXAsIGFjdGlvbk1hdGNoZXJzLCBkZWZhdWx0Q2FzZVJlZHVjZXJdO1xufVxuXG4vLyBzcmMvY3JlYXRlUmVkdWNlci50c1xuc2V0VXNlU3RyaWN0SXRlcmF0aW9uKGZhbHNlKTtcbmZ1bmN0aW9uIGlzU3RhdGVGdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVkdWNlcihpbml0aWFsU3RhdGUsIG1hcE9yQnVpbGRlckNhbGxiYWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAodHlwZW9mIG1hcE9yQnVpbGRlckNhbGxiYWNrID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg4KSA6IFwiVGhlIG9iamVjdCBub3RhdGlvbiBmb3IgYGNyZWF0ZVJlZHVjZXJgIGhhcyBiZWVuIHJlbW92ZWQuIFBsZWFzZSB1c2UgdGhlICdidWlsZGVyIGNhbGxiYWNrJyBub3RhdGlvbiBpbnN0ZWFkOiBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL2FwaS9jcmVhdGVSZWR1Y2VyXCIpO1xuICAgIH1cbiAgfVxuICBsZXQgW2FjdGlvbnNNYXAsIGZpbmFsQWN0aW9uTWF0Y2hlcnMsIGZpbmFsRGVmYXVsdENhc2VSZWR1Y2VyXSA9IGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKG1hcE9yQnVpbGRlckNhbGxiYWNrKTtcbiAgbGV0IGdldEluaXRpYWxTdGF0ZTtcbiAgaWYgKGlzU3RhdGVGdW5jdGlvbihpbml0aWFsU3RhdGUpKSB7XG4gICAgZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4gZnJlZXplRHJhZnRhYmxlKGluaXRpYWxTdGF0ZSgpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmcm96ZW5Jbml0aWFsU3RhdGUgPSBmcmVlemVEcmFmdGFibGUoaW5pdGlhbFN0YXRlKTtcbiAgICBnZXRJbml0aWFsU3RhdGUgPSAoKSA9PiBmcm96ZW5Jbml0aWFsU3RhdGU7XG4gIH1cbiAgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZSA9IGdldEluaXRpYWxTdGF0ZSgpLCBhY3Rpb24pIHtcbiAgICBsZXQgY2FzZVJlZHVjZXJzID0gW2FjdGlvbnNNYXBbYWN0aW9uLnR5cGVdLCAuLi5maW5hbEFjdGlvbk1hdGNoZXJzLmZpbHRlcigoe1xuICAgICAgbWF0Y2hlclxuICAgIH0pID0+IG1hdGNoZXIoYWN0aW9uKSkubWFwKCh7XG4gICAgICByZWR1Y2VyOiByZWR1Y2VyMlxuICAgIH0pID0+IHJlZHVjZXIyKV07XG4gICAgaWYgKGNhc2VSZWR1Y2Vycy5maWx0ZXIoKGNyKSA9PiAhIWNyKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhc2VSZWR1Y2VycyA9IFtmaW5hbERlZmF1bHRDYXNlUmVkdWNlcl07XG4gICAgfVxuICAgIHJldHVybiBjYXNlUmVkdWNlcnMucmVkdWNlKChwcmV2aW91c1N0YXRlLCBjYXNlUmVkdWNlcikgPT4ge1xuICAgICAgaWYgKGNhc2VSZWR1Y2VyKSB7XG4gICAgICAgIGlmIChpc0RyYWZ0KHByZXZpb3VzU3RhdGUpKSB7XG4gICAgICAgICAgY29uc3QgZHJhZnQgPSBwcmV2aW91c1N0YXRlO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc2VSZWR1Y2VyKGRyYWZ0LCBhY3Rpb24pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzRHJhZnRhYmxlKHByZXZpb3VzU3RhdGUpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FzZVJlZHVjZXIocHJldmlvdXNTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1N0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJBIGNhc2UgcmVkdWNlciBvbiBhIG5vbi1kcmFmdGFibGUgdmFsdWUgbXVzdCBub3QgcmV0dXJuIHVuZGVmaW5lZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcHJvZHVjZShwcmV2aW91c1N0YXRlLCAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYXNlUmVkdWNlcihkcmFmdCwgYWN0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgfSwgc3RhdGUpO1xuICB9XG4gIHJlZHVjZXIuZ2V0SW5pdGlhbFN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlO1xuICByZXR1cm4gcmVkdWNlcjtcbn1cblxuLy8gc3JjL21hdGNoZXJzLnRzXG52YXIgbWF0Y2hlcyA9IChtYXRjaGVyLCBhY3Rpb24pID0+IHtcbiAgaWYgKGhhc01hdGNoRnVuY3Rpb24obWF0Y2hlcikpIHtcbiAgICByZXR1cm4gbWF0Y2hlci5tYXRjaChhY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBtYXRjaGVyKGFjdGlvbik7XG4gIH1cbn07XG5mdW5jdGlvbiBpc0FueU9mKC4uLm1hdGNoZXJzKSB7XG4gIHJldHVybiAoYWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuIG1hdGNoZXJzLnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoZXMobWF0Y2hlciwgYWN0aW9uKSk7XG4gIH07XG59XG5mdW5jdGlvbiBpc0FsbE9mKC4uLm1hdGNoZXJzKSB7XG4gIHJldHVybiAoYWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuIG1hdGNoZXJzLmV2ZXJ5KChtYXRjaGVyKSA9PiBtYXRjaGVzKG1hdGNoZXIsIGFjdGlvbikpO1xuICB9O1xufVxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCB2YWxpZFN0YXR1cykge1xuICBpZiAoIWFjdGlvbiB8fCAhYWN0aW9uLm1ldGEpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaGFzVmFsaWRSZXF1ZXN0SWQgPSB0eXBlb2YgYWN0aW9uLm1ldGEucmVxdWVzdElkID09PSBcInN0cmluZ1wiO1xuICBjb25zdCBoYXNWYWxpZFJlcXVlc3RTdGF0dXMgPSB2YWxpZFN0YXR1cy5pbmRleE9mKGFjdGlvbi5tZXRhLnJlcXVlc3RTdGF0dXMpID4gLTE7XG4gIHJldHVybiBoYXNWYWxpZFJlcXVlc3RJZCAmJiBoYXNWYWxpZFJlcXVlc3RTdGF0dXM7XG59XG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtBcnJheShhKSB7XG4gIHJldHVybiB0eXBlb2YgYVswXSA9PT0gXCJmdW5jdGlvblwiICYmIFwicGVuZGluZ1wiIGluIGFbMF0gJiYgXCJmdWxmaWxsZWRcIiBpbiBhWzBdICYmIFwicmVqZWN0ZWRcIiBpbiBhWzBdO1xufVxuZnVuY3Rpb24gaXNQZW5kaW5nKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJwZW5kaW5nXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc1BlbmRpbmcoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MubWFwKChhc3luY1RodW5rKSA9PiBhc3luY1RodW5rLnBlbmRpbmcpKTtcbn1cbmZ1bmN0aW9uIGlzUmVqZWN0ZWQoLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcInJlamVjdGVkXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc1JlamVjdGVkKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLm1hcCgoYXN5bmNUaHVuaykgPT4gYXN5bmNUaHVuay5yZWplY3RlZCkpO1xufVxuZnVuY3Rpb24gaXNSZWplY3RlZFdpdGhWYWx1ZSguLi5hc3luY1RodW5rcykge1xuICBjb25zdCBoYXNGbGFnID0gKGFjdGlvbikgPT4ge1xuICAgIHJldHVybiBhY3Rpb24gJiYgYWN0aW9uLm1ldGEgJiYgYWN0aW9uLm1ldGEucmVqZWN0ZWRXaXRoVmFsdWU7XG4gIH07XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaXNBbGxPZihpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNSZWplY3RlZFdpdGhWYWx1ZSgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbGxPZihpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XG59XG5mdW5jdGlvbiBpc0Z1bGZpbGxlZCguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wiZnVsZmlsbGVkXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc0Z1bGZpbGxlZCgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5tYXAoKGFzeW5jVGh1bmspID0+IGFzeW5jVGh1bmsuZnVsZmlsbGVkKSk7XG59XG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtBY3Rpb24oLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcInBlbmRpbmdcIiwgXCJmdWxmaWxsZWRcIiwgXCJyZWplY3RlZFwiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNBc3luY1RodW5rQWN0aW9uKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLmZsYXRNYXAoKGFzeW5jVGh1bmspID0+IFthc3luY1RodW5rLnBlbmRpbmcsIGFzeW5jVGh1bmsucmVqZWN0ZWQsIGFzeW5jVGh1bmsuZnVsZmlsbGVkXSkpO1xufVxuXG4vLyBzcmMvbmFub2lkLnRzXG52YXIgdXJsQWxwaGFiZXQgPSBcIk1vZHVsZVN5bWJoYXNPd25Qci0wMTIzNDU2Nzg5QUJDREVGR0hOUlZmZ2N0aVV2el9LcVlUSmtMeHBaWElqUVdcIjtcbnZhciBuYW5vaWQgPSAoc2l6ZSA9IDIxKSA9PiB7XG4gIGxldCBpZCA9IFwiXCI7XG4gIGxldCBpID0gc2l6ZTtcbiAgd2hpbGUgKGktLSkge1xuICAgIGlkICs9IHVybEFscGhhYmV0W01hdGgucmFuZG9tKCkgKiA2NCB8IDBdO1xuICB9XG4gIHJldHVybiBpZDtcbn07XG5cbi8vIHNyYy9jcmVhdGVBc3luY1RodW5rLnRzXG52YXIgY29tbW9uUHJvcGVydGllcyA9IFtcIm5hbWVcIiwgXCJtZXNzYWdlXCIsIFwic3RhY2tcIiwgXCJjb2RlXCJdO1xudmFyIFJlamVjdFdpdGhWYWx1ZSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IocGF5bG9hZCwgbWV0YSkge1xuICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgfVxuICAvKlxuICB0eXBlLW9ubHkgcHJvcGVydHkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBSZWplY3RXaXRoVmFsdWUgYW5kIEZ1bGZpbGxXaXRoTWV0YVxuICBkb2VzIG5vdCBleGlzdCBhdCBydW50aW1lXG4gICovXG4gIF90eXBlO1xufTtcbnZhciBGdWxmaWxsV2l0aE1ldGEgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHBheWxvYWQsIG1ldGEpIHtcbiAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gIH1cbiAgLypcbiAgdHlwZS1vbmx5IHByb3BlcnR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gUmVqZWN0V2l0aFZhbHVlIGFuZCBGdWxmaWxsV2l0aE1ldGFcbiAgZG9lcyBub3QgZXhpc3QgYXQgcnVudGltZVxuICAqL1xuICBfdHlwZTtcbn07XG52YXIgbWluaVNlcmlhbGl6ZUVycm9yID0gKHZhbHVlKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzaW1wbGVFcnJvciA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgY29tbW9uUHJvcGVydGllcykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZVtwcm9wZXJ0eV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgc2ltcGxlRXJyb3JbcHJvcGVydHldID0gdmFsdWVbcHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2ltcGxlRXJyb3I7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBTdHJpbmcodmFsdWUpXG4gIH07XG59O1xudmFyIGV4dGVybmFsQWJvcnRNZXNzYWdlID0gXCJFeHRlcm5hbCBzaWduYWwgd2FzIGFib3J0ZWRcIjtcbnZhciBjcmVhdGVBc3luY1RodW5rID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB7XG4gIGZ1bmN0aW9uIGNyZWF0ZUFzeW5jVGh1bmsyKHR5cGVQcmVmaXgsIHBheWxvYWRDcmVhdG9yLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZnVsZmlsbGVkID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9mdWxmaWxsZWRcIiwgKHBheWxvYWQsIHJlcXVlc3RJZCwgYXJnLCBtZXRhKSA9PiAoe1xuICAgICAgcGF5bG9hZCxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4ubWV0YSB8fCB7fSxcbiAgICAgICAgYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHJlcXVlc3RTdGF0dXM6IFwiZnVsZmlsbGVkXCJcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgY29uc3QgcGVuZGluZyA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvcGVuZGluZ1wiLCAocmVxdWVzdElkLCBhcmcsIG1ldGEpID0+ICh7XG4gICAgICBwYXlsb2FkOiB2b2lkIDAsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLm1ldGEgfHwge30sXG4gICAgICAgIGFyZyxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZXF1ZXN0U3RhdHVzOiBcInBlbmRpbmdcIlxuICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCByZWplY3RlZCA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvcmVqZWN0ZWRcIiwgKGVycm9yLCByZXF1ZXN0SWQsIGFyZywgcGF5bG9hZCwgbWV0YSkgPT4gKHtcbiAgICAgIHBheWxvYWQsXG4gICAgICBlcnJvcjogKG9wdGlvbnMgJiYgb3B0aW9ucy5zZXJpYWxpemVFcnJvciB8fCBtaW5pU2VyaWFsaXplRXJyb3IpKGVycm9yIHx8IFwiUmVqZWN0ZWRcIiksXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLm1ldGEgfHwge30sXG4gICAgICAgIGFyZyxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZWplY3RlZFdpdGhWYWx1ZTogISFwYXlsb2FkLFxuICAgICAgICByZXF1ZXN0U3RhdHVzOiBcInJlamVjdGVkXCIsXG4gICAgICAgIGFib3J0ZWQ6IGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIixcbiAgICAgICAgY29uZGl0aW9uOiBlcnJvcj8ubmFtZSA9PT0gXCJDb25kaXRpb25FcnJvclwiXG4gICAgICB9XG4gICAgfSkpO1xuICAgIGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoYXJnLCB7XG4gICAgICBzaWduYWxcbiAgICB9ID0ge30pIHtcbiAgICAgIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYSkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBvcHRpb25zPy5pZEdlbmVyYXRvciA/IG9wdGlvbnMuaWRHZW5lcmF0b3IoYXJnKSA6IG5hbm9pZCgpO1xuICAgICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGxldCBhYm9ydEhhbmRsZXI7XG4gICAgICAgIGxldCBhYm9ydFJlYXNvbjtcbiAgICAgICAgZnVuY3Rpb24gYWJvcnQocmVhc29uKSB7XG4gICAgICAgICAgYWJvcnRSZWFzb24gPSByZWFzb247XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgYWJvcnQoZXh0ZXJuYWxBYm9ydE1lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IGFib3J0KGV4dGVybmFsQWJvcnRNZXNzYWdlKSwge1xuICAgICAgICAgICAgICBvbmNlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxldCBmaW5hbEFjdGlvbjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGNvbmRpdGlvblJlc3VsdCA9IG9wdGlvbnM/LmNvbmRpdGlvbj8uKGFyZywge1xuICAgICAgICAgICAgICBnZXRTdGF0ZSxcbiAgICAgICAgICAgICAgZXh0cmFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGlzVGhlbmFibGUoY29uZGl0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgPSBhd2FpdCBjb25kaXRpb25SZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uUmVzdWx0ID09PSBmYWxzZSB8fCBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29uZGl0aW9uRXJyb3JcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkFib3J0ZWQgZHVlIHRvIGNvbmRpdGlvbiBjYWxsYmFjayByZXR1cm5pbmcgZmFsc2UuXCJcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFib3J0ZWRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBhYm9ydEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQWJvcnRFcnJvclwiLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYWJvcnRSZWFzb24gfHwgXCJBYm9ydGVkXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRIYW5kbGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGlzcGF0Y2gocGVuZGluZyhyZXF1ZXN0SWQsIGFyZywgb3B0aW9ucz8uZ2V0UGVuZGluZ01ldGE/Lih7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGdldFN0YXRlLFxuICAgICAgICAgICAgICBleHRyYVxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gYXdhaXQgUHJvbWlzZS5yYWNlKFthYm9ydGVkUHJvbWlzZSwgUHJvbWlzZS5yZXNvbHZlKHBheWxvYWRDcmVhdG9yKGFyZywge1xuICAgICAgICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgICAgICAgIGV4dHJhLFxuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgYWJvcnQsXG4gICAgICAgICAgICAgIHJlamVjdFdpdGhWYWx1ZTogKHZhbHVlLCBtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWplY3RXaXRoVmFsdWUodmFsdWUsIG1ldGEpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdWxmaWxsV2l0aFZhbHVlOiAodmFsdWUsIG1ldGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bGZpbGxXaXRoTWV0YSh2YWx1ZSwgbWV0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlamVjdFdpdGhWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRnVsZmlsbFdpdGhNZXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bGZpbGxlZChyZXN1bHQucGF5bG9hZCwgcmVxdWVzdElkLCBhcmcsIHJlc3VsdC5tZXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZnVsZmlsbGVkKHJlc3VsdCwgcmVxdWVzdElkLCBhcmcpO1xuICAgICAgICAgICAgfSldKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gZXJyIGluc3RhbmNlb2YgUmVqZWN0V2l0aFZhbHVlID8gcmVqZWN0ZWQobnVsbCwgcmVxdWVzdElkLCBhcmcsIGVyci5wYXlsb2FkLCBlcnIubWV0YSkgOiByZWplY3RlZChlcnIsIHJlcXVlc3RJZCwgYXJnKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKGFib3J0SGFuZGxlcikge1xuICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBza2lwRGlzcGF0Y2ggPSBvcHRpb25zICYmICFvcHRpb25zLmRpc3BhdGNoQ29uZGl0aW9uUmVqZWN0aW9uICYmIHJlamVjdGVkLm1hdGNoKGZpbmFsQWN0aW9uKSAmJiBmaW5hbEFjdGlvbi5tZXRhLmNvbmRpdGlvbjtcbiAgICAgICAgICBpZiAoIXNraXBEaXNwYXRjaCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goZmluYWxBY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmluYWxBY3Rpb247XG4gICAgICAgIH0oKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocHJvbWlzZSwge1xuICAgICAgICAgIGFib3J0LFxuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICBhcmcsXG4gICAgICAgICAgdW53cmFwKCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbih1bndyYXBSZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY3Rpb25DcmVhdG9yLCB7XG4gICAgICBwZW5kaW5nLFxuICAgICAgcmVqZWN0ZWQsXG4gICAgICBmdWxmaWxsZWQsXG4gICAgICBzZXR0bGVkOiBpc0FueU9mKHJlamVjdGVkLCBmdWxmaWxsZWQpLFxuICAgICAgdHlwZVByZWZpeFxuICAgIH0pO1xuICB9XG4gIGNyZWF0ZUFzeW5jVGh1bmsyLndpdGhUeXBlcyA9ICgpID0+IGNyZWF0ZUFzeW5jVGh1bmsyO1xuICByZXR1cm4gY3JlYXRlQXN5bmNUaHVuazI7XG59KSgpO1xuZnVuY3Rpb24gdW53cmFwUmVzdWx0KGFjdGlvbikge1xuICBpZiAoYWN0aW9uLm1ldGEgJiYgYWN0aW9uLm1ldGEucmVqZWN0ZWRXaXRoVmFsdWUpIHtcbiAgICB0aHJvdyBhY3Rpb24ucGF5bG9hZDtcbiAgfVxuICBpZiAoYWN0aW9uLmVycm9yKSB7XG4gICAgdGhyb3cgYWN0aW9uLmVycm9yO1xuICB9XG4gIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGlzVGhlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vLyBzcmMvY3JlYXRlU2xpY2UudHNcbnZhciBhc3luY1RodW5rU3ltYm9sID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoXCJydGstc2xpY2UtY3JlYXRlYXN5bmN0aHVua1wiKTtcbnZhciBhc3luY1RodW5rQ3JlYXRvciA9IHtcbiAgW2FzeW5jVGh1bmtTeW1ib2xdOiBjcmVhdGVBc3luY1RodW5rXG59O1xudmFyIFJlZHVjZXJUeXBlID0gLyogQF9fUFVSRV9fICovICgoUmVkdWNlclR5cGUyKSA9PiB7XG4gIFJlZHVjZXJUeXBlMltcInJlZHVjZXJcIl0gPSBcInJlZHVjZXJcIjtcbiAgUmVkdWNlclR5cGUyW1wicmVkdWNlcldpdGhQcmVwYXJlXCJdID0gXCJyZWR1Y2VyV2l0aFByZXBhcmVcIjtcbiAgUmVkdWNlclR5cGUyW1wiYXN5bmNUaHVua1wiXSA9IFwiYXN5bmNUaHVua1wiO1xuICByZXR1cm4gUmVkdWNlclR5cGUyO1xufSkoUmVkdWNlclR5cGUgfHwge30pO1xuZnVuY3Rpb24gZ2V0VHlwZShzbGljZSwgYWN0aW9uS2V5KSB7XG4gIHJldHVybiBgJHtzbGljZX0vJHthY3Rpb25LZXl9YDtcbn1cbmZ1bmN0aW9uIGJ1aWxkQ3JlYXRlU2xpY2Uoe1xuICBjcmVhdG9yc1xufSA9IHt9KSB7XG4gIGNvbnN0IGNBVCA9IGNyZWF0b3JzPy5hc3luY1RodW5rPy5bYXN5bmNUaHVua1N5bWJvbF07XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVTbGljZTIob3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICByZWR1Y2VyUGF0aCA9IG5hbWVcbiAgICB9ID0gb3B0aW9ucztcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiYG5hbWVgIGlzIGEgcmVxdWlyZWQgb3B0aW9uIGZvciBjcmVhdGVTbGljZVwiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIGlmIChvcHRpb25zLmluaXRpYWxTdGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgbXVzdCBwcm92aWRlIGFuIGBpbml0aWFsU3RhdGVgIHZhbHVlIHRoYXQgaXMgbm90IGB1bmRlZmluZWRgLiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBgaW5pdGlhbFN0YXRlYFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVkdWNlcnMgPSAodHlwZW9mIG9wdGlvbnMucmVkdWNlcnMgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMucmVkdWNlcnMoYnVpbGRSZWR1Y2VyQ3JlYXRvcnMoKSkgOiBvcHRpb25zLnJlZHVjZXJzKSB8fCB7fTtcbiAgICBjb25zdCByZWR1Y2VyTmFtZXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lOiB7fSxcbiAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlOiB7fSxcbiAgICAgIGFjdGlvbkNyZWF0b3JzOiB7fSxcbiAgICAgIHNsaWNlTWF0Y2hlcnM6IFtdXG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0TWV0aG9kcyA9IHtcbiAgICAgIGFkZENhc2UodHlwZU9yQWN0aW9uQ3JlYXRvciwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSBcInN0cmluZ1wiID8gdHlwZU9yQWN0aW9uQ3JlYXRvciA6IHR5cGVPckFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJgY29udGV4dC5hZGRDYXNlYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYW4gZW1wdHkgYWN0aW9uIHR5cGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgaW4gY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IFwiYGNvbnRleHQuYWRkQ2FzZWAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIHR3byByZWR1Y2VycyBmb3IgdGhlIHNhbWUgYWN0aW9uIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZVt0eXBlXSA9IHJlZHVjZXIyO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9LFxuICAgICAgYWRkTWF0Y2hlcihtYXRjaGVyLCByZWR1Y2VyMikge1xuICAgICAgICBjb250ZXh0LnNsaWNlTWF0Y2hlcnMucHVzaCh7XG4gICAgICAgICAgbWF0Y2hlcixcbiAgICAgICAgICByZWR1Y2VyOiByZWR1Y2VyMlxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfSxcbiAgICAgIGV4cG9zZUFjdGlvbihuYW1lMiwgYWN0aW9uQ3JlYXRvcikge1xuICAgICAgICBjb250ZXh0LmFjdGlvbkNyZWF0b3JzW25hbWUyXSA9IGFjdGlvbkNyZWF0b3I7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH0sXG4gICAgICBleHBvc2VDYXNlUmVkdWNlcihuYW1lMiwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZVtuYW1lMl0gPSByZWR1Y2VyMjtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVkdWNlck5hbWVzLmZvckVhY2goKHJlZHVjZXJOYW1lKSA9PiB7XG4gICAgICBjb25zdCByZWR1Y2VyRGVmaW5pdGlvbiA9IHJlZHVjZXJzW3JlZHVjZXJOYW1lXTtcbiAgICAgIGNvbnN0IHJlZHVjZXJEZXRhaWxzID0ge1xuICAgICAgICByZWR1Y2VyTmFtZSxcbiAgICAgICAgdHlwZTogZ2V0VHlwZShuYW1lLCByZWR1Y2VyTmFtZSksXG4gICAgICAgIGNyZWF0ZU5vdGF0aW9uOiB0eXBlb2Ygb3B0aW9ucy5yZWR1Y2VycyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICB9O1xuICAgICAgaWYgKGlzQXN5bmNUaHVua1NsaWNlUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pKSB7XG4gICAgICAgIGhhbmRsZVRodW5rQ2FzZVJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZXRhaWxzLCByZWR1Y2VyRGVmaW5pdGlvbiwgY29udGV4dE1ldGhvZHMsIGNBVCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYW5kbGVOb3JtYWxSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGV0YWlscywgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHRNZXRob2RzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmdW5jdGlvbiBidWlsZFJlZHVjZXIoKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5leHRyYVJlZHVjZXJzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogXCJUaGUgb2JqZWN0IG5vdGF0aW9uIGZvciBgY3JlYXRlU2xpY2UuZXh0cmFSZWR1Y2Vyc2AgaGFzIGJlZW4gcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGUgJ2J1aWxkZXIgY2FsbGJhY2snIG5vdGF0aW9uIGluc3RlYWQ6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2NyZWF0ZVNsaWNlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBbZXh0cmFSZWR1Y2VycyA9IHt9LCBhY3Rpb25NYXRjaGVycyA9IFtdLCBkZWZhdWx0Q2FzZVJlZHVjZXIgPSB2b2lkIDBdID0gdHlwZW9mIG9wdGlvbnMuZXh0cmFSZWR1Y2VycyA9PT0gXCJmdW5jdGlvblwiID8gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2sob3B0aW9ucy5leHRyYVJlZHVjZXJzKSA6IFtvcHRpb25zLmV4dHJhUmVkdWNlcnNdO1xuICAgICAgY29uc3QgZmluYWxDYXNlUmVkdWNlcnMgPSB7XG4gICAgICAgIC4uLmV4dHJhUmVkdWNlcnMsXG4gICAgICAgIC4uLmNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGVcbiAgICAgIH07XG4gICAgICByZXR1cm4gY3JlYXRlUmVkdWNlcihvcHRpb25zLmluaXRpYWxTdGF0ZSwgKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGZpbmFsQ2FzZVJlZHVjZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRDYXNlKGtleSwgZmluYWxDYXNlUmVkdWNlcnNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgc00gb2YgY29udGV4dC5zbGljZU1hdGNoZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRNYXRjaGVyKHNNLm1hdGNoZXIsIHNNLnJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG0gb2YgYWN0aW9uTWF0Y2hlcnMpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZE1hdGNoZXIobS5tYXRjaGVyLCBtLnJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZERlZmF1bHRDYXNlKGRlZmF1bHRDYXNlUmVkdWNlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RTZWxmID0gKHN0YXRlKSA9PiBzdGF0ZTtcbiAgICBjb25zdCBpbmplY3RlZFNlbGVjdG9yQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGluamVjdGVkU3RhdGVDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICAgIGxldCBfcmVkdWNlcjtcbiAgICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgIGlmICghX3JlZHVjZXIpIF9yZWR1Y2VyID0gYnVpbGRSZWR1Y2VyKCk7XG4gICAgICByZXR1cm4gX3JlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgIGlmICghX3JlZHVjZXIpIF9yZWR1Y2VyID0gYnVpbGRSZWR1Y2VyKCk7XG4gICAgICByZXR1cm4gX3JlZHVjZXIuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VTZWxlY3RvclByb3BzKHJlZHVjZXJQYXRoMiwgaW5qZWN0ZWQgPSBmYWxzZSkge1xuICAgICAgZnVuY3Rpb24gc2VsZWN0U2xpY2Uoc3RhdGUpIHtcbiAgICAgICAgbGV0IHNsaWNlU3RhdGUgPSBzdGF0ZVtyZWR1Y2VyUGF0aDJdO1xuICAgICAgICBpZiAodHlwZW9mIHNsaWNlU3RhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgICAgIHNsaWNlU3RhdGUgPSBnZXRPckluc2VydENvbXB1dGVkKGluamVjdGVkU3RhdGVDYWNoZSwgc2VsZWN0U2xpY2UsIGdldEluaXRpYWxTdGF0ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6IFwic2VsZWN0U2xpY2UgcmV0dXJuZWQgdW5kZWZpbmVkIGZvciBhbiB1bmluamVjdGVkIHNsaWNlIHJlZHVjZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzbGljZVN0YXRlO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKHNlbGVjdFN0YXRlID0gc2VsZWN0U2VsZikge1xuICAgICAgICBjb25zdCBzZWxlY3RvckNhY2hlID0gZ2V0T3JJbnNlcnRDb21wdXRlZChpbmplY3RlZFNlbGVjdG9yQ2FjaGUsIGluamVjdGVkLCAoKSA9PiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSk7XG4gICAgICAgIHJldHVybiBnZXRPckluc2VydENvbXB1dGVkKHNlbGVjdG9yQ2FjaGUsIHNlbGVjdFN0YXRlLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWFwID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBbbmFtZTIsIHNlbGVjdG9yXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zLnNlbGVjdG9ycyA/PyB7fSkpIHtcbiAgICAgICAgICAgIG1hcFtuYW1lMl0gPSB3cmFwU2VsZWN0b3Ioc2VsZWN0b3IsIHNlbGVjdFN0YXRlLCAoKSA9PiBnZXRPckluc2VydENvbXB1dGVkKGluamVjdGVkU3RhdGVDYWNoZSwgc2VsZWN0U3RhdGUsIGdldEluaXRpYWxTdGF0ZSksIGluamVjdGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWR1Y2VyUGF0aDogcmVkdWNlclBhdGgyLFxuICAgICAgICBnZXRTZWxlY3RvcnMsXG4gICAgICAgIGdldCBzZWxlY3RvcnMoKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9ycyhzZWxlY3RTbGljZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdFNsaWNlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzbGljZSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICByZWR1Y2VyLFxuICAgICAgYWN0aW9uczogY29udGV4dC5hY3Rpb25DcmVhdG9ycyxcbiAgICAgIGNhc2VSZWR1Y2VyczogY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZSxcbiAgICAgIGdldEluaXRpYWxTdGF0ZSxcbiAgICAgIC4uLm1ha2VTZWxlY3RvclByb3BzKHJlZHVjZXJQYXRoKSxcbiAgICAgIGluamVjdEludG8oaW5qZWN0YWJsZSwge1xuICAgICAgICByZWR1Y2VyUGF0aDogcGF0aE9wdCxcbiAgICAgICAgLi4uY29uZmlnXG4gICAgICB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgbmV3UmVkdWNlclBhdGggPSBwYXRoT3B0ID8/IHJlZHVjZXJQYXRoO1xuICAgICAgICBpbmplY3RhYmxlLmluamVjdCh7XG4gICAgICAgICAgcmVkdWNlclBhdGg6IG5ld1JlZHVjZXJQYXRoLFxuICAgICAgICAgIHJlZHVjZXJcbiAgICAgICAgfSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zbGljZSxcbiAgICAgICAgICAuLi5tYWtlU2VsZWN0b3JQcm9wcyhuZXdSZWR1Y2VyUGF0aCwgdHJ1ZSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBzbGljZTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHdyYXBTZWxlY3RvcihzZWxlY3Rvciwgc2VsZWN0U3RhdGUsIGdldEluaXRpYWxTdGF0ZSwgaW5qZWN0ZWQpIHtcbiAgZnVuY3Rpb24gd3JhcHBlcihyb290U3RhdGUsIC4uLmFyZ3MpIHtcbiAgICBsZXQgc2xpY2VTdGF0ZSA9IHNlbGVjdFN0YXRlKHJvb3RTdGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBzbGljZVN0YXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgc2xpY2VTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJzZWxlY3RTdGF0ZSByZXR1cm5lZCB1bmRlZmluZWQgZm9yIGFuIHVuaW5qZWN0ZWQgc2xpY2UgcmVkdWNlclwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yKHNsaWNlU3RhdGUsIC4uLmFyZ3MpO1xuICB9XG4gIHdyYXBwZXIudW53cmFwcGVkID0gc2VsZWN0b3I7XG4gIHJldHVybiB3cmFwcGVyO1xufVxudmFyIGNyZWF0ZVNsaWNlID0gLyogQF9fUFVSRV9fICovIGJ1aWxkQ3JlYXRlU2xpY2UoKTtcbmZ1bmN0aW9uIGJ1aWxkUmVkdWNlckNyZWF0b3JzKCkge1xuICBmdW5jdGlvbiBhc3luY1RodW5rKHBheWxvYWRDcmVhdG9yLCBjb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX3JlZHVjZXJEZWZpbml0aW9uVHlwZTogXCJhc3luY1RodW5rXCIgLyogYXN5bmNUaHVuayAqLyxcbiAgICAgIHBheWxvYWRDcmVhdG9yLFxuICAgICAgLi4uY29uZmlnXG4gICAgfTtcbiAgfVxuICBhc3luY1RodW5rLndpdGhUeXBlcyA9ICgpID0+IGFzeW5jVGh1bms7XG4gIHJldHVybiB7XG4gICAgcmVkdWNlcihjYXNlUmVkdWNlcikge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAvLyBoYWNrIHNvIHRoZSB3cmFwcGluZyBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNvIHRoZSBgcmVkdWNlckRlZmluaXRpb25UeXBlYCBpcyBub3QgYXNzaWduZWQgdG8gdGhlIG9yaWdpbmFsXG4gICAgICAgIFtjYXNlUmVkdWNlci5uYW1lXSguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc2VSZWR1Y2VyKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9W2Nhc2VSZWR1Y2VyLm5hbWVdLCB7XG4gICAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwicmVkdWNlclwiIC8qIHJlZHVjZXIgKi9cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlcGFyZWRSZWR1Y2VyKHByZXBhcmUsIHJlZHVjZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwicmVkdWNlcldpdGhQcmVwYXJlXCIgLyogcmVkdWNlcldpdGhQcmVwYXJlICovLFxuICAgICAgICBwcmVwYXJlLFxuICAgICAgICByZWR1Y2VyXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXN5bmNUaHVua1xuICB9O1xufVxuZnVuY3Rpb24gaGFuZGxlTm9ybWFsUmVkdWNlckRlZmluaXRpb24oe1xuICB0eXBlLFxuICByZWR1Y2VyTmFtZSxcbiAgY3JlYXRlTm90YXRpb25cbn0sIG1heWJlUmVkdWNlcldpdGhQcmVwYXJlLCBjb250ZXh0KSB7XG4gIGxldCBjYXNlUmVkdWNlcjtcbiAgbGV0IHByZXBhcmVDYWxsYmFjaztcbiAgaWYgKFwicmVkdWNlclwiIGluIG1heWJlUmVkdWNlcldpdGhQcmVwYXJlKSB7XG4gICAgaWYgKGNyZWF0ZU5vdGF0aW9uICYmICFpc0Nhc2VSZWR1Y2VyV2l0aFByZXBhcmVEZWZpbml0aW9uKG1heWJlUmVkdWNlcldpdGhQcmVwYXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTcpIDogXCJQbGVhc2UgdXNlIHRoZSBgY3JlYXRlLnByZXBhcmVkUmVkdWNlcmAgbm90YXRpb24gZm9yIHByZXBhcmVkIGFjdGlvbiBjcmVhdG9ycyB3aXRoIHRoZSBgY3JlYXRlYCBub3RhdGlvbi5cIik7XG4gICAgfVxuICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucmVkdWNlcjtcbiAgICBwcmVwYXJlQ2FsbGJhY2sgPSBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZS5wcmVwYXJlO1xuICB9IGVsc2Uge1xuICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmU7XG4gIH1cbiAgY29udGV4dC5hZGRDYXNlKHR5cGUsIGNhc2VSZWR1Y2VyKS5leHBvc2VDYXNlUmVkdWNlcihyZWR1Y2VyTmFtZSwgY2FzZVJlZHVjZXIpLmV4cG9zZUFjdGlvbihyZWR1Y2VyTmFtZSwgcHJlcGFyZUNhbGxiYWNrID8gY3JlYXRlQWN0aW9uKHR5cGUsIHByZXBhcmVDYWxsYmFjaykgOiBjcmVhdGVBY3Rpb24odHlwZSkpO1xufVxuZnVuY3Rpb24gaXNBc3luY1RodW5rU2xpY2VSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGVmaW5pdGlvbikge1xuICByZXR1cm4gcmVkdWNlckRlZmluaXRpb24uX3JlZHVjZXJEZWZpbml0aW9uVHlwZSA9PT0gXCJhc3luY1RodW5rXCIgLyogYXN5bmNUaHVuayAqLztcbn1cbmZ1bmN0aW9uIGlzQ2FzZVJlZHVjZXJXaXRoUHJlcGFyZURlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pIHtcbiAgcmV0dXJuIHJlZHVjZXJEZWZpbml0aW9uLl9yZWR1Y2VyRGVmaW5pdGlvblR5cGUgPT09IFwicmVkdWNlcldpdGhQcmVwYXJlXCIgLyogcmVkdWNlcldpdGhQcmVwYXJlICovO1xufVxuZnVuY3Rpb24gaGFuZGxlVGh1bmtDYXNlUmVkdWNlckRlZmluaXRpb24oe1xuICB0eXBlLFxuICByZWR1Y2VyTmFtZVxufSwgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHQsIGNBVCkge1xuICBpZiAoIWNBVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE4KSA6IFwiQ2Fubm90IHVzZSBgY3JlYXRlLmFzeW5jVGh1bmtgIGluIHRoZSBidWlsdC1pbiBgY3JlYXRlU2xpY2VgLiBVc2UgYGJ1aWxkQ3JlYXRlU2xpY2UoeyBjcmVhdG9yczogeyBhc3luY1RodW5rOiBhc3luY1RodW5rQ3JlYXRvciB9IH0pYCB0byBjcmVhdGUgYSBjdXN0b21pc2VkIHZlcnNpb24gb2YgYGNyZWF0ZVNsaWNlYC5cIik7XG4gIH1cbiAgY29uc3Qge1xuICAgIHBheWxvYWRDcmVhdG9yLFxuICAgIGZ1bGZpbGxlZCxcbiAgICBwZW5kaW5nLFxuICAgIHJlamVjdGVkLFxuICAgIHNldHRsZWQsXG4gICAgb3B0aW9uc1xuICB9ID0gcmVkdWNlckRlZmluaXRpb247XG4gIGNvbnN0IHRodW5rID0gY0FUKHR5cGUsIHBheWxvYWRDcmVhdG9yLCBvcHRpb25zKTtcbiAgY29udGV4dC5leHBvc2VBY3Rpb24ocmVkdWNlck5hbWUsIHRodW5rKTtcbiAgaWYgKGZ1bGZpbGxlZCkge1xuICAgIGNvbnRleHQuYWRkQ2FzZSh0aHVuay5mdWxmaWxsZWQsIGZ1bGZpbGxlZCk7XG4gIH1cbiAgaWYgKHBlbmRpbmcpIHtcbiAgICBjb250ZXh0LmFkZENhc2UodGh1bmsucGVuZGluZywgcGVuZGluZyk7XG4gIH1cbiAgaWYgKHJlamVjdGVkKSB7XG4gICAgY29udGV4dC5hZGRDYXNlKHRodW5rLnJlamVjdGVkLCByZWplY3RlZCk7XG4gIH1cbiAgaWYgKHNldHRsZWQpIHtcbiAgICBjb250ZXh0LmFkZE1hdGNoZXIodGh1bmsuc2V0dGxlZCwgc2V0dGxlZCk7XG4gIH1cbiAgY29udGV4dC5leHBvc2VDYXNlUmVkdWNlcihyZWR1Y2VyTmFtZSwge1xuICAgIGZ1bGZpbGxlZDogZnVsZmlsbGVkIHx8IG5vb3AsXG4gICAgcGVuZGluZzogcGVuZGluZyB8fCBub29wLFxuICAgIHJlamVjdGVkOiByZWplY3RlZCB8fCBub29wLFxuICAgIHNldHRsZWQ6IHNldHRsZWQgfHwgbm9vcFxuICB9KTtcbn1cbmZ1bmN0aW9uIG5vb3AoKSB7XG59XG5cbi8vIHNyYy9lbnRpdGllcy9lbnRpdHlfc3RhdGUudHNcbmZ1bmN0aW9uIGdldEluaXRpYWxFbnRpdHlTdGF0ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBpZHM6IFtdLFxuICAgIGVudGl0aWVzOiB7fVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5pdGlhbFN0YXRlRmFjdG9yeShzdGF0ZUFkYXB0ZXIpIHtcbiAgZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKGFkZGl0aW9uYWxTdGF0ZSA9IHt9LCBlbnRpdGllcykge1xuICAgIGNvbnN0IHN0YXRlID0gT2JqZWN0LmFzc2lnbihnZXRJbml0aWFsRW50aXR5U3RhdGUoKSwgYWRkaXRpb25hbFN0YXRlKTtcbiAgICByZXR1cm4gZW50aXRpZXMgPyBzdGF0ZUFkYXB0ZXIuc2V0QWxsKHN0YXRlLCBlbnRpdGllcykgOiBzdGF0ZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldEluaXRpYWxTdGF0ZVxuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvc3RhdGVfc2VsZWN0b3JzLnRzXG5mdW5jdGlvbiBjcmVhdGVTZWxlY3RvcnNGYWN0b3J5KCkge1xuICBmdW5jdGlvbiBnZXRTZWxlY3RvcnMoc2VsZWN0U3RhdGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNyZWF0ZVNlbGVjdG9yOiBjcmVhdGVTZWxlY3RvcjIgPSBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvclxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHNlbGVjdElkcyA9IChzdGF0ZSkgPT4gc3RhdGUuaWRzO1xuICAgIGNvbnN0IHNlbGVjdEVudGl0aWVzID0gKHN0YXRlKSA9PiBzdGF0ZS5lbnRpdGllcztcbiAgICBjb25zdCBzZWxlY3RBbGwgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0SWRzLCBzZWxlY3RFbnRpdGllcywgKGlkcywgZW50aXRpZXMpID0+IGlkcy5tYXAoKGlkKSA9PiBlbnRpdGllc1tpZF0pKTtcbiAgICBjb25zdCBzZWxlY3RJZCA9IChfLCBpZCkgPT4gaWQ7XG4gICAgY29uc3Qgc2VsZWN0QnlJZCA9IChlbnRpdGllcywgaWQpID0+IGVudGl0aWVzW2lkXTtcbiAgICBjb25zdCBzZWxlY3RUb3RhbCA9IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RJZHMsIChpZHMpID0+IGlkcy5sZW5ndGgpO1xuICAgIGlmICghc2VsZWN0U3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdElkcyxcbiAgICAgICAgc2VsZWN0RW50aXRpZXMsXG4gICAgICAgIHNlbGVjdEFsbCxcbiAgICAgICAgc2VsZWN0VG90YWwsXG4gICAgICAgIHNlbGVjdEJ5SWQ6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RFbnRpdGllcywgc2VsZWN0SWQsIHNlbGVjdEJ5SWQpXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RHbG9iYWxpemVkRW50aXRpZXMgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdEVudGl0aWVzKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0SWRzOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdElkcyksXG4gICAgICBzZWxlY3RFbnRpdGllczogc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLFxuICAgICAgc2VsZWN0QWxsOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdEFsbCksXG4gICAgICBzZWxlY3RUb3RhbDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RUb3RhbCksXG4gICAgICBzZWxlY3RCeUlkOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLCBzZWxlY3RJZCwgc2VsZWN0QnlJZClcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0U2VsZWN0b3JzXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9zdGF0ZV9hZGFwdGVyLnRzXG52YXIgaXNEcmFmdFR5cGVkID0gaXNEcmFmdDtcbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihtdXRhdG9yKSB7XG4gIGNvbnN0IG9wZXJhdG9yID0gY3JlYXRlU3RhdGVPcGVyYXRvcigoXywgc3RhdGUpID0+IG11dGF0b3Ioc3RhdGUpKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9wZXJhdGlvbihzdGF0ZSkge1xuICAgIHJldHVybiBvcGVyYXRvcihzdGF0ZSwgdm9pZCAwKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRlT3BlcmF0b3IobXV0YXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gb3BlcmF0aW9uKHN0YXRlLCBhcmcpIHtcbiAgICBmdW5jdGlvbiBpc1BheWxvYWRBY3Rpb25Bcmd1bWVudChhcmcyKSB7XG4gICAgICByZXR1cm4gaXNGU0EoYXJnMik7XG4gICAgfVxuICAgIGNvbnN0IHJ1bk11dGF0b3IgPSAoZHJhZnQpID0+IHtcbiAgICAgIGlmIChpc1BheWxvYWRBY3Rpb25Bcmd1bWVudChhcmcpKSB7XG4gICAgICAgIG11dGF0b3IoYXJnLnBheWxvYWQsIGRyYWZ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11dGF0b3IoYXJnLCBkcmFmdCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoaXNEcmFmdFR5cGVkKHN0YXRlKSkge1xuICAgICAgcnVuTXV0YXRvcihzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBwcm9kdWNlKHN0YXRlLCBydW5NdXRhdG9yKTtcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3V0aWxzLnRzXG5mdW5jdGlvbiBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpIHtcbiAgY29uc3Qga2V5ID0gc2VsZWN0SWQoZW50aXR5KTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBrZXkgPT09IHZvaWQgMCkge1xuICAgIGNvbnNvbGUud2FybihcIlRoZSBlbnRpdHkgcGFzc2VkIHRvIHRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uIHJldHVybmVkIHVuZGVmaW5lZC5cIiwgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHByb3ZpZGUgeW91ciBvd24gYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbi5cIiwgXCJUaGUgZW50aXR5IHRoYXQgd2FzIHBhc3NlZDpcIiwgZW50aXR5LCBcIlRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uOlwiLCBzZWxlY3RJZC50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4ga2V5O1xufVxuZnVuY3Rpb24gZW5zdXJlRW50aXRpZXNBcnJheShlbnRpdGllcykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZW50aXRpZXMpKSB7XG4gICAgZW50aXRpZXMgPSBPYmplY3QudmFsdWVzKGVudGl0aWVzKTtcbiAgfVxuICByZXR1cm4gZW50aXRpZXM7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50KHZhbHVlKSB7XG4gIHJldHVybiBpc0RyYWZ0KHZhbHVlKSA/IGN1cnJlbnQodmFsdWUpIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzcGxpdEFkZGVkVXBkYXRlZEVudGl0aWVzKG5ld0VudGl0aWVzLCBzZWxlY3RJZCwgc3RhdGUpIHtcbiAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgY29uc3QgZXhpc3RpbmdJZHNBcnJheSA9IGdldEN1cnJlbnQoc3RhdGUuaWRzKTtcbiAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KGV4aXN0aW5nSWRzQXJyYXkpO1xuICBjb25zdCBhZGRlZCA9IFtdO1xuICBjb25zdCBhZGRlZElkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtdKTtcbiAgY29uc3QgdXBkYXRlZCA9IFtdO1xuICBmb3IgKGNvbnN0IGVudGl0eSBvZiBuZXdFbnRpdGllcykge1xuICAgIGNvbnN0IGlkID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcbiAgICBpZiAoZXhpc3RpbmdJZHMuaGFzKGlkKSB8fCBhZGRlZElkcy5oYXMoaWQpKSB7XG4gICAgICB1cGRhdGVkLnB1c2goe1xuICAgICAgICBpZCxcbiAgICAgICAgY2hhbmdlczogZW50aXR5XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkZWRJZHMuYWRkKGlkKTtcbiAgICAgIGFkZGVkLnB1c2goZW50aXR5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFthZGRlZCwgdXBkYXRlZCwgZXhpc3RpbmdJZHNBcnJheV07XG59XG5cbi8vIHNyYy9lbnRpdGllcy91bnNvcnRlZF9zdGF0ZV9hZGFwdGVyLnRzXG5mdW5jdGlvbiBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCkge1xuICBmdW5jdGlvbiBhZGRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICBjb25zdCBrZXkgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xuICAgIGlmIChrZXkgaW4gc3RhdGUuZW50aXRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUuaWRzLnB1c2goa2V5KTtcbiAgICBzdGF0ZS5lbnRpdGllc1trZXldID0gZW50aXR5O1xuICB9XG4gIGZ1bmN0aW9uIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgbmV3RW50aXRpZXMpIHtcbiAgICAgIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIGNvbnN0IGtleSA9IHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCk7XG4gICAgaWYgKCEoa2V5IGluIHN0YXRlLmVudGl0aWVzKSkge1xuICAgICAgc3RhdGUuaWRzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgO1xuICAgIHN0YXRlLmVudGl0aWVzW2tleV0gPSBlbnRpdHk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBuZXdFbnRpdGllcykge1xuICAgICAgc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0QWxsTXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIHN0YXRlLmlkcyA9IFtdO1xuICAgIHN0YXRlLmVudGl0aWVzID0ge307XG4gICAgYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVPbmVNdXRhYmx5KGtleSwgc3RhdGUpIHtcbiAgICByZXR1cm4gcmVtb3ZlTWFueU11dGFibHkoW2tleV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVNYW55TXV0YWJseShrZXlzLCBzdGF0ZSkge1xuICAgIGxldCBkaWRNdXRhdGUgPSBmYWxzZTtcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleSBpbiBzdGF0ZS5lbnRpdGllcykge1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNba2V5XTtcbiAgICAgICAgZGlkTXV0YXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZGlkTXV0YXRlKSB7XG4gICAgICBzdGF0ZS5pZHMgPSBzdGF0ZS5pZHMuZmlsdGVyKChpZCkgPT4gaWQgaW4gc3RhdGUuZW50aXRpZXMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiByZW1vdmVBbGxNdXRhYmx5KHN0YXRlKSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwge1xuICAgICAgaWRzOiBbXSxcbiAgICAgIGVudGl0aWVzOiB7fVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHRha2VOZXdLZXkoa2V5cywgdXBkYXRlLCBzdGF0ZSkge1xuICAgIGNvbnN0IG9yaWdpbmFsMyA9IHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgaWYgKG9yaWdpbmFsMyA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZWQgPSBPYmplY3QuYXNzaWduKHt9LCBvcmlnaW5hbDMsIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICBjb25zdCBuZXdLZXkgPSBzZWxlY3RJZFZhbHVlKHVwZGF0ZWQsIHNlbGVjdElkKTtcbiAgICBjb25zdCBoYXNOZXdLZXkgPSBuZXdLZXkgIT09IHVwZGF0ZS5pZDtcbiAgICBpZiAoaGFzTmV3S2V5KSB7XG4gICAgICBrZXlzW3VwZGF0ZS5pZF0gPSBuZXdLZXk7XG4gICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICB9XG4gICAgO1xuICAgIHN0YXRlLmVudGl0aWVzW25ld0tleV0gPSB1cGRhdGVkO1xuICAgIHJldHVybiBoYXNOZXdLZXk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlT25lTXV0YWJseSh1cGRhdGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU1hbnlNdXRhYmx5KFt1cGRhdGVdLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlTWFueU11dGFibHkodXBkYXRlcywgc3RhdGUpIHtcbiAgICBjb25zdCBuZXdLZXlzID0ge307XG4gICAgY29uc3QgdXBkYXRlc1BlckVudGl0eSA9IHt9O1xuICAgIHVwZGF0ZXMuZm9yRWFjaCgodXBkYXRlKSA9PiB7XG4gICAgICBpZiAodXBkYXRlLmlkIGluIHN0YXRlLmVudGl0aWVzKSB7XG4gICAgICAgIHVwZGF0ZXNQZXJFbnRpdHlbdXBkYXRlLmlkXSA9IHtcbiAgICAgICAgICBpZDogdXBkYXRlLmlkLFxuICAgICAgICAgIC8vIFNwcmVhZHMgaWdub3JlIGZhbHN5IHZhbHVlcywgc28gdGhpcyB3b3JrcyBldmVuIGlmIHRoZXJlIGlzbid0XG4gICAgICAgICAgLy8gYW4gZXhpc3RpbmcgdXBkYXRlIGFscmVhZHkgYXQgdGhpcyBrZXlcbiAgICAgICAgICBjaGFuZ2VzOiB7XG4gICAgICAgICAgICAuLi51cGRhdGVzUGVyRW50aXR5W3VwZGF0ZS5pZF0/LmNoYW5nZXMsXG4gICAgICAgICAgICAuLi51cGRhdGUuY2hhbmdlc1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1cGRhdGVzID0gT2JqZWN0LnZhbHVlcyh1cGRhdGVzUGVyRW50aXR5KTtcbiAgICBjb25zdCBkaWRNdXRhdGVFbnRpdGllcyA9IHVwZGF0ZXMubGVuZ3RoID4gMDtcbiAgICBpZiAoZGlkTXV0YXRlRW50aXRpZXMpIHtcbiAgICAgIGNvbnN0IGRpZE11dGF0ZUlkcyA9IHVwZGF0ZXMuZmlsdGVyKCh1cGRhdGUpID0+IHRha2VOZXdLZXkobmV3S2V5cywgdXBkYXRlLCBzdGF0ZSkpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoZGlkTXV0YXRlSWRzKSB7XG4gICAgICAgIHN0YXRlLmlkcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUuZW50aXRpZXMpLm1hcCgoZSkgPT4gc2VsZWN0SWRWYWx1ZShlLCBzZWxlY3RJZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBzZXJ0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBjb25zdCBbYWRkZWQsIHVwZGF0ZWRdID0gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKTtcbiAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUpO1xuICAgIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbW92ZUFsbDogY3JlYXRlU2luZ2xlQXJndW1lbnRTdGF0ZU9wZXJhdG9yKHJlbW92ZUFsbE11dGFibHkpLFxuICAgIGFkZE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRPbmVNdXRhYmx5KSxcbiAgICBhZGRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE1hbnlNdXRhYmx5KSxcbiAgICBzZXRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0T25lTXV0YWJseSksXG4gICAgc2V0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRNYW55TXV0YWJseSksXG4gICAgc2V0QWxsOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldEFsbE11dGFibHkpLFxuICAgIHVwZGF0ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVPbmVNdXRhYmx5KSxcbiAgICB1cGRhdGVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU1hbnlNdXRhYmx5KSxcbiAgICB1cHNlcnRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0T25lTXV0YWJseSksXG4gICAgdXBzZXJ0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRNYW55TXV0YWJseSksXG4gICAgcmVtb3ZlT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHJlbW92ZU9uZU11dGFibHkpLFxuICAgIHJlbW92ZU1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IocmVtb3ZlTWFueU11dGFibHkpXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9zb3J0ZWRfc3RhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gZmluZEluc2VydEluZGV4KHNvcnRlZEl0ZW1zLCBpdGVtLCBjb21wYXJpc29uRnVuY3Rpb24pIHtcbiAgbGV0IGxvd0luZGV4ID0gMDtcbiAgbGV0IGhpZ2hJbmRleCA9IHNvcnRlZEl0ZW1zLmxlbmd0aDtcbiAgd2hpbGUgKGxvd0luZGV4IDwgaGlnaEluZGV4KSB7XG4gICAgbGV0IG1pZGRsZUluZGV4ID0gbG93SW5kZXggKyBoaWdoSW5kZXggPj4+IDE7XG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSBzb3J0ZWRJdGVtc1ttaWRkbGVJbmRleF07XG4gICAgY29uc3QgcmVzID0gY29tcGFyaXNvbkZ1bmN0aW9uKGl0ZW0sIGN1cnJlbnRJdGVtKTtcbiAgICBpZiAocmVzID49IDApIHtcbiAgICAgIGxvd0luZGV4ID0gbWlkZGxlSW5kZXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWdoSW5kZXggPSBtaWRkbGVJbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxvd0luZGV4O1xufVxuZnVuY3Rpb24gaW5zZXJ0KHNvcnRlZEl0ZW1zLCBpdGVtLCBjb21wYXJpc29uRnVuY3Rpb24pIHtcbiAgY29uc3QgaW5zZXJ0QXRJbmRleCA9IGZpbmRJbnNlcnRJbmRleChzb3J0ZWRJdGVtcywgaXRlbSwgY29tcGFyaXNvbkZ1bmN0aW9uKTtcbiAgc29ydGVkSXRlbXMuc3BsaWNlKGluc2VydEF0SW5kZXgsIDAsIGl0ZW0pO1xuICByZXR1cm4gc29ydGVkSXRlbXM7XG59XG5mdW5jdGlvbiBjcmVhdGVTb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQsIGNvbXBhcmVyKSB7XG4gIGNvbnN0IHtcbiAgICByZW1vdmVPbmUsXG4gICAgcmVtb3ZlTWFueSxcbiAgICByZW1vdmVBbGxcbiAgfSA9IGNyZWF0ZVVuc29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkKTtcbiAgZnVuY3Rpb24gYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIGFkZE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlLCBleGlzdGluZ0lkcykge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChleGlzdGluZ0lkcyA/PyBnZXRDdXJyZW50KHN0YXRlLmlkcykpO1xuICAgIGNvbnN0IGFkZGVkS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgY29uc3QgbW9kZWxzID0gbmV3RW50aXRpZXMuZmlsdGVyKChtb2RlbCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxJZCA9IHNlbGVjdElkVmFsdWUobW9kZWwsIHNlbGVjdElkKTtcbiAgICAgIGNvbnN0IG5vdEFkZGVkID0gIWFkZGVkS2V5cy5oYXMobW9kZWxJZCk7XG4gICAgICBpZiAobm90QWRkZWQpIGFkZGVkS2V5cy5hZGQobW9kZWxJZCk7XG4gICAgICByZXR1cm4gIWV4aXN0aW5nS2V5cy5oYXMobW9kZWxJZCkgJiYgbm90QWRkZWQ7XG4gICAgfSk7XG4gICAgaWYgKG1vZGVscy5sZW5ndGggIT09IDApIHtcbiAgICAgIG1lcmdlRnVuY3Rpb24oc3RhdGUsIG1vZGVscyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiBzZXRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHNldE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIGxldCBkZWR1cGxpY2F0ZWRFbnRpdGllcyA9IHt9O1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgaWYgKG5ld0VudGl0aWVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5ld0VudGl0aWVzKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkID0gc2VsZWN0SWQoaXRlbSk7XG4gICAgICAgIGRlZHVwbGljYXRlZEVudGl0aWVzW2VudGl0eUlkXSA9IGl0ZW07XG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1tlbnRpdHlJZF07XG4gICAgICB9XG4gICAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkoZGVkdXBsaWNhdGVkRW50aXRpZXMpO1xuICAgICAgbWVyZ2VGdW5jdGlvbihzdGF0ZSwgbmV3RW50aXRpZXMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRBbGxNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgc3RhdGUuZW50aXRpZXMgPSB7fTtcbiAgICBzdGF0ZS5pZHMgPSBbXTtcbiAgICBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUsIFtdKTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVPbmVNdXRhYmx5KHVwZGF0ZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBkYXRlTWFueU11dGFibHkoW3VwZGF0ZV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVzLCBzdGF0ZSkge1xuICAgIGxldCBhcHBsaWVkVXBkYXRlcyA9IGZhbHNlO1xuICAgIGxldCByZXBsYWNlZElkcyA9IGZhbHNlO1xuICAgIGZvciAobGV0IHVwZGF0ZSBvZiB1cGRhdGVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhcHBsaWVkVXBkYXRlcyA9IHRydWU7XG4gICAgICBPYmplY3QuYXNzaWduKGVudGl0eSwgdXBkYXRlLmNoYW5nZXMpO1xuICAgICAgY29uc3QgbmV3SWQgPSBzZWxlY3RJZChlbnRpdHkpO1xuICAgICAgaWYgKHVwZGF0ZS5pZCAhPT0gbmV3SWQpIHtcbiAgICAgICAgcmVwbGFjZWRJZHMgPSB0cnVlO1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSBzdGF0ZS5pZHMuaW5kZXhPZih1cGRhdGUuaWQpO1xuICAgICAgICBzdGF0ZS5pZHNbb2xkSW5kZXhdID0gbmV3SWQ7XG4gICAgICAgIHN0YXRlLmVudGl0aWVzW25ld0lkXSA9IGVudGl0eTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFwcGxpZWRVcGRhdGVzKSB7XG4gICAgICBtZXJnZUZ1bmN0aW9uKHN0YXRlLCBbXSwgYXBwbGllZFVwZGF0ZXMsIHJlcGxhY2VkSWRzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwc2VydE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgW2FkZGVkLCB1cGRhdGVkLCBleGlzdGluZ0lkc0FycmF5XSA9IHNwbGl0QWRkZWRVcGRhdGVkRW50aXRpZXMobmV3RW50aXRpZXMsIHNlbGVjdElkLCBzdGF0ZSk7XG4gICAgaWYgKGFkZGVkLmxlbmd0aCkge1xuICAgICAgYWRkTWFueU11dGFibHkoYWRkZWQsIHN0YXRlLCBleGlzdGluZ0lkc0FycmF5KTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZWQubGVuZ3RoKSB7XG4gICAgICB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVkLCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFyZUFycmF5c0VxdWFsKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gPT09IGJbaV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IG1lcmdlRnVuY3Rpb24gPSAoc3RhdGUsIGFkZGVkSXRlbXMsIGFwcGxpZWRVcGRhdGVzLCByZXBsYWNlZElkcykgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRFbnRpdGllcyA9IGdldEN1cnJlbnQoc3RhdGUuZW50aXRpZXMpO1xuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBnZXRDdXJyZW50KHN0YXRlLmlkcyk7XG4gICAgY29uc3Qgc3RhdGVFbnRpdGllcyA9IHN0YXRlLmVudGl0aWVzO1xuICAgIGxldCBpZHMgPSBjdXJyZW50SWRzO1xuICAgIGlmIChyZXBsYWNlZElkcykge1xuICAgICAgaWRzID0gbmV3IFNldChjdXJyZW50SWRzKTtcbiAgICB9XG4gICAgbGV0IHNvcnRlZEVudGl0aWVzID0gW107XG4gICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IGN1cnJlbnRFbnRpdGllc1tpZF07XG4gICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgIHNvcnRlZEVudGl0aWVzLnB1c2goZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgd2FzUHJldmlvdXNseUVtcHR5ID0gc29ydGVkRW50aXRpZXMubGVuZ3RoID09PSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBhZGRlZEl0ZW1zKSB7XG4gICAgICBzdGF0ZUVudGl0aWVzW3NlbGVjdElkKGl0ZW0pXSA9IGl0ZW07XG4gICAgICBpZiAoIXdhc1ByZXZpb3VzbHlFbXB0eSkge1xuICAgICAgICBpbnNlcnQoc29ydGVkRW50aXRpZXMsIGl0ZW0sIGNvbXBhcmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHdhc1ByZXZpb3VzbHlFbXB0eSkge1xuICAgICAgc29ydGVkRW50aXRpZXMgPSBhZGRlZEl0ZW1zLnNsaWNlKCkuc29ydChjb21wYXJlcik7XG4gICAgfSBlbHNlIGlmIChhcHBsaWVkVXBkYXRlcykge1xuICAgICAgc29ydGVkRW50aXRpZXMuc29ydChjb21wYXJlcik7XG4gICAgfVxuICAgIGNvbnN0IG5ld1NvcnRlZElkcyA9IHNvcnRlZEVudGl0aWVzLm1hcChzZWxlY3RJZCk7XG4gICAgaWYgKCFhcmVBcnJheXNFcXVhbChjdXJyZW50SWRzLCBuZXdTb3J0ZWRJZHMpKSB7XG4gICAgICBzdGF0ZS5pZHMgPSBuZXdTb3J0ZWRJZHM7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge1xuICAgIHJlbW92ZU9uZSxcbiAgICByZW1vdmVNYW55LFxuICAgIHJlbW92ZUFsbCxcbiAgICBhZGRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkT25lTXV0YWJseSksXG4gICAgdXBkYXRlT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU9uZU11dGFibHkpLFxuICAgIHVwc2VydE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRPbmVNdXRhYmx5KSxcbiAgICBzZXRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0T25lTXV0YWJseSksXG4gICAgc2V0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRNYW55TXV0YWJseSksXG4gICAgc2V0QWxsOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldEFsbE11dGFibHkpLFxuICAgIGFkZE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkTWFueU11dGFibHkpLFxuICAgIHVwZGF0ZU1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlTWFueU11dGFibHkpLFxuICAgIHVwc2VydE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0TWFueU11dGFibHkpXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9jcmVhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gY3JlYXRlRW50aXR5QWRhcHRlcihvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHNlbGVjdElkLFxuICAgIHNvcnRDb21wYXJlclxuICB9ID0ge1xuICAgIHNvcnRDb21wYXJlcjogZmFsc2UsXG4gICAgc2VsZWN0SWQ6IChpbnN0YW5jZSkgPT4gaW5zdGFuY2UuaWQsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICBjb25zdCBzdGF0ZUFkYXB0ZXIgPSBzb3J0Q29tcGFyZXIgPyBjcmVhdGVTb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQsIHNvcnRDb21wYXJlcikgOiBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCk7XG4gIGNvbnN0IHN0YXRlRmFjdG9yeSA9IGNyZWF0ZUluaXRpYWxTdGF0ZUZhY3Rvcnkoc3RhdGVBZGFwdGVyKTtcbiAgY29uc3Qgc2VsZWN0b3JzRmFjdG9yeSA9IGNyZWF0ZVNlbGVjdG9yc0ZhY3RvcnkoKTtcbiAgcmV0dXJuIHtcbiAgICBzZWxlY3RJZCxcbiAgICBzb3J0Q29tcGFyZXIsXG4gICAgLi4uc3RhdGVGYWN0b3J5LFxuICAgIC4uLnNlbGVjdG9yc0ZhY3RvcnksXG4gICAgLi4uc3RhdGVBZGFwdGVyXG4gIH07XG59XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvZXhjZXB0aW9ucy50c1xudmFyIHRhc2sgPSBcInRhc2tcIjtcbnZhciBsaXN0ZW5lciA9IFwibGlzdGVuZXJcIjtcbnZhciBjb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xudmFyIGNhbmNlbGxlZCA9IFwiY2FuY2VsbGVkXCI7XG52YXIgdGFza0NhbmNlbGxlZCA9IGB0YXNrLSR7Y2FuY2VsbGVkfWA7XG52YXIgdGFza0NvbXBsZXRlZCA9IGB0YXNrLSR7Y29tcGxldGVkfWA7XG52YXIgbGlzdGVuZXJDYW5jZWxsZWQgPSBgJHtsaXN0ZW5lcn0tJHtjYW5jZWxsZWR9YDtcbnZhciBsaXN0ZW5lckNvbXBsZXRlZCA9IGAke2xpc3RlbmVyfS0ke2NvbXBsZXRlZH1gO1xudmFyIFRhc2tBYm9ydEVycm9yID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihjb2RlKSB7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBgJHt0YXNrfSAke2NhbmNlbGxlZH0gKHJlYXNvbjogJHtjb2RlfSlgO1xuICB9XG4gIG5hbWUgPSBcIlRhc2tBYm9ydEVycm9yXCI7XG4gIG1lc3NhZ2U7XG59O1xuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL3V0aWxzLnRzXG52YXIgYXNzZXJ0RnVuY3Rpb24gPSAoZnVuYywgZXhwZWN0ZWQpID0+IHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzIpIDogYCR7ZXhwZWN0ZWR9IGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gIH1cbn07XG52YXIgbm9vcDIgPSAoKSA9PiB7XG59O1xudmFyIGNhdGNoUmVqZWN0aW9uID0gKHByb21pc2UsIG9uRXJyb3IgPSBub29wMikgPT4ge1xuICBwcm9taXNlLmNhdGNoKG9uRXJyb3IpO1xuICByZXR1cm4gcHJvbWlzZTtcbn07XG52YXIgYWRkQWJvcnRTaWduYWxMaXN0ZW5lciA9IChhYm9ydFNpZ25hbCwgY2FsbGJhY2spID0+IHtcbiAgYWJvcnRTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGNhbGxiYWNrLCB7XG4gICAgb25jZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuICgpID0+IGFib3J0U2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBjYWxsYmFjayk7XG59O1xudmFyIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24gPSAoYWJvcnRDb250cm9sbGVyLCByZWFzb24pID0+IHtcbiAgY29uc3Qgc2lnbmFsID0gYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghKFwicmVhc29uXCIgaW4gc2lnbmFsKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzaWduYWwsIFwicmVhc29uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogcmVhc29uLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxuICA7XG4gIGFib3J0Q29udHJvbGxlci5hYm9ydChyZWFzb24pO1xufTtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS90YXNrLnRzXG52YXIgdmFsaWRhdGVBY3RpdmUgPSAoc2lnbmFsKSA9PiB7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlYXNvblxuICAgIH0gPSBzaWduYWw7XG4gICAgdGhyb3cgbmV3IFRhc2tBYm9ydEVycm9yKHJlYXNvbik7XG4gIH1cbn07XG5mdW5jdGlvbiByYWNlV2l0aFNpZ25hbChzaWduYWwsIHByb21pc2UpIHtcbiAgbGV0IGNsZWFudXAgPSBub29wMjtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBub3RpZnlSZWplY3Rpb24gPSAoKSA9PiByZWplY3QobmV3IFRhc2tBYm9ydEVycm9yKHNpZ25hbC5yZWFzb24pKTtcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIG5vdGlmeVJlamVjdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGVhbnVwID0gYWRkQWJvcnRTaWduYWxMaXN0ZW5lcihzaWduYWwsIG5vdGlmeVJlamVjdGlvbik7XG4gICAgcHJvbWlzZS5maW5hbGx5KCgpID0+IGNsZWFudXAoKSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBjbGVhbnVwID0gbm9vcDI7XG4gIH0pO1xufVxudmFyIHJ1blRhc2sgPSBhc3luYyAodGFzazIsIGNsZWFuVXApID0+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRhc2syKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogXCJva1wiLFxuICAgICAgdmFsdWVcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IGVycm9yIGluc3RhbmNlb2YgVGFza0Fib3J0RXJyb3IgPyBcImNhbmNlbGxlZFwiIDogXCJyZWplY3RlZFwiLFxuICAgICAgZXJyb3JcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFuVXA/LigpO1xuICB9XG59O1xudmFyIGNyZWF0ZVBhdXNlID0gKHNpZ25hbCkgPT4ge1xuICByZXR1cm4gKHByb21pc2UpID0+IHtcbiAgICByZXR1cm4gY2F0Y2hSZWplY3Rpb24ocmFjZVdpdGhTaWduYWwoc2lnbmFsLCBwcm9taXNlKS50aGVuKChvdXRwdXQpID0+IHtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKHNpZ25hbCk7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pKTtcbiAgfTtcbn07XG52YXIgY3JlYXRlRGVsYXkgPSAoc2lnbmFsKSA9PiB7XG4gIGNvbnN0IHBhdXNlID0gY3JlYXRlUGF1c2Uoc2lnbmFsKTtcbiAgcmV0dXJuICh0aW1lb3V0TXMpID0+IHtcbiAgICByZXR1cm4gcGF1c2UobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dE1zKSkpO1xuICB9O1xufTtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS9pbmRleC50c1xudmFyIHtcbiAgYXNzaWduXG59ID0gT2JqZWN0O1xudmFyIElOVEVSTkFMX05JTF9UT0tFTiA9IHt9O1xudmFyIGFsbSA9IFwibGlzdGVuZXJNaWRkbGV3YXJlXCI7XG52YXIgY3JlYXRlRm9yayA9IChwYXJlbnRBYm9ydFNpZ25hbCwgcGFyZW50QmxvY2tpbmdQcm9taXNlcykgPT4ge1xuICBjb25zdCBsaW5rQ29udHJvbGxlcnMgPSAoY29udHJvbGxlcikgPT4gYWRkQWJvcnRTaWduYWxMaXN0ZW5lcihwYXJlbnRBYm9ydFNpZ25hbCwgKCkgPT4gYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjb250cm9sbGVyLCBwYXJlbnRBYm9ydFNpZ25hbC5yZWFzb24pKTtcbiAgcmV0dXJuICh0YXNrRXhlY3V0b3IsIG9wdHMpID0+IHtcbiAgICBhc3NlcnRGdW5jdGlvbih0YXNrRXhlY3V0b3IsIFwidGFza0V4ZWN1dG9yXCIpO1xuICAgIGNvbnN0IGNoaWxkQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGxpbmtDb250cm9sbGVycyhjaGlsZEFib3J0Q29udHJvbGxlcik7XG4gICAgY29uc3QgcmVzdWx0ID0gcnVuVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShwYXJlbnRBYm9ydFNpZ25hbCk7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgY29uc3QgcmVzdWx0MiA9IGF3YWl0IHRhc2tFeGVjdXRvcih7XG4gICAgICAgIHBhdXNlOiBjcmVhdGVQYXVzZShjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICBkZWxheTogY3JlYXRlRGVsYXkoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgc2lnbmFsOiBjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWxcbiAgICAgIH0pO1xuICAgICAgdmFsaWRhdGVBY3RpdmUoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIHJldHVybiByZXN1bHQyO1xuICAgIH0sICgpID0+IGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY2hpbGRBYm9ydENvbnRyb2xsZXIsIHRhc2tDb21wbGV0ZWQpKTtcbiAgICBpZiAob3B0cz8uYXV0b0pvaW4pIHtcbiAgICAgIHBhcmVudEJsb2NraW5nUHJvbWlzZXMucHVzaChyZXN1bHQuY2F0Y2gobm9vcDIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdDogY3JlYXRlUGF1c2UocGFyZW50QWJvcnRTaWduYWwpKHJlc3VsdCksXG4gICAgICBjYW5jZWwoKSB7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY2hpbGRBYm9ydENvbnRyb2xsZXIsIHRhc2tDYW5jZWxsZWQpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59O1xudmFyIGNyZWF0ZVRha2VQYXR0ZXJuID0gKHN0YXJ0TGlzdGVuaW5nLCBzaWduYWwpID0+IHtcbiAgY29uc3QgdGFrZSA9IGFzeW5jIChwcmVkaWNhdGUsIHRpbWVvdXQpID0+IHtcbiAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgIGxldCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICB9O1xuICAgIGNvbnN0IHR1cGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzdG9wTGlzdGVuaW5nID0gc3RhcnRMaXN0ZW5pbmcoe1xuICAgICAgICBwcmVkaWNhdGUsXG4gICAgICAgIGVmZmVjdDogKGFjdGlvbiwgbGlzdGVuZXJBcGkpID0+IHtcbiAgICAgICAgICBsaXN0ZW5lckFwaS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlc29sdmUoW2FjdGlvbiwgbGlzdGVuZXJBcGkuZ2V0U3RhdGUoKSwgbGlzdGVuZXJBcGkuZ2V0T3JpZ2luYWxTdGF0ZSgpXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICAgIHN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHByb21pc2VzID0gW3R1cGxlUHJvbWlzZV07XG4gICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgcHJvbWlzZXMucHVzaChuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lb3V0LCBudWxsKSkpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmFjZVdpdGhTaWduYWwoc2lnbmFsLCBQcm9taXNlLnJhY2UocHJvbWlzZXMpKTtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKHNpZ25hbCk7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIChwcmVkaWNhdGUsIHRpbWVvdXQpID0+IGNhdGNoUmVqZWN0aW9uKHRha2UocHJlZGljYXRlLCB0aW1lb3V0KSk7XG59O1xudmFyIGdldExpc3RlbmVyRW50cnlQcm9wc0Zyb20gPSAob3B0aW9ucykgPT4ge1xuICBsZXQge1xuICAgIHR5cGUsXG4gICAgYWN0aW9uQ3JlYXRvcixcbiAgICBtYXRjaGVyLFxuICAgIHByZWRpY2F0ZSxcbiAgICBlZmZlY3RcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICh0eXBlKSB7XG4gICAgcHJlZGljYXRlID0gY3JlYXRlQWN0aW9uKHR5cGUpLm1hdGNoO1xuICB9IGVsc2UgaWYgKGFjdGlvbkNyZWF0b3IpIHtcbiAgICB0eXBlID0gYWN0aW9uQ3JlYXRvci50eXBlO1xuICAgIHByZWRpY2F0ZSA9IGFjdGlvbkNyZWF0b3IubWF0Y2g7XG4gIH0gZWxzZSBpZiAobWF0Y2hlcikge1xuICAgIHByZWRpY2F0ZSA9IG1hdGNoZXI7XG4gIH0gZWxzZSBpZiAocHJlZGljYXRlKSB7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjEpIDogXCJDcmVhdGluZyBvciByZW1vdmluZyBhIGxpc3RlbmVyIHJlcXVpcmVzIG9uZSBvZiB0aGUga25vd24gZmllbGRzIGZvciBtYXRjaGluZyBhbiBhY3Rpb25cIik7XG4gIH1cbiAgYXNzZXJ0RnVuY3Rpb24oZWZmZWN0LCBcIm9wdGlvbnMubGlzdGVuZXJcIik7XG4gIHJldHVybiB7XG4gICAgcHJlZGljYXRlLFxuICAgIHR5cGUsXG4gICAgZWZmZWN0XG4gIH07XG59O1xudmFyIGNyZWF0ZUxpc3RlbmVyRW50cnkgPSAvKiBAX19QVVJFX18gKi8gYXNzaWduKChvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHByZWRpY2F0ZSxcbiAgICBlZmZlY3RcbiAgfSA9IGdldExpc3RlbmVyRW50cnlQcm9wc0Zyb20ob3B0aW9ucyk7XG4gIGNvbnN0IGVudHJ5ID0ge1xuICAgIGlkOiBuYW5vaWQoKSxcbiAgICBlZmZlY3QsXG4gICAgdHlwZSxcbiAgICBwcmVkaWNhdGUsXG4gICAgcGVuZGluZzogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjIpIDogXCJVbnN1YnNjcmliZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICB9O1xuICByZXR1cm4gZW50cnk7XG59LCB7XG4gIHdpdGhUeXBlczogKCkgPT4gY3JlYXRlTGlzdGVuZXJFbnRyeVxufSk7XG52YXIgZmluZExpc3RlbmVyRW50cnkgPSAobGlzdGVuZXJNYXAsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgZWZmZWN0LFxuICAgIHByZWRpY2F0ZVxuICB9ID0gZ2V0TGlzdGVuZXJFbnRyeVByb3BzRnJvbShvcHRpb25zKTtcbiAgcmV0dXJuIEFycmF5LmZyb20obGlzdGVuZXJNYXAudmFsdWVzKCkpLmZpbmQoKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgbWF0Y2hQcmVkaWNhdGVPclR5cGUgPSB0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIiA/IGVudHJ5LnR5cGUgPT09IHR5cGUgOiBlbnRyeS5wcmVkaWNhdGUgPT09IHByZWRpY2F0ZTtcbiAgICByZXR1cm4gbWF0Y2hQcmVkaWNhdGVPclR5cGUgJiYgZW50cnkuZWZmZWN0ID09PSBlZmZlY3Q7XG4gIH0pO1xufTtcbnZhciBjYW5jZWxBY3RpdmVMaXN0ZW5lcnMgPSAoZW50cnkpID0+IHtcbiAgZW50cnkucGVuZGluZy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjb250cm9sbGVyLCBsaXN0ZW5lckNhbmNlbGxlZCk7XG4gIH0pO1xufTtcbnZhciBjcmVhdGVDbGVhckxpc3RlbmVyTWlkZGxld2FyZSA9IChsaXN0ZW5lck1hcCwgZXhlY3V0aW5nTGlzdGVuZXJzKSA9PiB7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lcjIgb2YgZXhlY3V0aW5nTGlzdGVuZXJzLmtleXMoKSkge1xuICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzKGxpc3RlbmVyMik7XG4gICAgfVxuICAgIGxpc3RlbmVyTWFwLmNsZWFyKCk7XG4gIH07XG59O1xudmFyIHNhZmVseU5vdGlmeUVycm9yID0gKGVycm9ySGFuZGxlciwgZXJyb3JUb05vdGlmeSwgZXJyb3JJbmZvKSA9PiB7XG4gIHRyeSB7XG4gICAgZXJyb3JIYW5kbGVyKGVycm9yVG9Ob3RpZnksIGVycm9ySW5mbyk7XG4gIH0gY2F0Y2ggKGVycm9ySGFuZGxlckVycm9yKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvckhhbmRsZXJFcnJvcjtcbiAgICB9LCAwKTtcbiAgfVxufTtcbnZhciBhZGRMaXN0ZW5lciA9IC8qIEBfX1BVUkVfXyAqLyBhc3NpZ24oLyogQF9fUFVSRV9fICovIGNyZWF0ZUFjdGlvbihgJHthbG19L2FkZGApLCB7XG4gIHdpdGhUeXBlczogKCkgPT4gYWRkTGlzdGVuZXJcbn0pO1xudmFyIGNsZWFyQWxsTGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUFjdGlvbihgJHthbG19L3JlbW92ZUFsbGApO1xudmFyIHJlbW92ZUxpc3RlbmVyID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vcmVtb3ZlYCksIHtcbiAgd2l0aFR5cGVzOiAoKSA9PiByZW1vdmVMaXN0ZW5lclxufSk7XG52YXIgZGVmYXVsdEVycm9ySGFuZGxlciA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoYCR7YWxtfS9lcnJvcmAsIC4uLmFyZ3MpO1xufTtcbnZhciBjcmVhdGVMaXN0ZW5lck1pZGRsZXdhcmUgPSAobWlkZGxld2FyZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCBsaXN0ZW5lck1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IGV4ZWN1dGluZ0xpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IHRyYWNrRXhlY3V0aW5nTGlzdGVuZXIgPSAoZW50cnkpID0+IHtcbiAgICBjb25zdCBjb3VudCA9IGV4ZWN1dGluZ0xpc3RlbmVycy5nZXQoZW50cnkpID8/IDA7XG4gICAgZXhlY3V0aW5nTGlzdGVuZXJzLnNldChlbnRyeSwgY291bnQgKyAxKTtcbiAgfTtcbiAgY29uc3QgdW50cmFja0V4ZWN1dGluZ0xpc3RlbmVyID0gKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgY291bnQgPSBleGVjdXRpbmdMaXN0ZW5lcnMuZ2V0KGVudHJ5KSA/PyAxO1xuICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgZXhlY3V0aW5nTGlzdGVuZXJzLmRlbGV0ZShlbnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4ZWN1dGluZ0xpc3RlbmVycy5zZXQoZW50cnksIGNvdW50IC0gMSk7XG4gICAgfVxuICB9O1xuICBjb25zdCB7XG4gICAgZXh0cmEsXG4gICAgb25FcnJvciA9IGRlZmF1bHRFcnJvckhhbmRsZXJcbiAgfSA9IG1pZGRsZXdhcmVPcHRpb25zO1xuICBhc3NlcnRGdW5jdGlvbihvbkVycm9yLCBcIm9uRXJyb3JcIik7XG4gIGNvbnN0IGluc2VydEVudHJ5ID0gKGVudHJ5KSA9PiB7XG4gICAgZW50cnkudW5zdWJzY3JpYmUgPSAoKSA9PiBsaXN0ZW5lck1hcC5kZWxldGUoZW50cnkuaWQpO1xuICAgIGxpc3RlbmVyTWFwLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgIHJldHVybiAoY2FuY2VsT3B0aW9ucykgPT4ge1xuICAgICAgZW50cnkudW5zdWJzY3JpYmUoKTtcbiAgICAgIGlmIChjYW5jZWxPcHRpb25zPy5jYW5jZWxBY3RpdmUpIHtcbiAgICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICBjb25zdCBzdGFydExpc3RlbmluZyA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBmaW5kTGlzdGVuZXJFbnRyeShsaXN0ZW5lck1hcCwgb3B0aW9ucykgPz8gY3JlYXRlTGlzdGVuZXJFbnRyeShvcHRpb25zKTtcbiAgICByZXR1cm4gaW5zZXJ0RW50cnkoZW50cnkpO1xuICB9O1xuICBhc3NpZ24oc3RhcnRMaXN0ZW5pbmcsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHN0YXJ0TGlzdGVuaW5nXG4gIH0pO1xuICBjb25zdCBzdG9wTGlzdGVuaW5nID0gKG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGZpbmRMaXN0ZW5lckVudHJ5KGxpc3RlbmVyTWFwLCBvcHRpb25zKTtcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAob3B0aW9ucy5jYW5jZWxBY3RpdmUpIHtcbiAgICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICEhZW50cnk7XG4gIH07XG4gIGFzc2lnbihzdG9wTGlzdGVuaW5nLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBzdG9wTGlzdGVuaW5nXG4gIH0pO1xuICBjb25zdCBub3RpZnlMaXN0ZW5lciA9IGFzeW5jIChlbnRyeSwgYWN0aW9uLCBhcGksIGdldE9yaWdpbmFsU3RhdGUpID0+IHtcbiAgICBjb25zdCBpbnRlcm5hbFRhc2tDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRha2UgPSBjcmVhdGVUYWtlUGF0dGVybihzdGFydExpc3RlbmluZywgaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpO1xuICAgIGNvbnN0IGF1dG9Kb2luUHJvbWlzZXMgPSBbXTtcbiAgICB0cnkge1xuICAgICAgZW50cnkucGVuZGluZy5hZGQoaW50ZXJuYWxUYXNrQ29udHJvbGxlcik7XG4gICAgICB0cmFja0V4ZWN1dGluZ0xpc3RlbmVyKGVudHJ5KTtcbiAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShlbnRyeS5lZmZlY3QoXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgLy8gVXNlIGFzc2lnbigpIHJhdGhlciB0aGFuIC4uLiB0byBhdm9pZCBleHRyYSBoZWxwZXIgZnVuY3Rpb25zIGFkZGVkIHRvIGJ1bmRsZVxuICAgICAgICBhc3NpZ24oe30sIGFwaSwge1xuICAgICAgICAgIGdldE9yaWdpbmFsU3RhdGUsXG4gICAgICAgICAgY29uZGl0aW9uOiAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiB0YWtlKHByZWRpY2F0ZSwgdGltZW91dCkudGhlbihCb29sZWFuKSxcbiAgICAgICAgICB0YWtlLFxuICAgICAgICAgIGRlbGF5OiBjcmVhdGVEZWxheShpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgICAgcGF1c2U6IGNyZWF0ZVBhdXNlKGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgICBleHRyYSxcbiAgICAgICAgICBzaWduYWw6IGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIGZvcms6IGNyZWF0ZUZvcmsoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwsIGF1dG9Kb2luUHJvbWlzZXMpLFxuICAgICAgICAgIHVuc3Vic2NyaWJlOiBlbnRyeS51bnN1YnNjcmliZSxcbiAgICAgICAgICBzdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgICAgICAgIGxpc3RlbmVyTWFwLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzOiAoKSA9PiB7XG4gICAgICAgICAgICBlbnRyeS5wZW5kaW5nLmZvckVhY2goKGNvbnRyb2xsZXIsIF8sIHNldCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPT0gaW50ZXJuYWxUYXNrQ29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgbGlzdGVuZXJDYW5jZWxsZWQpO1xuICAgICAgICAgICAgICAgIHNldC5kZWxldGUoY29udHJvbGxlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGludGVybmFsVGFza0NvbnRyb2xsZXIsIGxpc3RlbmVyQ2FuY2VsbGVkKTtcbiAgICAgICAgICAgIGVudHJ5LnBlbmRpbmcuZGVsZXRlKGludGVybmFsVGFza0NvbnRyb2xsZXIpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhyb3dJZkNhbmNlbGxlZDogKCkgPT4ge1xuICAgICAgICAgICAgdmFsaWRhdGVBY3RpdmUoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgIH0gY2F0Y2ggKGxpc3RlbmVyRXJyb3IpIHtcbiAgICAgIGlmICghKGxpc3RlbmVyRXJyb3IgaW5zdGFuY2VvZiBUYXNrQWJvcnRFcnJvcikpIHtcbiAgICAgICAgc2FmZWx5Tm90aWZ5RXJyb3Iob25FcnJvciwgbGlzdGVuZXJFcnJvciwge1xuICAgICAgICAgIHJhaXNlZEJ5OiBcImVmZmVjdFwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChhdXRvSm9pblByb21pc2VzKTtcbiAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oaW50ZXJuYWxUYXNrQ29udHJvbGxlciwgbGlzdGVuZXJDb21wbGV0ZWQpO1xuICAgICAgdW50cmFja0V4ZWN1dGluZ0xpc3RlbmVyKGVudHJ5KTtcbiAgICAgIGVudHJ5LnBlbmRpbmcuZGVsZXRlKGludGVybmFsVGFza0NvbnRyb2xsZXIpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgY2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUgPSBjcmVhdGVDbGVhckxpc3RlbmVyTWlkZGxld2FyZShsaXN0ZW5lck1hcCwgZXhlY3V0aW5nTGlzdGVuZXJzKTtcbiAgY29uc3QgbWlkZGxld2FyZSA9IChhcGkpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgaWYgKCFpc0FjdGlvbihhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgIH1cbiAgICBpZiAoYWRkTGlzdGVuZXIubWF0Y2goYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXJ0TGlzdGVuaW5nKGFjdGlvbi5wYXlsb2FkKTtcbiAgICB9XG4gICAgaWYgKGNsZWFyQWxsTGlzdGVuZXJzLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZW1vdmVMaXN0ZW5lci5tYXRjaChhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gc3RvcExpc3RlbmluZyhhY3Rpb24ucGF5bG9hZCk7XG4gICAgfVxuICAgIGxldCBvcmlnaW5hbFN0YXRlID0gYXBpLmdldFN0YXRlKCk7XG4gICAgY29uc3QgZ2V0T3JpZ2luYWxTdGF0ZSA9ICgpID0+IHtcbiAgICAgIGlmIChvcmlnaW5hbFN0YXRlID09PSBJTlRFUk5BTF9OSUxfVE9LRU4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjMpIDogYCR7YWxtfTogZ2V0T3JpZ2luYWxTdGF0ZSBjYW4gb25seSBiZSBjYWxsZWQgc3luY2hyb25vdXNseWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9yaWdpbmFsU3RhdGU7XG4gICAgfTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBuZXh0KGFjdGlvbik7XG4gICAgICBpZiAobGlzdGVuZXJNYXAuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gYXBpLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyRW50cmllcyA9IEFycmF5LmZyb20obGlzdGVuZXJNYXAudmFsdWVzKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RlbmVyRW50cmllcykge1xuICAgICAgICAgIGxldCBydW5MaXN0ZW5lciA9IGZhbHNlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBydW5MaXN0ZW5lciA9IGVudHJ5LnByZWRpY2F0ZShhY3Rpb24sIGN1cnJlbnRTdGF0ZSwgb3JpZ2luYWxTdGF0ZSk7XG4gICAgICAgICAgfSBjYXRjaCAocHJlZGljYXRlRXJyb3IpIHtcbiAgICAgICAgICAgIHJ1bkxpc3RlbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBzYWZlbHlOb3RpZnlFcnJvcihvbkVycm9yLCBwcmVkaWNhdGVFcnJvciwge1xuICAgICAgICAgICAgICByYWlzZWRCeTogXCJwcmVkaWNhdGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcnVuTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub3RpZnlMaXN0ZW5lcihlbnRyeSwgYWN0aW9uLCBhcGksIGdldE9yaWdpbmFsU3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9yaWdpbmFsU3RhdGUgPSBJTlRFUk5BTF9OSUxfVE9LRU47XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWlkZGxld2FyZSxcbiAgICBzdGFydExpc3RlbmluZyxcbiAgICBzdG9wTGlzdGVuaW5nLFxuICAgIGNsZWFyTGlzdGVuZXJzOiBjbGVhckxpc3RlbmVyTWlkZGxld2FyZVxuICB9O1xufTtcblxuLy8gc3JjL2R5bmFtaWNNaWRkbGV3YXJlL2luZGV4LnRzXG52YXIgY3JlYXRlTWlkZGxld2FyZUVudHJ5ID0gKG1pZGRsZXdhcmUpID0+ICh7XG4gIG1pZGRsZXdhcmUsXG4gIGFwcGxpZWQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbn0pO1xudmFyIG1hdGNoSW5zdGFuY2UgPSAoaW5zdGFuY2VJZCkgPT4gKGFjdGlvbikgPT4gYWN0aW9uPy5tZXRhPy5pbnN0YW5jZUlkID09PSBpbnN0YW5jZUlkO1xudmFyIGNyZWF0ZUR5bmFtaWNNaWRkbGV3YXJlID0gKCkgPT4ge1xuICBjb25zdCBpbnN0YW5jZUlkID0gbmFub2lkKCk7XG4gIGNvbnN0IG1pZGRsZXdhcmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBjb25zdCB3aXRoTWlkZGxld2FyZSA9IE9iamVjdC5hc3NpZ24oY3JlYXRlQWN0aW9uKFwiZHluYW1pY01pZGRsZXdhcmUvYWRkXCIsICguLi5taWRkbGV3YXJlcykgPT4gKHtcbiAgICBwYXlsb2FkOiBtaWRkbGV3YXJlcyxcbiAgICBtZXRhOiB7XG4gICAgICBpbnN0YW5jZUlkXG4gICAgfVxuICB9KSksIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHdpdGhNaWRkbGV3YXJlXG4gIH0pO1xuICBjb25zdCBhZGRNaWRkbGV3YXJlID0gT2JqZWN0LmFzc2lnbihmdW5jdGlvbiBhZGRNaWRkbGV3YXJlMiguLi5taWRkbGV3YXJlcykge1xuICAgIG1pZGRsZXdhcmVzLmZvckVhY2goKG1pZGRsZXdhcmUyKSA9PiB7XG4gICAgICBnZXRPckluc2VydENvbXB1dGVkKG1pZGRsZXdhcmVNYXAsIG1pZGRsZXdhcmUyLCBjcmVhdGVNaWRkbGV3YXJlRW50cnkpO1xuICAgIH0pO1xuICB9LCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBhZGRNaWRkbGV3YXJlXG4gIH0pO1xuICBjb25zdCBnZXRGaW5hbE1pZGRsZXdhcmUgPSAoYXBpKSA9PiB7XG4gICAgY29uc3QgYXBwbGllZE1pZGRsZXdhcmUgPSBBcnJheS5mcm9tKG1pZGRsZXdhcmVNYXAudmFsdWVzKCkpLm1hcCgoZW50cnkpID0+IGdldE9ySW5zZXJ0Q29tcHV0ZWQoZW50cnkuYXBwbGllZCwgYXBpLCBlbnRyeS5taWRkbGV3YXJlKSk7XG4gICAgcmV0dXJuIGNvbXBvc2UoLi4uYXBwbGllZE1pZGRsZXdhcmUpO1xuICB9O1xuICBjb25zdCBpc1dpdGhNaWRkbGV3YXJlID0gaXNBbGxPZih3aXRoTWlkZGxld2FyZSwgbWF0Y2hJbnN0YW5jZShpbnN0YW5jZUlkKSk7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoYXBpKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmIChpc1dpdGhNaWRkbGV3YXJlKGFjdGlvbikpIHtcbiAgICAgIGFkZE1pZGRsZXdhcmUoLi4uYWN0aW9uLnBheWxvYWQpO1xuICAgICAgcmV0dXJuIGFwaS5kaXNwYXRjaDtcbiAgICB9XG4gICAgcmV0dXJuIGdldEZpbmFsTWlkZGxld2FyZShhcGkpKG5leHQpKGFjdGlvbik7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWlkZGxld2FyZSxcbiAgICBhZGRNaWRkbGV3YXJlLFxuICAgIHdpdGhNaWRkbGV3YXJlLFxuICAgIGluc3RhbmNlSWRcbiAgfTtcbn07XG5cbi8vIHNyYy9jb21iaW5lU2xpY2VzLnRzXG5pbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgYXMgY29tYmluZVJlZHVjZXJzMiB9IGZyb20gXCJyZWR1eFwiO1xudmFyIGlzU2xpY2VMaWtlID0gKG1heWJlU2xpY2VMaWtlKSA9PiBcInJlZHVjZXJQYXRoXCIgaW4gbWF5YmVTbGljZUxpa2UgJiYgdHlwZW9mIG1heWJlU2xpY2VMaWtlLnJlZHVjZXJQYXRoID09PSBcInN0cmluZ1wiO1xudmFyIGdldFJlZHVjZXJzID0gKHNsaWNlcykgPT4gc2xpY2VzLmZsYXRNYXAoKHNsaWNlT3JNYXApID0+IGlzU2xpY2VMaWtlKHNsaWNlT3JNYXApID8gW1tzbGljZU9yTWFwLnJlZHVjZXJQYXRoLCBzbGljZU9yTWFwLnJlZHVjZXJdXSA6IE9iamVjdC5lbnRyaWVzKHNsaWNlT3JNYXApKTtcbnZhciBPUklHSU5BTF9TVEFURSA9IFN5bWJvbC5mb3IoXCJydGstc3RhdGUtcHJveHktb3JpZ2luYWxcIik7XG52YXIgaXNTdGF0ZVByb3h5ID0gKHZhbHVlKSA9PiAhIXZhbHVlICYmICEhdmFsdWVbT1JJR0lOQUxfU1RBVEVdO1xudmFyIHN0YXRlUHJveHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBjcmVhdGVTdGF0ZVByb3h5ID0gKHN0YXRlLCByZWR1Y2VyTWFwLCBpbml0aWFsU3RhdGVDYWNoZSkgPT4gZ2V0T3JJbnNlcnRDb21wdXRlZChzdGF0ZVByb3h5TWFwLCBzdGF0ZSwgKCkgPT4gbmV3IFByb3h5KHN0YXRlLCB7XG4gIGdldDogKHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAocHJvcCA9PT0gT1JJR0lOQUxfU1RBVEUpIHJldHVybiB0YXJnZXQ7XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGluaXRpYWxTdGF0ZUNhY2hlW3Byb3BdO1xuICAgICAgaWYgKHR5cGVvZiBjYWNoZWQgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBjYWNoZWQ7XG4gICAgICBjb25zdCByZWR1Y2VyID0gcmVkdWNlck1hcFtwcm9wXTtcbiAgICAgIGlmIChyZWR1Y2VyKSB7XG4gICAgICAgIGNvbnN0IHJlZHVjZXJSZXN1bHQgPSByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgICAgIHR5cGU6IG5hbm9pZCgpXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHJlZHVjZXJSZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNCkgOiBgVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7cHJvcC50b1N0cmluZygpfVwiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIGNhbGxlZCBmb3Igc2VsZWN0b3IoKS4gSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgeW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpbml0aWFsU3RhdGVDYWNoZVtwcm9wXSA9IHJlZHVjZXJSZXN1bHQ7XG4gICAgICAgIHJldHVybiByZWR1Y2VyUmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KSk7XG52YXIgb3JpZ2luYWwgPSAoc3RhdGUpID0+IHtcbiAgaWYgKCFpc1N0YXRlUHJveHkoc3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjUpIDogXCJvcmlnaW5hbCBtdXN0IGJlIHVzZWQgb24gc3RhdGUgUHJveHlcIik7XG4gIH1cbiAgcmV0dXJuIHN0YXRlW09SSUdJTkFMX1NUQVRFXTtcbn07XG52YXIgZW1wdHlPYmplY3QgPSB7fTtcbnZhciBub29wUmVkdWNlciA9IChzdGF0ZSA9IGVtcHR5T2JqZWN0KSA9PiBzdGF0ZTtcbmZ1bmN0aW9uIGNvbWJpbmVTbGljZXMoLi4uc2xpY2VzKSB7XG4gIGNvbnN0IHJlZHVjZXJNYXAgPSBPYmplY3QuZnJvbUVudHJpZXMoZ2V0UmVkdWNlcnMoc2xpY2VzKSk7XG4gIGNvbnN0IGdldFJlZHVjZXIgPSAoKSA9PiBPYmplY3Qua2V5cyhyZWR1Y2VyTWFwKS5sZW5ndGggPyBjb21iaW5lUmVkdWNlcnMyKHJlZHVjZXJNYXApIDogbm9vcFJlZHVjZXI7XG4gIGxldCByZWR1Y2VyID0gZ2V0UmVkdWNlcigpO1xuICBmdW5jdGlvbiBjb21iaW5lZFJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgIHJldHVybiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICB9XG4gIGNvbWJpbmVkUmVkdWNlci53aXRoTGF6eUxvYWRlZFNsaWNlcyA9ICgpID0+IGNvbWJpbmVkUmVkdWNlcjtcbiAgY29uc3QgaW5pdGlhbFN0YXRlQ2FjaGUgPSB7fTtcbiAgY29uc3QgaW5qZWN0ID0gKHNsaWNlLCBjb25maWcgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlZHVjZXJQYXRoLFxuICAgICAgcmVkdWNlcjogcmVkdWNlclRvSW5qZWN0XG4gICAgfSA9IHNsaWNlO1xuICAgIGNvbnN0IGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlck1hcFtyZWR1Y2VyUGF0aF07XG4gICAgaWYgKCFjb25maWcub3ZlcnJpZGVFeGlzdGluZyAmJiBjdXJyZW50UmVkdWNlciAmJiBjdXJyZW50UmVkdWNlciAhPT0gcmVkdWNlclRvSW5qZWN0KSB7XG4gICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBjYWxsZWQgXFxgaW5qZWN0XFxgIHRvIG92ZXJyaWRlIGFscmVhZHktZXhpc3RpbmcgcmVkdWNlciAke3JlZHVjZXJQYXRofSB3aXRob3V0IHNwZWNpZnlpbmcgXFxgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZVxcYGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWJpbmVkUmVkdWNlcjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5vdmVycmlkZUV4aXN0aW5nICYmIGN1cnJlbnRSZWR1Y2VyICE9PSByZWR1Y2VyVG9JbmplY3QpIHtcbiAgICAgIGRlbGV0ZSBpbml0aWFsU3RhdGVDYWNoZVtyZWR1Y2VyUGF0aF07XG4gICAgfVxuICAgIHJlZHVjZXJNYXBbcmVkdWNlclBhdGhdID0gcmVkdWNlclRvSW5qZWN0O1xuICAgIHJlZHVjZXIgPSBnZXRSZWR1Y2VyKCk7XG4gICAgcmV0dXJuIGNvbWJpbmVkUmVkdWNlcjtcbiAgfTtcbiAgY29uc3Qgc2VsZWN0b3IgPSBPYmplY3QuYXNzaWduKGZ1bmN0aW9uIG1ha2VTZWxlY3RvcihzZWxlY3RvckZuLCBzZWxlY3RTdGF0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBzZWxlY3RvcjIoc3RhdGUsIC4uLmFyZ3MpIHtcbiAgICAgIHJldHVybiBzZWxlY3RvckZuKGNyZWF0ZVN0YXRlUHJveHkoc2VsZWN0U3RhdGUgPyBzZWxlY3RTdGF0ZShzdGF0ZSwgLi4uYXJncykgOiBzdGF0ZSwgcmVkdWNlck1hcCwgaW5pdGlhbFN0YXRlQ2FjaGUpLCAuLi5hcmdzKTtcbiAgICB9O1xuICB9LCB7XG4gICAgb3JpZ2luYWxcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKGNvbWJpbmVkUmVkdWNlciwge1xuICAgIGluamVjdCxcbiAgICBzZWxlY3RvclxuICB9KTtcbn1cblxuLy8gc3JjL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UudHNcbmZ1bmN0aW9uIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoY29kZSkge1xuICByZXR1cm4gYE1pbmlmaWVkIFJlZHV4IFRvb2xraXQgZXJyb3IgIyR7Y29kZX07IHZpc2l0IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvRXJyb3JzP2NvZGU9JHtjb2RlfSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiBgO1xufVxuZXhwb3J0IHtcbiAgUmVkdWNlclR5cGUsXG4gIFNIT1VMRF9BVVRPQkFUQ0gsXG4gIFRhc2tBYm9ydEVycm9yLFxuICBUdXBsZSxcbiAgYWRkTGlzdGVuZXIsXG4gIGFzeW5jVGh1bmtDcmVhdG9yLFxuICBhdXRvQmF0Y2hFbmhhbmNlcixcbiAgYnVpbGRDcmVhdGVTbGljZSxcbiAgY2xlYXJBbGxMaXN0ZW5lcnMsXG4gIGNvbWJpbmVTbGljZXMsXG4gIGNvbmZpZ3VyZVN0b3JlLFxuICBjcmVhdGVBY3Rpb24sXG4gIGNyZWF0ZUFjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlLFxuICBjcmVhdGVBc3luY1RodW5rLFxuICBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcixcbiAgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JDcmVhdG9yLFxuICBjcmVhdGVEeW5hbWljTWlkZGxld2FyZSxcbiAgY3JlYXRlRW50aXR5QWRhcHRlcixcbiAgY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLFxuICBjcmVhdGVMaXN0ZW5lck1pZGRsZXdhcmUsXG4gIHByb2R1Y2UgYXMgY3JlYXRlTmV4dFN0YXRlLFxuICBjcmVhdGVSZWR1Y2VyLFxuICBjcmVhdGVTZWxlY3RvcixcbiAgY3JlYXRlU2VsZWN0b3JDcmVhdG9yLFxuICBjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUsXG4gIGNyZWF0ZVNsaWNlLFxuICBjdXJyZW50LFxuICBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUsXG4gIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UsXG4gIGZyZWV6ZSxcbiAgaXNBY3Rpb25DcmVhdG9yLFxuICBpc0FsbE9mLFxuICBpc0FueU9mLFxuICBpc0FzeW5jVGh1bmtBY3Rpb24sXG4gIGlzRHJhZnQsXG4gIGlzRlNBIGFzIGlzRmx1eFN0YW5kYXJkQWN0aW9uLFxuICBpc0Z1bGZpbGxlZCxcbiAgaXNJbW11dGFibGVEZWZhdWx0LFxuICBpc1BlbmRpbmcsXG4gIGlzUGxhaW4sXG4gIGlzUmVqZWN0ZWQsXG4gIGlzUmVqZWN0ZWRXaXRoVmFsdWUsXG4gIGxydU1lbW9pemUsXG4gIG1pbmlTZXJpYWxpemVFcnJvcixcbiAgbmFub2lkLFxuICBvcmlnaW5hbDIgYXMgb3JpZ2luYWwsXG4gIHByZXBhcmVBdXRvQmF0Y2hlZCxcbiAgcmVtb3ZlTGlzdGVuZXIsXG4gIHVud3JhcFJlc3VsdCxcbiAgd2Vha01hcE1lbW9pemVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1eC10b29sa2l0Lm1vZGVybi5tanMubWFwIiwiaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNuYWNrYmFyIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TdG9yZSB9IGZyb20gJy4vYXBwbGljYXRpb24tc3RvcmUnO1xudmFyIFNuYWNrYmFyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmV4cG9ydCB2YXIgU25hY2tiYXJQcm92aWRlciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuO1xuICAgIHZhciBzbmFja2JhciA9IEFwcGxpY2F0aW9uU3RvcmUudXNlU3RhdGUoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMuc25hY2tiYXI7IH0pO1xuICAgIHZhciBzaG93U25hY2tiYXIgPSBmdW5jdGlvbiAobWVzc2FnZSwgc2V2ZXJpdHkpIHtcbiAgICAgICAgaWYgKHNldmVyaXR5ID09PSB2b2lkIDApIHsgc2V2ZXJpdHkgPSAnaW5mbyc7IH1cbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiAoX2pzeHMoU25hY2tiYXJDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiB7IHNob3dTbmFja2Jhcjogc2hvd1NuYWNrYmFyIH0sIGNoaWxkcmVuOiBbY2hpbGRyZW4sIF9qc3goU25hY2tiYXIsIHsgb3Blbjogc25hY2tiYXIub3BlbiwgbWVzc2FnZTogc25hY2tiYXIubWVzc2FnZSwgc2V2ZXJpdHk6IHNuYWNrYmFyLnNldmVyaXR5LCBhdXRvSGlkZUR1cmF0aW9uOiAxNTAwLCBvbkNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSB9KV0gfSkpO1xufTtcbiIsImltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMsIGNvbmZpZ3VyZVN0b3JlLCB9IGZyb20gJ0ByZWR1eGpzL3Rvb2xraXQnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUXVlcnlDbGllbnQsIFF1ZXJ5Q2xpZW50UHJvdmlkZXIgfSBmcm9tICdyZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IEJyb3dzZXJSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCB7IGluc3RpdHV0aW9uQ29kZSwgdGVuYW50Q29kZSwgd29ya3NwYWNlIH0gZnJvbSAnLi4vdXRpbHMvY29uc3RhbnRzJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dQcm92aWRlciB9IGZyb20gJy4vQ29uZmlybURpYWxvZ1Byb3ZpZGVyJztcbmltcG9ydCB7IFNuYWNrYmFyUHJvdmlkZXIgfSBmcm9tICcuL1NuYWNrYmFyUHJvdmlkZXInO1xuLy8gV2UnbGwgYWRkIHRoaXMgZXhwb3J0IHRvIGVuc3VyZSBSb3V0ZXIgaXMgcHJvcGVybHkgZXhwb3J0ZWRcbmV4cG9ydCB7IEJyb3dzZXJSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmV4cG9ydCB2YXIgUHJvdmlkZXJzID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIGJhc2VuYW1lID0gX2EuYmFzZW5hbWUsIF9iID0gX2EucmVkdWNlcnMsIHJlZHVjZXJzID0gX2IgPT09IHZvaWQgMCA/IHt9IDogX2I7XG4gICAgdmFyIHF1ZXJ5Q2xpZW50ID0gbmV3IFF1ZXJ5Q2xpZW50KHtcbiAgICAgICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgICAgICAgIHF1ZXJpZXM6IHtcbiAgICAgICAgICAgICAgICByZWZldGNoT25XaW5kb3dGb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmV0cnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHVzZUVycm9yQm91bmRhcnk6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHZhciBiYXNlTmFtZSA9IHRlbmFudENvZGUgJiYgaW5zdGl0dXRpb25Db2RlICYmIHdvcmtzcGFjZVxuICAgICAgICA/IFwiL1wiLmNvbmNhdChpbnN0aXR1dGlvbkNvZGUsIFwiL1wiKS5jb25jYXQod29ya3NwYWNlKVxuICAgICAgICA6ICcvJztcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lID09PSAnLycgJiZcbiAgICAgICAgICAgIGluc3RpdHV0aW9uQ29kZSAmJlxuICAgICAgICAgICAgd29ya3NwYWNlICYmXG4gICAgICAgICAgICB0ZW5hbnRDb2RlKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvXCIuY29uY2F0KGluc3RpdHV0aW9uQ29kZSwgXCIvXCIpLmNvbmNhdCh3b3Jrc3BhY2UpKTtcbiAgICAgICAgfVxuICAgIH0sIFtpbnN0aXR1dGlvbkNvZGUsIHRlbmFudENvZGUsIHdvcmtzcGFjZV0pO1xuICAgIHZhciBzdG9yZSA9IGNvbmZpZ3VyZVN0b3JlKHtcbiAgICAgICAgcmVkdWNlcjogY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSxcbiAgICB9KTtcbiAgICByZXR1cm4gKF9qc3goUHJvdmlkZXIsIHsgc3RvcmU6IHN0b3JlLCBjaGlsZHJlbjogX2pzeChCcm93c2VyUm91dGVyLCB7IGJhc2VuYW1lOiBiYXNlbmFtZSAhPT0gbnVsbCAmJiBiYXNlbmFtZSAhPT0gdm9pZCAwID8gYmFzZW5hbWUgOiBiYXNlTmFtZSwgY2hpbGRyZW46IF9qc3goUXVlcnlDbGllbnRQcm92aWRlciwgeyBjbGllbnQ6IHF1ZXJ5Q2xpZW50LCBjaGlsZHJlbjogX2pzeChTbmFja2JhclByb3ZpZGVyLCB7IGNoaWxkcmVuOiBfanN4KENvbmZpcm1EaWFsb2dQcm92aWRlciwgeyBjaGlsZHJlbjogY2hpbGRyZW4gfSkgfSkgfSkgfSkgfSkpO1xufTtcbiIsImltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L2FwcGxpY2F0aW9uLXN0b3JlJztcbnZhciBkZWZhdWx0Q29uZmlybURpYWxvZ1N0YXRlID0ge1xuICAgIGlzT3BlbjogZmFsc2UsXG4gICAgdGl0bGU6ICcnLFxuICAgIG1lc3NhZ2U6ICcnLFxuICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnJyxcbiAgICBjYW5jZWxCdXR0b25UZXh0OiAnJyxcbiAgICB0eXBlOiAnY29uZmlybScsXG4gICAgb25Db25maXJtOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgb25DYW5jZWw6IGZ1bmN0aW9uICgpIHsgfSxcbn07XG5leHBvcnQgdmFyIHVzZUNvbmZpcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlzQ29uZmlybWVkID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciB0aXRsZSA9IF9hLnRpdGxlLCBtZXNzYWdlID0gX2EubWVzc2FnZSwgY29uZmlybUJ1dHRvblRleHQgPSBfYS5jb25maXJtQnV0dG9uVGV4dCwgY2FuY2VsQnV0dG9uVGV4dCA9IF9hLmNhbmNlbEJ1dHRvblRleHQsIF9iID0gX2EudHlwZSwgdHlwZSA9IF9iID09PSB2b2lkIDAgPyAnY29uZmlybScgOiBfYjtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgIHMuY29uZmlybURpYWxvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBjb25maXJtQnV0dG9uVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogY2FuY2VsQnV0dG9uVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXREaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXREaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIHJlc2V0RGlhbG9nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5jb25maXJtRGlhbG9nID0gZGVmYXVsdENvbmZpcm1EaWFsb2dTdGF0ZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gaXNDb25maXJtZWQ7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgQmF0Y2hTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiQmF0Y2hcIiB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvYmF0Y2hlc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgQ291cnNlU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdjb3Vyc2VOYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAnbGV2ZWwnLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9jb3Vyc2VzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBEZXBhcnRtZW50U2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ19pZCcsXG4gICAgICAgICAgICBpc09iamVjdElkOiB0cnVlLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9kZXBhcnRtZW50c1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgRW1wbG95ZWVzU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdfaWQnLFxuICAgICAgICAgICAgaXNPYmplY3RJZDogdHJ1ZSxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ2Z1bGxOYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAnZW1wbG95ZWVJZCcsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2VtcGxveWVlc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgRXhhbXNSZWd1bGF0aW9uU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHsgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJSZWd1bGF0aW9uXCIgfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2V4YW0tcmVndWxhdGlvbnNcIiwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgIGxhYmVsS2V5OiAnci5uYW1lJyxcbiAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgdmFsdWVLZXk6ICdyLm5hbWUnLFxuICAgIH0gfSkpKTsgfTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG52YXIgZXhhbVR5cGVPcHRpb25zID0gW1xuICAgIHsgbGFiZWw6ICdBbGwnLCB2YWx1ZTogbnVsbCB9LFxuICAgIHsgbGFiZWw6ICdSRUdVTEFSJywgdmFsdWU6ICdSJyB9LFxuICAgIHsgbGFiZWw6ICdTVVBQTEVNRU5UQVJZJywgdmFsdWU6ICdTJyB9LFxuXTtcbmV4cG9ydCB2YXIgRXhhbVR5cGVTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIkV4YW0gVHlwZVwiLCBvcHRpb25zOiBleGFtVHlwZU9wdGlvbnMgfSwgcHJvcHMpKSk7IH07XG4iLCJleHBvcnQgdmFyIEZlZVR5cGVzID0gW1xuICAgIHtcbiAgICAgICAgbGFiZWw6ICdUdWl0aW9uIEZlZScsXG4gICAgICAgIHZhbHVlOiAndHVpdGlvbl9mZWUnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBsYWJlbDogJ0FkbWlzc2lvbiBGZWUnLFxuICAgICAgICB2YWx1ZTogJ2FkbWlzc2lvbl9mZWUnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBsYWJlbDogJ0hvc3RlbCBGZWUnLFxuICAgICAgICB2YWx1ZTogJ2hvc3RlbF9mZWUnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBsYWJlbDogJ1RyYW5zcG9ydCBGZWUnLFxuICAgICAgICB2YWx1ZTogJ3RyYW5zcG9ydF9mZWUnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBsYWJlbDogJ0V4YW0gRmVlJyxcbiAgICAgICAgdmFsdWU6ICdleGFtX2ZlZScsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnT3RoZXIgRmVlJyxcbiAgICAgICAgdmFsdWU6ICdvdGhlcl9mZWUnLFxuICAgIH0sXG5dO1xuZXhwb3J0IHZhciB5ZWFycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDYgfSwgZnVuY3Rpb24gKF8sIGkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gaTtcbn0pO1xuZXhwb3J0IHZhciBiYXRjaE9wdGlvbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMiB9LCBmdW5jdGlvbiAoXywgaSkgeyByZXR1cm4gKHtcbiAgICBsYWJlbDogXCJcIi5jb25jYXQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gaSwgXCIgLSBcIikuY29uY2F0KG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIGkgKyAxKSxcbiAgICB2YWx1ZTogXCJcIi5jb25jYXQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gaSwgXCIgLSBcIikuY29uY2F0KG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIGkgKyAxKSxcbn0pOyB9KTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBGZWVUeXBlcyB9IGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IHZhciBGZWVUeXBlU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIkZlZSBUeXBlXCIsIG9wdGlvbnM6IEZlZVR5cGVzID09PSBudWxsIHx8IEZlZVR5cGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBGZWVUeXBlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuICh7XG4gICAgICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLnZhbHVlLFxuICAgICAgICB9KTsgfSkgfSwgcHJvcHMpKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgSG9zdGVsQmxvY2tTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgICAgIGlzSW50OiB0cnVlLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3R5cGUnLFxuICAgICAgICAgICAgdXNlTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgICAgICB1c2VTdWJMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvaG9zdGVsLWJsb2Nrc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgSG9zdGVsRmxvb3JTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiSG9zdGVsIFJvb20gTm8uXCIsIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdmbG9vcicsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdmbG9vcicsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCJkcm9wZG93bnMvZmxvb3JzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBIb3N0ZWxSb29tU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIkhvc3RlbCBSb29tXCIsIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdyb29tX251bWJlcicsXG4gICAgICAgICAgICB1c2VMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgICAgIC8vIHN1YkxhYmVsS2V5OiAnZmxvb3InLFxuICAgICAgICB9IH0sIHByb3BzLCB7IG9wdGlvbnNBcGlFbmRQb2ludDogXCJkcm9wZG93bnMvaG9zdGVsLXJvb21zXCIsIGV4dGVybmFsQXhpb3M6IGF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgTW9udGhZZWFyU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHsgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJNb250aCAmIFllYXJcIiB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvbW9udGgteWVhcnNcIiB9KSkpOyB9O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUHJpbnRGb3JtYXRTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICd0eXBlJyxcbiAgICAgICAgICAgIHVzZVN1YkxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9wcmludC1mb3JtYXRzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBQcm9ncmFtU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdicmFuY2hDb2RlJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAnYnJhbmNoRGlzcGxheScsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3Byb2dyYW1zXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBSZWd1bGF0aW9uU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIlJlZ3VsYXRpb25cIiwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ3JlZ3VsYXRpb25faWQnLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnci5uYW1lJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiZHJvcGRvd25zL3JlZ3VsYXRpb25zXCIsIGV4dGVybmFsQXhpb3M6IGF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUmVzZWFyY2hFeHBlcnRTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICdvcmdhbml6YXRpb24nLFxuICAgICAgICB9IH0sIHByb3BzLCB7IG9wdGlvbnNBcGlFbmRQb2ludDogXCJkcm9wZG93bnMvcmVzZWFyY2gtZXhwZXJ0c1wiLCBleHRlcm5hbEF4aW9zOiBub25Xb3Jrc3BhY2VBeGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFJlc2VhcmNoU3RhZ2VTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIC8vIEVzY2FwZSAnb3JkZXInIGNvbHVtbiBuYW1lIGFzIGl0J3MgYSByZXNlcnZlZCBrZXl3b3JkIGluIE15U1FMXG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnYG9yZGVyYCcsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAnYG9yZGVyYCcsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9yZXNlYXJjaC1zdGFnZXNcIiwgZXh0ZXJuYWxBeGlvczogbm9uV29ya3NwYWNlQXhpb3MgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBTZW1lc3RlclNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3llYXInLFxuICAgICAgICB9IH0sIHByb3BzLCB7IG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3NlbWVzdGVyc1wiLCBleHRlcm5hbEF4aW9zOiBheGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFN0dWRlbnRTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ3NsdWcnLFxuICAgICAgICAgICAgdXNlTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3N0dWRlbnRzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBTdHVkZW50U2VydmljZXNTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ3NsdWcnLFxuICAgICAgICAgICAgdXNlTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3N0dWRlbnQtc2VydmljZXNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IHllYXJzIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgdmFyIFllYXJSYW5nZVNlbGVjdG9yID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iID0gX2Euc3VmZml4LCBzdWZmaXggPSBfYiA9PT0gdm9pZCAwID8gbnVsbCA6IF9iLCBfYyA9IF9hLnZhbHVlS2V5LCB2YWx1ZUtleSA9IF9jID09PSB2b2lkIDAgPyAneWVhclJhbmdlJyA6IF9jLCBwcm9wcyA9IF9fcmVzdChfYSwgW1wic3VmZml4XCIsIFwidmFsdWVLZXlcIl0pO1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiWWVhciBSYW5nZVwiLCBvcHRpb25zOiB5ZWFycyA9PT0gbnVsbCB8fCB5ZWFycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogeWVhcnMubWFwKGZ1bmN0aW9uICh5ZWFyKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgbGFiZWw6IHN1ZmZpeFxuICAgICAgICAgICAgICAgID8gXCJcIi5jb25jYXQoc3VmZml4LCBcIiBcIikuY29uY2F0KHllYXIsIFwiIC0gXCIpLmNvbmNhdCh5ZWFyICsgMSlcbiAgICAgICAgICAgICAgICA6IFwiXCIuY29uY2F0KHllYXIsIFwiIC0gXCIpLmNvbmNhdCh5ZWFyICsgMSksXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVLZXkgPT09ICd5ZWFyUmFuZ2UnID8gXCJcIi5jb25jYXQoeWVhciwgXCIgLSBcIikuY29uY2F0KHllYXIgKyAxKSA6IHllYXIsXG4gICAgICAgIH0pOyB9KSB9LCBwcm9wcykpKTtcbn07XG4iLCJleHBvcnQgdmFyIG9wZW5Jbk5ld1RhYiA9IGZ1bmN0aW9uIChwYXRoQWZ0ZXJCYXNlLCBleGNsdWRlSW5zdGl0dXRpb24sIGV4Y2x1ZGVXb3Jrc3BhY2UpIHtcbiAgICBpZiAoZXhjbHVkZUluc3RpdHV0aW9uID09PSB2b2lkIDApIHsgZXhjbHVkZUluc3RpdHV0aW9uID0gZmFsc2U7IH1cbiAgICBpZiAoZXhjbHVkZVdvcmtzcGFjZSA9PT0gdm9pZCAwKSB7IGV4Y2x1ZGVXb3Jrc3BhY2UgPSBmYWxzZTsgfVxuICAgIHZhciBjdXJyZW50UGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICB2YXIgc2VnbWVudHMgPSBjdXJyZW50UGF0aC5zcGxpdCgnLycpO1xuICAgIC8vIEJ1aWxkIGJhc2UgcGF0aCBiYXNlZCBvbiBleGNsdXNpb24gZmxhZ3NcbiAgICB2YXIgYmFzZVBhcnRzID0gW107XG4gICAgLy8gQWRkIHNlZ21lbnQgMSAoaW5zdGl0dXRpb24pIHVubGVzcyBleGNsdWRlZFxuICAgIGlmICghZXhjbHVkZUluc3RpdHV0aW9uICYmIHNlZ21lbnRzWzFdKSB7XG4gICAgICAgIGJhc2VQYXJ0cy5wdXNoKHNlZ21lbnRzWzFdKTtcbiAgICB9XG4gICAgLy8gQWRkIHNlZ21lbnQgMiAod29ya3NwYWNlKSB1bmxlc3MgZXhjbHVkZWRcbiAgICBpZiAoIWV4Y2x1ZGVXb3Jrc3BhY2UgJiYgc2VnbWVudHNbMl0pIHtcbiAgICAgICAgYmFzZVBhcnRzLnB1c2goc2VnbWVudHNbMl0pO1xuICAgIH1cbiAgICB2YXIgYmFzZSA9IGJhc2VQYXJ0cy5sZW5ndGggPiAwID8gJy8nICsgYmFzZVBhcnRzLmpvaW4oJy8nKSA6ICcnO1xuICAgIC8vIENvbnN0cnVjdCBmdWxsIFVSTCBhbmQgb3BlbiBpbiBuZXcgdGFiXG4gICAgdmFyIGZ1bGxQYXRoID0gXCJcIi5jb25jYXQod2luZG93LmxvY2F0aW9uLm9yaWdpbikuY29uY2F0KGJhc2UsIFwiL1wiKS5jb25jYXQocGF0aEFmdGVyQmFzZSk7XG4gICAgd2luZG93Lm9wZW4oZnVsbFBhdGgsICdfYmxhbmsnKTtcbn07XG4iXSwibmFtZXMiOlsiX19hc3NpZ24iLCJPYmplY3QiLCJhc3NpZ24iLCJ0IiwicyIsImkiLCJuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwicCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImFwcGx5IiwidGhpcyIsIl9fYXdhaXRlciIsInRoaXNBcmciLCJfYXJndW1lbnRzIiwiUCIsImdlbmVyYXRvciIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwidmFsdWUiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiX19nZW5lcmF0b3IiLCJib2R5IiwiZiIsInkiLCJfIiwibGFiZWwiLCJzZW50IiwidHJ5cyIsIm9wcyIsImciLCJjcmVhdGUiLCJJdGVyYXRvciIsInZlcmIiLCJTeW1ib2wiLCJpdGVyYXRvciIsInYiLCJvcCIsIlR5cGVFcnJvciIsInBvcCIsInB1c2giLCJ0YXJnZXQiLCJzb3VyY2UiLCJrZXkiLCJTdXBwcmVzc2VkRXJyb3IiLCJhcGkiLCJpbml0IiwiY29udmVydGVyIiwiZGVmYXVsdEF0dHJpYnV0ZXMiLCJzZXQiLCJuYW1lIiwiYXR0cmlidXRlcyIsImRvY3VtZW50IiwiZXhwaXJlcyIsIkRhdGUiLCJub3ciLCJ0b1VUQ1N0cmluZyIsImVuY29kZVVSSUNvbXBvbmVudCIsInJlcGxhY2UiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJzdHJpbmdpZmllZEF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVOYW1lIiwic3BsaXQiLCJjb29raWUiLCJ3cml0ZSIsImdldCIsImNvb2tpZXMiLCJqYXIiLCJwYXJ0cyIsInNsaWNlIiwiam9pbiIsImZvdW5kIiwicmVhZCIsInJlbW92ZSIsIndpdGhBdHRyaWJ1dGVzIiwid2l0aENvbnZlcnRlciIsImZyZWV6ZSIsInBhdGgiLCJpbml0aWFsQXBwbGljYXRpb25TdGF0ZSIsImlzTG9naW5EaWFsb2dPcGVuIiwic25hY2tiYXIiLCJvcGVuIiwibWVzc2FnZSIsInNldmVyaXR5IiwiY29uZmlybURpYWxvZyIsImlzT3BlbiIsInRpdGxlIiwib25Db25maXJtIiwib25DYW5jZWwiLCJ0eXBlIiwidXNlciIsInVuZGVmaW5lZCIsImluc3RpdHV0aW9uSW5mbyIsImFzc2V0IiwiQXBwbGljYXRpb25TdG9yZSIsIlN0b3JlIiwiaXNEZXZlbG9wbWVudCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaG9zdG5hbWUiLCJpbmNsdWRlcyIsInRlbmFudENvZGUiLCJpbnN0aXR1dGlvbkNvZGUiLCJwYXRobmFtZSIsIndvcmtzcGFjZSIsIndvcmtzcGFjZUFwaU1hcHBpbmciLCJheGlvcyIsIkF4aW9zIiwiYmFzZVVSTCIsInByb2Nlc3MiLCJlbnYiLCJSRUFDVF9BUFBfQVBJX0hPU1QiLCJ3aXRoQ3JlZGVudGlhbHMiLCJoZWFkZXJzIiwiY3JlYXRlUnNidWlsZFNoYXJlZENvbmZpZyIsImRlcGVuZGVuY2llcyIsImFsd2F5c0VhZ2VyIiwic2hhcmVkRGVwZW5kZW5jaWVzTGlzdCIsInJlZHVjZSIsImFjYyIsInBrZyIsInZlcnNpb24iLCJzaW5nbGV0b24iLCJyZXF1aXJlZFZlcnNpb24iLCJlYWdlciIsImludGVyY2VwdG9ycyIsInJlcXVlc3QiLCJ1c2UiLCJjb25maWciLCJwYXJhbXMiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJtYXAiLCJfYSIsImZvcm1hdFBhcmFtcyIsIndvcmtzcGFjZVByZWZpeCIsInVybCIsImNvbmNhdCIsInNlc3Npb25LZXkiLCJDb29raWVzIiwib3BlblBheW1lbnRzS2V5Iiwic3R1ZGVudFNlc3Npb25LZXkiLCJza2lwSW5zdGl0dXRpb25Db2RlIiwiZGVsZXRlIiwiZXJyb3IiLCJyZXNwb25zZSIsImRhdGEiLCJoaWRlU25hY2tiYXIiLCJtZXRob2QiLCJzdGF0dXMiLCJ1cGRhdGUiLCJlcnIiLCJfYiIsIl9jIiwiX2QiLCJzaG91bGRIaWRlU25hY2tiYXIiLCJub25Xb3Jrc3BhY2VBeGlvcyIsIkNvbmZpcm1Db250ZXh0IiwiY3JlYXRlQ29udGV4dCIsInNob3dDb25maXJtRGlhbG9nIiwiQ29uZmlybURpYWxvZ1Byb3ZpZGVyIiwiY2hpbGRyZW4iLCJ1c2VTdGF0ZSIsImhhbmRsZUNsb3NlRGlhbG9nIiwiX2pzeHMiLCJQcm92aWRlciIsImNvbmZpcm1CdXR0b25UZXh0IiwiY2FuY2VsQnV0dG9uVGV4dCIsIl9qc3giLCJDb25maXJtRGlhbG9nIiwiX3NldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJiaW5kIiwiX19wcm90b19fIiwiaW5pdGlhbFN0YXRlIiwiRXJyb3JCb3VuZGFyeSIsIl9SZWFjdCRDb21wb25lbnQiLCJfdGhpcyIsIl9sZW4iLCJfYXJncyIsIkFycmF5IiwiX2tleSIsInN0YXRlIiwicmVzZXRFcnJvckJvdW5kYXJ5IiwiX3RoaXMkcHJvcHMiLCJfbGVuMiIsImFyZ3MiLCJfa2V5MiIsInByb3BzIiwib25SZXNldCIsInJlc2V0IiwibyIsImNvbnN0cnVjdG9yIiwiX2luaGVyaXRzTG9vc2UiLCJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCJfcHJvdG8iLCJzZXRTdGF0ZSIsImNvbXBvbmVudERpZENhdGNoIiwiaW5mbyIsIl90aGlzJHByb3BzJG9uRXJyb3IiLCJfdGhpcyRwcm9wczIiLCJvbkVycm9yIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwiX3RoaXMkcHJvcHMkb25SZXNldEtlIiwiX3RoaXMkcHJvcHMzIiwiYSIsImIiLCJyZXNldEtleXMiLCJzb21lIiwiaXRlbSIsImluZGV4IiwiaXMiLCJvblJlc2V0S2V5c0NoYW5nZSIsInJlbmRlciIsIl90aGlzJHByb3BzNCIsImZhbGxiYWNrUmVuZGVyIiwiRmFsbGJhY2tDb21wb25lbnQiLCJmYWxsYmFjayIsIl9wcm9wcyIsIlJlYWN0IiwiaXNWYWxpZEVsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiRXJyb3IiLCJDb21wb25lbnQiLCJjIiwiciIsInUiLCJjb250ZXh0IiwiTk9ERV9FTlYiLCJtb2RlIiwiYWJvcnRFYXJseSIsInNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24iLCJ2YWx1ZXMiLCJyYXdWYWx1ZXMiLCJlcnJvcnMiLCJpbm5lciIsImNyaXRlcmlhTW9kZSIsInR5cGVzIiwicGVyZm9ybUxvZ2luIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJmZXRjaCIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb25zaWRlcklwIiwianNvbiIsImxhdCIsImxuZyIsInBvc3QiLCJyZXMiLCJ2YWxpZGF0aW9uU2NoZW1hIiwiWXVwIiwib2JqZWN0Iiwic2hhcGUiLCJ1c2VybmFtZSIsInN0cmluZyIsInJlcXVpcmVkIiwicGFzc3dvcmQiLCJMb2dpbiIsImNsb3NlIiwiZGV2aWNlSW5mb3JtYXRpb24iLCJkZXZpY2VUeXBlIiwiY2xpZW50TmFtZSIsIm9zIiwib3NWZXJzaW9uIiwidG9rZW5UeXBlIiwiaXNMb2NhdGlvbkFsbG93ZWQiLCJkZXZpY2VTdGF0ZSIsInNldERldmljZVN0YXRlIiwibmF2aWdhdGUiLCJ1c2VOYXZpZ2F0ZSIsInVzZUVmZmVjdCIsIm5hdmlnYXRvciIsImdlb2xvY2F0aW9uIiwiZ2V0Q3VycmVudFBvc2l0aW9uIiwicG9zaXRpb24iLCJjb29yZHMiLCJwZXJtaXNzaW9ucyIsInF1ZXJ5IiwicGVybWlzc2lvblN0YXR1cyIsImRldmljZUluZm8iLCJEZXZpY2VEZXRlY3RvciIsInBhcnNlIiwidXNlckFnZW50IiwiY2xpZW50IiwidXNlRm9ybSIsInJlc29sdmVyIiwieXVwUmVzb2x2ZXIiLCJoYW5kbGVTdWJtaXQiLCJjb250cm9sIiwiZm9ybVN0YXRlIiwidXNlTXV0YXRpb24iLCJvblN1Y2Nlc3MiLCJzZXNzaW9uIiwidG9rZW4iLCJyZWxvYWQiLCJtdXRhdGUiLCJpc0xvYWRpbmciLCJjbGFzc05hbWUiLCJJY29ucyIsIkNhbXB4RnVsbExvZ29JY29uIiwiQ29udHJvbGxlciIsImZpZWxkIiwiVGV4dEZpZWxkIiwicGxhY2Vob2xkZXIiLCJvbkNoYW5nZSIsImZ1bGxXaWR0aCIsIlBhc3N3b3JkRmllbGQiLCJCdXR0b24iLCJjb2xvciIsInZhcmlhbnQiLCJvbkNsaWNrIiwibG9naW5JZCIsImxvZ2luVHlwZSIsImRpc2FibGVkIiwibG9hZGluZyIsInVzZUxvY2F0aW9uIiwiUXVlcnlFcnJvclJlc2V0Qm91bmRhcnkiLCJSZWFjdEVycm9yQm91bmRhcnkiLCJFcnJvckZhbGxiYWNrIiwiX2UiLCJfZiIsIl9nIiwiX2giLCJVbkF1dGgiLCJJbnRlcm5hbFNlcnZlckVycm9yIiwicmVzZXRCb3VuZGFyeSIsIlJlc291cmNlTm90Rm91bmQiLCJjb2RlIiwiTm9JbnRlcm5lQ29ubmVjdGlvbiIsInNpemUiLCJpc01vZGFsT3BlbiIsInNldE1vZGFsT3BlbiIsInNlc3Npb25Db29raWUiLCJVbkF1dGhvcml6ZWQiLCJjb21wb25lbnQiLCJfRnJhZ21lbnQiLCJEaWFsb2ciLCJvbkNsb3NlIiwiY29udGVudCIsImZvcm1hdFByb2RFcnJvck1lc3NhZ2UiLCJzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0Iiwib2JzZXJ2YWJsZSIsInJhbmRvbVN0cmluZyIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0cmluZyIsImFjdGlvblR5cGVzX2RlZmF1bHQiLCJJTklUIiwiUkVQTEFDRSIsIlBST0JFX1VOS05PV05fQUNUSU9OIiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsInByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJtaW5pS2luZE9mIiwidmFsIiwiaXNBcnJheSIsInRvRGF0ZVN0cmluZyIsImdldERhdGUiLCJzZXREYXRlIiwiaXNEYXRlIiwic3RhY2tUcmFjZUxpbWl0IiwiaXNFcnJvciIsImNvbnN0cnVjdG9yTmFtZSIsImN0b3JOYW1lIiwidG9Mb3dlckNhc2UiLCJraW5kT2YiLCJ0eXBlT2ZWYWwiLCJjcmVhdGVTdG9yZSIsInJlZHVjZXIiLCJwcmVsb2FkZWRTdGF0ZSIsImVuaGFuY2VyIiwiY3VycmVudFJlZHVjZXIiLCJjdXJyZW50U3RhdGUiLCJjdXJyZW50TGlzdGVuZXJzIiwiTWFwIiwibmV4dExpc3RlbmVycyIsImxpc3RlbmVySWRDb3VudGVyIiwiaXNEaXNwYXRjaGluZyIsImVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMiLCJmb3JFYWNoIiwibGlzdGVuZXIiLCJnZXRTdGF0ZSIsInN1YnNjcmliZSIsImlzU3Vic2NyaWJlZCIsImxpc3RlbmVySWQiLCJkaXNwYXRjaCIsImFjdGlvbiIsInJlcGxhY2VSZWR1Y2VyIiwibmV4dFJlZHVjZXIiLCJvdXRlclN1YnNjcmliZSIsIm9ic2VydmVyIiwib2JzZXJ2ZVN0YXRlIiwib2JzZXJ2ZXJBc09ic2VydmVyIiwidW5zdWJzY3JpYmUiLCJ3YXJuaW5nIiwiY29uc29sZSIsImNvbWJpbmVSZWR1Y2VycyIsInJlZHVjZXJzIiwicmVkdWNlcktleXMiLCJrZXlzIiwiZmluYWxSZWR1Y2VycyIsImZpbmFsUmVkdWNlcktleXMiLCJ1bmV4cGVjdGVkS2V5Q2FjaGUiLCJzaGFwZUFzc2VydGlvbkVycm9yIiwiYXNzZXJ0UmVkdWNlclNoYXBlIiwid2FybmluZ01lc3NhZ2UiLCJpbnB1dFN0YXRlIiwiYXJndW1lbnROYW1lIiwidW5leHBlY3RlZEtleXMiLCJmaWx0ZXIiLCJnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlIiwiaGFzQ2hhbmdlZCIsIm5leHRTdGF0ZSIsInByZXZpb3VzU3RhdGVGb3JLZXkiLCJuZXh0U3RhdGVGb3JLZXkiLCJhY3Rpb25UeXBlIiwiU3RyaW5nIiwiY29tcG9zZSIsImZ1bmNzIiwiYXJnIiwiTk9USElORyIsImZvciIsIkRSQUZUQUJMRSIsIkRSQUZUX1NUQVRFIiwicGx1Z2luIiwidGhpbmciLCJkaWUiLCJtc2ciLCJpc0RyYWZ0IiwiaXNEcmFmdGFibGUiLCJpc01hcCIsImlzU2V0Iiwib2JqZWN0Q3RvclN0cmluZyIsImNhY2hlZEN0b3JTdHJpbmdzIiwiV2Vha01hcCIsIkN0b3IiLCJjdG9yU3RyaW5nIiwiRnVuY3Rpb24iLCJlYWNoIiwiaXRlciIsInN0cmljdCIsImdldEFyY2h0eXBlIiwiUmVmbGVjdCIsIm93bktleXMiLCJlbnRyeSIsInR5cGVfIiwiaGFzIiwicHJvcCIsInByb3BPck9sZFZhbHVlIiwiYWRkIiwiU2V0IiwibGF0ZXN0IiwiY29weV8iLCJiYXNlXyIsInNoYWxsb3dDb3B5IiwiYmFzZSIsImlzUGxhaW4iLCJkZXNjcmlwdG9ycyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZXNjIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZGVlcCIsImlzRnJvemVuIiwiZGVmaW5lUHJvcGVydGllcyIsImRvbnRNdXRhdGVNZXRob2RPdmVycmlkZSIsImNsZWFyIiwiY3VycmVudFNjb3BlIiwicGx1Z2lucyIsImdldFBsdWdpbiIsInBsdWdpbktleSIsImdldEN1cnJlbnRTY29wZSIsInVzZVBhdGNoZXNJblNjb3BlIiwic2NvcGUiLCJwYXRjaExpc3RlbmVyIiwicGF0Y2hlc18iLCJpbnZlcnNlUGF0Y2hlc18iLCJwYXRjaExpc3RlbmVyXyIsInJldm9rZVNjb3BlIiwibGVhdmVTY29wZSIsImRyYWZ0c18iLCJyZXZva2VEcmFmdCIsInBhcmVudF8iLCJlbnRlclNjb3BlIiwiaW1tZXIyIiwiaW1tZXJfIiwiY2FuQXV0b0ZyZWV6ZV8iLCJ1bmZpbmFsaXplZERyYWZ0c18iLCJkcmFmdCIsInJldm9rZV8iLCJyZXZva2VkXyIsInByb2Nlc3NSZXN1bHQiLCJiYXNlRHJhZnQiLCJtb2RpZmllZF8iLCJmaW5hbGl6ZSIsIm1heWJlRnJlZXplIiwiZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfIiwicm9vdFNjb3BlIiwidXNlU3RyaWN0SXRlcmF0aW9uIiwic2hvdWxkVXNlU3RyaWN0SXRlcmF0aW9uIiwiY2hpbGRWYWx1ZSIsImZpbmFsaXplUHJvcGVydHkiLCJzY29wZV8iLCJmaW5hbGl6ZWRfIiwicmVzdWx0RWFjaCIsImlzU2V0MiIsImdlbmVyYXRlUGF0Y2hlc18iLCJwYXJlbnRTdGF0ZSIsInRhcmdldE9iamVjdCIsInJvb3RQYXRoIiwidGFyZ2V0SXNTZXQiLCJjaGlsZElzRnJvemVuIiwiYXNzaWduZWRfIiwiYXV0b0ZyZWV6ZV8iLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIm9iamVjdFRyYXBzIiwiZ2V0RGVzY3JpcHRvckZyb21Qcm90byIsImRyYWZ0XyIsInJlYWRQcm9wRnJvbVByb3RvIiwicGVlayIsInByZXBhcmVDb3B5IiwiY3JlYXRlUHJveHkiLCJjdXJyZW50MiIsIngiLCJtYXJrQ2hhbmdlZCIsIk51bWJlciIsImlzTmFOIiwiZGVsZXRlUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJvd25lciIsImRlZmluZVByb3BlcnR5IiwiYXJyYXlUcmFwcyIsInVzZVN0cmljdFNoYWxsb3dDb3B5XyIsImZuIiwicGFyc2VJbnQiLCJwYXJlbnQiLCJwcm94eU1hcF8iLCJwcm94eVNldF8iLCJpc01hbnVhbF8iLCJ0cmFwcyIsInJldm9rZSIsInByb3h5IiwiUHJveHkiLCJyZXZvY2FibGUiLCJjcmVhdGVQcm94eVByb3h5IiwiY3VycmVudEltcGwiLCJjb3B5IiwiaW1tZXIiLCJ1c2VTdHJpY3RJdGVyYXRpb25fIiwicHJvZHVjZSIsInJlY2lwZSIsImRlZmF1bHRCYXNlIiwic2VsZiIsImJhc2UyIiwiaGFzRXJyb3IiLCJpcCIsInByb2R1Y2VXaXRoUGF0Y2hlcyIsInBhdGNoZXMiLCJpbnZlcnNlUGF0Y2hlcyIsImF1dG9GcmVlemUiLCJzZXRBdXRvRnJlZXplIiwidXNlU3RyaWN0U2hhbGxvd0NvcHkiLCJzZXRVc2VTdHJpY3RTaGFsbG93Q29weSIsInNldFVzZVN0cmljdEl0ZXJhdGlvbiIsImNyZWF0ZURyYWZ0IiwiY3VycmVudCIsImZpbmlzaERyYWZ0IiwiYXBwbHlQYXRjaGVzIiwicGF0Y2giLCJhcHBseVBhdGNoZXNJbXBsIiwiYXBwbHlQYXRjaGVzXyIsImNyZWF0ZVRodW5rTWlkZGxld2FyZSIsImV4dHJhQXJndW1lbnQiLCJ0aHVuayIsIndpdGhFeHRyYUFyZ3VtZW50IiwiY29tcG9zZVdpdGhEZXZUb29scyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXyIsImlzQWN0aW9uQ3JlYXRvciIsIm1hdGNoIiwiZ2V0VGltZU1lYXN1cmVVdGlscyIsIm1heERlbGF5IiwiZm5OYW1lIiwiZWxhcHNlZCIsIm1lYXN1cmVUaW1lIiwic3RhcnRlZCIsImZpbmlzaGVkIiwid2FybklmRXhjZWVkZWQiLCJUdXBsZSIsIl9UdXBsZSIsIml0ZW1zIiwic3VwZXIiLCJzcGVjaWVzIiwiYXJyIiwicHJlcGVuZCIsImlzSW1tdXRhYmxlRGVmYXVsdCIsInRyYWNrRm9yTXV0YXRpb25zIiwiaXNJbW11dGFibGUiLCJpZ25vcmVQYXRocyIsInRyYWNrZWRQcm9wZXJ0aWVzIiwidHJhY2tQcm9wZXJ0aWVzIiwiZGV0ZWN0TXV0YXRpb25zIiwiY2hlY2tlZE9iamVjdHMiLCJ0cmFja2VkIiwiY2hpbGRQYXRoIiwiaW5kZXhPZiIsImlnbm9yZWRQYXRocyIsInRyYWNrZWRQcm9wZXJ0eSIsInNhbWVQYXJlbnRSZWYiLCJwcmV2T2JqIiwic2FtZVJlZiIsIndhc011dGF0ZWQiLCJrZXlzVG9EZXRlY3QiLCJoYXNJZ25vcmVkUGF0aHMiLCJuZXN0ZWRQYXRoIiwiaWdub3JlZCIsIlJlZ0V4cCIsInRlc3QiLCJmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUiLCJpc1NlcmlhbGl6YWJsZSIsImdldEVudHJpZXMiLCJjYWNoZSIsImZvdW5kTmVzdGVkU2VyaWFsaXphYmxlIiwia2V5UGF0aCIsIm5lc3RlZFZhbHVlIiwiaXNOZXN0ZWRGcm96ZW4iLCJjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUiLCJvcHRpb25zIiwiaWdub3JlZEFjdGlvbnMiLCJpZ25vcmVkQWN0aW9uUGF0aHMiLCJ3YXJuQWZ0ZXIiLCJpZ25vcmVTdGF0ZSIsImlnbm9yZUFjdGlvbnMiLCJkaXNhYmxlQ2FjaGUiLCJXZWFrU2V0Iiwic3RvcmVBUEkiLCJpc0FjdGlvbiIsIm1lYXN1cmVVdGlscyIsImZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWUiLCJmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWUiLCJpc0Jvb2xlYW4iLCJidWlsZEdldERlZmF1bHRNaWRkbGV3YXJlIiwiaW1tdXRhYmxlQ2hlY2siLCJzZXJpYWxpemFibGVDaGVjayIsImFjdGlvbkNyZWF0b3JDaGVjayIsIm1pZGRsZXdhcmVBcnJheSIsInRodW5rTWlkZGxld2FyZSIsImltbXV0YWJsZU9wdGlvbnMiLCJ1bnNoaWZ0Iiwic3RyaW5naWZ5MiIsInNlcmlhbGl6ZXIiLCJpbmRlbnQiLCJkZWN5Y2xlciIsImdldFNlcmlhbGl6ZTIiLCJzdGFjayIsInRoaXNQb3MiLCJzcGxpY2UiLCJJbmZpbml0eSIsInRyYWNrIiwidHJhY2tlciIsImRpc3BhdGNoZWRBY3Rpb24iLCJjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUiLCJzZXJpYWxpemFibGVPcHRpb25zIiwiYWN0aW9uQ3JlYXRvck9wdGlvbnMiLCJpc0FjdGlvbkNyZWF0b3IyIiwiY3JlYXRlQWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUiLCJjcmVhdGVRdWV1ZVdpdGhUaW1lciIsInRpbWVvdXQiLCJub3RpZnkiLCJzZXRUaW1lb3V0IiwiYnVpbGRHZXREZWZhdWx0RW5oYW5jZXJzIiwibWlkZGxld2FyZUVuaGFuY2VyIiwiYXV0b0JhdGNoIiwiZW5oYW5jZXJBcnJheSIsInN0b3JlIiwibm90aWZ5aW5nIiwic2hvdWxkTm90aWZ5QXRFbmRPZlRpY2siLCJub3RpZmljYXRpb25RdWV1ZWQiLCJsaXN0ZW5lcnMiLCJxdWV1ZUNhbGxiYWNrIiwicXVldWVNaWNyb3Rhc2siLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJxdWV1ZU5vdGlmaWNhdGlvbiIsIm5vdGlmeUxpc3RlbmVycyIsImwiLCJsaXN0ZW5lcjIiLCJtZXRhIiwiYXV0b0JhdGNoRW5oYW5jZXIiLCJjb25maWd1cmVTdG9yZSIsImdldERlZmF1bHRNaWRkbGV3YXJlIiwibWlkZGxld2FyZSIsImRldlRvb2xzIiwiZHVwbGljYXRlTWlkZGxld2FyZUNoZWNrIiwiZW5oYW5jZXJzIiwicm9vdFJlZHVjZXIiLCJmaW5hbE1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlUmVmZXJlbmNlcyIsIm1pZGRsZXdhcmUyIiwiZmluYWxDb21wb3NlIiwidHJhY2UiLCJtaWRkbGV3YXJlcyIsImNyZWF0ZVN0b3JlMiIsIm1pZGRsZXdhcmVBUEkiLCJjaGFpbiIsImFwcGx5TWlkZGxld2FyZSIsImdldERlZmF1bHRFbmhhbmNlcnMiLCJzdG9yZUVuaGFuY2VycyIsIlNuYWNrYmFyQ29udGV4dCIsIlNuYWNrYmFyUHJvdmlkZXIiLCJzaG93U25hY2tiYXIiLCJTbmFja2JhciIsImF1dG9IaWRlRHVyYXRpb24iLCJQcm92aWRlcnMiLCJiYXNlbmFtZSIsInF1ZXJ5Q2xpZW50IiwiUXVlcnlDbGllbnQiLCJkZWZhdWx0T3B0aW9ucyIsInF1ZXJpZXMiLCJyZWZldGNoT25XaW5kb3dGb2N1cyIsInJldHJ5IiwidXNlRXJyb3JCb3VuZGFyeSIsImJhc2VOYW1lIiwib3JpZ2luIiwiQnJvd3NlclJvdXRlciIsIlF1ZXJ5Q2xpZW50UHJvdmlkZXIiLCJkZWZhdWx0Q29uZmlybURpYWxvZ1N0YXRlIiwidXNlQ29uZmlybSIsInJlc2V0RGlhbG9nIiwiQmF0Y2hTZWxlY3RvciIsIlNpbmdsZVNlbGVjdCIsImV4dGVybmFsQXhpb3MiLCJvcHRpb25zQXBpRW5kUG9pbnQiLCJDb3Vyc2VTZWxlY3RvciIsImRiTGFiZWxQcm9wcyIsImxhYmVsS2V5Iiwic3ViTGFiZWxLZXkiLCJEZXBhcnRtZW50U2VsZWN0b3IiLCJkYlZhbHVlUHJvcHMiLCJ2YWx1ZUtleSIsImlzT2JqZWN0SWQiLCJFbXBsb3llZXNTZWxlY3RvciIsIkV4YW1zUmVndWxhdGlvblNlbGVjdG9yIiwiZXhhbVR5cGVPcHRpb25zIiwiRXhhbVR5cGVTZWxlY3RvciIsIkZlZVR5cGVzIiwieWVhcnMiLCJmcm9tIiwiZ2V0RnVsbFllYXIiLCJGZWVUeXBlU2VsZWN0b3IiLCJIb3N0ZWxCbG9ja1NlbGVjdG9yIiwiaXNJbnQiLCJ1c2VMYWJlbFN0YXJ0Q2FzZSIsInVzZVN1YkxhYmVsU3RhcnRDYXNlIiwiSG9zdGVsRmxvb3JTZWxlY3RvciIsIkhvc3RlbFJvb21TZWxlY3RvciIsIk1vbnRoWWVhclNlbGVjdG9yIiwiUHJpbnRGb3JtYXRTZWxlY3RvciIsIlByb2dyYW1TZWxlY3RvciIsIlJlZ3VsYXRpb25TZWxlY3RvciIsIlJlc2VhcmNoRXhwZXJ0U2VsZWN0b3IiLCJSZXNlYXJjaFN0YWdlU2VsZWN0b3IiLCJTZW1lc3RlclNlbGVjdG9yIiwiU3R1ZGVudFNlbGVjdG9yIiwiU3R1ZGVudFNlcnZpY2VzU2VsZWN0b3IiLCJZZWFyUmFuZ2VTZWxlY3RvciIsInN1ZmZpeCIsImdldE93blByb3BlcnR5U3ltYm9scyIsIl9fcmVzdCIsInllYXIiLCJvcGVuSW5OZXdUYWIiLCJwYXRoQWZ0ZXJCYXNlIiwiZXhjbHVkZUluc3RpdHV0aW9uIiwiZXhjbHVkZVdvcmtzcGFjZSIsInNlZ21lbnRzIiwiYmFzZVBhcnRzIiwiZnVsbFBhdGgiXSwibWFwcGluZ3MiOiJvN0JBK0JPLElBQUlBLEVBQVcsV0FRbEIsT0FQQUEsRUFBV0MsT0FBT0MsUUFBVSxTQUFrQkMsR0FDMUMsSUFBSyxJQUFJQyxFQUFHQyxFQUFJLEVBQUdDLEVBQUlDLFVBQVVDLE9BQVFILEVBQUlDLEVBQUdELElBRTVDLElBQUssSUFBSUksS0FEVEwsRUFBSUcsVUFBVUYsR0FDT0osT0FBT1MsVUFBVUMsZUFBZUMsS0FBS1IsRUFBR0ssS0FBSU4sRUFB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eXVCLEVBQVMsR0FBR3puQixPQUFPeW5CLEVBQVEsS0FBS3puQixPQUFPNG5CLEVBQU0sT0FBTzVuQixPQUFPNG5CLEVBQU8sR0FBSyxHQUFHNW5CLE9BQU80bkIsRUFBTSxPQUFPNW5CLE9BQU80bkIsRUFBTyxHQUNuSHp2QixNQUFvQixjQUFiMnRCLEVBQTJCLEdBQUc5bEIsT0FBTzRuQixFQUFNLE9BQU81bkIsT0FBTzRuQixFQUFPLEdBQUtBLEVBRWhGLElBQ0N6a0IsR0FDTCxFQ25CVzBrQixHQUFlLFNBQVVDLEVBQWVDLEVBQW9CQyxRQUMxQyxJQUF2QkQsSUFDRkEsR0FBcUIsUUFFRSxJQUFyQkMsSUFDRkEsR0FBbUIsR0FFckIsSUFDSUMsRUFEY3pxQixPQUFPQyxTQUFTSyxTQUNQekMsTUFBTSxLQUU3QjZzQixFQUFZLElBRVhILEdBQXNCRSxFQUFTLElBQ2xDQyxFQUFVcHVCLEtBQUttdUIsRUFBUyxLQUdyQkQsR0FBb0JDLEVBQVMsSUFDaENDLEVBQVVwdUIsS0FBS211QixFQUFTLElBRTFCLElBQUk5VCxFQUFPK1QsRUFBVS93QixPQUFTLEVBQUksSUFBTSt3QixFQUFVcnNCLEtBQUssS0FBTyxHQUUxRHNzQixFQUFXLEdBQUdub0IsT0FBT3hDLE9BQU9DLFNBQVNxbkIsUUFBUTlrQixPQUFPbVUsRUFBTSxLQUFLblUsT0FBTzhuQixHQUMxRXRxQixPQUFPaEIsS0FBSzJyQixFQUFVLFNBQ3hCIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSw4LDksMTAsMTEsMTQsMTUsMTYsMTddfQ==
1
+ import e from"axios";import{Store as t}from"pullstate";import{jsxs as n,jsx as r,Fragment as o}from"react/jsx-runtime";import{ConfirmDialog as i,Icons as a,TextField as s,PasswordField as c,Button as u,ResourceNotFound as l,InternalServerError as d,NoInterneConnection as p,UnAuthorized as f,Dialog as h,Snackbar as m,SingleSelect as y}from"@campxdev/react-blueprint";import*as b from"react";import{createContext as v,useState as w,useEffect as g}from"react";import{useMutation as _,QueryErrorResetBoundary as E,QueryClient as O,QueryClientProvider as k}from"react-query";import{useNavigate as x,useLocation as N,BrowserRouter as P}from"react-router-dom";export{BrowserRouter}from"react-router-dom";import{validateFieldsNatively as S,toNestError as j}from"@hookform/resolvers";import{appendErrors as A,useForm as D,Controller as C}from"react-hook-form";import I from"device-detector-js";import*as V from"yup";import{Provider as T}from"react-redux";var R=function(){return R=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},R.apply(this,arguments)};function L(e,t,n,r){return new(n||(n=Promise))(function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function s(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(a,s)}c((r=r.apply(e,t||[])).next())})}function K(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=s(0),a.throw=s(1),a.return=s(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(c){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],r=0}finally{n=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,c])}}}function F(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}"function"==typeof SuppressedError&&SuppressedError;var $=function e(t,n){function r(e,r,o){if("undefined"!=typeof document){"number"==typeof(o=F({},n,o)).expires&&(o.expires=new Date(Date.now()+864e5*o.expires)),o.expires&&(o.expires=o.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var i="";for(var a in o)o[a]&&(i+="; "+a,!0!==o[a]&&(i+="="+o[a].split(";")[0]));return document.cookie=e+"="+t.write(r,e)+i}}return Object.create({set:r,get:function(e){if("undefined"!=typeof document&&(!arguments.length||e)){for(var n=document.cookie?document.cookie.split("; "):[],r={},o=0;o<n.length;o++){var i=n[o].split("="),a=i.slice(1).join("=");try{var s=decodeURIComponent(i[0]);if(r[s]=t.read(a,s),e===s)break}catch(e){}}return e?r[e]:r}},remove:function(e,t){r(e,"",F({},t,{expires:-1}))},withAttributes:function(t){return e(this.converter,F({},this.attributes,t))},withConverter:function(t){return e(F({},this.converter,t),this.attributes)}},{attributes:{value:Object.freeze(n)},converter:{value:Object.freeze(t)}})}({read:function(e){return'"'===e[0]&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"}),z={isLoginDialogOpen:!1,snackbar:{open:!1,message:"",severity:"success"},confirmDialog:{isOpen:!1,title:"",message:"",onConfirm:function(){},onCancel:function(){},type:"confirm"},user:void 0,institutionInfo:void 0,asset:void 0},M=new t(z),B=window.location.hostname.includes("localhost"),U=window.location.hostname.split(".")[0],q=window.location.pathname.split("/")[1],W=window.location.pathname.split("/")[2],Y={"student-workspace":"/student-api","faculty-workspace":"/faculty-api","department-workspace":"/department-api","academic-coordinator-workspace":"/academic-coordinator-api","feedback-coordinator-workspace":"/feedback-coordinator-api","course-coordinator-workspace":"/course-coordinator-api","classroom-coordinator-workspace":"/classroom-coordinator-api","coe-workspace":"/coe-api","academic-admin-workspace":"/academic-admin-api","hostel-admin-workspace":"/hostel-admin-api","transport-coordinator-workspace":"/transport-coordinator-api","employee-workspace":"/employee-api","librarian-workspace":"/librarian-api","fee-terminal":"/fee-terminal-api","accounts-officer-workspace":"accounts-officer-api","finance-officer-workspace":"finance-officer-api","outreach-agent-workspace":"outreach-agent-api","prospect-workspace":"prospect-api","research-coordinator-workspace":"research-coordinator-api","tele-counsellor-workspace":"tele-counsellor-api","team-owner-workspace":"/team-owner-api","admissions-counsellor-workspace":"/admissions-counsellor-api","admissions-officer-workspace":"/admissions-officer-api"},H=e.create({baseURL:process.env.REACT_APP_API_HOST||"",withCredentials:!0,headers:{"x-tenant-id":U,"x-institution-code":q}});function X(e,t,n){return n.reduce(function(n,r){var o=e[r];return o&&(n[r]=R({singleton:!0,requiredVersion:o,version:o.replace(/^[\^~]/,"")},t.includes(r)?{eager:!0}:{})),n},{})}H.interceptors.request.use(function(e){var t=function(e){return Object.fromEntries(Object.entries(null!=e?e:{}).map(function(e){var t=e[0],n=e[1];return[t,"__empty__"===n?"":n]}))}(null==e?void 0:e.params);if(!1!==e.workspace&&W&&Y[W]&&"common-workspace"!==W){var n=Y[W];e.url="".concat(n).concat(e.url)}var r=$.get("campx_session_key"),o=$.get("campx_open_payments_key"),i=$.get("campx_student_key");return B&&r&&e.headers.set("campx_session_key",r),B&&i&&e.headers.set("campx_student_key",i),o&&e.headers.set("campx_open_payments_key",o),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),R(R({},e),{params:t})},function(e){return Promise.reject(e)}),H.interceptors.response.use(function(e){var t;return!(!0===(null===(t=e.data)||void 0===t?void 0:t.hideSnackbar))&&e.config.method&&["put","post","delete","patch"].includes(e.config.method)&&[200,201,202].includes(e.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.data.message||"Operation successful",t.snackbar.severity="success"}),e},function(e){var t,n,r,o,i=!0===(null===(n=null===(t=e.response)||void 0===t?void 0:t.data)||void 0===n?void 0:n.hideSnackbar);return!i&&[400,422,413].includes(null===(r=e.response)||void 0===r?void 0:r.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Bad Request",t.snackbar.severity="error"}),!i&&(null===(o=e.response)||void 0===o?void 0:o.config.method)&&["put","post","delete","patch"].includes(e.response.config.method)&&[404].includes(e.response.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var G=e.create({baseURL:process.env.REACT_APP_API_HOST||"",withCredentials:!0,workspace:!1,headers:{"x-tenant-id":U,"x-institution-code":q}});G.interceptors.request.use(function(e){var t=function(e){return Object.fromEntries(Object.entries(null!=e?e:{}).map(function(e){var t=e[0],n=e[1];return[t,"__empty__"===n?"":n]}))}(null==e?void 0:e.params),n=$.get("campx_session_key"),r=$.get("campx_open_payments_key"),o=$.get("campx_student_key");return B&&n&&e.headers.set("campx_session_key",n),B&&o&&e.headers.set("campx_student_key",o),r&&e.headers.set("campx_open_payments_key",r),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),R(R({},e),{params:t})},function(e){return Promise.reject(e)}),G.interceptors.response.use(function(e){var t;return!(!0===(null===(t=e.data)||void 0===t?void 0:t.hideSnackbar))&&e.config.method&&["put","post","delete","patch"].includes(e.config.method)&&[200,201,202].includes(e.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.data.message||"Operation successful",t.snackbar.severity="success"}),e},function(e){var t,n,r,o,i=!0===(null===(n=null===(t=e.response)||void 0===t?void 0:t.data)||void 0===n?void 0:n.hideSnackbar);return!i&&[400,422].includes(null===(r=e.response)||void 0===r?void 0:r.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Bad Request",t.snackbar.severity="error"}),!i&&(null===(o=e.response)||void 0===o?void 0:o.config.method)&&["put","post","delete","patch"].includes(e.response.config.method)&&[404].includes(e.response.status)&&M.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var J=v({showConfirmDialog:function(){}}),Q=function(e){var t=e.children,o=M.useState(function(e){return e.confirmDialog}),a=function(){M.update(function(e){e.confirmDialog.isOpen=!1})};return n(J.Provider,{value:{showConfirmDialog:function(e,t,n,r,o,i,a){void 0===o&&(o="confirm"),M.update(function(s){s.confirmDialog={isOpen:!0,title:e,message:t,onConfirm:n,onCancel:r,type:o,confirmButtonText:i,cancelButtonText:a}})}},children:[t,r(i,{isOpen:o.isOpen,title:o.title,message:o.message,type:o.type,confirmButtonText:o.confirmButtonText,cancelButtonText:o.cancelButtonText,onConfirm:function(){o.onConfirm(),a()},onCancel:function(){o.onCancel(),a()}})]})};function Z(e,t){return Z=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Z(e,t)}var ee={error:null},te=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).state=ee,t.resetErrorBoundary=function(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];null==t.props.onReset||(e=t.props).onReset.apply(e,r),t.reset()},t}!function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,Z(e,t)}(t,e),t.getDerivedStateFromError=function(e){return{error:e}};var n=t.prototype;return n.reset=function(){this.setState(ee)},n.componentDidCatch=function(e,t){var n,r;null==(n=(r=this.props).onError)||n.call(r,e,t)},n.componentDidUpdate=function(e,t){var n,r,o,i,a=this.state.error,s=this.props.resetKeys;null!==a&&null!==t.error&&(void 0===(o=e.resetKeys)&&(o=[]),void 0===(i=s)&&(i=[]),o.length!==i.length||o.some(function(e,t){return!Object.is(e,i[t])}))&&(null==(n=(r=this.props).onResetKeysChange)||n.call(r,e.resetKeys,s),this.reset())},n.render=function(){var e=this.state.error,t=this.props,n=t.fallbackRender,r=t.FallbackComponent,o=t.fallback;if(null!==e){var i={error:e,resetErrorBoundary:this.resetErrorBoundary};if(b.isValidElement(o))return o;if("function"==typeof n)return n(i);if(r)return b.createElement(r,i);throw new Error("react-error-boundary requires either a fallback, fallbackRender, or FallbackComponent prop")}return this.props.children},t}(b.Component),ne=function(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),function(r,o,i){try{return Promise.resolve(function(a,s){try{var c=(t.context&&process.env.NODE_ENV,Promise.resolve(e["sync"===n.mode?"validateSync":"validate"](r,Object.assign({abortEarly:!1},t,{context:o}))).then(function(e){return i.shouldUseNativeValidation&&S({},i),{values:n.rawValues?r:e,errors:{}}}))}catch(e){return s(e)}return c&&c.then?c.then(void 0,s):c}(0,function(e){if(!e.inner)throw e;return{values:{},errors:j((t=e,n=!i.shouldUseNativeValidation&&"all"===i.criteriaMode,(t.inner||[]).reduce(function(e,t){if(e[t.path]||(e[t.path]={message:t.message,type:t.type}),n){var r=e[t.path].types,o=r&&r[t.type];e[t.path]=A(t.path,n,e,t.type,o?[].concat(o,t.message):t.message)}return e},{})),i)};var t,n}))}catch(e){return Promise.reject(e)}}},re=function(e){return L(void 0,void 0,void 0,function(){var t;return K(this,function(n){switch(n.label){case 0:return e.latitude&&e.longitude?[3,3]:[4,fetch("https://www.googleapis.com/geolocation/v1/geolocate?key=AIzaSyB2YCpo1yi107RYj1LdZu2DCcpcO93reFY",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({considerIp:"true"})})];case 1:return[4,n.sent().json()];case 2:t=n.sent(),e.latitude=t.location.lat,e.longitude=t.location.lng,n.label=3;case 3:return[2,H.post("/auth-server/auth-v2/login",e,{workspace:!1}).then(function(e){return e.data})]}})})},oe=V.object().shape({username:V.string().required("Username is required"),password:V.string().required("Password is required")}),ie=function(e){var t=e.close,o=w({deviceInformation:{deviceType:"browser",clientName:"unknown",os:"unknown",osVersion:"unknown",latitude:null,longitude:null,tokenType:"WEB"},isLocationAllowed:!0}),i=o[0],l=o[1],d=x();g(function(){navigator.geolocation.getCurrentPosition(function(e){l(function(t){return R(R({},t),{deviceInformation:R(R({},t.deviceInformation),{latitude:e.coords.latitude,longitude:e.coords.longitude})})})}),navigator.permissions.query({name:"geolocation"}).then(function(e){"denied"===e.state&&l(function(e){return R(R({},e),{isLocationAllowed:!1})})});var e=(new I).parse(navigator.userAgent);l(function(t){var n,r,o;return R(R({},t),{deviceInformation:R(R({},t.deviceInformation),{clientName:(null===(n=e.client)||void 0===n?void 0:n.name)||t.deviceInformation.clientName,os:(null===(r=e.os)||void 0===r?void 0:r.name)||t.deviceInformation.os,osVersion:(null===(o=e.os)||void 0===o?void 0:o.version)||t.deviceInformation.osVersion})})})},[]);var p=D({resolver:ne(oe)}),f=p.handleSubmit,h=p.control,m=p.formState.errors,y=_(re,{onSuccess:function(e){B&&($.remove("campx_session_key"),$.set("campx_session_key",e.session.token),t(),d("/".concat(e.session.institutionCode,"/workspace")),window.location.reload())}}),b=y.mutate,v=y.isLoading;return n("div",{className:"flex flex-col gap-8 justify-center items-center p-8",children:[r("div",{className:"flex items-center justify-center h-9 w-48",children:r(a.CampxFullLogoIcon,{})}),n("div",{className:"flex flex-col gap-4 w-full max-w-[400px]",children:[r(C,{control:h,render:function(e){var t=e.field;return r(s,{name:"username",placeholder:"Enter Username or Email",onChange:t.onChange,label:"Username or Email",error:!!m.username,required:!0,fullWidth:!0})},name:"username"}),r(C,{control:h,render:function(e){var t=e.field;return r(c,{name:"password",placeholder:"Enter password",onChange:t.onChange,label:"Password",error:!!m.password,required:!0,fullWidth:!0})},name:"password"}),r(u,{type:"submit",color:"primary",variant:"default",onClick:f(function(e){return L(void 0,void 0,void 0,function(){return K(this,function(t){return b(R(R(R({},e),i.deviceInformation),{loginId:e.username,loginType:"USER"})),[2]})})}),disabled:v,loading:v,fullWidth:!0,children:"Login"})]})]})},ae=function(e){var t=N();return r(E,{children:function(n){var o=n.reset;return r(te,{onReset:o,FallbackComponent:se,children:e.children},null==t?void 0:t.pathname)}})},se=function(e){var t,o,i,a,s,c,f,h=e.error,m=e.resetErrorBoundary;if(null===(t=null==h?void 0:h.response)||void 0===t?void 0:t.status)switch(null===(o=null==h?void 0:h.response)||void 0===o?void 0:o.status){case 401:return r(ce,{});case 500:return r(d,{resetBoundary:m});case 404:return r(l,{message:null===(a=null===(i=null==h?void 0:h.response)||void 0===i?void 0:i.data)||void 0===a?void 0:a.message})}return"ERR_NETWORK"===(null==h?void 0:h.code)?r(p,{resetBoundary:m}):r("div",{className:"mt-4 p-5",children:n("div",{className:"relative h-15 border border-red-200 bg-red-50 flex items-center rounded-md px-2",children:[r("div",{className:"flex-1 text-red-700 bg-transparent",children:null!==(f=null===(c=null===(s=null==h?void 0:h.response)||void 0===s?void 0:s.data)||void 0===c?void 0:c.message)&&void 0!==f?f:null==h?void 0:h.message}),r(u,{onClick:function(){return m()},size:"sm",variant:"link",className:"hover:no-underline text-destructive",children:"Try Again"})]})})},ce=function(){var e=x(),t=w(!1),i=t[0],a=t[1],s=$.get("campx_session_key");return r(f,{component:n(o,{children:[r(u,{className:"mt-5",variant:"default",onClick:function(){"localhost"===window.location.hostname.split(".")[1]?a(!0):s||e("prospect-workspace"===W?"".concat(q,"/ats/login"):"/auth/login")},children:"Click Here To Login"}),r(h,{open:i,onClose:function(){return a(!1)},content:function(e){var t=e.close;return r(ie,{close:t})}})]})})};function ue(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var le=(()=>"function"==typeof Symbol&&Symbol.observable||"@@observable")(),de=()=>Math.random().toString(36).substring(7).split("").join("."),pe={INIT:`@@redux/INIT${de()}`,REPLACE:`@@redux/REPLACE${de()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${de()}`};function fe(e){if("object"!=typeof e||null===e)return!1;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||null===Object.getPrototypeOf(e)}function he(e){if(void 0===e)return"undefined";if(null===e)return"null";const t=typeof e;switch(t){case"boolean":case"string":case"number":case"symbol":case"function":return t}if(Array.isArray(e))return"array";if(function(e){return e instanceof Date||"function"==typeof e.toDateString&&"function"==typeof e.getDate&&"function"==typeof e.setDate}(e))return"date";if(function(e){return e instanceof Error||"string"==typeof e.message&&e.constructor&&"number"==typeof e.constructor.stackTraceLimit}(e))return"error";const n=function(e){return"function"==typeof e.constructor?e.constructor.name:null}(e);switch(n){case"Symbol":case"Promise":case"WeakMap":case"WeakSet":case"Map":case"Set":return n}return Object.prototype.toString.call(e).slice(8,-1).toLowerCase().replace(/\s/g,"")}function me(e){let t=typeof e;return"production"!==process.env.NODE_ENV&&(t=he(e)),t}function ye(e,t,n){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?ue(2):`Expected the root reducer to be a function. Instead, received: '${me(e)}'`);if("function"==typeof t&&"function"==typeof n||"function"==typeof n&&"function"==typeof arguments[3])throw new Error("production"===process.env.NODE_ENV?ue(0):"It looks like you are passing several store enhancers to createStore(). This is not supported. Instead, compose them together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.");if("function"==typeof t&&void 0===n&&(n=t,t=void 0),void 0!==n){if("function"!=typeof n)throw new Error("production"===process.env.NODE_ENV?ue(1):`Expected the enhancer to be a function. Instead, received: '${me(n)}'`);return n(ye)(e,t)}let r=e,o=t,i=new Map,a=i,s=0,c=!1;function u(){a===i&&(a=new Map,i.forEach((e,t)=>{a.set(t,e)}))}function l(){if(c)throw new Error("production"===process.env.NODE_ENV?ue(3):"You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store.");return o}function d(e){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?ue(4):`Expected the listener to be a function. Instead, received: '${me(e)}'`);if(c)throw new Error("production"===process.env.NODE_ENV?ue(5):"You may not call store.subscribe() while the reducer is executing. If you would like to be notified after the store has been updated, subscribe from a component and invoke store.getState() in the callback to access the latest state. See https://redux.js.org/api/store#subscribelistener for more details.");let t=!0;u();const n=s++;return a.set(n,e),function(){if(t){if(c)throw new Error("production"===process.env.NODE_ENV?ue(6):"You may not unsubscribe from a store listener while the reducer is executing. See https://redux.js.org/api/store#subscribelistener for more details.");t=!1,u(),a.delete(n),i=null}}}function p(e){if(!fe(e))throw new Error("production"===process.env.NODE_ENV?ue(7):`Actions must be plain objects. Instead, the actual type was: '${me(e)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`);if(void 0===e.type)throw new Error("production"===process.env.NODE_ENV?ue(8):'Actions may not have an undefined "type" property. You may have misspelled an action type string constant.');if("string"!=typeof e.type)throw new Error("production"===process.env.NODE_ENV?ue(17):`Action "type" property must be a string. Instead, the actual type was: '${me(e.type)}'. Value was: '${e.type}' (stringified)`);if(c)throw new Error("production"===process.env.NODE_ENV?ue(9):"Reducers may not dispatch actions.");try{c=!0,o=r(o,e)}finally{c=!1}return(i=a).forEach(e=>{e()}),e}p({type:pe.INIT});return{dispatch:p,subscribe:d,getState:l,replaceReducer:function(e){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?ue(10):`Expected the nextReducer to be a function. Instead, received: '${me(e)}`);r=e,p({type:pe.REPLACE})},[le]:function(){const e=d;return{subscribe(t){if("object"!=typeof t||null===t)throw new Error("production"===process.env.NODE_ENV?ue(11):`Expected the observer to be an object. Instead, received: '${me(t)}'`);function n(){const e=t;e.next&&e.next(l())}n();return{unsubscribe:e(n)}},[le](){return this}}}}}function be(e){"undefined"!=typeof console&&console.error;try{throw new Error(e)}catch(e){}}function ve(e){const t=Object.keys(e),n={};for(let r=0;r<t.length;r++){const o=t[r];"production"!==process.env.NODE_ENV&&void 0===e[o]&&be(`No reducer provided for key "${o}"`),"function"==typeof e[o]&&(n[o]=e[o])}const r=Object.keys(n);let o,i;"production"!==process.env.NODE_ENV&&(o={});try{!function(e){Object.keys(e).forEach(t=>{const n=e[t];if(void 0===n(void 0,{type:pe.INIT}))throw new Error("production"===process.env.NODE_ENV?ue(12):`The slice reducer for key "${t}" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.`);if(void 0===n(void 0,{type:pe.PROBE_UNKNOWN_ACTION()}))throw new Error("production"===process.env.NODE_ENV?ue(13):`The slice reducer for key "${t}" returned undefined when probed with a random type. Don't try to handle '${pe.INIT}' or other actions in "redux/*" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.`)})}(n)}catch(e){i=e}return function(e={},t){if(i)throw i;if("production"!==process.env.NODE_ENV){const r=function(e,t,n,r){const o=Object.keys(t),i=n&&n.type===pe.INIT?"preloadedState argument passed to createStore":"previous state received by the reducer";if(0===o.length)return"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";if(!fe(e))return`The ${i} has unexpected type of "${me(e)}". Expected argument to be an object with the following keys: "${o.join('", "')}"`;const a=Object.keys(e).filter(e=>!t.hasOwnProperty(e)&&!r[e]);return a.forEach(e=>{r[e]=!0}),n&&n.type===pe.REPLACE?void 0:a.length>0?`Unexpected ${a.length>1?"keys":"key"} "${a.join('", "')}" found in ${i}. Expected to find one of the known reducer keys instead: "${o.join('", "')}". Unexpected keys will be ignored.`:void 0}(e,n,t,o);r&&be(r)}let a=!1;const s={};for(let o=0;o<r.length;o++){const i=r[o],c=n[i],u=e[i],l=c(u,t);if(void 0===l){const e=t&&t.type;throw new Error("production"===process.env.NODE_ENV?ue(14):`When called with an action of type ${e?`"${String(e)}"`:"(unknown type)"}, the slice reducer for key "${i}" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.`)}s[i]=l,a=a||l!==u}return a=a||r.length!==Object.keys(e).length,a?s:e}}function we(...e){return 0===e.length?e=>e:1===e.length?e[0]:e.reduce((e,t)=>(...n)=>e(t(...n)))}var ge=Symbol.for("immer-nothing"),_e=Symbol.for("immer-draftable"),Ee=Symbol.for("immer-state"),Oe="production"!==process.env.NODE_ENV?[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}]:[];function ke(e,...t){if("production"!==process.env.NODE_ENV){const n=Oe[e],r="function"==typeof n?n.apply(null,t):n;throw new Error(`[Immer] ${r}`)}throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var xe=Object.getPrototypeOf;function Ne(e){return!!e&&!!e[Ee]}function Pe(e){return!!e&&(Ae(e)||Array.isArray(e)||!!e[_e]||!!e.constructor?.[_e]||Te(e)||Re(e))}var Se=Object.prototype.constructor.toString(),je=new WeakMap;function Ae(e){if(!e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);if(null===t||t===Object.prototype)return!0;const n=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(n===Object)return!0;if("function"!=typeof n)return!1;let r=je.get(n);return void 0===r&&(r=Function.toString.call(n),je.set(n,r)),r===Se}function De(e,t,n=!0){if(0===Ce(e)){(n?Reflect.ownKeys(e):Object.keys(e)).forEach(n=>{t(n,e[n],e)})}else e.forEach((n,r)=>t(r,n,e))}function Ce(e){const t=e[Ee];return t?t.type_:Array.isArray(e)?1:Te(e)?2:Re(e)?3:0}function Ie(e,t){return 2===Ce(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function Ve(e,t,n){const r=Ce(e);2===r?e.set(t,n):3===r?e.add(n):e[t]=n}function Te(e){return e instanceof Map}function Re(e){return e instanceof Set}function Le(e){return e.copy_||e.base_}function Ke(e,t){if(Te(e))return new Map(e);if(Re(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const n=Ae(e);if(!0===t||"class_only"===t&&!n){const t=Object.getOwnPropertyDescriptors(e);delete t[Ee];let n=Reflect.ownKeys(t);for(let r=0;r<n.length;r++){const o=n[r],i=t[o];!1===i.writable&&(i.writable=!0,i.configurable=!0),(i.get||i.set)&&(t[o]={configurable:!0,writable:!0,enumerable:i.enumerable,value:e[o]})}return Object.create(xe(e),t)}{const t=xe(e);if(null!==t&&n)return{...e};const r=Object.create(t);return Object.assign(r,e)}}function Fe(e,t=!1){return ze(e)||Ne(e)||!Pe(e)||(Ce(e)>1&&Object.defineProperties(e,{set:$e,add:$e,clear:$e,delete:$e}),Object.freeze(e),t&&Object.values(e).forEach(e=>Fe(e,!0))),e}var $e={value:function(){ke(2)}};function ze(e){return null===e||"object"!=typeof e||Object.isFrozen(e)}var Me,Be={};function Ue(e){const t=Be[e];return t||ke(0,e),t}function qe(){return Me}function We(e,t){t&&(Ue("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Ye(e){He(e),e.drafts_.forEach(Ge),e.drafts_=null}function He(e){e===Me&&(Me=e.parent_)}function Xe(e){return Me={drafts_:[],parent_:Me,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Ge(e){const t=e[Ee];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function Je(e,t){t.unfinalizedDrafts_=t.drafts_.length;const n=t.drafts_[0];return void 0!==e&&e!==n?(n[Ee].modified_&&(Ye(t),ke(4)),Pe(e)&&(e=Qe(t,e),t.parent_||et(t,e)),t.patches_&&Ue("Patches").generateReplacementPatches_(n[Ee].base_,e,t.patches_,t.inversePatches_)):e=Qe(t,n,[]),Ye(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==ge?e:void 0}function Qe(e,t,n){if(ze(t))return t;const r=e.immer_.shouldUseStrictIteration(),o=t[Ee];if(!o)return De(t,(r,i)=>Ze(e,o,t,r,i,n),r),t;if(o.scope_!==e)return t;if(!o.modified_)return et(e,o.base_,!0),o.base_;if(!o.finalized_){o.finalized_=!0,o.scope_.unfinalizedDrafts_--;const t=o.copy_;let i=t,a=!1;3===o.type_&&(i=new Set(t),t.clear(),a=!0),De(i,(r,i)=>Ze(e,o,t,r,i,n,a),r),et(e,t,!1),n&&e.patches_&&Ue("Patches").generatePatches_(o,n,e.patches_,e.inversePatches_)}return o.copy_}function Ze(e,t,n,r,o,i,a){if(null==o)return;if("object"!=typeof o&&!a)return;const s=ze(o);if(!s||a){if("production"!==process.env.NODE_ENV&&o===n&&ke(5),Ne(o)){const a=Qe(e,o,i&&t&&3!==t.type_&&!Ie(t.assigned_,r)?i.concat(r):void 0);if(Ve(n,r,a),!Ne(a))return;e.canAutoFreeze_=!1}else a&&n.add(o);if(Pe(o)&&!s){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;if(t&&t.base_&&t.base_[r]===o&&s)return;Qe(e,o),t&&t.scope_.parent_||"symbol"==typeof r||!(Te(n)?n.has(r):Object.prototype.propertyIsEnumerable.call(n,r))||et(e,o)}}}function et(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Fe(t,n)}var tt={get(e,t){if(t===Ee)return e;const n=Le(e);if(!Ie(n,t))return function(e,t,n){const r=ot(t,n);return r?"value"in r?r.value:r.get?.call(e.draft_):void 0}(e,n,t);const r=n[t];return e.finalized_||!Pe(r)?r:r===rt(e.base_,t)?(at(e),e.copy_[t]=st(r,e)):r},has:(e,t)=>t in Le(e),ownKeys:e=>Reflect.ownKeys(Le(e)),set(e,t,n){const r=ot(Le(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){const r=rt(Le(e),t),a=r?.[Ee];if(a&&a.base_===n)return e.copy_[t]=n,e.assigned_[t]=!1,!0;if(((o=n)===(i=r)?0!==o||1/o==1/i:o!=o&&i!=i)&&(void 0!==n||Ie(e.base_,t)))return!0;at(e),it(e)}var o,i;return e.copy_[t]===n&&(void 0!==n||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_[t]=!0),!0},deleteProperty:(e,t)=>(void 0!==rt(e.base_,t)||t in e.base_?(e.assigned_[t]=!1,at(e),it(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=Le(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{writable:!0,configurable:1!==e.type_||"length"!==t,enumerable:r.enumerable,value:n[t]}:r},defineProperty(){ke(11)},getPrototypeOf:e=>xe(e.base_),setPrototypeOf(){ke(12)}},nt={};function rt(e,t){const n=e[Ee];return(n?Le(n):e)[t]}function ot(e,t){if(!(t in e))return;let n=xe(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=xe(n)}}function it(e){e.modified_||(e.modified_=!0,e.parent_&&it(e.parent_))}function at(e){e.copy_||(e.copy_=Ke(e.base_,e.scope_.immer_.useStrictShallowCopy_))}De(tt,(e,t)=>{nt[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}}),nt.deleteProperty=function(e,t){return"production"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&ke(13),nt.set.call(this,e,t,void 0)},nt.set=function(e,t,n){return"production"!==process.env.NODE_ENV&&"length"!==t&&isNaN(parseInt(t))&&ke(14),tt.set.call(this,e[0],t,n,e[0])};function st(e,t){const n=Te(e)?Ue("MapSet").proxyMap_(e,t):Re(e)?Ue("MapSet").proxySet_(e,t):function(e,t){const n=Array.isArray(e),r={type_:n?1:0,scope_:t?t.scope_:qe(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let o=r,i=tt;n&&(o=[r],i=nt);const{revoke:a,proxy:s}=Proxy.revocable(o,i);return r.draft_=s,r.revoke_=a,s}(e,t);return(t?t.scope_:qe()).drafts_.push(n),n}function ct(e){if(!Pe(e)||ze(e))return e;const t=e[Ee];let n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Ke(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Ke(e,!0);return De(n,(e,t)=>{Ve(n,e,ct(t))},r),t&&(t.finalized_=!1),n}var ut=new class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(e,t,n)=>{if("function"==typeof e&&"function"!=typeof t){const n=t;t=e;const r=this;return function(e=n,...o){return r.produce(e,e=>t.call(this,e,...o))}}let r;if("function"!=typeof t&&ke(6),void 0!==n&&"function"!=typeof n&&ke(7),Pe(e)){const o=Xe(this),i=st(e,void 0);let a=!0;try{r=t(i),a=!1}finally{a?Ye(o):He(o)}return We(o,n),Je(r,o)}if(!e||"object"!=typeof e){if(r=t(e),void 0===r&&(r=e),r===ge&&(r=void 0),this.autoFreeze_&&Fe(r,!0),n){const t=[],o=[];Ue("Patches").generateReplacementPatches_(e,r,t,o),n(t,o)}return r}ke(1,e)},this.produceWithPatches=(e,t)=>{if("function"==typeof e)return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},"boolean"==typeof e?.autoFreeze&&this.setAutoFreeze(e.autoFreeze),"boolean"==typeof e?.useStrictShallowCopy&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),"boolean"==typeof e?.useStrictIteration&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){Pe(e)||ke(8),Ne(e)&&(e=function(e){Ne(e)||ke(10,e);return ct(e)}(e));const t=Xe(this),n=st(e,void 0);return n[Ee].isManual_=!0,He(t),n}finishDraft(e,t){const n=e&&e[Ee];n&&n.isManual_||ke(9);const{scope_:r}=n;return We(r,t),Je(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));const r=Ue("Patches").applyPatches_;return Ne(e)?r(e,t):this.produce(e,e=>r(e,t))}};ut.produce;var lt=ut.setUseStrictIteration.bind(ut);function dt(e){return({dispatch:t,getState:n})=>r=>o=>"function"==typeof o?o(t,n,e):r(o)}var pt=dt(),ft=dt,ht="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(0!==arguments.length)return"object"==typeof arguments[0]?we:we.apply(null,arguments)};function mt(e){return"function"==typeof e&&"type"in e&&((t=e)&&"function"==typeof t.match);var t}function yt(e,t){let n=0;return{measureTime(e){const t=Date.now();try{return e()}finally{const e=Date.now();n+=e-t}},warnIfExceeded(){}}}var bt=class e extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,e.prototype)}static get[Symbol.species](){return e}concat(...e){return super.concat.apply(this,e)}prepend(...t){return 1===t.length&&Array.isArray(t[0])?new e(...t[0].concat(this)):new e(...t.concat(this))}};function vt(e){return"object"!=typeof e||null==e||Object.isFrozen(e)}function wt(e,t,n){const r=gt(e,t,n);return{detectMutations:()=>_t(e,t,r,n)}}function gt(e,t=[],n,r="",o=new Set){const i={value:n};if(!e(n)&&!o.has(n)){o.add(n),i.children={};for(const o in n){const a=r?r+"."+o:o;t.length&&-1!==t.indexOf(a)||(i.children[o]=gt(e,t,n[o],a))}}return i}function _t(e,t=[],n,r,o=!1,i=""){const a=n?n.value:void 0,s=a===r;if(o&&!s&&!Number.isNaN(r))return{wasMutated:!0,path:i};if(e(a)||e(r))return{wasMutated:!1};const c={};for(let e in n.children)c[e]=!0;for(let e in r)c[e]=!0;const u=t.length>0;for(let o in c){const a=i?i+"."+o:o;if(u){if(t.some(e=>e instanceof RegExp?e.test(a):a===e))continue}const c=_t(e,t,n.children[o],r[o],s,a);if(c.wasMutated)return c}return{wasMutated:!1}}function Et(e){const t=typeof e;return null==e||"string"===t||"boolean"===t||"number"===t||Array.isArray(e)||fe(e)}function Ot(e,t="",n=Et,r,o=[],i){let a;if(!n(e))return{keyPath:t||"<root>",value:e};if("object"!=typeof e||null===e)return!1;if(i?.has(e))return!1;const s=null!=r?r(e):Object.entries(e),c=o.length>0;for(const[e,u]of s){const s=t?t+"."+e:e;if(c){if(o.some(e=>e instanceof RegExp?e.test(s):s===e))continue}if(!n(u))return{keyPath:s,value:u};if("object"==typeof u&&(a=Ot(u,s,n,r,o,i),a))return a}return i&&kt(e)&&i.add(e),!1}function kt(e){if(!Object.isFrozen(e))return!1;for(const t of Object.values(e))if("object"==typeof t&&null!==t&&!kt(t))return!1;return!0}function xt(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);{const{isSerializable:t=Et,getEntries:n,ignoredActions:r=[],ignoredActionPaths:o=["meta.arg","meta.baseQueryMeta"],ignoredPaths:i=[],warnAfter:a=32,ignoreState:s=!1,ignoreActions:c=!1,disableCache:u=!1}=e,l=!u&&WeakSet?new WeakSet:void 0;return e=>a=>u=>{if(!function(e){return fe(e)&&"type"in e&&"string"==typeof e.type}(u))return a(u);const d=a(u),p=yt();return c||r.length&&-1!==r.indexOf(u.type)||p.measureTime(()=>{const e=Ot(u,"",t,n,o,l);if(e){const{keyPath:t,value:n}=e}}),s||(p.measureTime(()=>{const r=Ot(e.getState(),"",t,n,i,l);if(r){const{keyPath:e,value:t}=r}}),p.warnIfExceeded()),d}}}function Nt(e){return"boolean"==typeof e}var Pt=()=>function(e){const{thunk:t=!0,immutableCheck:n=!0,serializableCheck:r=!0,actionCreatorCheck:o=!0}=e??{};let i=new bt;if(t&&(Nt(t)?i.push(pt):i.push(ft(t.extraArgument))),"production"!==process.env.NODE_ENV){if(n){let e={};Nt(n)||(e=n),i.unshift(function(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);{let t=function(e,t,r,o){return JSON.stringify(e,n(t,o),r)},n=function(e,t){let n=[],r=[];return t||(t=function(e,t){return n[0]===t?"[Circular ~]":"[Circular ~."+r.slice(0,n.indexOf(t)).join(".")+"]"}),function(o,i){if(n.length>0){var a=n.indexOf(this);~a?n.splice(a+1):n.push(this),~a?r.splice(a,1/0,o):r.push(o),~n.indexOf(i)&&(i=t.call(this,o,i))}else n.push(i);return null==e?i:e.call(this,o,i)}},{isImmutable:r=vt,ignoredPaths:o,warnAfter:i=32}=e;const a=wt.bind(null,r,o);return({getState:e})=>{let n,r=e(),o=a(r);return i=>s=>{const c=yt();c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?Dt(19):`A state mutation was detected between dispatches, in the path '${n.path||""}'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`)});const u=i(s);return c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?Dt(20):`A state mutation was detected inside a dispatch, in the path: ${n.path||""}. Take a look at the reducer(s) handling the action ${t(s)}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`)}),c.warnIfExceeded(),u}}}}(e))}if(r){let e={};Nt(r)||(e=r),i.push(xt(e))}if(o){let e={};Nt(o)||(e=o),i.unshift(function(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);const{isActionCreator:t=mt}=e;return()=>e=>n=>(t(n),e(n))}(e))}}return i},St=e=>t=>{setTimeout(t,e)},jt=e=>function(t){const{autoBatch:n=!0}=t??{};let r=new bt(e);return n&&r.push(((e={type:"raf"})=>t=>(...n)=>{const r=t(...n);let o=!0,i=!1,a=!1;const s=new Set,c="tick"===e.type?queueMicrotask:"raf"===e.type?"undefined"!=typeof window&&window.requestAnimationFrame?window.requestAnimationFrame:St(10):"callback"===e.type?e.queueNotification:St(e.timeout),u=()=>{a=!1,i&&(i=!1,s.forEach(e=>e()))};return Object.assign({},r,{subscribe(e){const t=r.subscribe(()=>o&&e());return s.add(e),()=>{t(),s.delete(e)}},dispatch(e){try{return o=!e?.meta?.RTK_autoBatch,i=!o,i&&(a||(a=!0,c(u))),r.dispatch(e)}finally{o=!0}}})})("object"==typeof n?n:void 0)),r};function At(e){const t=Pt(),{reducer:n,middleware:r,devTools:o=!0,duplicateMiddlewareCheck:i=!0,preloadedState:a,enhancers:s}=e||{};let c,u;if("function"==typeof n)c=n;else{if(!fe(n))throw new Error("production"===process.env.NODE_ENV?Dt(1):"`reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers");c=ve(n)}if("production"!==process.env.NODE_ENV&&r&&"function"!=typeof r)throw new Error("production"===process.env.NODE_ENV?Dt(2):"`middleware` field must be a callback");if("function"==typeof r){if(u=r(t),"production"!==process.env.NODE_ENV&&!Array.isArray(u))throw new Error("production"===process.env.NODE_ENV?Dt(3):"when using a middleware builder function, an array of middleware must be returned")}else u=t();if("production"!==process.env.NODE_ENV&&u.some(e=>"function"!=typeof e))throw new Error("production"===process.env.NODE_ENV?Dt(4):"each middleware provided to configureStore must be a function");if("production"!==process.env.NODE_ENV&&i){let e=new Set;u.forEach(t=>{if(e.has(t))throw new Error("production"===process.env.NODE_ENV?Dt(42):"Duplicate middleware references found when creating the store. Ensure that each middleware is only included once.");e.add(t)})}let l=we;o&&(l=ht({trace:"production"!==process.env.NODE_ENV,..."object"==typeof o&&o}));const d=function(...e){return t=>(n,r)=>{const o=t(n,r);let i=()=>{throw new Error("production"===process.env.NODE_ENV?ue(15):"Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.")};const a={getState:o.getState,dispatch:(e,...t)=>i(e,...t)},s=e.map(e=>e(a));return i=we(...s)(o.dispatch),{...o,dispatch:i}}}(...u),p=jt(d);if("production"!==process.env.NODE_ENV&&s&&"function"!=typeof s)throw new Error("production"===process.env.NODE_ENV?Dt(5):"`enhancers` field must be a callback");let f="function"==typeof s?s(p):p();if("production"!==process.env.NODE_ENV&&!Array.isArray(f))throw new Error("production"===process.env.NODE_ENV?Dt(6):"`enhancers` callback must return an array");if("production"!==process.env.NODE_ENV&&f.some(e=>"function"!=typeof e))throw new Error("production"===process.env.NODE_ENV?Dt(7):"each enhancer provided to configureStore must be a function");"production"!==process.env.NODE_ENV&&u.length&&f.includes(d);return ye(c,a,l(...f))}function Dt(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}lt(!1);var Ct=v(void 0),It=function(e){var t=e.children,o=M.useState(function(e){return e.snackbar});return n(Ct.Provider,{value:{showSnackbar:function(e,t){void 0===t&&(t="info"),M.update(function(n){n.snackbar.open=!0,n.snackbar.message=e,n.snackbar.severity=t})}},children:[t,r(m,{open:o.open,message:o.message,severity:o.severity,autoHideDuration:1500,onClose:function(){M.update(function(e){e.snackbar.open=!1})}})]})},Vt=function(e){var t=e.children,n=e.basename,o=e.reducers,i=void 0===o?{}:o,a=new O({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:!1,useErrorBoundary:!0}}}),s=U&&q&&W?"/".concat(q,"/").concat(W):"/";g(function(){"/"===window.location.pathname&&q&&W&&U&&window.location.replace(window.location.origin+"/".concat(q,"/").concat(W))},[q,U,W]);var c=At({reducer:ve(i)});return r(T,{store:c,children:r(P,{basename:null!=n?n:s,children:r(k,{client:a,children:r(It,{children:r(Q,{children:t})})})})})},Tt={isOpen:!1,title:"",message:"",confirmButtonText:"",cancelButtonText:"",type:"confirm",onConfirm:function(){},onCancel:function(){}},Rt=function(){var e=function(){M.update(function(e){e.confirmDialog=Tt})};return function(t){var n=t.title,r=t.message,o=t.confirmButtonText,i=t.cancelButtonText,a=t.type,s=void 0===a?"confirm":a;return new Promise(function(t){M.update(function(a){a.confirmDialog={isOpen:!0,title:n,message:r,confirmButtonText:o,cancelButtonText:i,type:s,onConfirm:function(){t(!0),e()},onCancel:function(){t(!1),e()}}})})}},Lt=function(e){return r(y,R({label:"Batch"},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/batches"}))},Kt=function(e){return r(y,R({dbLabelProps:{labelKey:"courseName",subLabelKey:"level"}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/courses"}))},Ft=function(e){return r(y,R({dbLabelProps:{labelKey:"name"},dbValueProps:{valueKey:"_id",isObjectId:!0}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/departments"}))},$t=function(e){return r(y,R({dbValueProps:{valueKey:"_id",isObjectId:!0},dbLabelProps:{labelKey:"fullName",subLabelKey:"employeeId"}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/employees"}))},zt=function(e){return r(y,R({label:"Regulation"},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/exam-regulations",dbLabelProps:{labelKey:"r.name"},dbValueProps:{valueKey:"r.name"}}))},Mt=[{label:"All",value:null},{label:"REGULAR",value:"R"},{label:"SUPPLEMENTARY",value:"S"}],Bt=function(e){return r(y,R({label:"Exam Type",options:Mt},e))},Ut=[{label:"Tuition Fee",value:"tuition_fee"},{label:"Admission Fee",value:"admission_fee"},{label:"Hostel Fee",value:"hostel_fee"},{label:"Transport Fee",value:"transport_fee"},{label:"Exam Fee",value:"exam_fee"},{label:"Other Fee",value:"other_fee"}],qt=Array.from({length:6},function(e,t){return(new Date).getFullYear()-t});Array.from({length:12},function(e,t){return{label:"".concat((new Date).getFullYear()-t," - ").concat((new Date).getFullYear()-t+1),value:"".concat((new Date).getFullYear()-t," - ").concat((new Date).getFullYear()-t+1)}});var Wt=function(e){return r(y,R({label:"Fee Type",options:null==Ut?void 0:Ut.map(function(e){return{label:e.label,value:e.value}})},e))},Yt=function(e){return r(y,R({dbValueProps:{valueKey:"id",isInt:!0},dbLabelProps:{labelKey:"name",subLabelKey:"type",useLabelStartCase:!0,useSubLabelStartCase:!0}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/hostel-blocks"}))},Ht=function(e){return r(y,R({label:"Hostel Room No.",dbValueProps:{valueKey:"floor"},dbLabelProps:{labelKey:"floor"}},e,{externalAxios:G,optionsApiEndPoint:"dropdowns/floors"}))},Xt=function(e){return r(y,R({label:"Hostel Room",dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"room_number",useLabelStartCase:!0}},e,{optionsApiEndPoint:"dropdowns/hostel-rooms",externalAxios:G}))},Gt=function(e){return r(y,R({label:"Month & Year"},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/month-years"}))},Jt=function(e){return r(y,R({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/print-formats"}))},Qt=function(e){return r(y,R({dbLabelProps:{labelKey:"branchCode",subLabelKey:"branchDisplay"}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/programs"}))},Zt=function(e){return r(y,R({label:"Regulation",dbValueProps:{valueKey:"regulation_id"},dbLabelProps:{labelKey:"r.name"}},e,{optionsApiEndPoint:"dropdowns/regulations",externalAxios:G}))},en=function(e){return r(y,R({dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"name",subLabelKey:"organization"}},e,{optionsApiEndPoint:"dropdowns/research-experts",externalAxios:G}))},tn=function(e){return r(y,R({dbValueProps:{valueKey:"`order`"},dbLabelProps:{labelKey:"name",subLabelKey:"`order`"}},e,{optionsApiEndPoint:"dropdowns/research-stages",externalAxios:G}))},nn=function(e){return r(y,R({dbLabelProps:{labelKey:"name",subLabelKey:"year"}},e,{optionsApiEndPoint:"/dropdowns/semesters",externalAxios:G}))},rn=function(e){return r(y,R({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/students"}))},on=function(e){return r(y,R({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:G,optionsApiEndPoint:"/dropdowns/student-services"}))},an=function(e){var t=e.suffix,n=void 0===t?null:t,o=e.valueKey,i=void 0===o?"yearRange":o,a=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}(e,["suffix","valueKey"]);return r(y,R({label:"Year Range",options:null==qt?void 0:qt.map(function(e){return{label:n?"".concat(n," ").concat(e," - ").concat(e+1):"".concat(e," - ").concat(e+1),value:"yearRange"===i?"".concat(e," - ").concat(e+1):e}})},a))},sn=function(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=!1);var r=window.location.pathname.split("/"),o=[];!t&&r[1]&&o.push(r[1]),!n&&r[2]&&o.push(r[2]);var i=o.length>0?"/"+o.join("/"):"",a="".concat(window.location.origin).concat(i,"/").concat(e);window.open(a,"_blank")};export{M as ApplicationStore,Lt as BatchSelector,Q as ConfirmDialogProvider,Kt as CourseSelector,Ft as DepartmentSelector,$t as EmployeesSelector,ae as ErrorBoundary,Bt as ExamTypeSelector,zt as ExamsRegulationSelector,Wt as FeeTypeSelector,Yt as HostelBlockSelector,Ht as HostelFloorSelector,Xt as HostelRoomSelector,Gt as MonthYearSelector,Jt as PrintFormatSelector,Qt as ProgramSelector,Vt as Providers,Zt as RegulationSelector,en as ResearchExpertSelector,tn as ResearchStageSelector,nn as SemesterSelector,It as SnackbarProvider,rn as StudentSelector,on as StudentServicesSelector,an as YearRangeSelector,H as axios,X as createRsbuildSharedConfig,z as initialApplicationState,q as institutionCode,B as isDevelopment,G as nonWorkspaceAxios,sn as openInNewTab,U as tenantCode,Rt as useConfirm,W as workspace,Y as workspaceApiMapping};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvanMtY29va2llL2Rpc3QvanMuY29va2llLm1qcyIsIi4uLy4uL3NyYy9jb250ZXh0L2FwcGxpY2F0aW9uLXN0b3JlLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2NvbnN0YW50cy50cyIsIi4uLy4uL3NyYy9jb25maWcvYXhpb3MudHMiLCIuLi8uLi9zcmMvY29uZmlnL2NyZWF0ZVJzYnVpbGRTaGFyZWRDb25maWcudHMiLCIuLi8uLi9zcmMvY29uZmlnL25vbldvcmtzcGFjZUF4aW9zLnRzIiwiLi4vLi4vc3JjL2NvbnRleHQvQ29uZmlybURpYWxvZ1Byb3ZpZGVyLnRzeCIsIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1lcnJvci1ib3VuZGFyeS9kaXN0L3JlYWN0LWVycm9yLWJvdW5kYXJ5LmVzbS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bob29rZm9ybS9yZXNvbHZlcnMveXVwL2Rpc3QveXVwLm1qcyIsIi4uLy4uL3NyYy9jb250ZXh0L0Vycm9yQm91bmRhcnkvTG9naW4udHN4IiwiLi4vLi4vc3JjL2NvbnRleHQvRXJyb3JCb3VuZGFyeS9FcnJvckJvdW5kYXJ5LnRzeCIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWR1eC9kaXN0L3JlZHV4Lm1qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcmVkdXhqcy90b29sa2l0L25vZGVfbW9kdWxlcy9pbW1lci9kaXN0L2ltbWVyLm1qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9yZWR1eC10aHVuay9kaXN0L3JlZHV4LXRodW5rLm1qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcmVkdXhqcy90b29sa2l0L2Rpc3QvcmVkdXgtdG9vbGtpdC5tb2Rlcm4ubWpzIiwiLi4vLi4vc3JjL2NvbnRleHQvU25hY2tiYXJQcm92aWRlci50c3giLCIuLi8uLi9zcmMvY29udGV4dC9Qcm92aWRlcnMudHN4IiwiLi4vLi4vc3JjL2hvb2tzL3VzZUNvbmZpcm0udHMiLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0JhdGNoU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Db3Vyc2VTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0RlcGFydG1lbnRTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0VtcGxveWVlc1NlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRXhhbVJlZ3VsYXRpb25TZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0V4YW1UeXBlU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy91dGlscy50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0ZlZVR5cGVTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0hvc3RlbEJsb2NrU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Ib3N0ZWxGbG9vclNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvSG9zdGVsUm9vbVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvTW9udGhZZWFyU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9QcmludEZvcm1hdFNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvUHJvZ3JhbVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvUmVndWxhdGlvblNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvUmVzZWFyY2hFeHBlcnRTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1Jlc2VhcmNoU3RhZ2VTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1NlbWVzdGVyU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9TdHVkZW50U2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9TdHVkZW50U2VydmljZXNTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1llYXJSYW5nZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy91dGlscy9vcGVuSW5OZXdUYWIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xyXG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XHJcbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xyXG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XHJcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcclxuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XHJcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xyXG4gICAgZG9uZSA9IHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xyXG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XHJcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xyXG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xyXG4gICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgdmFyIGFyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG93bktleXMobyk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XHJcbiAgICAgICAgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcclxuICAgICAgICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcclxuICAgICAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG5cclxufVxyXG5cclxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XHJcbiAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XHJcbiAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHZhciByLCBzID0gMDtcclxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBzIHw9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGZhaWwoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XHJcbiAgICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBfX2V4dGVuZHM6IF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduOiBfX2Fzc2lnbixcclxuICAgIF9fcmVzdDogX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZTogX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW06IF9fcGFyYW0sXHJcbiAgICBfX2VzRGVjb3JhdGU6IF9fZXNEZWNvcmF0ZSxcclxuICAgIF9fcnVuSW5pdGlhbGl6ZXJzOiBfX3J1bkluaXRpYWxpemVycyxcclxuICAgIF9fcHJvcEtleTogX19wcm9wS2V5LFxyXG4gICAgX19zZXRGdW5jdGlvbk5hbWU6IF9fc2V0RnVuY3Rpb25OYW1lLFxyXG4gICAgX19tZXRhZGF0YTogX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcjogX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nOiBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXI6IF9fZXhwb3J0U3RhcixcclxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZDogX19yZWFkLFxyXG4gICAgX19zcHJlYWQ6IF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheTogX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yOiBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdDogX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXI6IF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW46IF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxuICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlOiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlczogX19kaXNwb3NlUmVzb3VyY2VzLFxyXG4gICAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb246IF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxyXG59O1xyXG4iLCIvKiEganMtY29va2llIHYzLjAuNSB8IE1JVCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5mdW5jdGlvbiBhc3NpZ24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldFxufVxuLyogZXNsaW50LWVuYWJsZSBuby12YXIgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG52YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgcmVhZDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlWzBdID09PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyglW1xcZEEtRl17Mn0pKy9naSwgZGVjb2RlVVJJQ29tcG9uZW50KVxuICB9LFxuICB3cml0ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkucmVwbGFjZShcbiAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgIGRlY29kZVVSSUNvbXBvbmVudFxuICAgIClcbiAgfVxufTtcbi8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG5mdW5jdGlvbiBpbml0IChjb252ZXJ0ZXIsIGRlZmF1bHRBdHRyaWJ1dGVzKSB7XG4gIGZ1bmN0aW9uIHNldCAobmFtZSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgZGVmYXVsdEF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZTUpO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlcy5leHBpcmVzKSB7XG4gICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgICB9XG5cbiAgICBuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpXG4gICAgICAucmVwbGFjZSgvJSgyWzM0NkJdfDVFfDYwfDdDKS9nLCBkZWNvZGVVUklDb21wb25lbnQpXG4gICAgICAucmVwbGFjZSgvWygpXS9nLCBlc2NhcGUpO1xuXG4gICAgdmFyIHN0cmluZ2lmaWVkQXR0cmlidXRlcyA9ICcnO1xuICAgIGZvciAodmFyIGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykge1xuICAgICAgaWYgKCFhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblxuICAgICAgaWYgKGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gQ29uc2lkZXJzIFJGQyA2MjY1IHNlY3Rpb24gNS4yOlxuICAgICAgLy8gLi4uXG4gICAgICAvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG4gICAgICAvLyAgICAgY2hhcmFjdGVyOlxuICAgICAgLy8gQ29uc3VtZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyB1cCB0byxcbiAgICAgIC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuICAgICAgLy8gLi4uXG4gICAgICBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJz0nICsgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS5zcGxpdCgnOycpWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAoZG9jdW1lbnQuY29va2llID1cbiAgICAgIG5hbWUgKyAnPScgKyBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIG5hbWUpICsgc3RyaW5naWZpZWRBdHRyaWJ1dGVzKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0IChuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgKGFyZ3VtZW50cy5sZW5ndGggJiYgIW5hbWUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG4gICAgLy8gaW4gY2FzZSB0aGVyZSBhcmUgbm8gY29va2llcyBhdCBhbGwuXG4gICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUgPyBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsgJykgOiBbXTtcbiAgICB2YXIgamFyID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFydHMgPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7XG4gICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBmb3VuZCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1swXSk7XG4gICAgICAgIGphcltmb3VuZF0gPSBjb252ZXJ0ZXIucmVhZCh2YWx1ZSwgZm91bmQpO1xuXG4gICAgICAgIGlmIChuYW1lID09PSBmb3VuZCkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWUgPyBqYXJbbmFtZV0gOiBqYXJcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuY3JlYXRlKFxuICAgIHtcbiAgICAgIHNldCxcbiAgICAgIGdldCxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gKG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgc2V0KFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgYXNzaWduKHt9LCBhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICBleHBpcmVzOiAtMVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgd2l0aEF0dHJpYnV0ZXM6IGZ1bmN0aW9uIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiBpbml0KHRoaXMuY29udmVydGVyLCBhc3NpZ24oe30sIHRoaXMuYXR0cmlidXRlcywgYXR0cmlidXRlcykpXG4gICAgICB9LFxuICAgICAgd2l0aENvbnZlcnRlcjogZnVuY3Rpb24gKGNvbnZlcnRlcikge1xuICAgICAgICByZXR1cm4gaW5pdChhc3NpZ24oe30sIHRoaXMuY29udmVydGVyLCBjb252ZXJ0ZXIpLCB0aGlzLmF0dHJpYnV0ZXMpXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBhdHRyaWJ1dGVzOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGRlZmF1bHRBdHRyaWJ1dGVzKSB9LFxuICAgICAgY29udmVydGVyOiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKGNvbnZlcnRlcikgfVxuICAgIH1cbiAgKVxufVxuXG52YXIgYXBpID0gaW5pdChkZWZhdWx0Q29udmVydGVyLCB7IHBhdGg6ICcvJyB9KTtcbi8qIGVzbGludC1lbmFibGUgbm8tdmFyICovXG5cbmV4cG9ydCB7IGFwaSBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgeyBTdG9yZSB9IGZyb20gJ3B1bGxzdGF0ZSc7XG5leHBvcnQgdmFyIGluaXRpYWxBcHBsaWNhdGlvblN0YXRlID0ge1xuICAgIGlzTG9naW5EaWFsb2dPcGVuOiBmYWxzZSxcbiAgICBzbmFja2Jhcjoge1xuICAgICAgICBvcGVuOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIHNldmVyaXR5OiAnc3VjY2VzcycsXG4gICAgfSxcbiAgICBjb25maXJtRGlhbG9nOiB7XG4gICAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIG9uQ29uZmlybTogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvbkNhbmNlbDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICB0eXBlOiAnY29uZmlybScsXG4gICAgfSxcbiAgICB1c2VyOiB1bmRlZmluZWQsXG4gICAgaW5zdGl0dXRpb25JbmZvOiB1bmRlZmluZWQsXG4gICAgYXNzZXQ6IHVuZGVmaW5lZCxcbn07XG5leHBvcnQgdmFyIEFwcGxpY2F0aW9uU3RvcmUgPSBuZXcgU3RvcmUoaW5pdGlhbEFwcGxpY2F0aW9uU3RhdGUpO1xuIiwiZXhwb3J0IHZhciBpc0RldmVsb3BtZW50ID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluY2x1ZGVzKCdsb2NhbGhvc3QnKTtcbmV4cG9ydCB2YXIgdGVuYW50Q29kZSA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5zcGxpdCgnLicpWzBdO1xuLy8gaWYgdXJsIHNlYXJjaGVkIGlzIGF1cHVsc2UuY2FtcHguaW4gdGhlbiByZWRpcmVjdCB0byBhdXB1bHNlLmNhbXB4LmluL2F1cHVsc2VcbmV4cG9ydCB2YXIgaW5zdGl0dXRpb25Db2RlID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCcvJylbMV07XG5leHBvcnQgdmFyIHdvcmtzcGFjZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpWzJdO1xuLy8gV29ya3NwYWNlIHRvIEFQSSBlbmRwb2ludCBwcmVmaXggbWFwcGluZ1xuZXhwb3J0IHZhciB3b3Jrc3BhY2VBcGlNYXBwaW5nID0ge1xuICAgICdzdHVkZW50LXdvcmtzcGFjZSc6ICcvc3R1ZGVudC1hcGknLFxuICAgICdmYWN1bHR5LXdvcmtzcGFjZSc6ICcvZmFjdWx0eS1hcGknLFxuICAgICdkZXBhcnRtZW50LXdvcmtzcGFjZSc6ICcvZGVwYXJ0bWVudC1hcGknLFxuICAgICdhY2FkZW1pYy1jb29yZGluYXRvci13b3Jrc3BhY2UnOiAnL2FjYWRlbWljLWNvb3JkaW5hdG9yLWFwaScsXG4gICAgJ2ZlZWRiYWNrLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvZmVlZGJhY2stY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnY291cnNlLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvY291cnNlLWNvb3JkaW5hdG9yLWFwaScsXG4gICAgJ2NsYXNzcm9vbS1jb29yZGluYXRvci13b3Jrc3BhY2UnOiAnL2NsYXNzcm9vbS1jb29yZGluYXRvci1hcGknLFxuICAgICdjb2Utd29ya3NwYWNlJzogJy9jb2UtYXBpJyxcbiAgICAnYWNhZGVtaWMtYWRtaW4td29ya3NwYWNlJzogJy9hY2FkZW1pYy1hZG1pbi1hcGknLFxuICAgICdob3N0ZWwtYWRtaW4td29ya3NwYWNlJzogJy9ob3N0ZWwtYWRtaW4tYXBpJyxcbiAgICAndHJhbnNwb3J0LWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvdHJhbnNwb3J0LWNvb3JkaW5hdG9yLWFwaScsXG4gICAgJ2VtcGxveWVlLXdvcmtzcGFjZSc6ICcvZW1wbG95ZWUtYXBpJyxcbiAgICAnbGlicmFyaWFuLXdvcmtzcGFjZSc6ICcvbGlicmFyaWFuLWFwaScsXG4gICAgJ2ZlZS10ZXJtaW5hbCc6ICcvZmVlLXRlcm1pbmFsLWFwaScsXG4gICAgJ2FjY291bnRzLW9mZmljZXItd29ya3NwYWNlJzogJ2FjY291bnRzLW9mZmljZXItYXBpJyxcbiAgICAnZmluYW5jZS1vZmZpY2VyLXdvcmtzcGFjZSc6ICdmaW5hbmNlLW9mZmljZXItYXBpJyxcbiAgICAnb3V0cmVhY2gtYWdlbnQtd29ya3NwYWNlJzogJ291dHJlYWNoLWFnZW50LWFwaScsXG4gICAgJ3Byb3NwZWN0LXdvcmtzcGFjZSc6ICdwcm9zcGVjdC1hcGknLFxuICAgICdyZXNlYXJjaC1jb29yZGluYXRvci13b3Jrc3BhY2UnOiAncmVzZWFyY2gtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAndGVsZS1jb3Vuc2VsbG9yLXdvcmtzcGFjZSc6ICd0ZWxlLWNvdW5zZWxsb3ItYXBpJyxcbiAgICAndGVhbS1vd25lci13b3Jrc3BhY2UnOiAnL3RlYW0tb3duZXItYXBpJyxcbiAgICAnYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLXdvcmtzcGFjZSc6ICcvYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLWFwaScsXG4gICAgJ2FkbWlzc2lvbnMtb2ZmaWNlci13b3Jrc3BhY2UnOiAnL2FkbWlzc2lvbnMtb2ZmaWNlci1hcGknLFxufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L2FwcGxpY2F0aW9uLXN0b3JlJztcbmltcG9ydCB7IGluc3RpdHV0aW9uQ29kZSwgaXNEZXZlbG9wbWVudCwgdGVuYW50Q29kZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VBcGlNYXBwaW5nLCB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG4vLyBHZXQgYmFzZSBVUkwgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbnZhciBnZXRCYXNlVXJsID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIEZvciBDcmVhdGUgUmVhY3QgQXBwXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUElfSE9TVCB8fCAnJztcbn07XG4vLyBGb3JtYXQgcXVlcnkgcGFyYW1ldGVyc1xudmFyIGZvcm1hdFBhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHBhcmFtcyAhPT0gbnVsbCAmJiBwYXJhbXMgIT09IHZvaWQgMCA/IHBhcmFtcyA6IHt9KS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlID09PSAnX19lbXB0eV9fJyA/ICcnIDogdmFsdWUsXG4gICAgICAgIF07XG4gICAgfSkpO1xufTtcbi8vIENyZWF0ZSBheGlvcyBpbnN0YW5jZVxuZXhwb3J0IHZhciBheGlvcyA9IEF4aW9zLmNyZWF0ZSh7XG4gICAgYmFzZVVSTDogZ2V0QmFzZVVybCgpLFxuICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgICd4LXRlbmFudC1pZCc6IHRlbmFudENvZGUsXG4gICAgICAgICd4LWluc3RpdHV0aW9uLWNvZGUnOiBpbnN0aXR1dGlvbkNvZGUsXG4gICAgfSxcbn0pO1xuLy8gUmVxdWVzdCBpbnRlcmNlcHRvclxuYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAvLyBGb3JtYXQgcXVlcnkgcGFyYW1ldGVyc1xuICAgIHZhciBwYXJhbXMgPSBmb3JtYXRQYXJhbXMoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLnBhcmFtcyk7XG4gICAgLy8gSGFuZGxlIHdvcmtzcGFjZSByb3V0aW5nIChkZWZhdWx0OiB0cnVlKVxuICAgIGlmIChjb25maWcud29ya3NwYWNlICE9PSBmYWxzZSAmJlxuICAgICAgICB3b3Jrc3BhY2UgJiZcbiAgICAgICAgd29ya3NwYWNlQXBpTWFwcGluZ1t3b3Jrc3BhY2VdICYmXG4gICAgICAgIHdvcmtzcGFjZSAhPT0gJ2NvbW1vbi13b3Jrc3BhY2UnKSB7XG4gICAgICAgIHZhciB3b3Jrc3BhY2VQcmVmaXggPSB3b3Jrc3BhY2VBcGlNYXBwaW5nW3dvcmtzcGFjZV07XG4gICAgICAgIGNvbmZpZy51cmwgPSBcIlwiLmNvbmNhdCh3b3Jrc3BhY2VQcmVmaXgpLmNvbmNhdChjb25maWcudXJsKTtcbiAgICB9XG4gICAgLy8gQWRkIHNlc3Npb24gdG9rZW5zIGZyb20gY29va2llcyBpZiBpbiBkZXZlbG9wbWVudFxuICAgIHZhciBzZXNzaW9uS2V5ID0gQ29va2llcy5nZXQoJ2NhbXB4X3Nlc3Npb25fa2V5Jyk7XG4gICAgdmFyIG9wZW5QYXltZW50c0tleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9vcGVuX3BheW1lbnRzX2tleScpO1xuICAgIHZhciBzdHVkZW50U2Vzc2lvbktleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zdHVkZW50X2tleScpO1xuICAgIGlmIChpc0RldmVsb3BtZW50ICYmIHNlc3Npb25LZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9zZXNzaW9uX2tleScsIHNlc3Npb25LZXkpO1xuICAgIH1cbiAgICBpZiAoaXNEZXZlbG9wbWVudCAmJiBzdHVkZW50U2Vzc2lvbktleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X3N0dWRlbnRfa2V5Jywgc3R1ZGVudFNlc3Npb25LZXkpO1xuICAgIH1cbiAgICBpZiAob3BlblBheW1lbnRzS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfb3Blbl9wYXltZW50c19rZXknLCBvcGVuUGF5bWVudHNLZXkpO1xuICAgIH1cbiAgICAvLyBTa2lwIHNlbmRpbmcgWC1pbnN0aXR1dGlvbi1jb2RlIGlmIHRoZSBmbGFnIGlzIHNldFxuICAgIGlmIChjb25maWcuc2tpcEluc3RpdHV0aW9uQ29kZSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5kZWxldGUoJ3gtaW5zdGl0dXRpb24tY29kZScpO1xuICAgIH1cbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbmZpZyksIHsgcGFyYW1zOiBwYXJhbXMgfSk7XG59LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xufSk7XG4vLyBSZXNwb25zZSBpbnRlcmNlcHRvclxuYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBoaWRlU25hY2tiYXIgcHJvcGVydHlcbiAgICB2YXIgc2hvdWxkSGlkZVNuYWNrYmFyID0gKChfYSA9IHJlc3BvbnNlLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oaWRlU25hY2tiYXIpID09PSB0cnVlO1xuICAgIC8vIEhhbmRsZSBzdWNjZXNzZnVsIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmXG4gICAgICAgIHJlc3BvbnNlLmNvbmZpZy5tZXRob2QgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhyZXNwb25zZS5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbMjAwLCAyMDEsIDIwMl0uaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSByZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ09wZXJhdGlvbiBzdWNjZXNzZnVsJztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnc3VjY2Vzcyc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIC8vIENoZWNrIGlmIHRoZSBlcnJvciByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2IgPSAoX2EgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kYXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgZXJyb3IgcmVzcG9uc2VzXG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiYgWzQwMCwgNDIyLCA0MTNdLmluY2x1ZGVzKChfYyA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIGVycm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gZXJyLnJlc3BvbnNlLmRhdGEubWVzc2FnZSB8fCAnQmFkIFJlcXVlc3QnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdlcnJvcic7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXNob3VsZEhpZGVTbmFja2JhciAmJlxuICAgICAgICAoKF9kID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhlcnIucmVzcG9uc2UuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWzQwNF0uaW5jbHVkZXMoZXJyLnJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIG5vdCBmb3VuZCBlcnJvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IGVyci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ05vdCBGb3VuZCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ2Vycm9yJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBheGlvcztcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnNidWlsZFNoYXJlZENvbmZpZyhkZXBlbmRlbmNpZXMsIGFsd2F5c0VhZ2VyLCBzaGFyZWREZXBlbmRlbmNpZXNMaXN0KSB7XG4gICAgcmV0dXJuIHNoYXJlZERlcGVuZGVuY2llc0xpc3QucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBrZykge1xuICAgICAgICB2YXIgdmVyc2lvbiA9IGRlcGVuZGVuY2llc1twa2ddO1xuICAgICAgICBpZiAodmVyc2lvbikge1xuICAgICAgICAgICAgYWNjW3BrZ10gPSBfX2Fzc2lnbih7IHNpbmdsZXRvbjogdHJ1ZSwgcmVxdWlyZWRWZXJzaW9uOiB2ZXJzaW9uLCB2ZXJzaW9uOiB2ZXJzaW9uLnJlcGxhY2UoL15bXFxefl0vLCAnJykgfSwgKGFsd2F5c0VhZ2VyLmluY2x1ZGVzKHBrZykgPyB7IGVhZ2VyOiB0cnVlIH0gOiB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xufVxuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBBeGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvYXBwbGljYXRpb24tc3RvcmUnO1xuaW1wb3J0IHsgaW5zdGl0dXRpb25Db2RlLCBpc0RldmVsb3BtZW50LCB0ZW5hbnRDb2RlIH0gZnJvbSAnLi4vdXRpbHMvY29uc3RhbnRzJztcbi8vIEdldCBiYXNlIFVSTCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xudmFyIGdldEJhc2VVcmwgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gRm9yIENyZWF0ZSBSZWFjdCBBcHBcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0FQSV9IT1NUIHx8ICcnO1xufTtcbi8vIEZvcm1hdCBxdWVyeSBwYXJhbWV0ZXJzXG52YXIgZm9ybWF0UGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocGFyYW1zICE9PSBudWxsICYmIHBhcmFtcyAhPT0gdm9pZCAwID8gcGFyYW1zIDoge30pLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUgPT09ICdfX2VtcHR5X18nID8gJycgOiB2YWx1ZSxcbiAgICAgICAgXTtcbiAgICB9KSk7XG59O1xuLy8gQ3JlYXRlIGF4aW9zIGluc3RhbmNlIGZvciBzZWxlY3RvcnMgd2l0aCB3b3Jrc3BhY2U6IGZhbHNlXG5leHBvcnQgdmFyIG5vbldvcmtzcGFjZUF4aW9zID0gQXhpb3MuY3JlYXRlKHtcbiAgICBiYXNlVVJMOiBnZXRCYXNlVXJsKCksXG4gICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIHdvcmtzcGFjZTogZmFsc2UsXG4gICAgaGVhZGVyczoge1xuICAgICAgICAneC10ZW5hbnQtaWQnOiB0ZW5hbnRDb2RlLFxuICAgICAgICAneC1pbnN0aXR1dGlvbi1jb2RlJzogaW5zdGl0dXRpb25Db2RlLFxuICAgIH0sXG59KTtcbi8vIFJlcXVlc3QgaW50ZXJjZXB0b3Jcbm5vbldvcmtzcGFjZUF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgLy8gRm9ybWF0IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICB2YXIgcGFyYW1zID0gZm9ybWF0UGFyYW1zKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5wYXJhbXMpO1xuICAgIC8vIFNraXAgd29ya3NwYWNlIHJvdXRpbmcgc2luY2Ugd29ya3NwYWNlIGlzIHNldCB0byBmYWxzZVxuICAgIC8vIE5vIHdvcmtzcGFjZSByb3V0aW5nIGxvZ2ljIG5lZWRlZCBoZXJlXG4gICAgLy8gQWRkIHNlc3Npb24gdG9rZW5zIGZyb20gY29va2llcyBpZiBpbiBkZXZlbG9wbWVudFxuICAgIHZhciBzZXNzaW9uS2V5ID0gQ29va2llcy5nZXQoJ2NhbXB4X3Nlc3Npb25fa2V5Jyk7XG4gICAgdmFyIG9wZW5QYXltZW50c0tleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9vcGVuX3BheW1lbnRzX2tleScpO1xuICAgIHZhciBzdHVkZW50U2Vzc2lvbktleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zdHVkZW50X2tleScpO1xuICAgIGlmIChpc0RldmVsb3BtZW50ICYmIHNlc3Npb25LZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9zZXNzaW9uX2tleScsIHNlc3Npb25LZXkpO1xuICAgIH1cbiAgICBpZiAoaXNEZXZlbG9wbWVudCAmJiBzdHVkZW50U2Vzc2lvbktleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X3N0dWRlbnRfa2V5Jywgc3R1ZGVudFNlc3Npb25LZXkpO1xuICAgIH1cbiAgICBpZiAob3BlblBheW1lbnRzS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfb3Blbl9wYXltZW50c19rZXknLCBvcGVuUGF5bWVudHNLZXkpO1xuICAgIH1cbiAgICAvLyBTa2lwIHNlbmRpbmcgWC1pbnN0aXR1dGlvbi1jb2RlIGlmIHRoZSBmbGFnIGlzIHNldFxuICAgIGlmIChjb25maWcuc2tpcEluc3RpdHV0aW9uQ29kZSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5kZWxldGUoJ3gtaW5zdGl0dXRpb24tY29kZScpO1xuICAgIH1cbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbmZpZyksIHsgcGFyYW1zOiBwYXJhbXMgfSk7XG59LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xufSk7XG4vLyBSZXNwb25zZSBpbnRlcmNlcHRvclxubm9uV29ya3NwYWNlQXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBoaWRlU25hY2tiYXIgcHJvcGVydHlcbiAgICB2YXIgc2hvdWxkSGlkZVNuYWNrYmFyID0gKChfYSA9IHJlc3BvbnNlLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oaWRlU25hY2tiYXIpID09PSB0cnVlO1xuICAgIC8vIEhhbmRsZSBzdWNjZXNzZnVsIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmXG4gICAgICAgIHJlc3BvbnNlLmNvbmZpZy5tZXRob2QgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhyZXNwb25zZS5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbMjAwLCAyMDEsIDIwMl0uaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSByZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ09wZXJhdGlvbiBzdWNjZXNzZnVsJztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnc3VjY2Vzcyc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIC8vIENoZWNrIGlmIHRoZSBlcnJvciByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2IgPSAoX2EgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kYXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgZXJyb3IgcmVzcG9uc2VzXG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiYgWzQwMCwgNDIyXS5pbmNsdWRlcygoX2MgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBlcnJvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IGVyci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ0JhZCBSZXF1ZXN0JztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnZXJyb3InO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiZcbiAgICAgICAgKChfZCA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFsncHV0JywgJ3Bvc3QnLCAnZGVsZXRlJywgJ3BhdGNoJ10uaW5jbHVkZXMoZXJyLnJlc3BvbnNlLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFs0MDRdLmluY2x1ZGVzKGVyci5yZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBub3QgZm91bmQgZXJyb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSBlcnIucmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdOb3QgRm91bmQnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdlcnJvcic7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbm9uV29ya3NwYWNlQXhpb3M7XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZyB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuL2FwcGxpY2F0aW9uLXN0b3JlJztcbnZhciBDb25maXJtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe1xuICAgIHNob3dDb25maXJtRGlhbG9nOiBmdW5jdGlvbiAoKSB7IH0sXG59KTtcbmV4cG9ydCB2YXIgQ29uZmlybURpYWxvZ1Byb3ZpZGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW47XG4gICAgdmFyIGNvbmZpcm1EaWFsb2cgPSBBcHBsaWNhdGlvblN0b3JlLnVzZVN0YXRlKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLmNvbmZpcm1EaWFsb2c7IH0pO1xuICAgIHZhciBzaG93Q29uZmlybURpYWxvZyA9IGZ1bmN0aW9uICh0aXRsZSwgbWVzc2FnZSwgb25Db25maXJtLCBvbkNhbmNlbCwgdHlwZSwgY29uZmlybUJ1dHRvblRleHQsIGNhbmNlbEJ1dHRvblRleHQpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gJ2NvbmZpcm0nOyB9XG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLmNvbmZpcm1EaWFsb2cgPSB7XG4gICAgICAgICAgICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIG9uQ29uZmlybTogb25Db25maXJtLFxuICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiBvbkNhbmNlbCxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBjb25maXJtQnV0dG9uVGV4dCxcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiBjYW5jZWxCdXR0b25UZXh0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlQ2xvc2VEaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLmNvbmZpcm1EaWFsb2cuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIChfanN4cyhDb25maXJtQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogeyBzaG93Q29uZmlybURpYWxvZzogc2hvd0NvbmZpcm1EaWFsb2cgfSwgY2hpbGRyZW46IFtjaGlsZHJlbiwgX2pzeChDb25maXJtRGlhbG9nLCB7IGlzT3BlbjogY29uZmlybURpYWxvZy5pc09wZW4sIHRpdGxlOiBjb25maXJtRGlhbG9nLnRpdGxlLCBtZXNzYWdlOiBjb25maXJtRGlhbG9nLm1lc3NhZ2UsIHR5cGU6IGNvbmZpcm1EaWFsb2cudHlwZSwgY29uZmlybUJ1dHRvblRleHQ6IGNvbmZpcm1EaWFsb2cuY29uZmlybUJ1dHRvblRleHQsIGNhbmNlbEJ1dHRvblRleHQ6IGNvbmZpcm1EaWFsb2cuY2FuY2VsQnV0dG9uVGV4dCwgb25Db25maXJtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1EaWFsb2cub25Db25maXJtKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgfSwgb25DYW5jZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybURpYWxvZy5vbkNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZURpYWxvZygpO1xuICAgICAgICAgICAgICAgIH0gfSldIH0pKTtcbn07XG4iLCJmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCwgZSkge1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fID0gZSwgdDtcbiAgfSwgX3NldFByb3RvdHlwZU9mKHQsIGUpO1xufVxuZXhwb3J0IHsgX3NldFByb3RvdHlwZU9mIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZSc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbnZhciBjaGFuZ2VkQXJyYXkgPSBmdW5jdGlvbiBjaGFuZ2VkQXJyYXkoYSwgYikge1xuICBpZiAoYSA9PT0gdm9pZCAwKSB7XG4gICAgYSA9IFtdO1xuICB9XG5cbiAgaWYgKGIgPT09IHZvaWQgMCkge1xuICAgIGIgPSBbXTtcbiAgfVxuXG4gIHJldHVybiBhLmxlbmd0aCAhPT0gYi5sZW5ndGggfHwgYS5zb21lKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgIHJldHVybiAhT2JqZWN0LmlzKGl0ZW0sIGJbaW5kZXhdKTtcbiAgfSk7XG59O1xuXG52YXIgaW5pdGlhbFN0YXRlID0ge1xuICBlcnJvcjogbnVsbFxufTtcblxudmFyIEVycm9yQm91bmRhcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoRXJyb3JCb3VuZGFyeSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRXJyb3JCb3VuZGFyeSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgX2FyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBfYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KF9hcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcblxuICAgIF90aGlzLnJlc2V0RXJyb3JCb3VuZGFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcztcblxuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMucHJvcHMub25SZXNldCA9PSBudWxsID8gdm9pZCAwIDogKF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMpLm9uUmVzZXQuYXBwbHkoX3RoaXMkcHJvcHMsIGFyZ3MpO1xuXG4gICAgICBfdGhpcy5yZXNldCgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBFcnJvckJvdW5kYXJ5LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9O1xuXG4gIHZhciBfcHJvdG8gPSBFcnJvckJvdW5kYXJ5LnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHtcbiAgICB0aGlzLnNldFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZENhdGNoID0gZnVuY3Rpb24gY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGluZm8pIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMkb25FcnJvciwgX3RoaXMkcHJvcHMyO1xuXG4gICAgKF90aGlzJHByb3BzJG9uRXJyb3IgPSAoX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcykub25FcnJvcikgPT0gbnVsbCA/IHZvaWQgMCA6IF90aGlzJHByb3BzJG9uRXJyb3IuY2FsbChfdGhpcyRwcm9wczIsIGVycm9yLCBpbmZvKTtcbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgdmFyIGVycm9yID0gdGhpcy5zdGF0ZS5lcnJvcjtcbiAgICB2YXIgcmVzZXRLZXlzID0gdGhpcy5wcm9wcy5yZXNldEtleXM7IC8vIFRoZXJlJ3MgYW4gZWRnZSBjYXNlIHdoZXJlIGlmIHRoZSB0aGluZyB0aGF0IHRyaWdnZXJlZCB0aGUgZXJyb3JcbiAgICAvLyBoYXBwZW5zIHRvICphbHNvKiBiZSBpbiB0aGUgcmVzZXRLZXlzIGFycmF5LCB3ZSdkIGVuZCB1cCByZXNldHRpbmdcbiAgICAvLyB0aGUgZXJyb3IgYm91bmRhcnkgaW1tZWRpYXRlbHkuIFRoaXMgd291bGQgbGlrZWx5IHRyaWdnZXIgYSBzZWNvbmRcbiAgICAvLyBlcnJvciB0byBiZSB0aHJvd24uXG4gICAgLy8gU28gd2UgbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgY2hlY2sgdGhlIHJlc2V0S2V5cyBvbiB0aGUgZmlyc3QgY2FsbFxuICAgIC8vIG9mIGNEVSBhZnRlciB0aGUgZXJyb3IgaXMgc2V0XG5cbiAgICBpZiAoZXJyb3IgIT09IG51bGwgJiYgcHJldlN0YXRlLmVycm9yICE9PSBudWxsICYmIGNoYW5nZWRBcnJheShwcmV2UHJvcHMucmVzZXRLZXlzLCByZXNldEtleXMpKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMkb25SZXNldEtlLCBfdGhpcyRwcm9wczM7XG5cbiAgICAgIChfdGhpcyRwcm9wcyRvblJlc2V0S2UgPSAoX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcykub25SZXNldEtleXNDaGFuZ2UpID09IG51bGwgPyB2b2lkIDAgOiBfdGhpcyRwcm9wcyRvblJlc2V0S2UuY2FsbChfdGhpcyRwcm9wczMsIHByZXZQcm9wcy5yZXNldEtleXMsIHJlc2V0S2V5cyk7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIGVycm9yID0gdGhpcy5zdGF0ZS5lcnJvcjtcbiAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZmFsbGJhY2tSZW5kZXIgPSBfdGhpcyRwcm9wczQuZmFsbGJhY2tSZW5kZXIsXG4gICAgICAgIEZhbGxiYWNrQ29tcG9uZW50ID0gX3RoaXMkcHJvcHM0LkZhbGxiYWNrQ29tcG9uZW50LFxuICAgICAgICBmYWxsYmFjayA9IF90aGlzJHByb3BzNC5mYWxsYmFjaztcblxuICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9wcm9wcyA9IHtcbiAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICByZXNldEVycm9yQm91bmRhcnk6IHRoaXMucmVzZXRFcnJvckJvdW5kYXJ5XG4gICAgICB9O1xuXG4gICAgICBpZiAoIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChmYWxsYmFjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmFsbGJhY2tSZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrUmVuZGVyKF9wcm9wcyk7XG4gICAgICB9IGVsc2UgaWYgKEZhbGxiYWNrQ29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGYWxsYmFja0NvbXBvbmVudCwgX3Byb3BzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVhY3QtZXJyb3ItYm91bmRhcnkgcmVxdWlyZXMgZWl0aGVyIGEgZmFsbGJhY2ssIGZhbGxiYWNrUmVuZGVyLCBvciBGYWxsYmFja0NvbXBvbmVudCBwcm9wJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gIH07XG5cbiAgcmV0dXJuIEVycm9yQm91bmRhcnk7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmZ1bmN0aW9uIHdpdGhFcnJvckJvdW5kYXJ5KENvbXBvbmVudCwgZXJyb3JCb3VuZGFyeVByb3BzKSB7XG4gIHZhciBXcmFwcGVkID0gZnVuY3Rpb24gV3JhcHBlZChwcm9wcykge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFcnJvckJvdW5kYXJ5LCBlcnJvckJvdW5kYXJ5UHJvcHMsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgcHJvcHMpKTtcbiAgfTsgLy8gRm9ybWF0IGZvciBkaXNwbGF5IGluIERldlRvb2xzXG5cblxuICB2YXIgbmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnVW5rbm93bic7XG4gIFdyYXBwZWQuZGlzcGxheU5hbWUgPSBcIndpdGhFcnJvckJvdW5kYXJ5KFwiICsgbmFtZSArIFwiKVwiO1xuICByZXR1cm4gV3JhcHBlZDtcbn1cblxuZnVuY3Rpb24gdXNlRXJyb3JIYW5kbGVyKGdpdmVuRXJyb3IpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgICAgZXJyb3IgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRFcnJvciA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcblxuICBpZiAoZ2l2ZW5FcnJvciAhPSBudWxsKSB0aHJvdyBnaXZlbkVycm9yO1xuICBpZiAoZXJyb3IgIT0gbnVsbCkgdGhyb3cgZXJyb3I7XG4gIHJldHVybiBzZXRFcnJvcjtcbn1cbi8qXG5lc2xpbnRcbiAgQHR5cGVzY3JpcHQtZXNsaW50L3NvcnQtdHlwZS11bmlvbi1pbnRlcnNlY3Rpb24tbWVtYmVyczogXCJvZmZcIixcbiAgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRocm93LWxpdGVyYWw6IFwib2ZmXCIsXG4gIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nOiBcIm9mZlwiXG4qL1xuXG5leHBvcnQgeyBFcnJvckJvdW5kYXJ5LCB1c2VFcnJvckhhbmRsZXIsIHdpdGhFcnJvckJvdW5kYXJ5IH07XG4iLCJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHQsIG8pIHtcbiAgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSwgdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSB0LCBzZXRQcm90b3R5cGVPZih0LCBvKTtcbn1cbmV4cG9ydCB7IF9pbmhlcml0c0xvb3NlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnR7dmFsaWRhdGVGaWVsZHNOYXRpdmVseSBhcyBlLHRvTmVzdEVycm9yIGFzIHR9ZnJvbVwiQGhvb2tmb3JtL3Jlc29sdmVyc1wiO2ltcG9ydHthcHBlbmRFcnJvcnMgYXMgcn1mcm9tXCJyZWFjdC1ob29rLWZvcm1cIjt2YXIgbz1mdW5jdGlvbihvLG4sYSl7cmV0dXJuIHZvaWQgMD09PW4mJihuPXt9KSx2b2lkIDA9PT1hJiYoYT17fSksZnVuY3Rpb24ocyxpLGMpe3RyeXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZ1bmN0aW9uKHQscil7dHJ5e3ZhciB1PShuLmNvbnRleHQmJlwiZGV2ZWxvcG1lbnRcIj09PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZjb25zb2xlLndhcm4oXCJZb3Ugc2hvdWxkIG5vdCB1c2VkIHRoZSB5dXAgb3B0aW9ucyBjb250ZXh0LiBQbGVhc2UsIHVzZSB0aGUgJ3VzZUZvcm0nIGNvbnRleHQgb2JqZWN0IGluc3RlYWRcIiksUHJvbWlzZS5yZXNvbHZlKG9bXCJzeW5jXCI9PT1hLm1vZGU/XCJ2YWxpZGF0ZVN5bmNcIjpcInZhbGlkYXRlXCJdKHMsT2JqZWN0LmFzc2lnbih7YWJvcnRFYXJseTohMX0sbix7Y29udGV4dDppfSkpKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBjLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24mJmUoe30sYykse3ZhbHVlczphLnJhd1ZhbHVlcz9zOnQsZXJyb3JzOnt9fX0pKX1jYXRjaChlKXtyZXR1cm4gcihlKX1yZXR1cm4gdSYmdS50aGVuP3UudGhlbih2b2lkIDAscik6dX0oMCxmdW5jdGlvbihlKXtpZighZS5pbm5lcil0aHJvdyBlO3JldHVybnt2YWx1ZXM6e30sZXJyb3JzOnQoKG89ZSxuPSFjLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24mJlwiYWxsXCI9PT1jLmNyaXRlcmlhTW9kZSwoby5pbm5lcnx8W10pLnJlZHVjZShmdW5jdGlvbihlLHQpe2lmKGVbdC5wYXRoXXx8KGVbdC5wYXRoXT17bWVzc2FnZTp0Lm1lc3NhZ2UsdHlwZTp0LnR5cGV9KSxuKXt2YXIgbz1lW3QucGF0aF0udHlwZXMsYT1vJiZvW3QudHlwZV07ZVt0LnBhdGhdPXIodC5wYXRoLG4sZSx0LnR5cGUsYT9bXS5jb25jYXQoYSx0Lm1lc3NhZ2UpOnQubWVzc2FnZSl9cmV0dXJuIGV9LHt9KSksYyl9O3ZhciBvLG59KSl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfX19O2V4cG9ydHtvIGFzIHl1cFJlc29sdmVyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXl1cC5tb2R1bGUuanMubWFwXG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEJ1dHRvbiwgSWNvbnMsIFBhc3N3b3JkRmllbGQsIFRleHRGaWVsZCwgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IHl1cFJlc29sdmVyIH0gZnJvbSAnQGhvb2tmb3JtL3Jlc29sdmVycy95dXAnO1xuaW1wb3J0IERldmljZURldGVjdG9yIGZyb20gJ2RldmljZS1kZXRlY3Rvci1qcyc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbnRyb2xsZXIsIHVzZUZvcm0gfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlTXV0YXRpb24gfSBmcm9tICdyZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyB1c2VOYXZpZ2F0ZSB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0ICogYXMgWXVwIGZyb20gJ3l1cCc7XG5pbXBvcnQgeyBheGlvcyB9IGZyb20gJy4uLy4uL2NvbmZpZy9heGlvcyc7XG5pbXBvcnQgeyBpc0RldmVsb3BtZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uc3RhbnRzJztcbnZhciBwZXJmb3JtTG9naW4gPSBmdW5jdGlvbiAoYm9keSkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzcG9uc2UsIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgaWYgKCEoIWJvZHkubGF0aXR1ZGUgfHwgIWJvZHkubG9uZ2l0dWRlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZmV0Y2goJ2h0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2dlb2xvY2F0aW9uL3YxL2dlb2xvY2F0ZT9rZXk9QUl6YVN5QjJZQ3BvMXlpMTA3UllqMUxkWnUyRENjcGNPOTNyZUZZJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2lkZXJJcDogJ3RydWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZXNwb25zZS5qc29uKCldO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGRhdGEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgYm9keS5sYXRpdHVkZSA9IGRhdGEubG9jYXRpb24ubGF0O1xuICAgICAgICAgICAgICAgIGJvZHkubG9uZ2l0dWRlID0gZGF0YS5sb2NhdGlvbi5sbmc7XG4gICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgYXhpb3NcbiAgICAgICAgICAgICAgICAgICAgLnBvc3QoXCIvYXV0aC1zZXJ2ZXIvYXV0aC12Mi9sb2dpblwiLCBib2R5LCB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykgeyByZXR1cm4gcmVzLmRhdGE7IH0pXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG52YXIgdmFsaWRhdGlvblNjaGVtYSA9IFl1cC5vYmplY3QoKS5zaGFwZSh7XG4gICAgdXNlcm5hbWU6IFl1cC5zdHJpbmcoKS5yZXF1aXJlZCgnVXNlcm5hbWUgaXMgcmVxdWlyZWQnKSxcbiAgICBwYXNzd29yZDogWXVwLnN0cmluZygpLnJlcXVpcmVkKCdQYXNzd29yZCBpcyByZXF1aXJlZCcpLFxufSk7XG5leHBvcnQgdmFyIExvZ2luID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNsb3NlID0gX2EuY2xvc2U7XG4gICAgdmFyIF9iID0gdXNlU3RhdGUoe1xuICAgICAgICBkZXZpY2VJbmZvcm1hdGlvbjoge1xuICAgICAgICAgICAgZGV2aWNlVHlwZTogJ2Jyb3dzZXInLFxuICAgICAgICAgICAgY2xpZW50TmFtZTogJ3Vua25vd24nLFxuICAgICAgICAgICAgb3M6ICd1bmtub3duJyxcbiAgICAgICAgICAgIG9zVmVyc2lvbjogJ3Vua25vd24nLFxuICAgICAgICAgICAgbGF0aXR1ZGU6IG51bGwsXG4gICAgICAgICAgICBsb25naXR1ZGU6IG51bGwsXG4gICAgICAgICAgICB0b2tlblR5cGU6ICdXRUInLFxuICAgICAgICB9LFxuICAgICAgICBpc0xvY2F0aW9uQWxsb3dlZDogdHJ1ZSxcbiAgICB9KSwgZGV2aWNlU3RhdGUgPSBfYlswXSwgc2V0RGV2aWNlU3RhdGUgPSBfYlsxXTtcbiAgICB2YXIgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oZnVuY3Rpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBzZXREZXZpY2VTdGF0ZShmdW5jdGlvbiAocykgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzKSwgeyBkZXZpY2VJbmZvcm1hdGlvbjogX19hc3NpZ24oX19hc3NpZ24oe30sIHMuZGV2aWNlSW5mb3JtYXRpb24pLCB7IGxhdGl0dWRlOiBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUsIGxvbmdpdHVkZTogcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSB9KSB9KSk7IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbmF2aWdhdG9yLnBlcm1pc3Npb25zXG4gICAgICAgICAgICAucXVlcnkoeyBuYW1lOiAnZ2VvbG9jYXRpb24nIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocGVybWlzc2lvblN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25TdGF0dXMuc3RhdGUgPT09ICdkZW5pZWQnKSB7XG4gICAgICAgICAgICAgICAgc2V0RGV2aWNlU3RhdGUoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcyksIHsgaXNMb2NhdGlvbkFsbG93ZWQ6IGZhbHNlIH0pKTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZGV0ZWN0b3IgPSBuZXcgRGV2aWNlRGV0ZWN0b3IoKTtcbiAgICAgICAgdmFyIGRldmljZUluZm8gPSBkZXRlY3Rvci5wYXJzZShuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgICAgc2V0RGV2aWNlU3RhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICAgICAgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcyksIHsgZGV2aWNlSW5mb3JtYXRpb246IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzLmRldmljZUluZm9ybWF0aW9uKSwgeyBjbGllbnROYW1lOiAoKF9hID0gZGV2aWNlSW5mby5jbGllbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uYW1lKSB8fCBzLmRldmljZUluZm9ybWF0aW9uLmNsaWVudE5hbWUsIG9zOiAoKF9iID0gZGV2aWNlSW5mby5vcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm5hbWUpIHx8IHMuZGV2aWNlSW5mb3JtYXRpb24ub3MsIG9zVmVyc2lvbjogKChfYyA9IGRldmljZUluZm8ub3MpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy52ZXJzaW9uKSB8fCBzLmRldmljZUluZm9ybWF0aW9uLm9zVmVyc2lvbiB9KSB9KSk7XG4gICAgICAgIH0pO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgX2MgPSB1c2VGb3JtKHtcbiAgICAgICAgcmVzb2x2ZXI6IHl1cFJlc29sdmVyKHZhbGlkYXRpb25TY2hlbWEpLFxuICAgIH0pLCBoYW5kbGVTdWJtaXQgPSBfYy5oYW5kbGVTdWJtaXQsIGNvbnRyb2wgPSBfYy5jb250cm9sLCBlcnJvcnMgPSBfYy5mb3JtU3RhdGUuZXJyb3JzO1xuICAgIHZhciBfZCA9IHVzZU11dGF0aW9uKHBlcmZvcm1Mb2dpbiwge1xuICAgICAgICBvblN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICBpZiAoaXNEZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgIENvb2tpZXMucmVtb3ZlKCdjYW1weF9zZXNzaW9uX2tleScpO1xuICAgICAgICAgICAgICAgIENvb2tpZXMuc2V0KCdjYW1weF9zZXNzaW9uX2tleScsIGRhdGEuc2Vzc2lvbi50b2tlbik7XG4gICAgICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0ZShcIi9cIi5jb25jYXQoZGF0YS5zZXNzaW9uLmluc3RpdHV0aW9uQ29kZSwgXCIvd29ya3NwYWNlXCIpKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSksIG11dGF0ZSA9IF9kLm11dGF0ZSwgaXNMb2FkaW5nID0gX2QuaXNMb2FkaW5nO1xuICAgIHZhciBvblN1Ym1pdCA9IGZ1bmN0aW9uIChib2R5KSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBtdXRhdGUoX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIGJvZHkpLCBkZXZpY2VTdGF0ZS5kZXZpY2VJbmZvcm1hdGlvbiksIHsgbG9naW5JZDogYm9keS51c2VybmFtZSwgbG9naW5UeXBlOiAnVVNFUicgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICB9KTtcbiAgICB9KTsgfTtcbiAgICByZXR1cm4gKF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggZmxleC1jb2wgZ2FwLTgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHAtOFwiLCBjaGlsZHJlbjogW19qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaC05IHctNDhcIiwgY2hpbGRyZW46IF9qc3goSWNvbnMuQ2FtcHhGdWxsTG9nb0ljb24sIHt9KSB9KSwgX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBmbGV4LWNvbCBnYXAtNCB3LWZ1bGwgbWF4LXctWzQwMHB4XVwiLCBjaGlsZHJlbjogW19qc3goQ29udHJvbGxlciwgeyBjb250cm9sOiBjb250cm9sLCByZW5kZXI6IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IF9hLmZpZWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2pzeChUZXh0RmllbGQsIHsgbmFtZTogXCJ1c2VybmFtZVwiLCBwbGFjZWhvbGRlcjogXCJFbnRlciBVc2VybmFtZSBvciBFbWFpbFwiLCBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsIGxhYmVsOiBcIlVzZXJuYW1lIG9yIEVtYWlsXCIsIGVycm9yOiAhIWVycm9ycy51c2VybmFtZSwgcmVxdWlyZWQ6IHRydWUsIGZ1bGxXaWR0aDogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBuYW1lOiBcInVzZXJuYW1lXCIgfSksIF9qc3goQ29udHJvbGxlciwgeyBjb250cm9sOiBjb250cm9sLCByZW5kZXI6IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IF9hLmZpZWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2pzeChQYXNzd29yZEZpZWxkLCB7IG5hbWU6IFwicGFzc3dvcmRcIiwgcGxhY2Vob2xkZXI6IFwiRW50ZXIgcGFzc3dvcmRcIiwgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLCBsYWJlbDogXCJQYXNzd29yZFwiLCBlcnJvcjogISFlcnJvcnMucGFzc3dvcmQsIHJlcXVpcmVkOiB0cnVlLCBmdWxsV2lkdGg6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgbmFtZTogXCJwYXNzd29yZFwiIH0pLCBfanN4KEJ1dHRvbiwgeyB0eXBlOiBcInN1Ym1pdFwiLCBjb2xvcjogXCJwcmltYXJ5XCIsIHZhcmlhbnQ6IFwiZGVmYXVsdFwiLCBvbkNsaWNrOiBoYW5kbGVTdWJtaXQob25TdWJtaXQpLCBkaXNhYmxlZDogaXNMb2FkaW5nLCBsb2FkaW5nOiBpc0xvYWRpbmcsIGZ1bGxXaWR0aDogdHJ1ZSwgY2hpbGRyZW46IFwiTG9naW5cIiB9KV0gfSldIH0pKTtcbn07XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cywgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBCdXR0b24sIERpYWxvZywgSW50ZXJuYWxTZXJ2ZXJFcnJvciwgTm9JbnRlcm5lQ29ubmVjdGlvbiwgUmVzb3VyY2VOb3RGb3VuZCwgVW5BdXRob3JpemVkLCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRXJyb3JCb3VuZGFyeSBhcyBSZWFjdEVycm9yQm91bmRhcnkgfSBmcm9tICdyZWFjdC1lcnJvci1ib3VuZGFyeSc7XG5pbXBvcnQgeyBRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSB9IGZyb20gJ3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IHVzZUxvY2F0aW9uLCB1c2VOYXZpZ2F0ZSB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IHsgaW5zdGl0dXRpb25Db2RlLCB3b3Jrc3BhY2UgfSBmcm9tICcuLi8uLi91dGlscy9jb25zdGFudHMnO1xuaW1wb3J0IHsgTG9naW4gfSBmcm9tICcuL0xvZ2luJztcbmV4cG9ydCB2YXIgRXJyb3JCb3VuZGFyeSA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHZhciBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKCk7XG4gICAgcmV0dXJuIChfanN4KFF1ZXJ5RXJyb3JSZXNldEJvdW5kYXJ5LCB7IGNoaWxkcmVuOiBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHZhciByZXNldCA9IF9hLnJlc2V0O1xuICAgICAgICAgICAgcmV0dXJuIChfanN4KFJlYWN0RXJyb3JCb3VuZGFyeSwgeyBvblJlc2V0OiByZXNldCwgRmFsbGJhY2tDb21wb25lbnQ6IEVycm9yRmFsbGJhY2ssIGNoaWxkcmVuOiBwcm9wcy5jaGlsZHJlbiB9LCBsb2NhdGlvbiA9PT0gbnVsbCB8fCBsb2NhdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYXRpb24ucGF0aG5hbWUpKTtcbiAgICAgICAgfSB9KSk7XG59O1xudmFyIEVycm9yRmFsbGJhY2sgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2g7XG4gICAgdmFyIGVycm9yID0gX2EuZXJyb3IsIHJlc2V0RXJyb3JCb3VuZGFyeSA9IF9hLnJlc2V0RXJyb3JCb3VuZGFyeTtcbiAgICBpZiAoKF9iID0gZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc3RhdHVzKSB7XG4gICAgICAgIHN3aXRjaCAoKF9jID0gZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Muc3RhdHVzKSB7XG4gICAgICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2pzeChVbkF1dGgsIHt9KTtcbiAgICAgICAgICAgIGNhc2UgNTAwOlxuICAgICAgICAgICAgICAgIHJldHVybiBfanN4KEludGVybmFsU2VydmVyRXJyb3IsIHsgcmVzZXRCb3VuZGFyeTogcmVzZXRFcnJvckJvdW5kYXJ5IH0pO1xuICAgICAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9qc3goUmVzb3VyY2VOb3RGb3VuZCwgeyBtZXNzYWdlOiAoX2UgPSAoX2QgPSBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5kYXRhKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UubWVzc2FnZSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5jb2RlKSA9PT0gJ0VSUl9ORVRXT1JLJykge1xuICAgICAgICByZXR1cm4gX2pzeChOb0ludGVybmVDb25uZWN0aW9uLCB7IHJlc2V0Qm91bmRhcnk6IHJlc2V0RXJyb3JCb3VuZGFyeSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIChfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcIm10LTQgcC01XCIsIGNoaWxkcmVuOiBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJyZWxhdGl2ZSBoLTE1IGJvcmRlciBib3JkZXItcmVkLTIwMCBiZy1yZWQtNTAgZmxleCBpdGVtcy1jZW50ZXIgcm91bmRlZC1tZCAgcHgtMlwiLCBjaGlsZHJlbjogW19qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleC0xIHRleHQtcmVkLTcwMCBiZy10cmFuc3BhcmVudFwiLCBjaGlsZHJlbjogKF9oID0gKF9nID0gKF9mID0gZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YuZGF0YSkgPT09IG51bGwgfHwgX2cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nLm1lc3NhZ2UpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5tZXNzYWdlIH0pLCBfanN4KEJ1dHRvbiwgeyBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNldEVycm9yQm91bmRhcnkoKTsgfSwgc2l6ZTogXCJzbVwiLCB2YXJpYW50OiBcImxpbmtcIiwgY2xhc3NOYW1lOiBcImhvdmVyOm5vLXVuZGVybGluZSB0ZXh0LWRlc3RydWN0aXZlXCIsIGNoaWxkcmVuOiBcIlRyeSBBZ2FpblwiIH0pXSB9KSB9KSk7XG59O1xudmFyIFVuQXV0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICAgIHZhciBfYSA9IHVzZVN0YXRlKGZhbHNlKSwgaXNNb2RhbE9wZW4gPSBfYVswXSwgc2V0TW9kYWxPcGVuID0gX2FbMV07XG4gICAgdmFyIHNlc3Npb25Db29raWUgPSBDb29raWVzLmdldCgnY2FtcHhfc2Vzc2lvbl9rZXknKTtcbiAgICB2YXIgaGFuZGxlTG9naW5DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5zcGxpdCgnLicpWzFdID09PSAnbG9jYWxob3N0Jykge1xuICAgICAgICAgICAgc2V0TW9kYWxPcGVuKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFzZXNzaW9uQ29va2llKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtzcGFjZSA9PT0gJ3Byb3NwZWN0LXdvcmtzcGFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGUoXCJcIi5jb25jYXQoaW5zdGl0dXRpb25Db2RlLCBcIi9hdHMvbG9naW5cIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRlKCcvYXV0aC9sb2dpbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gKF9qc3goVW5BdXRob3JpemVkLCB7IGNvbXBvbmVudDogX2pzeHMoX0ZyYWdtZW50LCB7IGNoaWxkcmVuOiBbX2pzeChCdXR0b24sIHsgY2xhc3NOYW1lOiBcIm10LTVcIiwgdmFyaWFudDogXCJkZWZhdWx0XCIsIG9uQ2xpY2s6IGhhbmRsZUxvZ2luQ2xpY2ssIGNoaWxkcmVuOiBcIkNsaWNrIEhlcmUgVG8gTG9naW5cIiB9KSwgX2pzeChEaWFsb2csIHsgb3BlbjogaXNNb2RhbE9wZW4sIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNldE1vZGFsT3BlbihmYWxzZSk7IH0sIGNvbnRlbnQ6IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsb3NlID0gX2EuY2xvc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2pzeChMb2dpbiwgeyBjbG9zZTogY2xvc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gfSldIH0pIH0pKTtcbn07XG4iLCIvLyBzcmMvdXRpbHMvZm9ybWF0UHJvZEVycm9yTWVzc2FnZS50c1xuZnVuY3Rpb24gZm9ybWF0UHJvZEVycm9yTWVzc2FnZShjb2RlKSB7XG4gIHJldHVybiBgTWluaWZpZWQgUmVkdXggZXJyb3IgIyR7Y29kZX07IHZpc2l0IGh0dHBzOi8vcmVkdXguanMub3JnL0Vycm9ycz9jb2RlPSR7Y29kZX0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycy4gYDtcbn1cblxuLy8gc3JjL3V0aWxzL3N5bWJvbC1vYnNlcnZhYmxlLnRzXG52YXIgJCRvYnNlcnZhYmxlID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgXCJAQG9ic2VydmFibGVcIikoKTtcbnZhciBzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0ID0gJCRvYnNlcnZhYmxlO1xuXG4vLyBzcmMvdXRpbHMvYWN0aW9uVHlwZXMudHNcbnZhciByYW5kb21TdHJpbmcgPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoXCJcIikuam9pbihcIi5cIik7XG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IGBAQHJlZHV4L0lOSVQkey8qIEBfX1BVUkVfXyAqLyByYW5kb21TdHJpbmcoKX1gLFxuICBSRVBMQUNFOiBgQEByZWR1eC9SRVBMQUNFJHsvKiBAX19QVVJFX18gKi8gcmFuZG9tU3RyaW5nKCl9YCxcbiAgUFJPQkVfVU5LTk9XTl9BQ1RJT046ICgpID0+IGBAQHJlZHV4L1BST0JFX1VOS05PV05fQUNUSU9OJHtyYW5kb21TdHJpbmcoKX1gXG59O1xudmFyIGFjdGlvblR5cGVzX2RlZmF1bHQgPSBBY3Rpb25UeXBlcztcblxuLy8gc3JjL3V0aWxzL2lzUGxhaW5PYmplY3QudHNcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8IG9iaiA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGxldCBwcm90byA9IG9iajtcbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90byB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gbnVsbDtcbn1cblxuLy8gc3JjL3V0aWxzL2tpbmRPZi50c1xuZnVuY3Rpb24gbWluaUtpbmRPZih2YWwpIHtcbiAgaWYgKHZhbCA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICBpZiAodmFsID09PSBudWxsKVxuICAgIHJldHVybiBcIm51bGxcIjtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6IHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKVxuICAgIHJldHVybiBcImFycmF5XCI7XG4gIGlmIChpc0RhdGUodmFsKSlcbiAgICByZXR1cm4gXCJkYXRlXCI7XG4gIGlmIChpc0Vycm9yKHZhbCkpXG4gICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gY3Rvck5hbWUodmFsKTtcbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlIFwiU3ltYm9sXCI6XG4gICAgY2FzZSBcIlByb21pc2VcIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgY2FzZSBcIk1hcFwiOlxuICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCBcIlwiKTtcbn1cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gXCJmdW5jdGlvblwiID8gdmFsLmNvbnN0cnVjdG9yLm5hbWUgOiBudWxsO1xufVxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWwuY29uc3RydWN0b3IgJiYgdHlwZW9mIHZhbC5jb25zdHJ1Y3Rvci5zdGFja1RyYWNlTGltaXQgPT09IFwibnVtYmVyXCI7XG59XG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gdHlwZW9mIHZhbC50b0RhdGVTdHJpbmcgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgdmFsLnNldERhdGUgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgbGV0IHR5cGVPZlZhbCA9IHR5cGVvZiB2YWw7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB0eXBlT2ZWYWwgPSBtaW5pS2luZE9mKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLy8gc3JjL2NyZWF0ZVN0b3JlLnRzXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IGBFeHBlY3RlZCB0aGUgcm9vdCByZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YocmVkdWNlcil9J2ApO1xuICB9XG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZW5oYW5jZXIgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgZW5oYW5jZXIgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgYXJndW1lbnRzWzNdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgwKSA6IFwiSXQgbG9va3MgbGlrZSB5b3UgYXJlIHBhc3Npbmcgc2V2ZXJhbCBzdG9yZSBlbmhhbmNlcnMgdG8gY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gdG9nZXRoZXIgdG8gYSBzaW5nbGUgZnVuY3Rpb24uIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNjcmVhdGluZy1hLXN0b3JlLXdpdGgtZW5oYW5jZXJzIGZvciBhbiBleGFtcGxlLlwiKTtcbiAgfVxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGVuaGFuY2VyID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZW5oYW5jZXIgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgICBwcmVsb2FkZWRTdGF0ZSA9IHZvaWQgMDtcbiAgfVxuICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IGBFeHBlY3RlZCB0aGUgZW5oYW5jZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihlbmhhbmNlcil9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gZW5oYW5jZXIoY3JlYXRlU3RvcmUpKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgfVxuICBsZXQgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyO1xuICBsZXQgY3VycmVudFN0YXRlID0gcHJlbG9hZGVkU3RhdGU7XG4gIGxldCBjdXJyZW50TGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICBsZXQgbGlzdGVuZXJJZENvdW50ZXIgPSAwO1xuICBsZXQgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIGN1cnJlbnRMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIsIGtleSkgPT4ge1xuICAgICAgICBuZXh0TGlzdGVuZXJzLnNldChrZXksIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiBcIllvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuIFRoZSByZWR1Y2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIHRoZSBzdGF0ZSBhcyBhbiBhcmd1bWVudC4gUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS5cIik7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH1cbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IGBFeHBlY3RlZCB0aGUgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihsaXN0ZW5lcil9J2ApO1xuICAgIH1cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNSkgOiBcIllvdSBtYXkgbm90IGNhbGwgc3RvcmUuc3Vic2NyaWJlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiBJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSBjb21wb25lbnQgYW5kIGludm9rZSBzdG9yZS5nZXRTdGF0ZSgpIGluIHRoZSBjYWxsYmFjayB0byBhY2Nlc3MgdGhlIGxhdGVzdCBzdGF0ZS4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLlwiKTtcbiAgICB9XG4gICAgbGV0IGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgIGNvbnN0IGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkQ291bnRlcisrO1xuICAgIG5leHRMaXN0ZW5lcnMuc2V0KGxpc3RlbmVySWQsIGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg2KSA6IFwiWW91IG1heSBub3QgdW5zdWJzY3JpYmUgZnJvbSBhIHN0b3JlIGxpc3RlbmVyIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLlwiKTtcbiAgICAgIH1cbiAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgbmV4dExpc3RlbmVycy5kZWxldGUobGlzdGVuZXJJZCk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg3KSA6IGBBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJyR7a2luZE9mKGFjdGlvbil9Jy4gWW91IG1heSBuZWVkIHRvIGFkZCBtaWRkbGV3YXJlIHRvIHlvdXIgc3RvcmUgc2V0dXAgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIG90aGVyIHZhbHVlcywgc3VjaCBhcyAncmVkdXgtdGh1bmsnIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBmdW5jdGlvbnMuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNtaWRkbGV3YXJlIGFuZCBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNi1hc3luYy1sb2dpYyN1c2luZy10aGUtcmVkdXgtdGh1bmstbWlkZGxld2FyZSBmb3IgZXhhbXBsZXMuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDgpIDogJ0FjdGlvbnMgbWF5IG5vdCBoYXZlIGFuIHVuZGVmaW5lZCBcInR5cGVcIiBwcm9wZXJ0eS4gWW91IG1heSBoYXZlIG1pc3NwZWxsZWQgYW4gYWN0aW9uIHR5cGUgc3RyaW5nIGNvbnN0YW50LicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNykgOiBgQWN0aW9uIFwidHlwZVwiIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmcuIEluc3RlYWQsIHRoZSBhY3R1YWwgdHlwZSB3YXM6ICcke2tpbmRPZihhY3Rpb24udHlwZSl9Jy4gVmFsdWUgd2FzOiAnJHthY3Rpb24udHlwZX0nIChzdHJpbmdpZmllZClgKTtcbiAgICB9XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogXCJSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG4gICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH0pO1xuICAgIHJldHVybiBhY3Rpb247XG4gIH1cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEwKSA6IGBFeHBlY3RlZCB0aGUgbmV4dFJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihuZXh0UmVkdWNlcil9YCk7XG4gICAgfVxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5SRVBMQUNFXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICBjb25zdCBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbWluaW1hbCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgQW55IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIG9ic2VydmVyLlxuICAgICAgICogVGhlIG9ic2VydmVyIG9iamVjdCBzaG91bGQgaGF2ZSBhIGBuZXh0YCBtZXRob2QuXG4gICAgICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhbiBgdW5zdWJzY3JpYmVgIG1ldGhvZCB0aGF0IGNhblxuICAgICAgICogYmUgdXNlZCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSBmcm9tIHRoZSBzdG9yZSwgYW5kIHByZXZlbnQgZnVydGhlclxuICAgICAgICogZW1pc3Npb24gb2YgdmFsdWVzIGZyb20gdGhlIG9ic2VydmFibGUuXG4gICAgICAgKi9cbiAgICAgIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSBcIm9iamVjdFwiIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTEpIDogYEV4cGVjdGVkIHRoZSBvYnNlcnZlciB0byBiZSBhbiBvYmplY3QuIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2Yob2JzZXJ2ZXIpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBc09ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgICAgICAgaWYgKG9ic2VydmVyQXNPYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlckFzT2JzZXJ2ZXIubmV4dChnZXRTdGF0ZSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gb3V0ZXJTdWJzY3JpYmUob2JzZXJ2ZVN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bnN1YnNjcmliZVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIFtzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0XSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBkaXNwYXRjaCh7XG4gICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUXG4gIH0pO1xuICBjb25zdCBzdG9yZSA9IHtcbiAgICBkaXNwYXRjaCxcbiAgICBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGUsXG4gICAgcmVwbGFjZVJlZHVjZXIsXG4gICAgW3N5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHRdOiBvYnNlcnZhYmxlXG4gIH07XG4gIHJldHVybiBzdG9yZTtcbn1cbmZ1bmN0aW9uIGxlZ2FjeV9jcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcik7XG59XG5cbi8vIHNyYy91dGlscy93YXJuaW5nLnRzXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIHRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cblxuLy8gc3JjL2NvbWJpbmVSZWR1Y2Vycy50c1xuZnVuY3Rpb24gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShpbnB1dFN0YXRlLCByZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpIHtcbiAgY29uc3QgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIGNvbnN0IGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUID8gXCJwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmVcIiA6IFwicHJldmlvdXMgc3RhdGUgcmVjZWl2ZWQgYnkgdGhlIHJlZHVjZXJcIjtcbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlN0b3JlIGRvZXMgbm90IGhhdmUgYSB2YWxpZCByZWR1Y2VyLiBNYWtlIHN1cmUgdGhlIGFyZ3VtZW50IHBhc3NlZCB0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuXCI7XG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0U3RhdGUpKSB7XG4gICAgcmV0dXJuIGBUaGUgJHthcmd1bWVudE5hbWV9IGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXCIke2tpbmRPZihpbnB1dFN0YXRlKX1cIi4gRXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOiBcIiR7cmVkdWNlcktleXMuam9pbignXCIsIFwiJyl9XCJgO1xuICB9XG4gIGNvbnN0IHVuZXhwZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTdGF0ZSkuZmlsdGVyKChrZXkpID0+ICFyZWR1Y2Vycy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSk7XG4gIHVuZXhwZWN0ZWRLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldID0gdHJ1ZTtcbiAgfSk7XG4gIGlmIChhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IGFjdGlvblR5cGVzX2RlZmF1bHQuUkVQTEFDRSlcbiAgICByZXR1cm47XG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGBVbmV4cGVjdGVkICR7dW5leHBlY3RlZEtleXMubGVuZ3RoID4gMSA/IFwia2V5c1wiIDogXCJrZXlcIn0gXCIke3VuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpfVwiIGZvdW5kIGluICR7YXJndW1lbnROYW1lfS4gRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiR7cmVkdWNlcktleXMuam9pbignXCIsIFwiJyl9XCIuIFVuZXhwZWN0ZWQga2V5cyB3aWxsIGJlIGlnbm9yZWQuYDtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUXG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgeW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5QUk9CRV9VTktOT1dOX0FDVElPTigpXG4gICAgfSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gcHJvYmVkIHdpdGggYSByYW5kb20gdHlwZS4gRG9uJ3QgdHJ5IHRvIGhhbmRsZSAnJHthY3Rpb25UeXBlc19kZWZhdWx0LklOSVR9JyBvciBvdGhlciBhY3Rpb25zIGluIFwicmVkdXgvKlwiIG5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHVubGVzcyBpdCBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSBhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5gKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSB7XG4gIGNvbnN0IHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICBjb25zdCBmaW5hbFJlZHVjZXJzID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgd2FybmluZyhgTm8gcmVkdWNlciBwcm92aWRlZCBmb3Iga2V5IFwiJHtrZXl9XCJgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIGNvbnN0IGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTtcbiAgbGV0IHVuZXhwZWN0ZWRLZXlDYWNoZTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHt9O1xuICB9XG4gIGxldCBzaGFwZUFzc2VydGlvbkVycm9yO1xuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBjb21iaW5hdGlvbihzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPSBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKHN0YXRlLCBmaW5hbFJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSk7XG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgbmV4dFN0YXRlID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBmaW5hbFJlZHVjZXJLZXlzW2ldO1xuICAgICAgY29uc3QgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNba2V5XTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtrZXldO1xuICAgICAgY29uc3QgbmV4dFN0YXRlRm9yS2V5ID0gcmVkdWNlcihwcmV2aW91c1N0YXRlRm9yS2V5LCBhY3Rpb24pO1xuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uVHlwZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogYFdoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgJHthY3Rpb25UeXBlID8gYFwiJHtTdHJpbmcoYWN0aW9uVHlwZSl9XCJgIDogXCIodW5rbm93biB0eXBlKVwifSwgdGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7a2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZC4gVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBJZiB5b3Ugd2FudCB0aGlzIHJlZHVjZXIgdG8gaG9sZCBubyB2YWx1ZSwgeW91IGNhbiByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICAgIH1cbiAgICAgIG5leHRTdGF0ZVtrZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cbiAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoc3RhdGUpLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9O1xufVxuXG4vLyBzcmMvYmluZEFjdGlvbkNyZWF0b3JzLnRzXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIHJldHVybiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9ycyhhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyAhPT0gXCJvYmplY3RcIiB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IGBiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnJHtraW5kT2YoYWN0aW9uQ3JlYXRvcnMpfScuIERpZCB5b3Ugd3JpdGUgXCJpbXBvcnQgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiIGluc3RlYWQgb2YgXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXCI/YCk7XG4gIH1cbiAgY29uc3QgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIGNvbnN0IGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufVxuXG4vLyBzcmMvY29tcG9zZS50c1xuZnVuY3Rpb24gY29tcG9zZSguLi5mdW5jcykge1xuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhcmcpID0+IGFyZztcbiAgfVxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZ1bmNzWzBdO1xuICB9XG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoKGEsIGIpID0+ICguLi5hcmdzKSA9PiBhKGIoLi4uYXJncykpKTtcbn1cblxuLy8gc3JjL2FwcGx5TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKC4uLm1pZGRsZXdhcmVzKSB7XG4gIHJldHVybiAoY3JlYXRlU3RvcmUyKSA9PiAocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlMihyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gICAgbGV0IGRpc3BhdGNoID0gKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTUpIDogXCJEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiBPdGhlciBtaWRkbGV3YXJlIHdvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZGlzcGF0Y2guXCIpO1xuICAgIH07XG4gICAgY29uc3QgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgIGdldFN0YXRlOiBzdG9yZS5nZXRTdGF0ZSxcbiAgICAgIGRpc3BhdGNoOiAoYWN0aW9uLCAuLi5hcmdzKSA9PiBkaXNwYXRjaChhY3Rpb24sIC4uLmFyZ3MpXG4gICAgfTtcbiAgICBjb25zdCBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcCgobWlkZGxld2FyZSkgPT4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKSk7XG4gICAgZGlzcGF0Y2ggPSBjb21wb3NlKC4uLmNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0b3JlLFxuICAgICAgZGlzcGF0Y2hcbiAgICB9O1xuICB9O1xufVxuXG4vLyBzcmMvdXRpbHMvaXNBY3Rpb24udHNcbmZ1bmN0aW9uIGlzQWN0aW9uKGFjdGlvbikge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdChhY3Rpb24pICYmIFwidHlwZVwiIGluIGFjdGlvbiAmJiB0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwic3RyaW5nXCI7XG59XG5leHBvcnQge1xuICBhY3Rpb25UeXBlc19kZWZhdWx0IGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsXG4gIGFwcGx5TWlkZGxld2FyZSxcbiAgYmluZEFjdGlvbkNyZWF0b3JzLFxuICBjb21iaW5lUmVkdWNlcnMsXG4gIGNvbXBvc2UsXG4gIGNyZWF0ZVN0b3JlLFxuICBpc0FjdGlvbixcbiAgaXNQbGFpbk9iamVjdCxcbiAgbGVnYWN5X2NyZWF0ZVN0b3JlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdXgubWpzLm1hcCIsIi8vIHNyYy91dGlscy9lbnYudHNcbnZhciBOT1RISU5HID0gU3ltYm9sLmZvcihcImltbWVyLW5vdGhpbmdcIik7XG52YXIgRFJBRlRBQkxFID0gU3ltYm9sLmZvcihcImltbWVyLWRyYWZ0YWJsZVwiKTtcbnZhciBEUkFGVF9TVEFURSA9IFN5bWJvbC5mb3IoXCJpbW1lci1zdGF0ZVwiKTtcblxuLy8gc3JjL3V0aWxzL2Vycm9ycy50c1xudmFyIGVycm9ycyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFtcbiAgLy8gQWxsIGVycm9yIGNvZGVzLCBzdGFydGluZyBieSAwOlxuICBmdW5jdGlvbihwbHVnaW4pIHtcbiAgICByZXR1cm4gYFRoZSBwbHVnaW4gZm9yICcke3BsdWdpbn0nIGhhcyBub3QgYmVlbiBsb2FkZWQgaW50byBJbW1lci4gVG8gZW5hYmxlIHRoZSBwbHVnaW4sIGltcG9ydCBhbmQgY2FsbCBcXGBlbmFibGUke3BsdWdpbn0oKVxcYCB3aGVuIGluaXRpYWxpemluZyB5b3VyIGFwcGxpY2F0aW9uLmA7XG4gIH0sXG4gIGZ1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIGBwcm9kdWNlIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiB0aGluZ3MgdGhhdCBhcmUgZHJhZnRhYmxlOiBwbGFpbiBvYmplY3RzLCBhcnJheXMsIE1hcCwgU2V0IG9yIGNsYXNzZXMgdGhhdCBhcmUgbWFya2VkIHdpdGggJ1tpbW1lcmFibGVdOiB0cnVlJy4gR290ICcke3RoaW5nfSdgO1xuICB9LFxuICBcIlRoaXMgb2JqZWN0IGhhcyBiZWVuIGZyb3plbiBhbmQgc2hvdWxkIG5vdCBiZSBtdXRhdGVkXCIsXG4gIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICByZXR1cm4gXCJDYW5ub3QgdXNlIGEgcHJveHkgdGhhdCBoYXMgYmVlbiByZXZva2VkLiBEaWQgeW91IHBhc3MgYW4gb2JqZWN0IGZyb20gaW5zaWRlIGFuIGltbWVyIGZ1bmN0aW9uIHRvIGFuIGFzeW5jIHByb2Nlc3M/IFwiICsgZGF0YTtcbiAgfSxcbiAgXCJBbiBpbW1lciBwcm9kdWNlciByZXR1cm5lZCBhIG5ldyB2YWx1ZSAqYW5kKiBtb2RpZmllZCBpdHMgZHJhZnQuIEVpdGhlciByZXR1cm4gYSBuZXcgdmFsdWUgKm9yKiBtb2RpZnkgdGhlIGRyYWZ0LlwiLFxuICBcIkltbWVyIGZvcmJpZHMgY2lyY3VsYXIgcmVmZXJlbmNlc1wiLFxuICBcIlRoZSBmaXJzdCBvciBzZWNvbmQgYXJndW1lbnQgdG8gYHByb2R1Y2VgIG11c3QgYmUgYSBmdW5jdGlvblwiLFxuICBcIlRoZSB0aGlyZCBhcmd1bWVudCB0byBgcHJvZHVjZWAgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIHVuZGVmaW5lZFwiLFxuICBcIkZpcnN0IGFyZ3VtZW50IHRvIGBjcmVhdGVEcmFmdGAgbXVzdCBiZSBhIHBsYWluIG9iamVjdCwgYW4gYXJyYXksIG9yIGFuIGltbWVyYWJsZSBvYmplY3RcIixcbiAgXCJGaXJzdCBhcmd1bWVudCB0byBgZmluaXNoRHJhZnRgIG11c3QgYmUgYSBkcmFmdCByZXR1cm5lZCBieSBgY3JlYXRlRHJhZnRgXCIsXG4gIGZ1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIGAnY3VycmVudCcgZXhwZWN0cyBhIGRyYWZ0LCBnb3Q6ICR7dGhpbmd9YDtcbiAgfSxcbiAgXCJPYmplY3QuZGVmaW5lUHJvcGVydHkoKSBjYW5ub3QgYmUgdXNlZCBvbiBhbiBJbW1lciBkcmFmdFwiLFxuICBcIk9iamVjdC5zZXRQcm90b3R5cGVPZigpIGNhbm5vdCBiZSB1c2VkIG9uIGFuIEltbWVyIGRyYWZ0XCIsXG4gIFwiSW1tZXIgb25seSBzdXBwb3J0cyBkZWxldGluZyBhcnJheSBpbmRpY2VzXCIsXG4gIFwiSW1tZXIgb25seSBzdXBwb3J0cyBzZXR0aW5nIGFycmF5IGluZGljZXMgYW5kIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eVwiLFxuICBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiBgJ29yaWdpbmFsJyBleHBlY3RzIGEgZHJhZnQsIGdvdDogJHt0aGluZ31gO1xuICB9XG4gIC8vIE5vdGU6IGlmIG1vcmUgZXJyb3JzIGFyZSBhZGRlZCwgdGhlIGVycm9yT2Zmc2V0IGluIFBhdGNoZXMudHMgc2hvdWxkIGJlIGluY3JlYXNlZFxuICAvLyBTZWUgUGF0Y2hlcy50cyBmb3IgYWRkaXRpb25hbCBlcnJvcnNcbl0gOiBbXTtcbmZ1bmN0aW9uIGRpZShlcnJvciwgLi4uYXJncykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc3QgZSA9IGVycm9yc1tlcnJvcl07XG4gICAgY29uc3QgbXNnID0gdHlwZW9mIGUgPT09IFwiZnVuY3Rpb25cIiA/IGUuYXBwbHkobnVsbCwgYXJncykgOiBlO1xuICAgIHRocm93IG5ldyBFcnJvcihgW0ltbWVyXSAke21zZ31gKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFtJbW1lcl0gbWluaWZpZWQgZXJyb3IgbnI6ICR7ZXJyb3J9LiBGdWxsIGVycm9yIGF0OiBodHRwczovL2JpdC5seS8zY1hFS1dmYFxuICApO1xufVxuXG4vLyBzcmMvdXRpbHMvY29tbW9uLnRzXG52YXIgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5mdW5jdGlvbiBpc0RyYWZ0KHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmICEhdmFsdWVbRFJBRlRfU1RBVEVdO1xufVxuZnVuY3Rpb24gaXNEcmFmdGFibGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSB8fCAhIXZhbHVlW0RSQUZUQUJMRV0gfHwgISF2YWx1ZS5jb25zdHJ1Y3Rvcj8uW0RSQUZUQUJMRV0gfHwgaXNNYXAodmFsdWUpIHx8IGlzU2V0KHZhbHVlKTtcbn1cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci50b1N0cmluZygpO1xudmFyIGNhY2hlZEN0b3JTdHJpbmdzID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwgfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpXG4gICAgcmV0dXJuIHRydWU7XG4gIGNvbnN0IEN0b3IgPSBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgXCJjb25zdHJ1Y3RvclwiKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgaWYgKEN0b3IgPT09IE9iamVjdClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiBDdG9yICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBsZXQgY3RvclN0cmluZyA9IGNhY2hlZEN0b3JTdHJpbmdzLmdldChDdG9yKTtcbiAgaWYgKGN0b3JTdHJpbmcgPT09IHZvaWQgMCkge1xuICAgIGN0b3JTdHJpbmcgPSBGdW5jdGlvbi50b1N0cmluZy5jYWxsKEN0b3IpO1xuICAgIGNhY2hlZEN0b3JTdHJpbmdzLnNldChDdG9yLCBjdG9yU3RyaW5nKTtcbiAgfVxuICByZXR1cm4gY3RvclN0cmluZyA9PT0gb2JqZWN0Q3RvclN0cmluZztcbn1cbmZ1bmN0aW9uIG9yaWdpbmFsKHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdCh2YWx1ZSkpXG4gICAgZGllKDE1LCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZVtEUkFGVF9TVEFURV0uYmFzZV87XG59XG5mdW5jdGlvbiBlYWNoKG9iaiwgaXRlciwgc3RyaWN0ID0gdHJ1ZSkge1xuICBpZiAoZ2V0QXJjaHR5cGUob2JqKSA9PT0gMCAvKiBPYmplY3QgKi8pIHtcbiAgICBjb25zdCBrZXlzID0gc3RyaWN0ID8gUmVmbGVjdC5vd25LZXlzKG9iaikgOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpdGVyKGtleSwgb2JqW2tleV0sIG9iaik7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqLmZvckVhY2goKGVudHJ5LCBpbmRleCkgPT4gaXRlcihpbmRleCwgZW50cnksIG9iaikpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRBcmNodHlwZSh0aGluZykge1xuICBjb25zdCBzdGF0ZSA9IHRoaW5nW0RSQUZUX1NUQVRFXTtcbiAgcmV0dXJuIHN0YXRlID8gc3RhdGUudHlwZV8gOiBBcnJheS5pc0FycmF5KHRoaW5nKSA/IDEgLyogQXJyYXkgKi8gOiBpc01hcCh0aGluZykgPyAyIC8qIE1hcCAqLyA6IGlzU2V0KHRoaW5nKSA/IDMgLyogU2V0ICovIDogMCAvKiBPYmplY3QgKi87XG59XG5mdW5jdGlvbiBoYXModGhpbmcsIHByb3ApIHtcbiAgcmV0dXJuIGdldEFyY2h0eXBlKHRoaW5nKSA9PT0gMiAvKiBNYXAgKi8gPyB0aGluZy5oYXMocHJvcCkgOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpbmcsIHByb3ApO1xufVxuZnVuY3Rpb24gZ2V0KHRoaW5nLCBwcm9wKSB7XG4gIHJldHVybiBnZXRBcmNodHlwZSh0aGluZykgPT09IDIgLyogTWFwICovID8gdGhpbmcuZ2V0KHByb3ApIDogdGhpbmdbcHJvcF07XG59XG5mdW5jdGlvbiBzZXQodGhpbmcsIHByb3BPck9sZFZhbHVlLCB2YWx1ZSkge1xuICBjb25zdCB0ID0gZ2V0QXJjaHR5cGUodGhpbmcpO1xuICBpZiAodCA9PT0gMiAvKiBNYXAgKi8pXG4gICAgdGhpbmcuc2V0KHByb3BPck9sZFZhbHVlLCB2YWx1ZSk7XG4gIGVsc2UgaWYgKHQgPT09IDMgLyogU2V0ICovKSB7XG4gICAgdGhpbmcuYWRkKHZhbHVlKTtcbiAgfSBlbHNlXG4gICAgdGhpbmdbcHJvcE9yT2xkVmFsdWVdID0gdmFsdWU7XG59XG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzTWFwKHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgTWFwO1xufVxuZnVuY3Rpb24gaXNTZXQodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBTZXQ7XG59XG5mdW5jdGlvbiBsYXRlc3Qoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmNvcHlfIHx8IHN0YXRlLmJhc2VfO1xufVxuZnVuY3Rpb24gc2hhbGxvd0NvcHkoYmFzZSwgc3RyaWN0KSB7XG4gIGlmIChpc01hcChiYXNlKSkge1xuICAgIHJldHVybiBuZXcgTWFwKGJhc2UpO1xuICB9XG4gIGlmIChpc1NldChiYXNlKSkge1xuICAgIHJldHVybiBuZXcgU2V0KGJhc2UpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2UpKVxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChiYXNlKTtcbiAgY29uc3QgaXNQbGFpbiA9IGlzUGxhaW5PYmplY3QoYmFzZSk7XG4gIGlmIChzdHJpY3QgPT09IHRydWUgfHwgc3RyaWN0ID09PSBcImNsYXNzX29ubHlcIiAmJiAhaXNQbGFpbikge1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoYmFzZSk7XG4gICAgZGVsZXRlIGRlc2NyaXB0b3JzW0RSQUZUX1NUQVRFXTtcbiAgICBsZXQga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhkZXNjcmlwdG9ycyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgZGVzYyA9IGRlc2NyaXB0b3JzW2tleV07XG4gICAgICBpZiAoZGVzYy53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZGVzYy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkZXNjLmdldCB8fCBkZXNjLnNldClcbiAgICAgICAgZGVzY3JpcHRvcnNba2V5XSA9IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgLy8gY291bGQgbGl2ZSB3aXRoICEhZGVzYy5zZXQgYXMgd2VsbCBoZXJlLi4uXG4gICAgICAgICAgZW51bWVyYWJsZTogZGVzYy5lbnVtZXJhYmxlLFxuICAgICAgICAgIHZhbHVlOiBiYXNlW2tleV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2V0UHJvdG90eXBlT2YoYmFzZSksIGRlc2NyaXB0b3JzKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGJhc2UpO1xuICAgIGlmIChwcm90byAhPT0gbnVsbCAmJiBpc1BsYWluKSB7XG4gICAgICByZXR1cm4geyAuLi5iYXNlIH07XG4gICAgfVxuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUocHJvdG8pO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG9iaiwgYmFzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZyZWV6ZShvYmosIGRlZXAgPSBmYWxzZSkge1xuICBpZiAoaXNGcm96ZW4ob2JqKSB8fCBpc0RyYWZ0KG9iaikgfHwgIWlzRHJhZnRhYmxlKG9iaikpXG4gICAgcmV0dXJuIG9iajtcbiAgaWYgKGdldEFyY2h0eXBlKG9iaikgPiAxKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqLCB7XG4gICAgICBzZXQ6IGRvbnRNdXRhdGVNZXRob2RPdmVycmlkZSxcbiAgICAgIGFkZDogZG9udE11dGF0ZU1ldGhvZE92ZXJyaWRlLFxuICAgICAgY2xlYXI6IGRvbnRNdXRhdGVNZXRob2RPdmVycmlkZSxcbiAgICAgIGRlbGV0ZTogZG9udE11dGF0ZU1ldGhvZE92ZXJyaWRlXG4gICAgfSk7XG4gIH1cbiAgT2JqZWN0LmZyZWV6ZShvYmopO1xuICBpZiAoZGVlcClcbiAgICBPYmplY3QudmFsdWVzKG9iaikuZm9yRWFjaCgodmFsdWUpID0+IGZyZWV6ZSh2YWx1ZSwgdHJ1ZSkpO1xuICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gZG9udE11dGF0ZUZyb3plbkNvbGxlY3Rpb25zKCkge1xuICBkaWUoMik7XG59XG52YXIgZG9udE11dGF0ZU1ldGhvZE92ZXJyaWRlID0ge1xuICB2YWx1ZTogZG9udE11dGF0ZUZyb3plbkNvbGxlY3Rpb25zXG59O1xuZnVuY3Rpb24gaXNGcm96ZW4ob2JqKSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIilcbiAgICByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIE9iamVjdC5pc0Zyb3plbihvYmopO1xufVxuXG4vLyBzcmMvdXRpbHMvcGx1Z2lucy50c1xudmFyIHBsdWdpbnMgPSB7fTtcbmZ1bmN0aW9uIGdldFBsdWdpbihwbHVnaW5LZXkpIHtcbiAgY29uc3QgcGx1Z2luID0gcGx1Z2luc1twbHVnaW5LZXldO1xuICBpZiAoIXBsdWdpbikge1xuICAgIGRpZSgwLCBwbHVnaW5LZXkpO1xuICB9XG4gIHJldHVybiBwbHVnaW47XG59XG5mdW5jdGlvbiBsb2FkUGx1Z2luKHBsdWdpbktleSwgaW1wbGVtZW50YXRpb24pIHtcbiAgaWYgKCFwbHVnaW5zW3BsdWdpbktleV0pXG4gICAgcGx1Z2luc1twbHVnaW5LZXldID0gaW1wbGVtZW50YXRpb247XG59XG5cbi8vIHNyYy9jb3JlL3Njb3BlLnRzXG52YXIgY3VycmVudFNjb3BlO1xuZnVuY3Rpb24gZ2V0Q3VycmVudFNjb3BlKCkge1xuICByZXR1cm4gY3VycmVudFNjb3BlO1xufVxuZnVuY3Rpb24gY3JlYXRlU2NvcGUocGFyZW50XywgaW1tZXJfKSB7XG4gIHJldHVybiB7XG4gICAgZHJhZnRzXzogW10sXG4gICAgcGFyZW50XyxcbiAgICBpbW1lcl8sXG4gICAgLy8gV2hlbmV2ZXIgdGhlIG1vZGlmaWVkIGRyYWZ0IGNvbnRhaW5zIGEgZHJhZnQgZnJvbSBhbm90aGVyIHNjb3BlLCB3ZVxuICAgIC8vIG5lZWQgdG8gcHJldmVudCBhdXRvLWZyZWV6aW5nIHNvIHRoZSB1bm93bmVkIGRyYWZ0IGNhbiBiZSBmaW5hbGl6ZWQuXG4gICAgY2FuQXV0b0ZyZWV6ZV86IHRydWUsXG4gICAgdW5maW5hbGl6ZWREcmFmdHNfOiAwXG4gIH07XG59XG5mdW5jdGlvbiB1c2VQYXRjaGVzSW5TY29wZShzY29wZSwgcGF0Y2hMaXN0ZW5lcikge1xuICBpZiAocGF0Y2hMaXN0ZW5lcikge1xuICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIik7XG4gICAgc2NvcGUucGF0Y2hlc18gPSBbXTtcbiAgICBzY29wZS5pbnZlcnNlUGF0Y2hlc18gPSBbXTtcbiAgICBzY29wZS5wYXRjaExpc3RlbmVyXyA9IHBhdGNoTGlzdGVuZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHJldm9rZVNjb3BlKHNjb3BlKSB7XG4gIGxlYXZlU2NvcGUoc2NvcGUpO1xuICBzY29wZS5kcmFmdHNfLmZvckVhY2gocmV2b2tlRHJhZnQpO1xuICBzY29wZS5kcmFmdHNfID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGxlYXZlU2NvcGUoc2NvcGUpIHtcbiAgaWYgKHNjb3BlID09PSBjdXJyZW50U2NvcGUpIHtcbiAgICBjdXJyZW50U2NvcGUgPSBzY29wZS5wYXJlbnRfO1xuICB9XG59XG5mdW5jdGlvbiBlbnRlclNjb3BlKGltbWVyMikge1xuICByZXR1cm4gY3VycmVudFNjb3BlID0gY3JlYXRlU2NvcGUoY3VycmVudFNjb3BlLCBpbW1lcjIpO1xufVxuZnVuY3Rpb24gcmV2b2tlRHJhZnQoZHJhZnQpIHtcbiAgY29uc3Qgc3RhdGUgPSBkcmFmdFtEUkFGVF9TVEFURV07XG4gIGlmIChzdGF0ZS50eXBlXyA9PT0gMCAvKiBPYmplY3QgKi8gfHwgc3RhdGUudHlwZV8gPT09IDEgLyogQXJyYXkgKi8pXG4gICAgc3RhdGUucmV2b2tlXygpO1xuICBlbHNlXG4gICAgc3RhdGUucmV2b2tlZF8gPSB0cnVlO1xufVxuXG4vLyBzcmMvY29yZS9maW5hbGl6ZS50c1xuZnVuY3Rpb24gcHJvY2Vzc1Jlc3VsdChyZXN1bHQsIHNjb3BlKSB7XG4gIHNjb3BlLnVuZmluYWxpemVkRHJhZnRzXyA9IHNjb3BlLmRyYWZ0c18ubGVuZ3RoO1xuICBjb25zdCBiYXNlRHJhZnQgPSBzY29wZS5kcmFmdHNfWzBdO1xuICBjb25zdCBpc1JlcGxhY2VkID0gcmVzdWx0ICE9PSB2b2lkIDAgJiYgcmVzdWx0ICE9PSBiYXNlRHJhZnQ7XG4gIGlmIChpc1JlcGxhY2VkKSB7XG4gICAgaWYgKGJhc2VEcmFmdFtEUkFGVF9TVEFURV0ubW9kaWZpZWRfKSB7XG4gICAgICByZXZva2VTY29wZShzY29wZSk7XG4gICAgICBkaWUoNCk7XG4gICAgfVxuICAgIGlmIChpc0RyYWZ0YWJsZShyZXN1bHQpKSB7XG4gICAgICByZXN1bHQgPSBmaW5hbGl6ZShzY29wZSwgcmVzdWx0KTtcbiAgICAgIGlmICghc2NvcGUucGFyZW50XylcbiAgICAgICAgbWF5YmVGcmVlemUoc2NvcGUsIHJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChzY29wZS5wYXRjaGVzXykge1xuICAgICAgZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5nZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18oXG4gICAgICAgIGJhc2VEcmFmdFtEUkFGVF9TVEFURV0uYmFzZV8sXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgc2NvcGUucGF0Y2hlc18sXG4gICAgICAgIHNjb3BlLmludmVyc2VQYXRjaGVzX1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gZmluYWxpemUoc2NvcGUsIGJhc2VEcmFmdCwgW10pO1xuICB9XG4gIHJldm9rZVNjb3BlKHNjb3BlKTtcbiAgaWYgKHNjb3BlLnBhdGNoZXNfKSB7XG4gICAgc2NvcGUucGF0Y2hMaXN0ZW5lcl8oc2NvcGUucGF0Y2hlc18sIHNjb3BlLmludmVyc2VQYXRjaGVzXyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdCAhPT0gTk9USElORyA/IHJlc3VsdCA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplKHJvb3RTY29wZSwgdmFsdWUsIHBhdGgpIHtcbiAgaWYgKGlzRnJvemVuKHZhbHVlKSlcbiAgICByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHVzZVN0cmljdEl0ZXJhdGlvbiA9IHJvb3RTY29wZS5pbW1lcl8uc2hvdWxkVXNlU3RyaWN0SXRlcmF0aW9uKCk7XG4gIGNvbnN0IHN0YXRlID0gdmFsdWVbRFJBRlRfU1RBVEVdO1xuICBpZiAoIXN0YXRlKSB7XG4gICAgZWFjaChcbiAgICAgIHZhbHVlLFxuICAgICAgKGtleSwgY2hpbGRWYWx1ZSkgPT4gZmluYWxpemVQcm9wZXJ0eShyb290U2NvcGUsIHN0YXRlLCB2YWx1ZSwga2V5LCBjaGlsZFZhbHVlLCBwYXRoKSxcbiAgICAgIHVzZVN0cmljdEl0ZXJhdGlvblxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChzdGF0ZS5zY29wZV8gIT09IHJvb3RTY29wZSlcbiAgICByZXR1cm4gdmFsdWU7XG4gIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgbWF5YmVGcmVlemUocm9vdFNjb3BlLCBzdGF0ZS5iYXNlXywgdHJ1ZSk7XG4gICAgcmV0dXJuIHN0YXRlLmJhc2VfO1xuICB9XG4gIGlmICghc3RhdGUuZmluYWxpemVkXykge1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSB0cnVlO1xuICAgIHN0YXRlLnNjb3BlXy51bmZpbmFsaXplZERyYWZ0c18tLTtcbiAgICBjb25zdCByZXN1bHQgPSBzdGF0ZS5jb3B5XztcbiAgICBsZXQgcmVzdWx0RWFjaCA9IHJlc3VsdDtcbiAgICBsZXQgaXNTZXQyID0gZmFsc2U7XG4gICAgaWYgKHN0YXRlLnR5cGVfID09PSAzIC8qIFNldCAqLykge1xuICAgICAgcmVzdWx0RWFjaCA9IG5ldyBTZXQocmVzdWx0KTtcbiAgICAgIHJlc3VsdC5jbGVhcigpO1xuICAgICAgaXNTZXQyID0gdHJ1ZTtcbiAgICB9XG4gICAgZWFjaChcbiAgICAgIHJlc3VsdEVhY2gsXG4gICAgICAoa2V5LCBjaGlsZFZhbHVlKSA9PiBmaW5hbGl6ZVByb3BlcnR5KFxuICAgICAgICByb290U2NvcGUsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIGtleSxcbiAgICAgICAgY2hpbGRWYWx1ZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgaXNTZXQyXG4gICAgICApLFxuICAgICAgdXNlU3RyaWN0SXRlcmF0aW9uXG4gICAgKTtcbiAgICBtYXliZUZyZWV6ZShyb290U2NvcGUsIHJlc3VsdCwgZmFsc2UpO1xuICAgIGlmIChwYXRoICYmIHJvb3RTY29wZS5wYXRjaGVzXykge1xuICAgICAgZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5nZW5lcmF0ZVBhdGNoZXNfKFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcm9vdFNjb3BlLnBhdGNoZXNfLFxuICAgICAgICByb290U2NvcGUuaW52ZXJzZVBhdGNoZXNfXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RhdGUuY29weV87XG59XG5mdW5jdGlvbiBmaW5hbGl6ZVByb3BlcnR5KHJvb3RTY29wZSwgcGFyZW50U3RhdGUsIHRhcmdldE9iamVjdCwgcHJvcCwgY2hpbGRWYWx1ZSwgcm9vdFBhdGgsIHRhcmdldElzU2V0KSB7XG4gIGlmIChjaGlsZFZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGVvZiBjaGlsZFZhbHVlICE9PSBcIm9iamVjdFwiICYmICF0YXJnZXRJc1NldCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjaGlsZElzRnJvemVuID0gaXNGcm96ZW4oY2hpbGRWYWx1ZSk7XG4gIGlmIChjaGlsZElzRnJvemVuICYmICF0YXJnZXRJc1NldCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGNoaWxkVmFsdWUgPT09IHRhcmdldE9iamVjdClcbiAgICBkaWUoNSk7XG4gIGlmIChpc0RyYWZ0KGNoaWxkVmFsdWUpKSB7XG4gICAgY29uc3QgcGF0aCA9IHJvb3RQYXRoICYmIHBhcmVudFN0YXRlICYmIHBhcmVudFN0YXRlLnR5cGVfICE9PSAzIC8qIFNldCAqLyAmJiAvLyBTZXQgb2JqZWN0cyBhcmUgYXRvbWljIHNpbmNlIHRoZXkgaGF2ZSBubyBrZXlzLlxuICAgICFoYXMocGFyZW50U3RhdGUuYXNzaWduZWRfLCBwcm9wKSA/IHJvb3RQYXRoLmNvbmNhdChwcm9wKSA6IHZvaWQgMDtcbiAgICBjb25zdCByZXMgPSBmaW5hbGl6ZShyb290U2NvcGUsIGNoaWxkVmFsdWUsIHBhdGgpO1xuICAgIHNldCh0YXJnZXRPYmplY3QsIHByb3AsIHJlcyk7XG4gICAgaWYgKGlzRHJhZnQocmVzKSkge1xuICAgICAgcm9vdFNjb3BlLmNhbkF1dG9GcmVlemVfID0gZmFsc2U7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAodGFyZ2V0SXNTZXQpIHtcbiAgICB0YXJnZXRPYmplY3QuYWRkKGNoaWxkVmFsdWUpO1xuICB9XG4gIGlmIChpc0RyYWZ0YWJsZShjaGlsZFZhbHVlKSAmJiAhY2hpbGRJc0Zyb3plbikge1xuICAgIGlmICghcm9vdFNjb3BlLmltbWVyXy5hdXRvRnJlZXplXyAmJiByb290U2NvcGUudW5maW5hbGl6ZWREcmFmdHNfIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGFyZW50U3RhdGUgJiYgcGFyZW50U3RhdGUuYmFzZV8gJiYgcGFyZW50U3RhdGUuYmFzZV9bcHJvcF0gPT09IGNoaWxkVmFsdWUgJiYgY2hpbGRJc0Zyb3plbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmaW5hbGl6ZShyb290U2NvcGUsIGNoaWxkVmFsdWUpO1xuICAgIGlmICgoIXBhcmVudFN0YXRlIHx8ICFwYXJlbnRTdGF0ZS5zY29wZV8ucGFyZW50XykgJiYgdHlwZW9mIHByb3AgIT09IFwic3ltYm9sXCIgJiYgKGlzTWFwKHRhcmdldE9iamVjdCkgPyB0YXJnZXRPYmplY3QuaGFzKHByb3ApIDogT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRhcmdldE9iamVjdCwgcHJvcCkpKVxuICAgICAgbWF5YmVGcmVlemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gbWF5YmVGcmVlemUoc2NvcGUsIHZhbHVlLCBkZWVwID0gZmFsc2UpIHtcbiAgaWYgKCFzY29wZS5wYXJlbnRfICYmIHNjb3BlLmltbWVyXy5hdXRvRnJlZXplXyAmJiBzY29wZS5jYW5BdXRvRnJlZXplXykge1xuICAgIGZyZWV6ZSh2YWx1ZSwgZGVlcCk7XG4gIH1cbn1cblxuLy8gc3JjL2NvcmUvcHJveHkudHNcbmZ1bmN0aW9uIGNyZWF0ZVByb3h5UHJveHkoYmFzZSwgcGFyZW50KSB7XG4gIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGJhc2UpO1xuICBjb25zdCBzdGF0ZSA9IHtcbiAgICB0eXBlXzogaXNBcnJheSA/IDEgLyogQXJyYXkgKi8gOiAwIC8qIE9iamVjdCAqLyxcbiAgICAvLyBUcmFjayB3aGljaCBwcm9kdWNlIGNhbGwgdGhpcyBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgc2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCksXG4gICAgLy8gVHJ1ZSBmb3IgYm90aCBzaGFsbG93IGFuZCBkZWVwIGNoYW5nZXMuXG4gICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAvLyBVc2VkIGR1cmluZyBmaW5hbGl6YXRpb24uXG4gICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgLy8gVHJhY2sgd2hpY2ggcHJvcGVydGllcyBoYXZlIGJlZW4gYXNzaWduZWQgKHRydWUpIG9yIGRlbGV0ZWQgKGZhbHNlKS5cbiAgICBhc3NpZ25lZF86IHt9LFxuICAgIC8vIFRoZSBwYXJlbnQgZHJhZnQgc3RhdGUuXG4gICAgcGFyZW50XzogcGFyZW50LFxuICAgIC8vIFRoZSBiYXNlIHN0YXRlLlxuICAgIGJhc2VfOiBiYXNlLFxuICAgIC8vIFRoZSBiYXNlIHByb3h5LlxuICAgIGRyYWZ0XzogbnVsbCxcbiAgICAvLyBzZXQgYmVsb3dcbiAgICAvLyBUaGUgYmFzZSBjb3B5IHdpdGggYW55IHVwZGF0ZWQgdmFsdWVzLlxuICAgIGNvcHlfOiBudWxsLFxuICAgIC8vIENhbGxlZCBieSB0aGUgYHByb2R1Y2VgIGZ1bmN0aW9uLlxuICAgIHJldm9rZV86IG51bGwsXG4gICAgaXNNYW51YWxfOiBmYWxzZVxuICB9O1xuICBsZXQgdGFyZ2V0ID0gc3RhdGU7XG4gIGxldCB0cmFwcyA9IG9iamVjdFRyYXBzO1xuICBpZiAoaXNBcnJheSkge1xuICAgIHRhcmdldCA9IFtzdGF0ZV07XG4gICAgdHJhcHMgPSBhcnJheVRyYXBzO1xuICB9XG4gIGNvbnN0IHsgcmV2b2tlLCBwcm94eSB9ID0gUHJveHkucmV2b2NhYmxlKHRhcmdldCwgdHJhcHMpO1xuICBzdGF0ZS5kcmFmdF8gPSBwcm94eTtcbiAgc3RhdGUucmV2b2tlXyA9IHJldm9rZTtcbiAgcmV0dXJuIHByb3h5O1xufVxudmFyIG9iamVjdFRyYXBzID0ge1xuICBnZXQoc3RhdGUsIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gRFJBRlRfU1RBVEUpXG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgY29uc3Qgc291cmNlID0gbGF0ZXN0KHN0YXRlKTtcbiAgICBpZiAoIWhhcyhzb3VyY2UsIHByb3ApKSB7XG4gICAgICByZXR1cm4gcmVhZFByb3BGcm9tUHJvdG8oc3RhdGUsIHNvdXJjZSwgcHJvcCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW3Byb3BdO1xuICAgIGlmIChzdGF0ZS5maW5hbGl6ZWRfIHx8ICFpc0RyYWZ0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBwZWVrKHN0YXRlLmJhc2VfLCBwcm9wKSkge1xuICAgICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfW3Byb3BdID0gY3JlYXRlUHJveHkodmFsdWUsIHN0YXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICBoYXMoc3RhdGUsIHByb3ApIHtcbiAgICByZXR1cm4gcHJvcCBpbiBsYXRlc3Qoc3RhdGUpO1xuICB9LFxuICBvd25LZXlzKHN0YXRlKSB7XG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhsYXRlc3Qoc3RhdGUpKTtcbiAgfSxcbiAgc2V0KHN0YXRlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGNvbnN0IGRlc2MgPSBnZXREZXNjcmlwdG9yRnJvbVByb3RvKGxhdGVzdChzdGF0ZSksIHByb3ApO1xuICAgIGlmIChkZXNjPy5zZXQpIHtcbiAgICAgIGRlc2Muc2V0LmNhbGwoc3RhdGUuZHJhZnRfLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQyID0gcGVlayhsYXRlc3Qoc3RhdGUpLCBwcm9wKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnQyPy5bRFJBRlRfU1RBVEVdO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAmJiBjdXJyZW50U3RhdGUuYmFzZV8gPT09IHZhbHVlKSB7XG4gICAgICAgIHN0YXRlLmNvcHlfW3Byb3BdID0gdmFsdWU7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkX1twcm9wXSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyh2YWx1ZSwgY3VycmVudDIpICYmICh2YWx1ZSAhPT0gdm9pZCAwIHx8IGhhcyhzdGF0ZS5iYXNlXywgcHJvcCkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcHlfW3Byb3BdID09PSB2YWx1ZSAmJiAvLyBzcGVjaWFsIGNhc2U6IGhhbmRsZSBuZXcgcHJvcHMgd2l0aCB2YWx1ZSAndW5kZWZpbmVkJ1xuICAgICh2YWx1ZSAhPT0gdm9pZCAwIHx8IHByb3AgaW4gc3RhdGUuY29weV8pIHx8IC8vIHNwZWNpYWwgY2FzZTogTmFOXG4gICAgTnVtYmVyLmlzTmFOKHZhbHVlKSAmJiBOdW1iZXIuaXNOYU4oc3RhdGUuY29weV9bcHJvcF0pKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgc3RhdGUuY29weV9bcHJvcF0gPSB2YWx1ZTtcbiAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShzdGF0ZSwgcHJvcCkge1xuICAgIGlmIChwZWVrKHN0YXRlLmJhc2VfLCBwcm9wKSAhPT0gdm9pZCAwIHx8IHByb3AgaW4gc3RhdGUuYmFzZV8pIHtcbiAgICAgIHN0YXRlLmFzc2lnbmVkX1twcm9wXSA9IGZhbHNlO1xuICAgICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc3RhdGUuYXNzaWduZWRfW3Byb3BdO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY29weV8pIHtcbiAgICAgIGRlbGV0ZSBzdGF0ZS5jb3B5X1twcm9wXTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIE5vdGU6IFdlIG5ldmVyIGNvZXJjZSBgZGVzYy52YWx1ZWAgaW50byBhbiBJbW1lciBkcmFmdCwgYmVjYXVzZSB3ZSBjYW4ndCBtYWtlXG4gIC8vIHRoZSBzYW1lIGd1YXJhbnRlZSBpbiBFUzUgbW9kZS5cbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHN0YXRlLCBwcm9wKSB7XG4gICAgY29uc3Qgb3duZXIgPSBsYXRlc3Qoc3RhdGUpO1xuICAgIGNvbnN0IGRlc2MgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvd25lciwgcHJvcCk7XG4gICAgaWYgKCFkZXNjKVxuICAgICAgcmV0dXJuIGRlc2M7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBzdGF0ZS50eXBlXyAhPT0gMSAvKiBBcnJheSAqLyB8fCBwcm9wICE9PSBcImxlbmd0aFwiLFxuICAgICAgZW51bWVyYWJsZTogZGVzYy5lbnVtZXJhYmxlLFxuICAgICAgdmFsdWU6IG93bmVyW3Byb3BdXG4gICAgfTtcbiAgfSxcbiAgZGVmaW5lUHJvcGVydHkoKSB7XG4gICAgZGllKDExKTtcbiAgfSxcbiAgZ2V0UHJvdG90eXBlT2Yoc3RhdGUpIHtcbiAgICByZXR1cm4gZ2V0UHJvdG90eXBlT2Yoc3RhdGUuYmFzZV8pO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZigpIHtcbiAgICBkaWUoMTIpO1xuICB9XG59O1xudmFyIGFycmF5VHJhcHMgPSB7fTtcbmVhY2gob2JqZWN0VHJhcHMsIChrZXksIGZuKSA9PiB7XG4gIGFycmF5VHJhcHNba2V5XSA9IGZ1bmN0aW9uKCkge1xuICAgIGFyZ3VtZW50c1swXSA9IGFyZ3VtZW50c1swXVswXTtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0pO1xuYXJyYXlUcmFwcy5kZWxldGVQcm9wZXJ0eSA9IGZ1bmN0aW9uKHN0YXRlLCBwcm9wKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgaXNOYU4ocGFyc2VJbnQocHJvcCkpKVxuICAgIGRpZSgxMyk7XG4gIHJldHVybiBhcnJheVRyYXBzLnNldC5jYWxsKHRoaXMsIHN0YXRlLCBwcm9wLCB2b2lkIDApO1xufTtcbmFycmF5VHJhcHMuc2V0ID0gZnVuY3Rpb24oc3RhdGUsIHByb3AsIHZhbHVlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgcHJvcCAhPT0gXCJsZW5ndGhcIiAmJiBpc05hTihwYXJzZUludChwcm9wKSkpXG4gICAgZGllKDE0KTtcbiAgcmV0dXJuIG9iamVjdFRyYXBzLnNldC5jYWxsKHRoaXMsIHN0YXRlWzBdLCBwcm9wLCB2YWx1ZSwgc3RhdGVbMF0pO1xufTtcbmZ1bmN0aW9uIHBlZWsoZHJhZnQsIHByb3ApIHtcbiAgY29uc3Qgc3RhdGUgPSBkcmFmdFtEUkFGVF9TVEFURV07XG4gIGNvbnN0IHNvdXJjZSA9IHN0YXRlID8gbGF0ZXN0KHN0YXRlKSA6IGRyYWZ0O1xuICByZXR1cm4gc291cmNlW3Byb3BdO1xufVxuZnVuY3Rpb24gcmVhZFByb3BGcm9tUHJvdG8oc3RhdGUsIHNvdXJjZSwgcHJvcCkge1xuICBjb25zdCBkZXNjID0gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhzb3VyY2UsIHByb3ApO1xuICByZXR1cm4gZGVzYyA/IGB2YWx1ZWAgaW4gZGVzYyA/IGRlc2MudmFsdWUgOiAoXG4gICAgLy8gVGhpcyBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLCBpZiB0aGUgcHJvcCBpcyBhIGdldHRlciBkZWZpbmVkIGJ5IHRoZVxuICAgIC8vIHByb3RvdHlwZSwgd2Ugc2hvdWxkIGludm9rZSBpdCB3aXRoIHRoZSBkcmFmdCBhcyBjb250ZXh0IVxuICAgIGRlc2MuZ2V0Py5jYWxsKHN0YXRlLmRyYWZ0XylcbiAgKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGdldERlc2NyaXB0b3JGcm9tUHJvdG8oc291cmNlLCBwcm9wKSB7XG4gIGlmICghKHByb3AgaW4gc291cmNlKSlcbiAgICByZXR1cm4gdm9pZCAwO1xuICBsZXQgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihzb3VyY2UpO1xuICB3aGlsZSAocHJvdG8pIHtcbiAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgcHJvcCk7XG4gICAgaWYgKGRlc2MpXG4gICAgICByZXR1cm4gZGVzYztcbiAgICBwcm90byA9IGdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gbWFya0NoYW5nZWQoc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pIHtcbiAgICBzdGF0ZS5tb2RpZmllZF8gPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5wYXJlbnRfKSB7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZS5wYXJlbnRfKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVDb3B5KHN0YXRlKSB7XG4gIGlmICghc3RhdGUuY29weV8pIHtcbiAgICBzdGF0ZS5jb3B5XyA9IHNoYWxsb3dDb3B5KFxuICAgICAgc3RhdGUuYmFzZV8sXG4gICAgICBzdGF0ZS5zY29wZV8uaW1tZXJfLnVzZVN0cmljdFNoYWxsb3dDb3B5X1xuICAgICk7XG4gIH1cbn1cblxuLy8gc3JjL2NvcmUvaW1tZXJDbGFzcy50c1xudmFyIEltbWVyMiA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5hdXRvRnJlZXplXyA9IHRydWU7XG4gICAgdGhpcy51c2VTdHJpY3RTaGFsbG93Q29weV8gPSBmYWxzZTtcbiAgICB0aGlzLnVzZVN0cmljdEl0ZXJhdGlvbl8gPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvZHVjZWAgZnVuY3Rpb24gdGFrZXMgYSB2YWx1ZSBhbmQgYSBcInJlY2lwZSBmdW5jdGlvblwiICh3aG9zZVxuICAgICAqIHJldHVybiB2YWx1ZSBvZnRlbiBkZXBlbmRzIG9uIHRoZSBiYXNlIHN0YXRlKS4gVGhlIHJlY2lwZSBmdW5jdGlvbiBpc1xuICAgICAqIGZyZWUgdG8gbXV0YXRlIGl0cyBmaXJzdCBhcmd1bWVudCBob3dldmVyIGl0IHdhbnRzLiBBbGwgbXV0YXRpb25zIGFyZVxuICAgICAqIG9ubHkgZXZlciBhcHBsaWVkIHRvIGEgX19jb3B5X18gb2YgdGhlIGJhc2Ugc3RhdGUuXG4gICAgICpcbiAgICAgKiBQYXNzIG9ubHkgYSBmdW5jdGlvbiB0byBjcmVhdGUgYSBcImN1cnJpZWQgcHJvZHVjZXJcIiB3aGljaCByZWxpZXZlcyB5b3VcbiAgICAgKiBmcm9tIHBhc3NpbmcgdGhlIHJlY2lwZSBmdW5jdGlvbiBldmVyeSB0aW1lLlxuICAgICAqXG4gICAgICogT25seSBwbGFpbiBvYmplY3RzIGFuZCBhcnJheXMgYXJlIG1hZGUgbXV0YWJsZS4gQWxsIG90aGVyIG9iamVjdHMgYXJlXG4gICAgICogY29uc2lkZXJlZCB1bmNvcHlhYmxlLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBmdW5jdGlvbiBpcyBfX2JvdW5kX18gdG8gaXRzIGBJbW1lcmAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2FueX0gYmFzZSAtIHRoZSBpbml0aWFsIHN0YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVjaXBlIC0gZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBhIHByb3h5IG9mIHRoZSBiYXNlIHN0YXRlIGFzIGZpcnN0IGFyZ3VtZW50IGFuZCB3aGljaCBjYW4gYmUgZnJlZWx5IG1vZGlmaWVkXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGF0Y2hMaXN0ZW5lciAtIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbGwgdGhlIHBhdGNoZXMgcHJvZHVjZWQgaGVyZVxuICAgICAqIEByZXR1cm5zIHthbnl9IGEgbmV3IHN0YXRlLCBvciB0aGUgaW5pdGlhbCBzdGF0ZSBpZiBub3RoaW5nIHdhcyBtb2RpZmllZFxuICAgICAqL1xuICAgIHRoaXMucHJvZHVjZSA9IChiYXNlLCByZWNpcGUsIHBhdGNoTGlzdGVuZXIpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiByZWNpcGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCBkZWZhdWx0QmFzZSA9IHJlY2lwZTtcbiAgICAgICAgcmVjaXBlID0gYmFzZTtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjdXJyaWVkUHJvZHVjZShiYXNlMiA9IGRlZmF1bHRCYXNlLCAuLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYucHJvZHVjZShiYXNlMiwgKGRyYWZ0KSA9PiByZWNpcGUuY2FsbCh0aGlzLCBkcmFmdCwgLi4uYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZWNpcGUgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZGllKDYpO1xuICAgICAgaWYgKHBhdGNoTGlzdGVuZXIgIT09IHZvaWQgMCAmJiB0eXBlb2YgcGF0Y2hMaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBkaWUoNyk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgaWYgKGlzRHJhZnRhYmxlKGJhc2UpKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gZW50ZXJTY29wZSh0aGlzKTtcbiAgICAgICAgY29uc3QgcHJveHkgPSBjcmVhdGVQcm94eShiYXNlLCB2b2lkIDApO1xuICAgICAgICBsZXQgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlY2lwZShwcm94eSk7XG4gICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoaGFzRXJyb3IpXG4gICAgICAgICAgICByZXZva2VTY29wZShzY29wZSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGVhdmVTY29wZShzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdChyZXN1bHQsIHNjb3BlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWJhc2UgfHwgdHlwZW9mIGJhc2UgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVjaXBlKGJhc2UpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApXG4gICAgICAgICAgcmVzdWx0ID0gYmFzZTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gTk9USElORylcbiAgICAgICAgICByZXN1bHQgPSB2b2lkIDA7XG4gICAgICAgIGlmICh0aGlzLmF1dG9GcmVlemVfKVxuICAgICAgICAgIGZyZWV6ZShyZXN1bHQsIHRydWUpO1xuICAgICAgICBpZiAocGF0Y2hMaXN0ZW5lcikge1xuICAgICAgICAgIGNvbnN0IHAgPSBbXTtcbiAgICAgICAgICBjb25zdCBpcCA9IFtdO1xuICAgICAgICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKGJhc2UsIHJlc3VsdCwgcCwgaXApO1xuICAgICAgICAgIHBhdGNoTGlzdGVuZXIocCwgaXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2VcbiAgICAgICAgZGllKDEsIGJhc2UpO1xuICAgIH07XG4gICAgdGhpcy5wcm9kdWNlV2l0aFBhdGNoZXMgPSAoYmFzZSwgcmVjaXBlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGJhc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gKHN0YXRlLCAuLi5hcmdzKSA9PiB0aGlzLnByb2R1Y2VXaXRoUGF0Y2hlcyhzdGF0ZSwgKGRyYWZ0KSA9PiBiYXNlKGRyYWZ0LCAuLi5hcmdzKSk7XG4gICAgICB9XG4gICAgICBsZXQgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXM7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnByb2R1Y2UoYmFzZSwgcmVjaXBlLCAocCwgaXApID0+IHtcbiAgICAgICAgcGF0Y2hlcyA9IHA7XG4gICAgICAgIGludmVyc2VQYXRjaGVzID0gaXA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbcmVzdWx0LCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlc107XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIGNvbmZpZz8uYXV0b0ZyZWV6ZSA9PT0gXCJib29sZWFuXCIpXG4gICAgICB0aGlzLnNldEF1dG9GcmVlemUoY29uZmlnLmF1dG9GcmVlemUpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnPy51c2VTdHJpY3RTaGFsbG93Q29weSA9PT0gXCJib29sZWFuXCIpXG4gICAgICB0aGlzLnNldFVzZVN0cmljdFNoYWxsb3dDb3B5KGNvbmZpZy51c2VTdHJpY3RTaGFsbG93Q29weSk7XG4gICAgaWYgKHR5cGVvZiBjb25maWc/LnVzZVN0cmljdEl0ZXJhdGlvbiA9PT0gXCJib29sZWFuXCIpXG4gICAgICB0aGlzLnNldFVzZVN0cmljdEl0ZXJhdGlvbihjb25maWcudXNlU3RyaWN0SXRlcmF0aW9uKTtcbiAgfVxuICBjcmVhdGVEcmFmdChiYXNlKSB7XG4gICAgaWYgKCFpc0RyYWZ0YWJsZShiYXNlKSlcbiAgICAgIGRpZSg4KTtcbiAgICBpZiAoaXNEcmFmdChiYXNlKSlcbiAgICAgIGJhc2UgPSBjdXJyZW50KGJhc2UpO1xuICAgIGNvbnN0IHNjb3BlID0gZW50ZXJTY29wZSh0aGlzKTtcbiAgICBjb25zdCBwcm94eSA9IGNyZWF0ZVByb3h5KGJhc2UsIHZvaWQgMCk7XG4gICAgcHJveHlbRFJBRlRfU1RBVEVdLmlzTWFudWFsXyA9IHRydWU7XG4gICAgbGVhdmVTY29wZShzY29wZSk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG4gIGZpbmlzaERyYWZ0KGRyYWZ0LCBwYXRjaExpc3RlbmVyKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBkcmFmdCAmJiBkcmFmdFtEUkFGVF9TVEFURV07XG4gICAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuaXNNYW51YWxfKVxuICAgICAgZGllKDkpO1xuICAgIGNvbnN0IHsgc2NvcGVfOiBzY29wZSB9ID0gc3RhdGU7XG4gICAgdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpO1xuICAgIHJldHVybiBwcm9jZXNzUmVzdWx0KHZvaWQgMCwgc2NvcGUpO1xuICB9XG4gIC8qKlxuICAgKiBQYXNzIHRydWUgdG8gYXV0b21hdGljYWxseSBmcmVlemUgYWxsIGNvcGllcyBjcmVhdGVkIGJ5IEltbWVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhdXRvLWZyZWV6aW5nIGlzIGVuYWJsZWQuXG4gICAqL1xuICBzZXRBdXRvRnJlZXplKHZhbHVlKSB7XG4gICAgdGhpcy5hdXRvRnJlZXplXyA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBQYXNzIHRydWUgdG8gZW5hYmxlIHN0cmljdCBzaGFsbG93IGNvcHkuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGltbWVyIGRvZXMgbm90IGNvcHkgdGhlIG9iamVjdCBkZXNjcmlwdG9ycyBzdWNoIGFzIGdldHRlciwgc2V0dGVyIGFuZCBub24tZW51bXJhYmxlIHByb3BlcnRpZXMuXG4gICAqL1xuICBzZXRVc2VTdHJpY3RTaGFsbG93Q29weSh2YWx1ZSkge1xuICAgIHRoaXMudXNlU3RyaWN0U2hhbGxvd0NvcHlfID0gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFBhc3MgZmFsc2UgdG8gdXNlIGZhc3RlciBpdGVyYXRpb24gdGhhdCBza2lwcyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gICAqIGJ1dCBzdGlsbCBoYW5kbGVzIHN5bWJvbHMgZm9yIGNvbXBhdGliaWxpdHkuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHN0cmljdCBpdGVyYXRpb24gaXMgZW5hYmxlZCAoaW5jbHVkZXMgYWxsIG93biBwcm9wZXJ0aWVzKS5cbiAgICovXG4gIHNldFVzZVN0cmljdEl0ZXJhdGlvbih2YWx1ZSkge1xuICAgIHRoaXMudXNlU3RyaWN0SXRlcmF0aW9uXyA9IHZhbHVlO1xuICB9XG4gIHNob3VsZFVzZVN0cmljdEl0ZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy51c2VTdHJpY3RJdGVyYXRpb25fO1xuICB9XG4gIGFwcGx5UGF0Y2hlcyhiYXNlLCBwYXRjaGVzKSB7XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gcGF0Y2hlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgcGF0Y2ggPSBwYXRjaGVzW2ldO1xuICAgICAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAwICYmIHBhdGNoLm9wID09PSBcInJlcGxhY2VcIikge1xuICAgICAgICBiYXNlID0gcGF0Y2gudmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA+IC0xKSB7XG4gICAgICBwYXRjaGVzID0gcGF0Y2hlcy5zbGljZShpICsgMSk7XG4gICAgfVxuICAgIGNvbnN0IGFwcGx5UGF0Y2hlc0ltcGwgPSBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmFwcGx5UGF0Y2hlc187XG4gICAgaWYgKGlzRHJhZnQoYmFzZSkpIHtcbiAgICAgIHJldHVybiBhcHBseVBhdGNoZXNJbXBsKGJhc2UsIHBhdGNoZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm9kdWNlKFxuICAgICAgYmFzZSxcbiAgICAgIChkcmFmdCkgPT4gYXBwbHlQYXRjaGVzSW1wbChkcmFmdCwgcGF0Y2hlcylcbiAgICApO1xuICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlUHJveHkodmFsdWUsIHBhcmVudCkge1xuICBjb25zdCBkcmFmdCA9IGlzTWFwKHZhbHVlKSA/IGdldFBsdWdpbihcIk1hcFNldFwiKS5wcm94eU1hcF8odmFsdWUsIHBhcmVudCkgOiBpc1NldCh2YWx1ZSkgPyBnZXRQbHVnaW4oXCJNYXBTZXRcIikucHJveHlTZXRfKHZhbHVlLCBwYXJlbnQpIDogY3JlYXRlUHJveHlQcm94eSh2YWx1ZSwgcGFyZW50KTtcbiAgY29uc3Qgc2NvcGUgPSBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCk7XG4gIHNjb3BlLmRyYWZ0c18ucHVzaChkcmFmdCk7XG4gIHJldHVybiBkcmFmdDtcbn1cblxuLy8gc3JjL2NvcmUvY3VycmVudC50c1xuZnVuY3Rpb24gY3VycmVudCh2YWx1ZSkge1xuICBpZiAoIWlzRHJhZnQodmFsdWUpKVxuICAgIGRpZSgxMCwgdmFsdWUpO1xuICByZXR1cm4gY3VycmVudEltcGwodmFsdWUpO1xufVxuZnVuY3Rpb24gY3VycmVudEltcGwodmFsdWUpIHtcbiAgaWYgKCFpc0RyYWZ0YWJsZSh2YWx1ZSkgfHwgaXNGcm96ZW4odmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgY29uc3Qgc3RhdGUgPSB2YWx1ZVtEUkFGVF9TVEFURV07XG4gIGxldCBjb3B5O1xuICBsZXQgc3RyaWN0ID0gdHJ1ZTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pXG4gICAgICByZXR1cm4gc3RhdGUuYmFzZV87XG4gICAgc3RhdGUuZmluYWxpemVkXyA9IHRydWU7XG4gICAgY29weSA9IHNoYWxsb3dDb3B5KHZhbHVlLCBzdGF0ZS5zY29wZV8uaW1tZXJfLnVzZVN0cmljdFNoYWxsb3dDb3B5Xyk7XG4gICAgc3RyaWN0ID0gc3RhdGUuc2NvcGVfLmltbWVyXy5zaG91bGRVc2VTdHJpY3RJdGVyYXRpb24oKTtcbiAgfSBlbHNlIHtcbiAgICBjb3B5ID0gc2hhbGxvd0NvcHkodmFsdWUsIHRydWUpO1xuICB9XG4gIGVhY2goXG4gICAgY29weSxcbiAgICAoa2V5LCBjaGlsZFZhbHVlKSA9PiB7XG4gICAgICBzZXQoY29weSwga2V5LCBjdXJyZW50SW1wbChjaGlsZFZhbHVlKSk7XG4gICAgfSxcbiAgICBzdHJpY3RcbiAgKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgc3RhdGUuZmluYWxpemVkXyA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBjb3B5O1xufVxuXG4vLyBzcmMvcGx1Z2lucy9wYXRjaGVzLnRzXG5mdW5jdGlvbiBlbmFibGVQYXRjaGVzKCkge1xuICBjb25zdCBlcnJvck9mZnNldCA9IDE2O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgZXJyb3JzLnB1c2goXG4gICAgICAnU2V0cyBjYW5ub3QgaGF2ZSBcInJlcGxhY2VcIiBwYXRjaGVzLicsXG4gICAgICBmdW5jdGlvbihvcCkge1xuICAgICAgICByZXR1cm4gXCJVbnN1cHBvcnRlZCBwYXRjaCBvcGVyYXRpb246IFwiICsgb3A7XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gXCJDYW5ub3QgYXBwbHkgcGF0Y2gsIHBhdGggZG9lc24ndCByZXNvbHZlOiBcIiArIHBhdGg7XG4gICAgICB9LFxuICAgICAgXCJQYXRjaGluZyByZXNlcnZlZCBhdHRyaWJ1dGVzIGxpa2UgX19wcm90b19fLCBwcm90b3R5cGUgYW5kIGNvbnN0cnVjdG9yIGlzIG5vdCBhbGxvd2VkXCJcbiAgICApO1xuICB9XG4gIGNvbnN0IFJFUExBQ0UgPSBcInJlcGxhY2VcIjtcbiAgY29uc3QgQUREID0gXCJhZGRcIjtcbiAgY29uc3QgUkVNT1ZFID0gXCJyZW1vdmVcIjtcbiAgZnVuY3Rpb24gZ2VuZXJhdGVQYXRjaGVzXyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgc3dpdGNoIChzdGF0ZS50eXBlXykge1xuICAgICAgY2FzZSAwIC8qIE9iamVjdCAqLzpcbiAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZVBhdGNoZXNGcm9tQXNzaWduZWQoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgYmFzZVBhdGgsXG4gICAgICAgICAgcGF0Y2hlcyxcbiAgICAgICAgICBpbnZlcnNlUGF0Y2hlc1xuICAgICAgICApO1xuICAgICAgY2FzZSAxIC8qIEFycmF5ICovOlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVBcnJheVBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcyk7XG4gICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVTZXRQYXRjaGVzKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGJhc2VQYXRoLFxuICAgICAgICAgIHBhdGNoZXMsXG4gICAgICAgICAgaW52ZXJzZVBhdGNoZXNcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVBcnJheVBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIGxldCB7IGJhc2VfLCBhc3NpZ25lZF8gfSA9IHN0YXRlO1xuICAgIGxldCBjb3B5XyA9IHN0YXRlLmNvcHlfO1xuICAgIGlmIChjb3B5Xy5sZW5ndGggPCBiYXNlXy5sZW5ndGgpIHtcbiAgICAgIDtcbiAgICAgIFtiYXNlXywgY29weV9dID0gW2NvcHlfLCBiYXNlX107XG4gICAgICBbcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXNdID0gW2ludmVyc2VQYXRjaGVzLCBwYXRjaGVzXTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXNlXy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFzc2lnbmVkX1tpXSAmJiBjb3B5X1tpXSAhPT0gYmFzZV9baV0pIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgLy8gTmVlZCB0byBtYXliZSBjbG9uZSBpdCwgYXMgaXQgY2FuIGluIGZhY3QgYmUgdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgICAgICAgLy8gZHVlIHRvIHRoZSBiYXNlL2NvcHkgaW52ZXJzaW9uIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgICAgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGNvcHlfW2ldKVxuICAgICAgICB9KTtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoYmFzZV9baV0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gYmFzZV8ubGVuZ3RoOyBpIDwgY29weV8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgIG9wOiBBREQsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIC8vIE5lZWQgdG8gbWF5YmUgY2xvbmUgaXQsIGFzIGl0IGNhbiBpbiBmYWN0IGJlIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICAvLyBkdWUgdG8gdGhlIGJhc2UvY29weSBpbnZlcnNpb24gYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGNvcHlfW2ldKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBjb3B5Xy5sZW5ndGggLSAxOyBiYXNlXy5sZW5ndGggPD0gaTsgLS1pKSB7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlUGF0Y2hlc0Zyb21Bc3NpZ25lZChzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgY29uc3QgeyBiYXNlXywgY29weV8gfSA9IHN0YXRlO1xuICAgIGVhY2goc3RhdGUuYXNzaWduZWRfLCAoa2V5LCBhc3NpZ25lZFZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcmlnVmFsdWUgPSBnZXQoYmFzZV8sIGtleSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdldChjb3B5Xywga2V5KTtcbiAgICAgIGNvbnN0IG9wID0gIWFzc2lnbmVkVmFsdWUgPyBSRU1PVkUgOiBoYXMoYmFzZV8sIGtleSkgPyBSRVBMQUNFIDogQUREO1xuICAgICAgaWYgKG9yaWdWYWx1ZSA9PT0gdmFsdWUgJiYgb3AgPT09IFJFUExBQ0UpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoa2V5KTtcbiAgICAgIHBhdGNoZXMucHVzaChvcCA9PT0gUkVNT1ZFID8geyBvcCwgcGF0aCB9IDogeyBvcCwgcGF0aCwgdmFsdWUgfSk7XG4gICAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKFxuICAgICAgICBvcCA9PT0gQUREID8geyBvcDogUkVNT1ZFLCBwYXRoIH0gOiBvcCA9PT0gUkVNT1ZFID8geyBvcDogQURELCBwYXRoLCB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob3JpZ1ZhbHVlKSB9IDogeyBvcDogUkVQTEFDRSwgcGF0aCwgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKG9yaWdWYWx1ZSkgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZVNldFBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIGxldCB7IGJhc2VfLCBjb3B5XyB9ID0gc3RhdGU7XG4gICAgbGV0IGkgPSAwO1xuICAgIGJhc2VfLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWNvcHlfLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBSRU1PVkUsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMudW5zaGlmdCh7XG4gICAgICAgICAgb3A6IEFERCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH0pO1xuICAgIGkgPSAwO1xuICAgIGNvcHlfLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWJhc2VfLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBBREQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMudW5zaGlmdCh7XG4gICAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhiYXNlVmFsdWUsIHJlcGxhY2VtZW50LCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogUkVQTEFDRSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgdmFsdWU6IHJlcGxhY2VtZW50ID09PSBOT1RISU5HID8gdm9pZCAwIDogcmVwbGFjZW1lbnRcbiAgICB9KTtcbiAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgcGF0aDogW10sXG4gICAgICB2YWx1ZTogYmFzZVZhbHVlXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gYXBwbHlQYXRjaGVzXyhkcmFmdCwgcGF0Y2hlcykge1xuICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgIGNvbnN0IHsgcGF0aCwgb3AgfSA9IHBhdGNoO1xuICAgICAgbGV0IGJhc2UgPSBkcmFmdDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFyZW50VHlwZSA9IGdldEFyY2h0eXBlKGJhc2UpO1xuICAgICAgICBsZXQgcCA9IHBhdGhbaV07XG4gICAgICAgIGlmICh0eXBlb2YgcCAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgcCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHAgPSBcIlwiICsgcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHBhcmVudFR5cGUgPT09IDAgLyogT2JqZWN0ICovIHx8IHBhcmVudFR5cGUgPT09IDEgLyogQXJyYXkgKi8pICYmIChwID09PSBcIl9fcHJvdG9fX1wiIHx8IHAgPT09IFwiY29uc3RydWN0b3JcIikpXG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMyk7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gXCJmdW5jdGlvblwiICYmIHAgPT09IFwicHJvdG90eXBlXCIpXG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMyk7XG4gICAgICAgIGJhc2UgPSBnZXQoYmFzZSwgcCk7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZSAhPT0gXCJvYmplY3RcIilcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAyLCBwYXRoLmpvaW4oXCIvXCIpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRBcmNodHlwZShiYXNlKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGVlcENsb25lUGF0Y2hWYWx1ZShwYXRjaC52YWx1ZSk7XG4gICAgICBjb25zdCBrZXkgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICAgIGNhc2UgUkVQTEFDRTpcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIGRpZShlcnJvck9mZnNldCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIEFERDpcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGtleSA9PT0gXCItXCIgPyBiYXNlLnB1c2godmFsdWUpIDogYmFzZS5zcGxpY2Uoa2V5LCAwLCB2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5hZGQodmFsdWUpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBSRU1PVkU6XG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDEgLyogQXJyYXkgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLnNwbGljZShrZXksIDEpO1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5kZWxldGUocGF0Y2gudmFsdWUpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZSBiYXNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDEsIG9wKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZHJhZnQ7XG4gIH1cbiAgZnVuY3Rpb24gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmopIHtcbiAgICBpZiAoIWlzRHJhZnRhYmxlKG9iaikpXG4gICAgICByZXR1cm4gb2JqO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpXG4gICAgICByZXR1cm4gb2JqLm1hcChkZWVwQ2xvbmVQYXRjaFZhbHVlKTtcbiAgICBpZiAoaXNNYXAob2JqKSlcbiAgICAgIHJldHVybiBuZXcgTWFwKFxuICAgICAgICBBcnJheS5mcm9tKG9iai5lbnRyaWVzKCkpLm1hcCgoW2ssIHZdKSA9PiBbaywgZGVlcENsb25lUGF0Y2hWYWx1ZSh2KV0pXG4gICAgICApO1xuICAgIGlmIChpc1NldChvYmopKVxuICAgICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbShvYmopLm1hcChkZWVwQ2xvbmVQYXRjaFZhbHVlKSk7XG4gICAgY29uc3QgY2xvbmVkID0gT2JqZWN0LmNyZWF0ZShnZXRQcm90b3R5cGVPZihvYmopKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopXG4gICAgICBjbG9uZWRba2V5XSA9IGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqW2tleV0pO1xuICAgIGlmIChoYXMob2JqLCBEUkFGVEFCTEUpKVxuICAgICAgY2xvbmVkW0RSQUZUQUJMRV0gPSBvYmpbRFJBRlRBQkxFXTtcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG4gIGZ1bmN0aW9uIGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKG9iaikge1xuICAgIGlmIChpc0RyYWZ0KG9iaikpIHtcbiAgICAgIHJldHVybiBkZWVwQ2xvbmVQYXRjaFZhbHVlKG9iaik7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm4gb2JqO1xuICB9XG4gIGxvYWRQbHVnaW4oXCJQYXRjaGVzXCIsIHtcbiAgICBhcHBseVBhdGNoZXNfLFxuICAgIGdlbmVyYXRlUGF0Y2hlc18sXG4gICAgZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfXG4gIH0pO1xufVxuXG4vLyBzcmMvcGx1Z2lucy9tYXBzZXQudHNcbmZ1bmN0aW9uIGVuYWJsZU1hcFNldCgpIHtcbiAgY2xhc3MgRHJhZnRNYXAgZXh0ZW5kcyBNYXAge1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgcGFyZW50KSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpc1tEUkFGVF9TVEFURV0gPSB7XG4gICAgICAgIHR5cGVfOiAyIC8qIE1hcCAqLyxcbiAgICAgICAgcGFyZW50XzogcGFyZW50LFxuICAgICAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAgICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAgICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgICAgIGNvcHlfOiB2b2lkIDAsXG4gICAgICAgIGFzc2lnbmVkXzogdm9pZCAwLFxuICAgICAgICBiYXNlXzogdGFyZ2V0LFxuICAgICAgICBkcmFmdF86IHRoaXMsXG4gICAgICAgIGlzTWFudWFsXzogZmFsc2UsXG4gICAgICAgIHJldm9rZWRfOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5zaXplO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5oYXMoa2V5KTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKCFsYXRlc3Qoc3RhdGUpLmhhcyhrZXkpIHx8IGxhdGVzdChzdGF0ZSkuZ2V0KGtleSkgIT09IHZhbHVlKSB7XG4gICAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgIGlmICghdGhpcy5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZS5iYXNlXy5oYXMoa2V5KSkge1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAgc3RhdGUuY29weV8uZGVsZXRlKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmIChsYXRlc3Qoc3RhdGUpLnNpemUpIHtcbiAgICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICAgIGVhY2goc3RhdGUuYmFzZV8sIChrZXkpID0+IHtcbiAgICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RhdGUuY29weV8uY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yRWFjaChjYiwgdGhpc0FyZykge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGxhdGVzdChzdGF0ZSkuZm9yRWFjaCgoX3ZhbHVlLCBrZXksIF9tYXApID0+IHtcbiAgICAgICAgY2IuY2FsbCh0aGlzQXJnLCB0aGlzLmdldChrZXkpLCBrZXksIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGdldChrZXkpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgY29uc3QgdmFsdWUgPSBsYXRlc3Qoc3RhdGUpLmdldChrZXkpO1xuICAgICAgaWYgKHN0YXRlLmZpbmFsaXplZF8gfHwgIWlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgIT09IHN0YXRlLmJhc2VfLmdldChrZXkpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRyYWZ0ID0gY3JlYXRlUHJveHkodmFsdWUsIHN0YXRlKTtcbiAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgIHN0YXRlLmNvcHlfLnNldChrZXksIGRyYWZ0KTtcbiAgICAgIHJldHVybiBkcmFmdDtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLmtleXMoKTtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLmtleXMoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB0aGlzLnZhbHVlcygpLFxuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoci5kb25lKVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChyLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMua2V5cygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHRoaXMuZW50cmllcygpLFxuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoci5kb25lKVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChyLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogW3IudmFsdWUsIHZhbHVlXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIFsoRFJBRlRfU1RBVEUsIFN5bWJvbC5pdGVyYXRvcildKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwcm94eU1hcF8odGFyZ2V0LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gbmV3IERyYWZ0TWFwKHRhcmdldCwgcGFyZW50KTtcbiAgfVxuICBmdW5jdGlvbiBwcmVwYXJlTWFwQ29weShzdGF0ZSkge1xuICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgIHN0YXRlLmFzc2lnbmVkXyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICBzdGF0ZS5jb3B5XyA9IG5ldyBNYXAoc3RhdGUuYmFzZV8pO1xuICAgIH1cbiAgfVxuICBjbGFzcyBEcmFmdFNldCBleHRlbmRzIFNldCB7XG4gICAgY29uc3RydWN0b3IodGFyZ2V0LCBwYXJlbnQpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzW0RSQUZUX1NUQVRFXSA9IHtcbiAgICAgICAgdHlwZV86IDMgLyogU2V0ICovLFxuICAgICAgICBwYXJlbnRfOiBwYXJlbnQsXG4gICAgICAgIHNjb3BlXzogcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpLFxuICAgICAgICBtb2RpZmllZF86IGZhbHNlLFxuICAgICAgICBmaW5hbGl6ZWRfOiBmYWxzZSxcbiAgICAgICAgY29weV86IHZvaWQgMCxcbiAgICAgICAgYmFzZV86IHRhcmdldCxcbiAgICAgICAgZHJhZnRfOiB0aGlzLFxuICAgICAgICBkcmFmdHNfOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLFxuICAgICAgICByZXZva2VkXzogZmFsc2UsXG4gICAgICAgIGlzTWFudWFsXzogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuc2l6ZTtcbiAgICB9XG4gICAgaGFzKHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmJhc2VfLmhhcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuY29weV8uaGFzKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoc3RhdGUuZHJhZnRzXy5oYXModmFsdWUpICYmIHN0YXRlLmNvcHlfLmhhcyhzdGF0ZS5kcmFmdHNfLmdldCh2YWx1ZSkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghdGhpcy5oYXModmFsdWUpKSB7XG4gICAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbGV0ZSh2YWx1ZSkge1xuICAgICAgaWYgKCF0aGlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV8uZGVsZXRlKHZhbHVlKSB8fCAoc3RhdGUuZHJhZnRzXy5oYXModmFsdWUpID8gc3RhdGUuY29weV8uZGVsZXRlKHN0YXRlLmRyYWZ0c18uZ2V0KHZhbHVlKSkgOiAoXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGZhbHNlXG4gICAgICApKTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmIChsYXRlc3Qoc3RhdGUpLnNpemUpIHtcbiAgICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhbHVlcygpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLnZhbHVlcygpO1xuICAgIH1cbiAgICBlbnRyaWVzKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV8uZW50cmllcygpO1xuICAgIH1cbiAgICBrZXlzKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCk7XG4gICAgfVxuICAgIFsoRFJBRlRfU1RBVEUsIFN5bWJvbC5pdGVyYXRvcildKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCk7XG4gICAgfVxuICAgIGZvckVhY2goY2IsIHRoaXNBcmcpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgIGxldCByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgIGNiLmNhbGwodGhpc0FyZywgcmVzdWx0LnZhbHVlLCByZXN1bHQudmFsdWUsIHRoaXMpO1xuICAgICAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHByb3h5U2V0Xyh0YXJnZXQsIHBhcmVudCkge1xuICAgIHJldHVybiBuZXcgRHJhZnRTZXQodGFyZ2V0LCBwYXJlbnQpO1xuICB9XG4gIGZ1bmN0aW9uIHByZXBhcmVTZXRDb3B5KHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgICAgc3RhdGUuY29weV8gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgICAgc3RhdGUuYmFzZV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGRyYWZ0ID0gY3JlYXRlUHJveHkodmFsdWUsIHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZS5kcmFmdHNfLnNldCh2YWx1ZSwgZHJhZnQpO1xuICAgICAgICAgIHN0YXRlLmNvcHlfLmFkZChkcmFmdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUuY29weV8uYWRkKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFzc2VydFVucmV2b2tlZChzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5yZXZva2VkXylcbiAgICAgIGRpZSgzLCBKU09OLnN0cmluZ2lmeShsYXRlc3Qoc3RhdGUpKSk7XG4gIH1cbiAgbG9hZFBsdWdpbihcIk1hcFNldFwiLCB7IHByb3h5TWFwXywgcHJveHlTZXRfIH0pO1xufVxuXG4vLyBzcmMvaW1tZXIudHNcbnZhciBpbW1lciA9IG5ldyBJbW1lcjIoKTtcbnZhciBwcm9kdWNlID0gaW1tZXIucHJvZHVjZTtcbnZhciBwcm9kdWNlV2l0aFBhdGNoZXMgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIucHJvZHVjZVdpdGhQYXRjaGVzLmJpbmQoXG4gIGltbWVyXG4pO1xudmFyIHNldEF1dG9GcmVlemUgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuc2V0QXV0b0ZyZWV6ZS5iaW5kKGltbWVyKTtcbnZhciBzZXRVc2VTdHJpY3RTaGFsbG93Q29weSA9IC8qIEBfX1BVUkVfXyAqLyBpbW1lci5zZXRVc2VTdHJpY3RTaGFsbG93Q29weS5iaW5kKFxuICBpbW1lclxuKTtcbnZhciBzZXRVc2VTdHJpY3RJdGVyYXRpb24gPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuc2V0VXNlU3RyaWN0SXRlcmF0aW9uLmJpbmQoXG4gIGltbWVyXG4pO1xudmFyIGFwcGx5UGF0Y2hlcyA9IC8qIEBfX1BVUkVfXyAqLyBpbW1lci5hcHBseVBhdGNoZXMuYmluZChpbW1lcik7XG52YXIgY3JlYXRlRHJhZnQgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuY3JlYXRlRHJhZnQuYmluZChpbW1lcik7XG52YXIgZmluaXNoRHJhZnQgPSAvKiBAX19QVVJFX18gKi8gaW1tZXIuZmluaXNoRHJhZnQuYmluZChpbW1lcik7XG5mdW5jdGlvbiBjYXN0RHJhZnQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY2FzdEltbXV0YWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQge1xuICBJbW1lcjIgYXMgSW1tZXIsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgY2FzdERyYWZ0LFxuICBjYXN0SW1tdXRhYmxlLFxuICBjcmVhdGVEcmFmdCxcbiAgY3VycmVudCxcbiAgZW5hYmxlTWFwU2V0LFxuICBlbmFibGVQYXRjaGVzLFxuICBmaW5pc2hEcmFmdCxcbiAgZnJlZXplLFxuICBEUkFGVEFCTEUgYXMgaW1tZXJhYmxlLFxuICBpc0RyYWZ0LFxuICBpc0RyYWZ0YWJsZSxcbiAgTk9USElORyBhcyBub3RoaW5nLFxuICBvcmlnaW5hbCxcbiAgcHJvZHVjZSxcbiAgcHJvZHVjZVdpdGhQYXRjaGVzLFxuICBzZXRBdXRvRnJlZXplLFxuICBzZXRVc2VTdHJpY3RJdGVyYXRpb24sXG4gIHNldFVzZVN0cmljdFNoYWxsb3dDb3B5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW1tZXIubWpzLm1hcCIsIi8vIHNyYy9pbmRleC50c1xuZnVuY3Rpb24gY3JlYXRlVGh1bmtNaWRkbGV3YXJlKGV4dHJhQXJndW1lbnQpIHtcbiAgY29uc3QgbWlkZGxld2FyZSA9ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgfTtcbiAgcmV0dXJuIG1pZGRsZXdhcmU7XG59XG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTtcbnZhciB3aXRoRXh0cmFBcmd1bWVudCA9IGNyZWF0ZVRodW5rTWlkZGxld2FyZTtcbmV4cG9ydCB7XG4gIHRodW5rLFxuICB3aXRoRXh0cmFBcmd1bWVudFxufTtcbiIsIi8vIHNyYy9pbmRleC50c1xuZXhwb3J0ICogZnJvbSBcInJlZHV4XCI7XG5pbXBvcnQgeyBmcmVlemUsIG9yaWdpbmFsIGFzIG9yaWdpbmFsMiB9IGZyb20gXCJpbW1lclwiO1xuXG4vLyBzcmMvaW1tZXJJbXBvcnRzLnRzXG5pbXBvcnQgeyBjdXJyZW50LCBpc0RyYWZ0LCBwcm9kdWNlLCBpc0RyYWZ0YWJsZSwgc2V0VXNlU3RyaWN0SXRlcmF0aW9uIH0gZnJvbSBcImltbWVyXCI7XG5cbi8vIHNyYy9pbmRleC50c1xuaW1wb3J0IHsgY3JlYXRlU2VsZWN0b3IsIGxydU1lbW9pemUgfSBmcm9tIFwicmVzZWxlY3RcIjtcblxuLy8gc3JjL3Jlc2VsZWN0SW1wb3J0cy50c1xuaW1wb3J0IHsgY3JlYXRlU2VsZWN0b3JDcmVhdG9yLCB3ZWFrTWFwTWVtb2l6ZSB9IGZyb20gXCJyZXNlbGVjdFwiO1xuXG4vLyBzcmMvY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IudHNcbnZhciBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvckNyZWF0b3IgPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBjcmVhdGVTZWxlY3RvcjIgPSBjcmVhdGVTZWxlY3RvckNyZWF0b3IoLi4uYXJncyk7XG4gIGNvbnN0IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yMiA9IE9iamVjdC5hc3NpZ24oKC4uLmFyZ3MyKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcjIoLi4uYXJnczIpO1xuICAgIGNvbnN0IHdyYXBwZWRTZWxlY3RvciA9ICh2YWx1ZSwgLi4ucmVzdCkgPT4gc2VsZWN0b3IoaXNEcmFmdCh2YWx1ZSkgPyBjdXJyZW50KHZhbHVlKSA6IHZhbHVlLCAuLi5yZXN0KTtcbiAgICBPYmplY3QuYXNzaWduKHdyYXBwZWRTZWxlY3Rvciwgc2VsZWN0b3IpO1xuICAgIHJldHVybiB3cmFwcGVkU2VsZWN0b3I7XG4gIH0sIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yMlxuICB9KTtcbiAgcmV0dXJuIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yMjtcbn07XG52YXIgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JDcmVhdG9yKHdlYWtNYXBNZW1vaXplKTtcblxuLy8gc3JjL3JlZHV4SW1wb3J0cy50c1xuaW1wb3J0IHsgY3JlYXRlU3RvcmUsIGNvbWJpbmVSZWR1Y2VycywgYXBwbHlNaWRkbGV3YXJlLCBjb21wb3NlLCBpc1BsYWluT2JqZWN0LCBpc0FjdGlvbiB9IGZyb20gXCJyZWR1eFwiO1xuXG4vLyBzcmMvZGV2dG9vbHNFeHRlbnNpb24udHNcbnZhciBjb21wb3NlV2l0aERldlRvb2xzID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fID8gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXyA6IGZ1bmN0aW9uKCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09IFwib2JqZWN0XCIpIHJldHVybiBjb21wb3NlO1xuICByZXR1cm4gY29tcG9zZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufTtcbnZhciBkZXZUb29sc0VuaGFuY2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyA/IHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fIDogZnVuY3Rpb24oKSB7XG4gIHJldHVybiBmdW5jdGlvbihub29wMykge1xuICAgIHJldHVybiBub29wMztcbiAgfTtcbn07XG5cbi8vIHNyYy9nZXREZWZhdWx0TWlkZGxld2FyZS50c1xuaW1wb3J0IHsgdGh1bmsgYXMgdGh1bmtNaWRkbGV3YXJlLCB3aXRoRXh0cmFBcmd1bWVudCB9IGZyb20gXCJyZWR1eC10aHVua1wiO1xuXG4vLyBzcmMvdHNIZWxwZXJzLnRzXG52YXIgaGFzTWF0Y2hGdW5jdGlvbiA9ICh2KSA9PiB7XG4gIHJldHVybiB2ICYmIHR5cGVvZiB2Lm1hdGNoID09PSBcImZ1bmN0aW9uXCI7XG59O1xuXG4vLyBzcmMvY3JlYXRlQWN0aW9uLnRzXG5mdW5jdGlvbiBjcmVhdGVBY3Rpb24odHlwZSwgcHJlcGFyZUFjdGlvbikge1xuICBmdW5jdGlvbiBhY3Rpb25DcmVhdG9yKC4uLmFyZ3MpIHtcbiAgICBpZiAocHJlcGFyZUFjdGlvbikge1xuICAgICAgbGV0IHByZXBhcmVkID0gcHJlcGFyZUFjdGlvbiguLi5hcmdzKTtcbiAgICAgIGlmICghcHJlcGFyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMCkgOiBcInByZXBhcmVBY3Rpb24gZGlkIG5vdCByZXR1cm4gYW4gb2JqZWN0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgcGF5bG9hZDogcHJlcGFyZWQucGF5bG9hZCxcbiAgICAgICAgLi4uXCJtZXRhXCIgaW4gcHJlcGFyZWQgJiYge1xuICAgICAgICAgIG1ldGE6IHByZXBhcmVkLm1ldGFcbiAgICAgICAgfSxcbiAgICAgICAgLi4uXCJlcnJvclwiIGluIHByZXBhcmVkICYmIHtcbiAgICAgICAgICBlcnJvcjogcHJlcGFyZWQuZXJyb3JcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGUsXG4gICAgICBwYXlsb2FkOiBhcmdzWzBdXG4gICAgfTtcbiAgfVxuICBhY3Rpb25DcmVhdG9yLnRvU3RyaW5nID0gKCkgPT4gYCR7dHlwZX1gO1xuICBhY3Rpb25DcmVhdG9yLnR5cGUgPSB0eXBlO1xuICBhY3Rpb25DcmVhdG9yLm1hdGNoID0gKGFjdGlvbikgPT4gaXNBY3Rpb24oYWN0aW9uKSAmJiBhY3Rpb24udHlwZSA9PT0gdHlwZTtcbiAgcmV0dXJuIGFjdGlvbkNyZWF0b3I7XG59XG5mdW5jdGlvbiBpc0FjdGlvbkNyZWF0b3IoYWN0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSBcImZ1bmN0aW9uXCIgJiYgXCJ0eXBlXCIgaW4gYWN0aW9uICYmIC8vIGhhc01hdGNoRnVuY3Rpb24gb25seSB3YW50cyBNYXRjaGVycyBidXQgSSBkb24ndCBzZWUgdGhlIHBvaW50IGluIHJld3JpdGluZyBpdFxuICBoYXNNYXRjaEZ1bmN0aW9uKGFjdGlvbik7XG59XG5mdW5jdGlvbiBpc0ZTQShhY3Rpb24pIHtcbiAgcmV0dXJuIGlzQWN0aW9uKGFjdGlvbikgJiYgT2JqZWN0LmtleXMoYWN0aW9uKS5ldmVyeShpc1ZhbGlkS2V5KTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRLZXkoa2V5KSB7XG4gIHJldHVybiBbXCJ0eXBlXCIsIFwicGF5bG9hZFwiLCBcImVycm9yXCIsIFwibWV0YVwiXS5pbmRleE9mKGtleSkgPiAtMTtcbn1cblxuLy8gc3JjL2FjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBnZXRNZXNzYWdlKHR5cGUpIHtcbiAgY29uc3Qgc3BsaXRUeXBlID0gdHlwZSA/IGAke3R5cGV9YC5zcGxpdChcIi9cIikgOiBbXTtcbiAgY29uc3QgYWN0aW9uTmFtZSA9IHNwbGl0VHlwZVtzcGxpdFR5cGUubGVuZ3RoIC0gMV0gfHwgXCJhY3Rpb25DcmVhdG9yXCI7XG4gIHJldHVybiBgRGV0ZWN0ZWQgYW4gYWN0aW9uIGNyZWF0b3Igd2l0aCB0eXBlIFwiJHt0eXBlIHx8IFwidW5rbm93blwifVwiIGJlaW5nIGRpc3BhdGNoZWQuIFxuTWFrZSBzdXJlIHlvdSdyZSBjYWxsaW5nIHRoZSBhY3Rpb24gY3JlYXRvciBiZWZvcmUgZGlzcGF0Y2hpbmcsIGkuZS4gXFxgZGlzcGF0Y2goJHthY3Rpb25OYW1lfSgpKVxcYCBpbnN0ZWFkIG9mIFxcYGRpc3BhdGNoKCR7YWN0aW9uTmFtZX0pXFxgLiBUaGlzIGlzIG5lY2Vzc2FyeSBldmVuIGlmIHRoZSBhY3Rpb24gaGFzIG5vIHBheWxvYWQuYDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlKG9wdGlvbnMgPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiBuZXh0KGFjdGlvbik7XG4gIH1cbiAgY29uc3Qge1xuICAgIGlzQWN0aW9uQ3JlYXRvcjogaXNBY3Rpb25DcmVhdG9yMiA9IGlzQWN0aW9uQ3JlYXRvclxuICB9ID0gb3B0aW9ucztcbiAgcmV0dXJuICgpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgaWYgKGlzQWN0aW9uQ3JlYXRvcjIoYWN0aW9uKSkge1xuICAgICAgY29uc29sZS53YXJuKGdldE1lc3NhZ2UoYWN0aW9uLnR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgfTtcbn1cblxuLy8gc3JjL3V0aWxzLnRzXG5mdW5jdGlvbiBnZXRUaW1lTWVhc3VyZVV0aWxzKG1heERlbGF5LCBmbk5hbWUpIHtcbiAgbGV0IGVsYXBzZWQgPSAwO1xuICByZXR1cm4ge1xuICAgIG1lYXN1cmVUaW1lKGZuKSB7XG4gICAgICBjb25zdCBzdGFydGVkID0gRGF0ZS5ub3coKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29uc3QgZmluaXNoZWQgPSBEYXRlLm5vdygpO1xuICAgICAgICBlbGFwc2VkICs9IGZpbmlzaGVkIC0gc3RhcnRlZDtcbiAgICAgIH1cbiAgICB9LFxuICAgIHdhcm5JZkV4Y2VlZGVkKCkge1xuICAgICAgaWYgKGVsYXBzZWQgPiBtYXhEZWxheSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7Zm5OYW1lfSB0b29rICR7ZWxhcHNlZH1tcywgd2hpY2ggaXMgbW9yZSB0aGFuIHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAke21heERlbGF5fW1zLiBcbklmIHlvdXIgc3RhdGUgb3IgYWN0aW9ucyBhcmUgdmVyeSBsYXJnZSwgeW91IG1heSB3YW50IHRvIGRpc2FibGUgdGhlIG1pZGRsZXdhcmUgYXMgaXQgbWlnaHQgY2F1c2UgdG9vIG11Y2ggb2YgYSBzbG93ZG93biBpbiBkZXZlbG9wbWVudCBtb2RlLiBTZWUgaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy9hcGkvZ2V0RGVmYXVsdE1pZGRsZXdhcmUgZm9yIGluc3RydWN0aW9ucy5cbkl0IGlzIGRpc2FibGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGF0LmApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbnZhciBUdXBsZSA9IGNsYXNzIF9UdXBsZSBleHRlbmRzIEFycmF5IHtcbiAgY29uc3RydWN0b3IoLi4uaXRlbXMpIHtcbiAgICBzdXBlciguLi5pdGVtcyk7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIF9UdXBsZS5wcm90b3R5cGUpO1xuICB9XG4gIHN0YXRpYyBnZXQgW1N5bWJvbC5zcGVjaWVzXSgpIHtcbiAgICByZXR1cm4gX1R1cGxlO1xuICB9XG4gIGNvbmNhdCguLi5hcnIpIHtcbiAgICByZXR1cm4gc3VwZXIuY29uY2F0LmFwcGx5KHRoaXMsIGFycik7XG4gIH1cbiAgcHJlcGVuZCguLi5hcnIpIHtcbiAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyclswXSkpIHtcbiAgICAgIHJldHVybiBuZXcgX1R1cGxlKC4uLmFyclswXS5jb25jYXQodGhpcykpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9UdXBsZSguLi5hcnIuY29uY2F0KHRoaXMpKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGZyZWV6ZURyYWZ0YWJsZSh2YWwpIHtcbiAgcmV0dXJuIGlzRHJhZnRhYmxlKHZhbCkgPyBwcm9kdWNlKHZhbCwgKCkgPT4ge1xuICB9KSA6IHZhbDtcbn1cbmZ1bmN0aW9uIGdldE9ySW5zZXJ0Q29tcHV0ZWQobWFwLCBrZXksIGNvbXB1dGUpIHtcbiAgaWYgKG1hcC5oYXMoa2V5KSkgcmV0dXJuIG1hcC5nZXQoa2V5KTtcbiAgcmV0dXJuIG1hcC5zZXQoa2V5LCBjb21wdXRlKGtleSkpLmdldChrZXkpO1xufVxuXG4vLyBzcmMvaW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBpc0ltbXV0YWJsZURlZmF1bHQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PSBudWxsIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSk7XG59XG5mdW5jdGlvbiB0cmFja0Zvck11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9iaikge1xuICBjb25zdCB0cmFja2VkUHJvcGVydGllcyA9IHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9iaik7XG4gIHJldHVybiB7XG4gICAgZGV0ZWN0TXV0YXRpb25zKCkge1xuICAgICAgcmV0dXJuIGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIHRyYWNrZWRQcm9wZXJ0aWVzLCBvYmopO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMgPSBbXSwgb2JqLCBwYXRoID0gXCJcIiwgY2hlY2tlZE9iamVjdHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSB7XG4gIGNvbnN0IHRyYWNrZWQgPSB7XG4gICAgdmFsdWU6IG9ialxuICB9O1xuICBpZiAoIWlzSW1tdXRhYmxlKG9iaikgJiYgIWNoZWNrZWRPYmplY3RzLmhhcyhvYmopKSB7XG4gICAgY2hlY2tlZE9iamVjdHMuYWRkKG9iaik7XG4gICAgdHJhY2tlZC5jaGlsZHJlbiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aCA/IHBhdGggKyBcIi5cIiArIGtleSA6IGtleTtcbiAgICAgIGlmIChpZ25vcmVQYXRocy5sZW5ndGggJiYgaWdub3JlUGF0aHMuaW5kZXhPZihjaGlsZFBhdGgpICE9PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRyYWNrZWQuY2hpbGRyZW5ba2V5XSA9IHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9ialtrZXldLCBjaGlsZFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJhY2tlZDtcbn1cbmZ1bmN0aW9uIGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzID0gW10sIHRyYWNrZWRQcm9wZXJ0eSwgb2JqLCBzYW1lUGFyZW50UmVmID0gZmFsc2UsIHBhdGggPSBcIlwiKSB7XG4gIGNvbnN0IHByZXZPYmogPSB0cmFja2VkUHJvcGVydHkgPyB0cmFja2VkUHJvcGVydHkudmFsdWUgOiB2b2lkIDA7XG4gIGNvbnN0IHNhbWVSZWYgPSBwcmV2T2JqID09PSBvYmo7XG4gIGlmIChzYW1lUGFyZW50UmVmICYmICFzYW1lUmVmICYmICFOdW1iZXIuaXNOYU4ob2JqKSkge1xuICAgIHJldHVybiB7XG4gICAgICB3YXNNdXRhdGVkOiB0cnVlLFxuICAgICAgcGF0aFxuICAgIH07XG4gIH1cbiAgaWYgKGlzSW1tdXRhYmxlKHByZXZPYmopIHx8IGlzSW1tdXRhYmxlKG9iaikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2FzTXV0YXRlZDogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNvbnN0IGtleXNUb0RldGVjdCA9IHt9O1xuICBmb3IgKGxldCBrZXkgaW4gdHJhY2tlZFByb3BlcnR5LmNoaWxkcmVuKSB7XG4gICAga2V5c1RvRGV0ZWN0W2tleV0gPSB0cnVlO1xuICB9XG4gIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICBrZXlzVG9EZXRlY3Rba2V5XSA9IHRydWU7XG4gIH1cbiAgY29uc3QgaGFzSWdub3JlZFBhdGhzID0gaWdub3JlZFBhdGhzLmxlbmd0aCA+IDA7XG4gIGZvciAobGV0IGtleSBpbiBrZXlzVG9EZXRlY3QpIHtcbiAgICBjb25zdCBuZXN0ZWRQYXRoID0gcGF0aCA/IHBhdGggKyBcIi5cIiArIGtleSA6IGtleTtcbiAgICBpZiAoaGFzSWdub3JlZFBhdGhzKSB7XG4gICAgICBjb25zdCBoYXNNYXRjaGVzID0gaWdub3JlZFBhdGhzLnNvbWUoKGlnbm9yZWQpID0+IHtcbiAgICAgICAgaWYgKGlnbm9yZWQgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICByZXR1cm4gaWdub3JlZC50ZXN0KG5lc3RlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXN0ZWRQYXRoID09PSBpZ25vcmVkO1xuICAgICAgfSk7XG4gICAgICBpZiAoaGFzTWF0Y2hlcykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZGV0ZWN0TXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVkUGF0aHMsIHRyYWNrZWRQcm9wZXJ0eS5jaGlsZHJlbltrZXldLCBvYmpba2V5XSwgc2FtZVJlZiwgbmVzdGVkUGF0aCk7XG4gICAgaWYgKHJlc3VsdC53YXNNdXRhdGVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdhc011dGF0ZWQ6IGZhbHNlXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUob3B0aW9ucyA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IG5leHQoYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgc3RyaW5naWZ5MiA9IGZ1bmN0aW9uKG9iaiwgc2VyaWFsaXplciwgaW5kZW50LCBkZWN5Y2xlcikge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgZ2V0U2VyaWFsaXplMihzZXJpYWxpemVyLCBkZWN5Y2xlciksIGluZGVudCk7XG4gICAgfSwgZ2V0U2VyaWFsaXplMiA9IGZ1bmN0aW9uKHNlcmlhbGl6ZXIsIGRlY3ljbGVyKSB7XG4gICAgICBsZXQgc3RhY2sgPSBbXSwga2V5cyA9IFtdO1xuICAgICAgaWYgKCFkZWN5Y2xlcikgZGVjeWNsZXIgPSBmdW5jdGlvbihfLCB2YWx1ZSkge1xuICAgICAgICBpZiAoc3RhY2tbMF0gPT09IHZhbHVlKSByZXR1cm4gXCJbQ2lyY3VsYXIgfl1cIjtcbiAgICAgICAgcmV0dXJuIFwiW0NpcmN1bGFyIH4uXCIgKyBrZXlzLnNsaWNlKDAsIHN0YWNrLmluZGV4T2YodmFsdWUpKS5qb2luKFwiLlwiKSArIFwiXVwiO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIHRoaXNQb3MgPSBzdGFjay5pbmRleE9mKHRoaXMpO1xuICAgICAgICAgIH50aGlzUG9zID8gc3RhY2suc3BsaWNlKHRoaXNQb3MgKyAxKSA6IHN0YWNrLnB1c2godGhpcyk7XG4gICAgICAgICAgfnRoaXNQb3MgPyBrZXlzLnNwbGljZSh0aGlzUG9zLCBJbmZpbml0eSwga2V5KSA6IGtleXMucHVzaChrZXkpO1xuICAgICAgICAgIGlmICh+c3RhY2suaW5kZXhPZih2YWx1ZSkpIHZhbHVlID0gZGVjeWNsZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHN0YWNrLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplciA9PSBudWxsID8gdmFsdWUgOiBzZXJpYWxpemVyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIHN0cmluZ2lmeSA9IHN0cmluZ2lmeTIsIGdldFNlcmlhbGl6ZSA9IGdldFNlcmlhbGl6ZTI7XG4gICAgbGV0IHtcbiAgICAgIGlzSW1tdXRhYmxlID0gaXNJbW11dGFibGVEZWZhdWx0LFxuICAgICAgaWdub3JlZFBhdGhzLFxuICAgICAgd2FybkFmdGVyID0gMzJcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB0cmFjayA9IHRyYWNrRm9yTXV0YXRpb25zLmJpbmQobnVsbCwgaXNJbW11dGFibGUsIGlnbm9yZWRQYXRocyk7XG4gICAgcmV0dXJuICh7XG4gICAgICBnZXRTdGF0ZVxuICAgIH0pID0+IHtcbiAgICAgIGxldCBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICBsZXQgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICByZXR1cm4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgbWVhc3VyZVV0aWxzID0gZ2V0VGltZU1lYXN1cmVVdGlscyh3YXJuQWZ0ZXIsIFwiSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlXCIpO1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICByZXN1bHQgPSB0cmFja2VyLmRldGVjdE11dGF0aW9ucygpO1xuICAgICAgICAgIHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC53YXNNdXRhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxOSkgOiBgQSBzdGF0ZSBtdXRhdGlvbiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiBkaXNwYXRjaGVzLCBpbiB0aGUgcGF0aCAnJHtyZXN1bHQucGF0aCB8fCBcIlwifScuICBUaGlzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IuIChodHRwczovL3JlZHV4LmpzLm9yZy9zdHlsZS1ndWlkZS9zdHlsZS1ndWlkZSNkby1ub3QtbXV0YXRlLXN0YXRlKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZWRBY3Rpb24gPSBuZXh0KGFjdGlvbik7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgIHJlc3VsdCA9IHRyYWNrZXIuZGV0ZWN0TXV0YXRpb25zKCk7XG4gICAgICAgICAgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcbiAgICAgICAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIwKSA6IGBBIHN0YXRlIG11dGF0aW9uIHdhcyBkZXRlY3RlZCBpbnNpZGUgYSBkaXNwYXRjaCwgaW4gdGhlIHBhdGg6ICR7cmVzdWx0LnBhdGggfHwgXCJcIn0uIFRha2UgYSBsb29rIGF0IHRoZSByZWR1Y2VyKHMpIGhhbmRsaW5nIHRoZSBhY3Rpb24gJHtzdHJpbmdpZnkyKGFjdGlvbil9LiAoaHR0cHM6Ly9yZWR1eC5qcy5vcmcvc3R5bGUtZ3VpZGUvc3R5bGUtZ3VpZGUjZG8tbm90LW11dGF0ZS1zdGF0ZSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtZWFzdXJlVXRpbHMud2FybklmRXhjZWVkZWQoKTtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoZWRBY3Rpb247XG4gICAgICB9O1xuICAgIH07XG4gIH1cbn1cblxuLy8gc3JjL3NlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gaXNQbGFpbih2YWwpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCB0eXBlID09PSBcInN0cmluZ1wiIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiIHx8IHR5cGUgPT09IFwibnVtYmVyXCIgfHwgQXJyYXkuaXNBcnJheSh2YWwpIHx8IGlzUGxhaW5PYmplY3QodmFsKTtcbn1cbmZ1bmN0aW9uIGZpbmROb25TZXJpYWxpemFibGVWYWx1ZSh2YWx1ZSwgcGF0aCA9IFwiXCIsIGlzU2VyaWFsaXphYmxlID0gaXNQbGFpbiwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzID0gW10sIGNhY2hlKSB7XG4gIGxldCBmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZTtcbiAgaWYgKCFpc1NlcmlhbGl6YWJsZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5UGF0aDogcGF0aCB8fCBcIjxyb290PlwiLFxuICAgICAgdmFsdWVcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGNhY2hlPy5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGVudHJpZXMgPSBnZXRFbnRyaWVzICE9IG51bGwgPyBnZXRFbnRyaWVzKHZhbHVlKSA6IE9iamVjdC5lbnRyaWVzKHZhbHVlKTtcbiAgY29uc3QgaGFzSWdub3JlZFBhdGhzID0gaWdub3JlZFBhdGhzLmxlbmd0aCA+IDA7XG4gIGZvciAoY29uc3QgW2tleSwgbmVzdGVkVmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBuZXN0ZWRQYXRoID0gcGF0aCA/IHBhdGggKyBcIi5cIiArIGtleSA6IGtleTtcbiAgICBpZiAoaGFzSWdub3JlZFBhdGhzKSB7XG4gICAgICBjb25zdCBoYXNNYXRjaGVzID0gaWdub3JlZFBhdGhzLnNvbWUoKGlnbm9yZWQpID0+IHtcbiAgICAgICAgaWYgKGlnbm9yZWQgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICByZXR1cm4gaWdub3JlZC50ZXN0KG5lc3RlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXN0ZWRQYXRoID09PSBpZ25vcmVkO1xuICAgICAgfSk7XG4gICAgICBpZiAoaGFzTWF0Y2hlcykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc1NlcmlhbGl6YWJsZShuZXN0ZWRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleVBhdGg6IG5lc3RlZFBhdGgsXG4gICAgICAgIHZhbHVlOiBuZXN0ZWRWYWx1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWRWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZm91bmROZXN0ZWRTZXJpYWxpemFibGUgPSBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUobmVzdGVkVmFsdWUsIG5lc3RlZFBhdGgsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkUGF0aHMsIGNhY2hlKTtcbiAgICAgIGlmIChmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZSkge1xuICAgICAgICByZXR1cm4gZm91bmROZXN0ZWRTZXJpYWxpemFibGU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjYWNoZSAmJiBpc05lc3RlZEZyb3plbih2YWx1ZSkpIGNhY2hlLmFkZCh2YWx1ZSk7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzTmVzdGVkRnJvemVuKHZhbHVlKSB7XG4gIGlmICghT2JqZWN0LmlzRnJvemVuKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IG5lc3RlZFZhbHVlIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiBuZXN0ZWRWYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBuZXN0ZWRWYWx1ZSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgaWYgKCFpc05lc3RlZEZyb3plbihuZXN0ZWRWYWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4gbmV4dChhY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzU2VyaWFsaXphYmxlID0gaXNQbGFpbixcbiAgICAgIGdldEVudHJpZXMsXG4gICAgICBpZ25vcmVkQWN0aW9ucyA9IFtdLFxuICAgICAgaWdub3JlZEFjdGlvblBhdGhzID0gW1wibWV0YS5hcmdcIiwgXCJtZXRhLmJhc2VRdWVyeU1ldGFcIl0sXG4gICAgICBpZ25vcmVkUGF0aHMgPSBbXSxcbiAgICAgIHdhcm5BZnRlciA9IDMyLFxuICAgICAgaWdub3JlU3RhdGUgPSBmYWxzZSxcbiAgICAgIGlnbm9yZUFjdGlvbnMgPSBmYWxzZSxcbiAgICAgIGRpc2FibGVDYWNoZSA9IGZhbHNlXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY2FjaGUgPSAhZGlzYWJsZUNhY2hlICYmIFdlYWtTZXQgPyAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gKHN0b3JlQVBJKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgICAgaWYgKCFpc0FjdGlvbihhY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXh0KGFjdGlvbik7XG4gICAgICBjb25zdCBtZWFzdXJlVXRpbHMgPSBnZXRUaW1lTWVhc3VyZVV0aWxzKHdhcm5BZnRlciwgXCJTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmVcIik7XG4gICAgICBpZiAoIWlnbm9yZUFjdGlvbnMgJiYgIShpZ25vcmVkQWN0aW9ucy5sZW5ndGggJiYgaWdub3JlZEFjdGlvbnMuaW5kZXhPZihhY3Rpb24udHlwZSkgIT09IC0xKSkge1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWUgPSBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUoYWN0aW9uLCBcIlwiLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZEFjdGlvblBhdGhzLCBjYWNoZSk7XG4gICAgICAgICAgaWYgKGZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAga2V5UGF0aCxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0gPSBmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQSBub24tc2VyaWFsaXphYmxlIHZhbHVlIHdhcyBkZXRlY3RlZCBpbiBhbiBhY3Rpb24sIGluIHRoZSBwYXRoOiBcXGAke2tleVBhdGh9XFxgLiBWYWx1ZTpgLCB2YWx1ZSwgXCJcXG5UYWtlIGEgbG9vayBhdCB0aGUgbG9naWMgdGhhdCBkaXNwYXRjaGVkIHRoaXMgYWN0aW9uOiBcIiwgYWN0aW9uLCBcIlxcbihTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvZmFxL2FjdGlvbnMjd2h5LXNob3VsZC10eXBlLWJlLWEtc3RyaW5nLW9yLWF0LWxlYXN0LXNlcmlhbGl6YWJsZS13aHktc2hvdWxkLW15LWFjdGlvbi10eXBlcy1iZS1jb25zdGFudHMpXCIsIFwiXFxuKFRvIGFsbG93IG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIHNlZTogaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy91c2FnZS91c2FnZS1ndWlkZSN3b3JraW5nLXdpdGgtbm9uLXNlcmlhbGl6YWJsZS1kYXRhKVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFpZ25vcmVTdGF0ZSkge1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmVBUEkuZ2V0U3RhdGUoKTtcbiAgICAgICAgICBjb25zdCBmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWUgPSBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUoc3RhdGUsIFwiXCIsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkUGF0aHMsIGNhY2hlKTtcbiAgICAgICAgICBpZiAoZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGtleVBhdGgsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9ID0gZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQSBub24tc2VyaWFsaXphYmxlIHZhbHVlIHdhcyBkZXRlY3RlZCBpbiB0aGUgc3RhdGUsIGluIHRoZSBwYXRoOiBcXGAke2tleVBhdGh9XFxgLiBWYWx1ZTpgLCB2YWx1ZSwgYFxuVGFrZSBhIGxvb2sgYXQgdGhlIHJlZHVjZXIocykgaGFuZGxpbmcgdGhpcyBhY3Rpb24gdHlwZTogJHthY3Rpb24udHlwZX0uXG4oU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2ZhcS9vcmdhbml6aW5nLXN0YXRlI2Nhbi1pLXB1dC1mdW5jdGlvbnMtcHJvbWlzZXMtb3Itb3RoZXItbm9uLXNlcmlhbGl6YWJsZS1pdGVtcy1pbi1teS1zdG9yZS1zdGF0ZSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtZWFzdXJlVXRpbHMud2FybklmRXhjZWVkZWQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxufVxuXG4vLyBzcmMvZ2V0RGVmYXVsdE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGlzQm9vbGVhbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJib29sZWFuXCI7XG59XG52YXIgYnVpbGRHZXREZWZhdWx0TWlkZGxld2FyZSA9ICgpID0+IGZ1bmN0aW9uIGdldERlZmF1bHRNaWRkbGV3YXJlKG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIHRodW5rID0gdHJ1ZSxcbiAgICBpbW11dGFibGVDaGVjayA9IHRydWUsXG4gICAgc2VyaWFsaXphYmxlQ2hlY2sgPSB0cnVlLFxuICAgIGFjdGlvbkNyZWF0b3JDaGVjayA9IHRydWVcbiAgfSA9IG9wdGlvbnMgPz8ge307XG4gIGxldCBtaWRkbGV3YXJlQXJyYXkgPSBuZXcgVHVwbGUoKTtcbiAgaWYgKHRodW5rKSB7XG4gICAgaWYgKGlzQm9vbGVhbih0aHVuaykpIHtcbiAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKHRodW5rTWlkZGxld2FyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKHdpdGhFeHRyYUFyZ3VtZW50KHRodW5rLmV4dHJhQXJndW1lbnQpKTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmIChpbW11dGFibGVDaGVjaykge1xuICAgICAgbGV0IGltbXV0YWJsZU9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghaXNCb29sZWFuKGltbXV0YWJsZUNoZWNrKSkge1xuICAgICAgICBpbW11dGFibGVPcHRpb25zID0gaW1tdXRhYmxlQ2hlY2s7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlQXJyYXkudW5zaGlmdChjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUoaW1tdXRhYmxlT3B0aW9ucykpO1xuICAgIH1cbiAgICBpZiAoc2VyaWFsaXphYmxlQ2hlY2spIHtcbiAgICAgIGxldCBzZXJpYWxpemFibGVPcHRpb25zID0ge307XG4gICAgICBpZiAoIWlzQm9vbGVhbihzZXJpYWxpemFibGVDaGVjaykpIHtcbiAgICAgICAgc2VyaWFsaXphYmxlT3B0aW9ucyA9IHNlcmlhbGl6YWJsZUNoZWNrO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2goY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKHNlcmlhbGl6YWJsZU9wdGlvbnMpKTtcbiAgICB9XG4gICAgaWYgKGFjdGlvbkNyZWF0b3JDaGVjaykge1xuICAgICAgbGV0IGFjdGlvbkNyZWF0b3JPcHRpb25zID0ge307XG4gICAgICBpZiAoIWlzQm9vbGVhbihhY3Rpb25DcmVhdG9yQ2hlY2spKSB7XG4gICAgICAgIGFjdGlvbkNyZWF0b3JPcHRpb25zID0gYWN0aW9uQ3JlYXRvckNoZWNrO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZUFycmF5LnVuc2hpZnQoY3JlYXRlQWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUoYWN0aW9uQ3JlYXRvck9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pZGRsZXdhcmVBcnJheTtcbn07XG5cbi8vIHNyYy9hdXRvQmF0Y2hFbmhhbmNlci50c1xudmFyIFNIT1VMRF9BVVRPQkFUQ0ggPSBcIlJUS19hdXRvQmF0Y2hcIjtcbnZhciBwcmVwYXJlQXV0b0JhdGNoZWQgPSAoKSA9PiAocGF5bG9hZCkgPT4gKHtcbiAgcGF5bG9hZCxcbiAgbWV0YToge1xuICAgIFtTSE9VTERfQVVUT0JBVENIXTogdHJ1ZVxuICB9XG59KTtcbnZhciBjcmVhdGVRdWV1ZVdpdGhUaW1lciA9ICh0aW1lb3V0KSA9PiB7XG4gIHJldHVybiAobm90aWZ5KSA9PiB7XG4gICAgc2V0VGltZW91dChub3RpZnksIHRpbWVvdXQpO1xuICB9O1xufTtcbnZhciBhdXRvQmF0Y2hFbmhhbmNlciA9IChvcHRpb25zID0ge1xuICB0eXBlOiBcInJhZlwiXG59KSA9PiAobmV4dCkgPT4gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3Qgc3RvcmUgPSBuZXh0KC4uLmFyZ3MpO1xuICBsZXQgbm90aWZ5aW5nID0gdHJ1ZTtcbiAgbGV0IHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrID0gZmFsc2U7XG4gIGxldCBub3RpZmljYXRpb25RdWV1ZWQgPSBmYWxzZTtcbiAgY29uc3QgbGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3QgcXVldWVDYWxsYmFjayA9IG9wdGlvbnMudHlwZSA9PT0gXCJ0aWNrXCIgPyBxdWV1ZU1pY3JvdGFzayA6IG9wdGlvbnMudHlwZSA9PT0gXCJyYWZcIiA/IChcbiAgICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgd29uJ3QgZXhpc3QgaW4gU1NSIGVudmlyb25tZW50cy4gRmFsbCBiYWNrIHRvIGEgdmFndWUgYXBwcm94aW1hdGlvbiBqdXN0IHRvIGtlZXAgZnJvbSBlcnJvcmluZy5cbiAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIDogY3JlYXRlUXVldWVXaXRoVGltZXIoMTApXG4gICkgOiBvcHRpb25zLnR5cGUgPT09IFwiY2FsbGJhY2tcIiA/IG9wdGlvbnMucXVldWVOb3RpZmljYXRpb24gOiBjcmVhdGVRdWV1ZVdpdGhUaW1lcihvcHRpb25zLnRpbWVvdXQpO1xuICBjb25zdCBub3RpZnlMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgbm90aWZpY2F0aW9uUXVldWVkID0gZmFsc2U7XG4gICAgaWYgKHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrKSB7XG4gICAgICBzaG91bGROb3RpZnlBdEVuZE9mVGljayA9IGZhbHNlO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGwpID0+IGwoKSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RvcmUsIHtcbiAgICAvLyBPdmVycmlkZSB0aGUgYmFzZSBgc3RvcmUuc3Vic2NyaWJlYCBtZXRob2QgdG8ga2VlcCBvcmlnaW5hbCBsaXN0ZW5lcnNcbiAgICAvLyBmcm9tIHJ1bm5pbmcgaWYgd2UncmUgZGVsYXlpbmcgbm90aWZpY2F0aW9uc1xuICAgIHN1YnNjcmliZShsaXN0ZW5lcjIpIHtcbiAgICAgIGNvbnN0IHdyYXBwZWRMaXN0ZW5lciA9ICgpID0+IG5vdGlmeWluZyAmJiBsaXN0ZW5lcjIoKTtcbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKHdyYXBwZWRMaXN0ZW5lcik7XG4gICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyMik7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyMik7XG4gICAgICB9O1xuICAgIH0sXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgYHN0b3JlLmRpc3BhdGNoYCBtZXRob2Qgc28gdGhhdCB3ZSBjYW4gY2hlY2sgYWN0aW9uc1xuICAgIC8vIGZvciB0aGUgYHNob3VsZEF1dG9CYXRjaGAgZmxhZyBhbmQgZGV0ZXJtaW5lIGlmIGJhdGNoaW5nIGlzIGFjdGl2ZVxuICAgIGRpc3BhdGNoKGFjdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbm90aWZ5aW5nID0gIWFjdGlvbj8ubWV0YT8uW1NIT1VMRF9BVVRPQkFUQ0hdO1xuICAgICAgICBzaG91bGROb3RpZnlBdEVuZE9mVGljayA9ICFub3RpZnlpbmc7XG4gICAgICAgIGlmIChzaG91bGROb3RpZnlBdEVuZE9mVGljaykge1xuICAgICAgICAgIGlmICghbm90aWZpY2F0aW9uUXVldWVkKSB7XG4gICAgICAgICAgICBub3RpZmljYXRpb25RdWV1ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcXVldWVDYWxsYmFjayhub3RpZnlMaXN0ZW5lcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RvcmUuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIG5vdGlmeWluZyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8vIHNyYy9nZXREZWZhdWx0RW5oYW5jZXJzLnRzXG52YXIgYnVpbGRHZXREZWZhdWx0RW5oYW5jZXJzID0gKG1pZGRsZXdhcmVFbmhhbmNlcikgPT4gZnVuY3Rpb24gZ2V0RGVmYXVsdEVuaGFuY2VycyhvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBhdXRvQmF0Y2ggPSB0cnVlXG4gIH0gPSBvcHRpb25zID8/IHt9O1xuICBsZXQgZW5oYW5jZXJBcnJheSA9IG5ldyBUdXBsZShtaWRkbGV3YXJlRW5oYW5jZXIpO1xuICBpZiAoYXV0b0JhdGNoKSB7XG4gICAgZW5oYW5jZXJBcnJheS5wdXNoKGF1dG9CYXRjaEVuaGFuY2VyKHR5cGVvZiBhdXRvQmF0Y2ggPT09IFwib2JqZWN0XCIgPyBhdXRvQmF0Y2ggOiB2b2lkIDApKTtcbiAgfVxuICByZXR1cm4gZW5oYW5jZXJBcnJheTtcbn07XG5cbi8vIHNyYy9jb25maWd1cmVTdG9yZS50c1xuZnVuY3Rpb24gY29uZmlndXJlU3RvcmUob3B0aW9ucykge1xuICBjb25zdCBnZXREZWZhdWx0TWlkZGxld2FyZSA9IGJ1aWxkR2V0RGVmYXVsdE1pZGRsZXdhcmUoKTtcbiAgY29uc3Qge1xuICAgIHJlZHVjZXIgPSB2b2lkIDAsXG4gICAgbWlkZGxld2FyZSxcbiAgICBkZXZUb29scyA9IHRydWUsXG4gICAgZHVwbGljYXRlTWlkZGxld2FyZUNoZWNrID0gdHJ1ZSxcbiAgICBwcmVsb2FkZWRTdGF0ZSA9IHZvaWQgMCxcbiAgICBlbmhhbmNlcnMgPSB2b2lkIDBcbiAgfSA9IG9wdGlvbnMgfHwge307XG4gIGxldCByb290UmVkdWNlcjtcbiAgaWYgKHR5cGVvZiByZWR1Y2VyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByb290UmVkdWNlciA9IHJlZHVjZXI7XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChyZWR1Y2VyKSkge1xuICAgIHJvb3RSZWR1Y2VyID0gY29tYmluZVJlZHVjZXJzKHJlZHVjZXIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpIDogXCJgcmVkdWNlcmAgaXMgYSByZXF1aXJlZCBhcmd1bWVudCwgYW5kIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBjb21iaW5lUmVkdWNlcnNcIik7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBtaWRkbGV3YXJlICYmIHR5cGVvZiBtaWRkbGV3YXJlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IFwiYG1pZGRsZXdhcmVgIGZpZWxkIG11c3QgYmUgYSBjYWxsYmFja1wiKTtcbiAgfVxuICBsZXQgZmluYWxNaWRkbGV3YXJlO1xuICBpZiAodHlwZW9mIG1pZGRsZXdhcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZpbmFsTWlkZGxld2FyZSA9IG1pZGRsZXdhcmUoZ2V0RGVmYXVsdE1pZGRsZXdhcmUpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIUFycmF5LmlzQXJyYXkoZmluYWxNaWRkbGV3YXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiBcIndoZW4gdXNpbmcgYSBtaWRkbGV3YXJlIGJ1aWxkZXIgZnVuY3Rpb24sIGFuIGFycmF5IG9mIG1pZGRsZXdhcmUgbXVzdCBiZSByZXR1cm5lZFwiKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmluYWxNaWRkbGV3YXJlID0gZ2V0RGVmYXVsdE1pZGRsZXdhcmUoKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGZpbmFsTWlkZGxld2FyZS5zb21lKChpdGVtKSA9PiB0eXBlb2YgaXRlbSAhPT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQpIDogXCJlYWNoIG1pZGRsZXdhcmUgcHJvdmlkZWQgdG8gY29uZmlndXJlU3RvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZHVwbGljYXRlTWlkZGxld2FyZUNoZWNrKSB7XG4gICAgbGV0IG1pZGRsZXdhcmVSZWZlcmVuY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBmaW5hbE1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxld2FyZTIpID0+IHtcbiAgICAgIGlmIChtaWRkbGV3YXJlUmVmZXJlbmNlcy5oYXMobWlkZGxld2FyZTIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQyKSA6IFwiRHVwbGljYXRlIG1pZGRsZXdhcmUgcmVmZXJlbmNlcyBmb3VuZCB3aGVuIGNyZWF0aW5nIHRoZSBzdG9yZS4gRW5zdXJlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIGlzIG9ubHkgaW5jbHVkZWQgb25jZS5cIik7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlUmVmZXJlbmNlcy5hZGQobWlkZGxld2FyZTIpO1xuICAgIH0pO1xuICB9XG4gIGxldCBmaW5hbENvbXBvc2UgPSBjb21wb3NlO1xuICBpZiAoZGV2VG9vbHMpIHtcbiAgICBmaW5hbENvbXBvc2UgPSBjb21wb3NlV2l0aERldlRvb2xzKHtcbiAgICAgIC8vIEVuYWJsZSBjYXB0dXJlIG9mIHN0YWNrIHRyYWNlcyBmb3IgZGlzcGF0Y2hlZCBSZWR1eCBhY3Rpb25zXG4gICAgICB0cmFjZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiLFxuICAgICAgLi4udHlwZW9mIGRldlRvb2xzID09PSBcIm9iamVjdFwiICYmIGRldlRvb2xzXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgbWlkZGxld2FyZUVuaGFuY2VyID0gYXBwbHlNaWRkbGV3YXJlKC4uLmZpbmFsTWlkZGxld2FyZSk7XG4gIGNvbnN0IGdldERlZmF1bHRFbmhhbmNlcnMgPSBidWlsZEdldERlZmF1bHRFbmhhbmNlcnMobWlkZGxld2FyZUVuaGFuY2VyKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBlbmhhbmNlcnMgJiYgdHlwZW9mIGVuaGFuY2VycyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNSkgOiBcImBlbmhhbmNlcnNgIGZpZWxkIG11c3QgYmUgYSBjYWxsYmFja1wiKTtcbiAgfVxuICBsZXQgc3RvcmVFbmhhbmNlcnMgPSB0eXBlb2YgZW5oYW5jZXJzID09PSBcImZ1bmN0aW9uXCIgPyBlbmhhbmNlcnMoZ2V0RGVmYXVsdEVuaGFuY2VycykgOiBnZXREZWZhdWx0RW5oYW5jZXJzKCk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIUFycmF5LmlzQXJyYXkoc3RvcmVFbmhhbmNlcnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNikgOiBcImBlbmhhbmNlcnNgIGNhbGxiYWNrIG11c3QgcmV0dXJuIGFuIGFycmF5XCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgc3RvcmVFbmhhbmNlcnMuc29tZSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gIT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg3KSA6IFwiZWFjaCBlbmhhbmNlciBwcm92aWRlZCB0byBjb25maWd1cmVTdG9yZSBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBmaW5hbE1pZGRsZXdhcmUubGVuZ3RoICYmICFzdG9yZUVuaGFuY2Vycy5pbmNsdWRlcyhtaWRkbGV3YXJlRW5oYW5jZXIpKSB7XG4gICAgY29uc29sZS5lcnJvcihcIm1pZGRsZXdhcmVzIHdlcmUgcHJvdmlkZWQsIGJ1dCBtaWRkbGV3YXJlIGVuaGFuY2VyIHdhcyBub3QgaW5jbHVkZWQgaW4gZmluYWwgZW5oYW5jZXJzIC0gbWFrZSBzdXJlIHRvIGNhbGwgYGdldERlZmF1bHRFbmhhbmNlcnNgXCIpO1xuICB9XG4gIGNvbnN0IGNvbXBvc2VkRW5oYW5jZXIgPSBmaW5hbENvbXBvc2UoLi4uc3RvcmVFbmhhbmNlcnMpO1xuICByZXR1cm4gY3JlYXRlU3RvcmUocm9vdFJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBjb21wb3NlZEVuaGFuY2VyKTtcbn1cblxuLy8gc3JjL21hcEJ1aWxkZXJzLnRzXG5mdW5jdGlvbiBleGVjdXRlUmVkdWNlckJ1aWxkZXJDYWxsYmFjayhidWlsZGVyQ2FsbGJhY2spIHtcbiAgY29uc3QgYWN0aW9uc01hcCA9IHt9O1xuICBjb25zdCBhY3Rpb25NYXRjaGVycyA9IFtdO1xuICBsZXQgZGVmYXVsdENhc2VSZWR1Y2VyO1xuICBjb25zdCBidWlsZGVyID0ge1xuICAgIGFkZENhc2UodHlwZU9yQWN0aW9uQ3JlYXRvciwgcmVkdWNlcikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpZiAoYWN0aW9uTWF0Y2hlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI2KSA6IFwiYGJ1aWxkZXIuYWRkQ2FzZWAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZE1hdGNoZXJgXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNykgOiBcImBidWlsZGVyLmFkZENhc2VgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWBcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdHlwZU9yQWN0aW9uQ3JlYXRvciA9PT0gXCJzdHJpbmdcIiA/IHR5cGVPckFjdGlvbkNyZWF0b3IgOiB0eXBlT3JBY3Rpb25DcmVhdG9yLnR5cGU7XG4gICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjgpIDogXCJgYnVpbGRlci5hZGRDYXNlYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYW4gZW1wdHkgYWN0aW9uIHR5cGVcIik7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSBpbiBhY3Rpb25zTWFwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI5KSA6IGBcXGBidWlsZGVyLmFkZENhc2VcXGAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIHR3byByZWR1Y2VycyBmb3IgdGhlIHNhbWUgYWN0aW9uIHR5cGUgJyR7dHlwZX0nYCk7XG4gICAgICB9XG4gICAgICBhY3Rpb25zTWFwW3R5cGVdID0gcmVkdWNlcjtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH0sXG4gICAgYWRkQXN5bmNUaHVuayhhc3luY1RodW5rLCByZWR1Y2Vycykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNDMpIDogXCJgYnVpbGRlci5hZGRBc3luY1RodW5rYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYGJ1aWxkZXIuYWRkRGVmYXVsdENhc2VgXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVkdWNlcnMucGVuZGluZykgYWN0aW9uc01hcFthc3luY1RodW5rLnBlbmRpbmcudHlwZV0gPSByZWR1Y2Vycy5wZW5kaW5nO1xuICAgICAgaWYgKHJlZHVjZXJzLnJlamVjdGVkKSBhY3Rpb25zTWFwW2FzeW5jVGh1bmsucmVqZWN0ZWQudHlwZV0gPSByZWR1Y2Vycy5yZWplY3RlZDtcbiAgICAgIGlmIChyZWR1Y2Vycy5mdWxmaWxsZWQpIGFjdGlvbnNNYXBbYXN5bmNUaHVuay5mdWxmaWxsZWQudHlwZV0gPSByZWR1Y2Vycy5mdWxmaWxsZWQ7XG4gICAgICBpZiAocmVkdWNlcnMuc2V0dGxlZCkgYWN0aW9uTWF0Y2hlcnMucHVzaCh7XG4gICAgICAgIG1hdGNoZXI6IGFzeW5jVGh1bmsuc2V0dGxlZCxcbiAgICAgICAgcmVkdWNlcjogcmVkdWNlcnMuc2V0dGxlZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9LFxuICAgIGFkZE1hdGNoZXIobWF0Y2hlciwgcmVkdWNlcikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzApIDogXCJgYnVpbGRlci5hZGRNYXRjaGVyYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYGJ1aWxkZXIuYWRkRGVmYXVsdENhc2VgXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhY3Rpb25NYXRjaGVycy5wdXNoKHtcbiAgICAgICAgbWF0Y2hlcixcbiAgICAgICAgcmVkdWNlclxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9LFxuICAgIGFkZERlZmF1bHRDYXNlKHJlZHVjZXIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMxKSA6IFwiYGJ1aWxkZXIuYWRkRGVmYXVsdENhc2VgIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZWZhdWx0Q2FzZVJlZHVjZXIgPSByZWR1Y2VyO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfVxuICB9O1xuICBidWlsZGVyQ2FsbGJhY2soYnVpbGRlcik7XG4gIHJldHVybiBbYWN0aW9uc01hcCwgYWN0aW9uTWF0Y2hlcnMsIGRlZmF1bHRDYXNlUmVkdWNlcl07XG59XG5cbi8vIHNyYy9jcmVhdGVSZWR1Y2VyLnRzXG5zZXRVc2VTdHJpY3RJdGVyYXRpb24oZmFsc2UpO1xuZnVuY3Rpb24gaXNTdGF0ZUZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSwgbWFwT3JCdWlsZGVyQ2FsbGJhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICh0eXBlb2YgbWFwT3JCdWlsZGVyQ2FsbGJhY2sgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDgpIDogXCJUaGUgb2JqZWN0IG5vdGF0aW9uIGZvciBgY3JlYXRlUmVkdWNlcmAgaGFzIGJlZW4gcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGUgJ2J1aWxkZXIgY2FsbGJhY2snIG5vdGF0aW9uIGluc3RlYWQ6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2NyZWF0ZVJlZHVjZXJcIik7XG4gICAgfVxuICB9XG4gIGxldCBbYWN0aW9uc01hcCwgZmluYWxBY3Rpb25NYXRjaGVycywgZmluYWxEZWZhdWx0Q2FzZVJlZHVjZXJdID0gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2sobWFwT3JCdWlsZGVyQ2FsbGJhY2spO1xuICBsZXQgZ2V0SW5pdGlhbFN0YXRlO1xuICBpZiAoaXNTdGF0ZUZ1bmN0aW9uKGluaXRpYWxTdGF0ZSkpIHtcbiAgICBnZXRJbml0aWFsU3RhdGUgPSAoKSA9PiBmcmVlemVEcmFmdGFibGUoaW5pdGlhbFN0YXRlKCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGZyb3plbkluaXRpYWxTdGF0ZSA9IGZyZWV6ZURyYWZ0YWJsZShpbml0aWFsU3RhdGUpO1xuICAgIGdldEluaXRpYWxTdGF0ZSA9ICgpID0+IGZyb3plbkluaXRpYWxTdGF0ZTtcbiAgfVxuICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlKCksIGFjdGlvbikge1xuICAgIGxldCBjYXNlUmVkdWNlcnMgPSBbYWN0aW9uc01hcFthY3Rpb24udHlwZV0sIC4uLmZpbmFsQWN0aW9uTWF0Y2hlcnMuZmlsdGVyKCh7XG4gICAgICBtYXRjaGVyXG4gICAgfSkgPT4gbWF0Y2hlcihhY3Rpb24pKS5tYXAoKHtcbiAgICAgIHJlZHVjZXI6IHJlZHVjZXIyXG4gICAgfSkgPT4gcmVkdWNlcjIpXTtcbiAgICBpZiAoY2FzZVJlZHVjZXJzLmZpbHRlcigoY3IpID0+ICEhY3IpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FzZVJlZHVjZXJzID0gW2ZpbmFsRGVmYXVsdENhc2VSZWR1Y2VyXTtcbiAgICB9XG4gICAgcmV0dXJuIGNhc2VSZWR1Y2Vycy5yZWR1Y2UoKHByZXZpb3VzU3RhdGUsIGNhc2VSZWR1Y2VyKSA9PiB7XG4gICAgICBpZiAoY2FzZVJlZHVjZXIpIHtcbiAgICAgICAgaWYgKGlzRHJhZnQocHJldmlvdXNTdGF0ZSkpIHtcbiAgICAgICAgICBjb25zdCBkcmFmdCA9IHByZXZpb3VzU3RhdGU7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FzZVJlZHVjZXIoZHJhZnQsIGFjdGlvbik7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmICghaXNEcmFmdGFibGUocHJldmlvdXNTdGF0ZSkpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYXNlUmVkdWNlcihwcmV2aW91c1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkEgY2FzZSByZWR1Y2VyIG9uIGEgbm9uLWRyYWZ0YWJsZSB2YWx1ZSBtdXN0IG5vdCByZXR1cm4gdW5kZWZpbmVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBwcm9kdWNlKHByZXZpb3VzU3RhdGUsIChkcmFmdCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNhc2VSZWR1Y2VyKGRyYWZ0LCBhY3Rpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcbiAgICB9LCBzdGF0ZSk7XG4gIH1cbiAgcmVkdWNlci5nZXRJbml0aWFsU3RhdGUgPSBnZXRJbml0aWFsU3RhdGU7XG4gIHJldHVybiByZWR1Y2VyO1xufVxuXG4vLyBzcmMvbWF0Y2hlcnMudHNcbnZhciBtYXRjaGVzID0gKG1hdGNoZXIsIGFjdGlvbikgPT4ge1xuICBpZiAoaGFzTWF0Y2hGdW5jdGlvbihtYXRjaGVyKSkge1xuICAgIHJldHVybiBtYXRjaGVyLm1hdGNoKGFjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1hdGNoZXIoYWN0aW9uKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGlzQW55T2YoLi4ubWF0Y2hlcnMpIHtcbiAgcmV0dXJuIChhY3Rpb24pID0+IHtcbiAgICByZXR1cm4gbWF0Y2hlcnMuc29tZSgobWF0Y2hlcikgPT4gbWF0Y2hlcyhtYXRjaGVyLCBhY3Rpb24pKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGlzQWxsT2YoLi4ubWF0Y2hlcnMpIHtcbiAgcmV0dXJuIChhY3Rpb24pID0+IHtcbiAgICByZXR1cm4gbWF0Y2hlcnMuZXZlcnkoKG1hdGNoZXIpID0+IG1hdGNoZXMobWF0Y2hlciwgYWN0aW9uKSk7XG4gIH07XG59XG5mdW5jdGlvbiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIHZhbGlkU3RhdHVzKSB7XG4gIGlmICghYWN0aW9uIHx8ICFhY3Rpb24ubWV0YSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBoYXNWYWxpZFJlcXVlc3RJZCA9IHR5cGVvZiBhY3Rpb24ubWV0YS5yZXF1ZXN0SWQgPT09IFwic3RyaW5nXCI7XG4gIGNvbnN0IGhhc1ZhbGlkUmVxdWVzdFN0YXR1cyA9IHZhbGlkU3RhdHVzLmluZGV4T2YoYWN0aW9uLm1ldGEucmVxdWVzdFN0YXR1cykgPiAtMTtcbiAgcmV0dXJuIGhhc1ZhbGlkUmVxdWVzdElkICYmIGhhc1ZhbGlkUmVxdWVzdFN0YXR1cztcbn1cbmZ1bmN0aW9uIGlzQXN5bmNUaHVua0FycmF5KGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBhWzBdID09PSBcImZ1bmN0aW9uXCIgJiYgXCJwZW5kaW5nXCIgaW4gYVswXSAmJiBcImZ1bGZpbGxlZFwiIGluIGFbMF0gJiYgXCJyZWplY3RlZFwiIGluIGFbMF07XG59XG5mdW5jdGlvbiBpc1BlbmRpbmcoLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcInBlbmRpbmdcIl0pO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzUGVuZGluZygpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5tYXAoKGFzeW5jVGh1bmspID0+IGFzeW5jVGh1bmsucGVuZGluZykpO1xufVxuZnVuY3Rpb24gaXNSZWplY3RlZCguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wicmVqZWN0ZWRcIl0pO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzUmVqZWN0ZWQoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MubWFwKChhc3luY1RodW5rKSA9PiBhc3luY1RodW5rLnJlamVjdGVkKSk7XG59XG5mdW5jdGlvbiBpc1JlamVjdGVkV2l0aFZhbHVlKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGNvbnN0IGhhc0ZsYWcgPSAoYWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuIGFjdGlvbiAmJiBhY3Rpb24ubWV0YSAmJiBhY3Rpb24ubWV0YS5yZWplY3RlZFdpdGhWYWx1ZTtcbiAgfTtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBpc0FsbE9mKGlzUmVqZWN0ZWQoLi4uYXN5bmNUaHVua3MpLCBoYXNGbGFnKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc1JlamVjdGVkV2l0aFZhbHVlKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FsbE9mKGlzUmVqZWN0ZWQoLi4uYXN5bmNUaHVua3MpLCBoYXNGbGFnKTtcbn1cbmZ1bmN0aW9uIGlzRnVsZmlsbGVkKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJmdWxmaWxsZWRcIl0pO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzRnVsZmlsbGVkKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLm1hcCgoYXN5bmNUaHVuaykgPT4gYXN5bmNUaHVuay5mdWxmaWxsZWQpKTtcbn1cbmZ1bmN0aW9uIGlzQXN5bmNUaHVua0FjdGlvbiguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wicGVuZGluZ1wiLCBcImZ1bGZpbGxlZFwiLCBcInJlamVjdGVkXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc0FzeW5jVGh1bmtBY3Rpb24oKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MuZmxhdE1hcCgoYXN5bmNUaHVuaykgPT4gW2FzeW5jVGh1bmsucGVuZGluZywgYXN5bmNUaHVuay5yZWplY3RlZCwgYXN5bmNUaHVuay5mdWxmaWxsZWRdKSk7XG59XG5cbi8vIHNyYy9uYW5vaWQudHNcbnZhciB1cmxBbHBoYWJldCA9IFwiTW9kdWxlU3ltYmhhc093blByLTAxMjM0NTY3ODlBQkNERUZHSE5SVmZnY3RpVXZ6X0txWVRKa0x4cFpYSWpRV1wiO1xudmFyIG5hbm9pZCA9IChzaXplID0gMjEpID0+IHtcbiAgbGV0IGlkID0gXCJcIjtcbiAgbGV0IGkgPSBzaXplO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgaWQgKz0gdXJsQWxwaGFiZXRbTWF0aC5yYW5kb20oKSAqIDY0IHwgMF07XG4gIH1cbiAgcmV0dXJuIGlkO1xufTtcblxuLy8gc3JjL2NyZWF0ZUFzeW5jVGh1bmsudHNcbnZhciBjb21tb25Qcm9wZXJ0aWVzID0gW1wibmFtZVwiLCBcIm1lc3NhZ2VcIiwgXCJzdGFja1wiLCBcImNvZGVcIl07XG52YXIgUmVqZWN0V2l0aFZhbHVlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihwYXlsb2FkLCBtZXRhKSB7XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICB9XG4gIC8qXG4gIHR5cGUtb25seSBwcm9wZXJ0eSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIFJlamVjdFdpdGhWYWx1ZSBhbmQgRnVsZmlsbFdpdGhNZXRhXG4gIGRvZXMgbm90IGV4aXN0IGF0IHJ1bnRpbWVcbiAgKi9cbiAgX3R5cGU7XG59O1xudmFyIEZ1bGZpbGxXaXRoTWV0YSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IocGF5bG9hZCwgbWV0YSkge1xuICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgfVxuICAvKlxuICB0eXBlLW9ubHkgcHJvcGVydHkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBSZWplY3RXaXRoVmFsdWUgYW5kIEZ1bGZpbGxXaXRoTWV0YVxuICBkb2VzIG5vdCBleGlzdCBhdCBydW50aW1lXG4gICovXG4gIF90eXBlO1xufTtcbnZhciBtaW5pU2VyaWFsaXplRXJyb3IgPSAodmFsdWUpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHNpbXBsZUVycm9yID0ge307XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBjb21tb25Qcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlW3Byb3BlcnR5XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBzaW1wbGVFcnJvcltwcm9wZXJ0eV0gPSB2YWx1ZVtwcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaW1wbGVFcnJvcjtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2U6IFN0cmluZyh2YWx1ZSlcbiAgfTtcbn07XG52YXIgZXh0ZXJuYWxBYm9ydE1lc3NhZ2UgPSBcIkV4dGVybmFsIHNpZ25hbCB3YXMgYWJvcnRlZFwiO1xudmFyIGNyZWF0ZUFzeW5jVGh1bmsgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcbiAgZnVuY3Rpb24gY3JlYXRlQXN5bmNUaHVuazIodHlwZVByZWZpeCwgcGF5bG9hZENyZWF0b3IsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmdWxmaWxsZWQgPSBjcmVhdGVBY3Rpb24odHlwZVByZWZpeCArIFwiL2Z1bGZpbGxlZFwiLCAocGF5bG9hZCwgcmVxdWVzdElkLCBhcmcsIG1ldGEpID0+ICh7XG4gICAgICBwYXlsb2FkLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi5tZXRhIHx8IHt9LFxuICAgICAgICBhcmcsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcmVxdWVzdFN0YXR1czogXCJmdWxmaWxsZWRcIlxuICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBwZW5kaW5nID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9wZW5kaW5nXCIsIChyZXF1ZXN0SWQsIGFyZywgbWV0YSkgPT4gKHtcbiAgICAgIHBheWxvYWQ6IHZvaWQgMCxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4ubWV0YSB8fCB7fSxcbiAgICAgICAgYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHJlcXVlc3RTdGF0dXM6IFwicGVuZGluZ1wiXG4gICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IHJlamVjdGVkID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9yZWplY3RlZFwiLCAoZXJyb3IsIHJlcXVlc3RJZCwgYXJnLCBwYXlsb2FkLCBtZXRhKSA9PiAoe1xuICAgICAgcGF5bG9hZCxcbiAgICAgIGVycm9yOiAob3B0aW9ucyAmJiBvcHRpb25zLnNlcmlhbGl6ZUVycm9yIHx8IG1pbmlTZXJpYWxpemVFcnJvcikoZXJyb3IgfHwgXCJSZWplY3RlZFwiKSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4ubWV0YSB8fCB7fSxcbiAgICAgICAgYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHJlamVjdGVkV2l0aFZhbHVlOiAhIXBheWxvYWQsXG4gICAgICAgIHJlcXVlc3RTdGF0dXM6IFwicmVqZWN0ZWRcIixcbiAgICAgICAgYWJvcnRlZDogZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiLFxuICAgICAgICBjb25kaXRpb246IGVycm9yPy5uYW1lID09PSBcIkNvbmRpdGlvbkVycm9yXCJcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgZnVuY3Rpb24gYWN0aW9uQ3JlYXRvcihhcmcsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUsIGV4dHJhKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IG9wdGlvbnM/LmlkR2VuZXJhdG9yID8gb3B0aW9ucy5pZEdlbmVyYXRvcihhcmcpIDogbmFub2lkKCk7XG4gICAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgbGV0IGFib3J0SGFuZGxlcjtcbiAgICAgICAgbGV0IGFib3J0UmVhc29uO1xuICAgICAgICBmdW5jdGlvbiBhYm9ydChyZWFzb24pIHtcbiAgICAgICAgICBhYm9ydFJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICBhYm9ydChleHRlcm5hbEFib3J0TWVzc2FnZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4gYWJvcnQoZXh0ZXJuYWxBYm9ydE1lc3NhZ2UpLCB7XG4gICAgICAgICAgICAgIG9uY2U6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNlID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbGV0IGZpbmFsQWN0aW9uO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgY29uZGl0aW9uUmVzdWx0ID0gb3B0aW9ucz8uY29uZGl0aW9uPy4oYXJnLCB7XG4gICAgICAgICAgICAgIGdldFN0YXRlLFxuICAgICAgICAgICAgICBleHRyYVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNUaGVuYWJsZShjb25kaXRpb25SZXN1bHQpKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvblJlc3VsdCA9IGF3YWl0IGNvbmRpdGlvblJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25kaXRpb25SZXN1bHQgPT09IGZhbHNlIHx8IGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJDb25kaXRpb25FcnJvclwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiQWJvcnRlZCBkdWUgdG8gY29uZGl0aW9uIGNhbGxiYWNrIHJldHVybmluZyBmYWxzZS5cIlxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWJvcnRlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgIGFib3J0SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3Qoe1xuICAgICAgICAgICAgICAgICAgbmFtZTogXCJBYm9ydEVycm9yXCIsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBhYm9ydFJlYXNvbiB8fCBcIkFib3J0ZWRcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkaXNwYXRjaChwZW5kaW5nKHJlcXVlc3RJZCwgYXJnLCBvcHRpb25zPy5nZXRQZW5kaW5nTWV0YT8uKHtcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgICAgICAgIGV4dHJhXG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgZmluYWxBY3Rpb24gPSBhd2FpdCBQcm9taXNlLnJhY2UoW2Fib3J0ZWRQcm9taXNlLCBQcm9taXNlLnJlc29sdmUocGF5bG9hZENyZWF0b3IoYXJnLCB7XG4gICAgICAgICAgICAgIGRpc3BhdGNoLFxuICAgICAgICAgICAgICBnZXRTdGF0ZSxcbiAgICAgICAgICAgICAgZXh0cmEsXG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICBhYm9ydCxcbiAgICAgICAgICAgICAgcmVqZWN0V2l0aFZhbHVlOiAodmFsdWUsIG1ldGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlamVjdFdpdGhWYWx1ZSh2YWx1ZSwgbWV0YSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bGZpbGxXaXRoVmFsdWU6ICh2YWx1ZSwgbWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVsZmlsbFdpdGhNZXRhKHZhbHVlLCBtZXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVqZWN0V2l0aFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBGdWxmaWxsV2l0aE1ldGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVsZmlsbGVkKHJlc3VsdC5wYXlsb2FkLCByZXF1ZXN0SWQsIGFyZywgcmVzdWx0Lm1ldGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmdWxmaWxsZWQocmVzdWx0LCByZXF1ZXN0SWQsIGFyZyk7XG4gICAgICAgICAgICB9KV0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZmluYWxBY3Rpb24gPSBlcnIgaW5zdGFuY2VvZiBSZWplY3RXaXRoVmFsdWUgPyByZWplY3RlZChudWxsLCByZXF1ZXN0SWQsIGFyZywgZXJyLnBheWxvYWQsIGVyci5tZXRhKSA6IHJlamVjdGVkKGVyciwgcmVxdWVzdElkLCBhcmcpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoYWJvcnRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNraXBEaXNwYXRjaCA9IG9wdGlvbnMgJiYgIW9wdGlvbnMuZGlzcGF0Y2hDb25kaXRpb25SZWplY3Rpb24gJiYgcmVqZWN0ZWQubWF0Y2goZmluYWxBY3Rpb24pICYmIGZpbmFsQWN0aW9uLm1ldGEuY29uZGl0aW9uO1xuICAgICAgICAgIGlmICghc2tpcERpc3BhdGNoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChmaW5hbEFjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaW5hbEFjdGlvbjtcbiAgICAgICAgfSgpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgICAgICAgYWJvcnQsXG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgIGFyZyxcbiAgICAgICAgICB1bndyYXAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKHVud3JhcFJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjdGlvbkNyZWF0b3IsIHtcbiAgICAgIHBlbmRpbmcsXG4gICAgICByZWplY3RlZCxcbiAgICAgIGZ1bGZpbGxlZCxcbiAgICAgIHNldHRsZWQ6IGlzQW55T2YocmVqZWN0ZWQsIGZ1bGZpbGxlZCksXG4gICAgICB0eXBlUHJlZml4XG4gICAgfSk7XG4gIH1cbiAgY3JlYXRlQXN5bmNUaHVuazIud2l0aFR5cGVzID0gKCkgPT4gY3JlYXRlQXN5bmNUaHVuazI7XG4gIHJldHVybiBjcmVhdGVBc3luY1RodW5rMjtcbn0pKCk7XG5mdW5jdGlvbiB1bndyYXBSZXN1bHQoYWN0aW9uKSB7XG4gIGlmIChhY3Rpb24ubWV0YSAmJiBhY3Rpb24ubWV0YS5yZWplY3RlZFdpdGhWYWx1ZSkge1xuICAgIHRocm93IGFjdGlvbi5wYXlsb2FkO1xuICB9XG4gIGlmIChhY3Rpb24uZXJyb3IpIHtcbiAgICB0aHJvdyBhY3Rpb24uZXJyb3I7XG4gIH1cbiAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xufVxuZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8vIHNyYy9jcmVhdGVTbGljZS50c1xudmFyIGFzeW5jVGh1bmtTeW1ib2wgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcInJ0ay1zbGljZS1jcmVhdGVhc3luY3RodW5rXCIpO1xudmFyIGFzeW5jVGh1bmtDcmVhdG9yID0ge1xuICBbYXN5bmNUaHVua1N5bWJvbF06IGNyZWF0ZUFzeW5jVGh1bmtcbn07XG52YXIgUmVkdWNlclR5cGUgPSAvKiBAX19QVVJFX18gKi8gKChSZWR1Y2VyVHlwZTIpID0+IHtcbiAgUmVkdWNlclR5cGUyW1wicmVkdWNlclwiXSA9IFwicmVkdWNlclwiO1xuICBSZWR1Y2VyVHlwZTJbXCJyZWR1Y2VyV2l0aFByZXBhcmVcIl0gPSBcInJlZHVjZXJXaXRoUHJlcGFyZVwiO1xuICBSZWR1Y2VyVHlwZTJbXCJhc3luY1RodW5rXCJdID0gXCJhc3luY1RodW5rXCI7XG4gIHJldHVybiBSZWR1Y2VyVHlwZTI7XG59KShSZWR1Y2VyVHlwZSB8fCB7fSk7XG5mdW5jdGlvbiBnZXRUeXBlKHNsaWNlLCBhY3Rpb25LZXkpIHtcbiAgcmV0dXJuIGAke3NsaWNlfS8ke2FjdGlvbktleX1gO1xufVxuZnVuY3Rpb24gYnVpbGRDcmVhdGVTbGljZSh7XG4gIGNyZWF0b3JzXG59ID0ge30pIHtcbiAgY29uc3QgY0FUID0gY3JlYXRvcnM/LmFzeW5jVGh1bms/Llthc3luY1RodW5rU3ltYm9sXTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVNsaWNlMihvcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHJlZHVjZXJQYXRoID0gbmFtZVxuICAgIH0gPSBvcHRpb25zO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTEpIDogXCJgbmFtZWAgaXMgYSByZXF1aXJlZCBvcHRpb24gZm9yIGNyZWF0ZVNsaWNlXCIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgaWYgKG9wdGlvbnMuaW5pdGlhbFN0YXRlID09PSB2b2lkIDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIllvdSBtdXN0IHByb3ZpZGUgYW4gYGluaXRpYWxTdGF0ZWAgdmFsdWUgdGhhdCBpcyBub3QgYHVuZGVmaW5lZGAuIFlvdSBtYXkgaGF2ZSBtaXNzcGVsbGVkIGBpbml0aWFsU3RhdGVgXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZWR1Y2VycyA9ICh0eXBlb2Ygb3B0aW9ucy5yZWR1Y2VycyA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy5yZWR1Y2VycyhidWlsZFJlZHVjZXJDcmVhdG9ycygpKSA6IG9wdGlvbnMucmVkdWNlcnMpIHx8IHt9O1xuICAgIGNvbnN0IHJlZHVjZXJOYW1lcyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgc2xpY2VDYXNlUmVkdWNlcnNCeU5hbWU6IHt9LFxuICAgICAgc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGU6IHt9LFxuICAgICAgYWN0aW9uQ3JlYXRvcnM6IHt9LFxuICAgICAgc2xpY2VNYXRjaGVyczogW11cbiAgICB9O1xuICAgIGNvbnN0IGNvbnRleHRNZXRob2RzID0ge1xuICAgICAgYWRkQ2FzZSh0eXBlT3JBY3Rpb25DcmVhdG9yLCByZWR1Y2VyMikge1xuICAgICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHR5cGVPckFjdGlvbkNyZWF0b3IgPT09IFwic3RyaW5nXCIgPyB0eXBlT3JBY3Rpb25DcmVhdG9yIDogdHlwZU9yQWN0aW9uQ3JlYXRvci50eXBlO1xuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMikgOiBcImBjb250ZXh0LmFkZENhc2VgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBhbiBlbXB0eSBhY3Rpb24gdHlwZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSBpbiBjb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJgY29udGV4dC5hZGRDYXNlYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggdHdvIHJlZHVjZXJzIGZvciB0aGUgc2FtZSBhY3Rpb24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlW3R5cGVdID0gcmVkdWNlcjI7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH0sXG4gICAgICBhZGRNYXRjaGVyKG1hdGNoZXIsIHJlZHVjZXIyKSB7XG4gICAgICAgIGNvbnRleHQuc2xpY2VNYXRjaGVycy5wdXNoKHtcbiAgICAgICAgICBtYXRjaGVyLFxuICAgICAgICAgIHJlZHVjZXI6IHJlZHVjZXIyXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9LFxuICAgICAgZXhwb3NlQWN0aW9uKG5hbWUyLCBhY3Rpb25DcmVhdG9yKSB7XG4gICAgICAgIGNvbnRleHQuYWN0aW9uQ3JlYXRvcnNbbmFtZTJdID0gYWN0aW9uQ3JlYXRvcjtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfSxcbiAgICAgIGV4cG9zZUNhc2VSZWR1Y2VyKG5hbWUyLCByZWR1Y2VyMikge1xuICAgICAgICBjb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lW25hbWUyXSA9IHJlZHVjZXIyO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9XG4gICAgfTtcbiAgICByZWR1Y2VyTmFtZXMuZm9yRWFjaCgocmVkdWNlck5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHJlZHVjZXJEZWZpbml0aW9uID0gcmVkdWNlcnNbcmVkdWNlck5hbWVdO1xuICAgICAgY29uc3QgcmVkdWNlckRldGFpbHMgPSB7XG4gICAgICAgIHJlZHVjZXJOYW1lLFxuICAgICAgICB0eXBlOiBnZXRUeXBlKG5hbWUsIHJlZHVjZXJOYW1lKSxcbiAgICAgICAgY3JlYXRlTm90YXRpb246IHR5cGVvZiBvcHRpb25zLnJlZHVjZXJzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgIH07XG4gICAgICBpZiAoaXNBc3luY1RodW5rU2xpY2VSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGVmaW5pdGlvbikpIHtcbiAgICAgICAgaGFuZGxlVGh1bmtDYXNlUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRldGFpbHMsIHJlZHVjZXJEZWZpbml0aW9uLCBjb250ZXh0TWV0aG9kcywgY0FUKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhbmRsZU5vcm1hbFJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZXRhaWxzLCByZWR1Y2VyRGVmaW5pdGlvbiwgY29udGV4dE1ldGhvZHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGJ1aWxkUmVkdWNlcigpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmV4dHJhUmVkdWNlcnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIlRoZSBvYmplY3Qgbm90YXRpb24gZm9yIGBjcmVhdGVTbGljZS5leHRyYVJlZHVjZXJzYCBoYXMgYmVlbiByZW1vdmVkLiBQbGVhc2UgdXNlIHRoZSAnYnVpbGRlciBjYWxsYmFjaycgbm90YXRpb24gaW5zdGVhZDogaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy9hcGkvY3JlYXRlU2xpY2VcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IFtleHRyYVJlZHVjZXJzID0ge30sIGFjdGlvbk1hdGNoZXJzID0gW10sIGRlZmF1bHRDYXNlUmVkdWNlciA9IHZvaWQgMF0gPSB0eXBlb2Ygb3B0aW9ucy5leHRyYVJlZHVjZXJzID09PSBcImZ1bmN0aW9uXCIgPyBleGVjdXRlUmVkdWNlckJ1aWxkZXJDYWxsYmFjayhvcHRpb25zLmV4dHJhUmVkdWNlcnMpIDogW29wdGlvbnMuZXh0cmFSZWR1Y2Vyc107XG4gICAgICBjb25zdCBmaW5hbENhc2VSZWR1Y2VycyA9IHtcbiAgICAgICAgLi4uZXh0cmFSZWR1Y2VycyxcbiAgICAgICAgLi4uY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZVxuICAgICAgfTtcbiAgICAgIHJldHVybiBjcmVhdGVSZWR1Y2VyKG9wdGlvbnMuaW5pdGlhbFN0YXRlLCAoYnVpbGRlcikgPT4ge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZmluYWxDYXNlUmVkdWNlcnMpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZENhc2Uoa2V5LCBmaW5hbENhc2VSZWR1Y2Vyc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBzTSBvZiBjb250ZXh0LnNsaWNlTWF0Y2hlcnMpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZE1hdGNoZXIoc00ubWF0Y2hlciwgc00ucmVkdWNlcik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbSBvZiBhY3Rpb25NYXRjaGVycykge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkTWF0Y2hlcihtLm1hdGNoZXIsIG0ucmVkdWNlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkRGVmYXVsdENhc2UoZGVmYXVsdENhc2VSZWR1Y2VyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdFNlbGYgPSAoc3RhdGUpID0+IHN0YXRlO1xuICAgIGNvbnN0IGluamVjdGVkU2VsZWN0b3JDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgY29uc3QgaW5qZWN0ZWRTdGF0ZUNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gICAgbGV0IF9yZWR1Y2VyO1xuICAgIGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgICAgaWYgKCFfcmVkdWNlcikgX3JlZHVjZXIgPSBidWlsZFJlZHVjZXIoKTtcbiAgICAgIHJldHVybiBfcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgaWYgKCFfcmVkdWNlcikgX3JlZHVjZXIgPSBidWlsZFJlZHVjZXIoKTtcbiAgICAgIHJldHVybiBfcmVkdWNlci5nZXRJbml0aWFsU3RhdGUoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZVNlbGVjdG9yUHJvcHMocmVkdWNlclBhdGgyLCBpbmplY3RlZCA9IGZhbHNlKSB7XG4gICAgICBmdW5jdGlvbiBzZWxlY3RTbGljZShzdGF0ZSkge1xuICAgICAgICBsZXQgc2xpY2VTdGF0ZSA9IHN0YXRlW3JlZHVjZXJQYXRoMl07XG4gICAgICAgIGlmICh0eXBlb2Ygc2xpY2VTdGF0ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGlmIChpbmplY3RlZCkge1xuICAgICAgICAgICAgc2xpY2VTdGF0ZSA9IGdldE9ySW5zZXJ0Q29tcHV0ZWQoaW5qZWN0ZWRTdGF0ZUNhY2hlLCBzZWxlY3RTbGljZSwgZ2V0SW5pdGlhbFN0YXRlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTUpIDogXCJzZWxlY3RTbGljZSByZXR1cm5lZCB1bmRlZmluZWQgZm9yIGFuIHVuaW5qZWN0ZWQgc2xpY2UgcmVkdWNlclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNsaWNlU3RhdGU7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXRTZWxlY3RvcnMoc2VsZWN0U3RhdGUgPSBzZWxlY3RTZWxmKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yQ2FjaGUgPSBnZXRPckluc2VydENvbXB1dGVkKGluamVjdGVkU2VsZWN0b3JDYWNoZSwgaW5qZWN0ZWQsICgpID0+IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpKTtcbiAgICAgICAgcmV0dXJuIGdldE9ySW5zZXJ0Q29tcHV0ZWQoc2VsZWN0b3JDYWNoZSwgc2VsZWN0U3RhdGUsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBtYXAgPSB7fTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lMiwgc2VsZWN0b3JdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuc2VsZWN0b3JzID8/IHt9KSkge1xuICAgICAgICAgICAgbWFwW25hbWUyXSA9IHdyYXBTZWxlY3RvcihzZWxlY3Rvciwgc2VsZWN0U3RhdGUsICgpID0+IGdldE9ySW5zZXJ0Q29tcHV0ZWQoaW5qZWN0ZWRTdGF0ZUNhY2hlLCBzZWxlY3RTdGF0ZSwgZ2V0SW5pdGlhbFN0YXRlKSwgaW5qZWN0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZHVjZXJQYXRoOiByZWR1Y2VyUGF0aDIsXG4gICAgICAgIGdldFNlbGVjdG9ycyxcbiAgICAgICAgZ2V0IHNlbGVjdG9ycygpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0U2VsZWN0b3JzKHNlbGVjdFNsaWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0U2xpY2VcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHNsaWNlID0ge1xuICAgICAgbmFtZSxcbiAgICAgIHJlZHVjZXIsXG4gICAgICBhY3Rpb25zOiBjb250ZXh0LmFjdGlvbkNyZWF0b3JzLFxuICAgICAgY2FzZVJlZHVjZXJzOiBjb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lLFxuICAgICAgZ2V0SW5pdGlhbFN0YXRlLFxuICAgICAgLi4ubWFrZVNlbGVjdG9yUHJvcHMocmVkdWNlclBhdGgpLFxuICAgICAgaW5qZWN0SW50byhpbmplY3RhYmxlLCB7XG4gICAgICAgIHJlZHVjZXJQYXRoOiBwYXRoT3B0LFxuICAgICAgICAuLi5jb25maWdcbiAgICAgIH0gPSB7fSkge1xuICAgICAgICBjb25zdCBuZXdSZWR1Y2VyUGF0aCA9IHBhdGhPcHQgPz8gcmVkdWNlclBhdGg7XG4gICAgICAgIGluamVjdGFibGUuaW5qZWN0KHtcbiAgICAgICAgICByZWR1Y2VyUGF0aDogbmV3UmVkdWNlclBhdGgsXG4gICAgICAgICAgcmVkdWNlclxuICAgICAgICB9LCBjb25maWcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnNsaWNlLFxuICAgICAgICAgIC4uLm1ha2VTZWxlY3RvclByb3BzKG5ld1JlZHVjZXJQYXRoLCB0cnVlKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHNsaWNlO1xuICB9O1xufVxuZnVuY3Rpb24gd3JhcFNlbGVjdG9yKHNlbGVjdG9yLCBzZWxlY3RTdGF0ZSwgZ2V0SW5pdGlhbFN0YXRlLCBpbmplY3RlZCkge1xuICBmdW5jdGlvbiB3cmFwcGVyKHJvb3RTdGF0ZSwgLi4uYXJncykge1xuICAgIGxldCBzbGljZVN0YXRlID0gc2VsZWN0U3RhdGUocm9vdFN0YXRlKTtcbiAgICBpZiAodHlwZW9mIHNsaWNlU3RhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChpbmplY3RlZCkge1xuICAgICAgICBzbGljZVN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNikgOiBcInNlbGVjdFN0YXRlIHJldHVybmVkIHVuZGVmaW5lZCBmb3IgYW4gdW5pbmplY3RlZCBzbGljZSByZWR1Y2VyXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0b3Ioc2xpY2VTdGF0ZSwgLi4uYXJncyk7XG4gIH1cbiAgd3JhcHBlci51bndyYXBwZWQgPSBzZWxlY3RvcjtcbiAgcmV0dXJuIHdyYXBwZXI7XG59XG52YXIgY3JlYXRlU2xpY2UgPSAvKiBAX19QVVJFX18gKi8gYnVpbGRDcmVhdGVTbGljZSgpO1xuZnVuY3Rpb24gYnVpbGRSZWR1Y2VyQ3JlYXRvcnMoKSB7XG4gIGZ1bmN0aW9uIGFzeW5jVGh1bmsocGF5bG9hZENyZWF0b3IsIGNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBfcmVkdWNlckRlZmluaXRpb25UeXBlOiBcImFzeW5jVGh1bmtcIiAvKiBhc3luY1RodW5rICovLFxuICAgICAgcGF5bG9hZENyZWF0b3IsXG4gICAgICAuLi5jb25maWdcbiAgICB9O1xuICB9XG4gIGFzeW5jVGh1bmsud2l0aFR5cGVzID0gKCkgPT4gYXN5bmNUaHVuaztcbiAgcmV0dXJuIHtcbiAgICByZWR1Y2VyKGNhc2VSZWR1Y2VyKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIC8vIGhhY2sgc28gdGhlIHdyYXBwaW5nIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBvcmlnaW5hbFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHdyYXBwZXIgc28gdGhlIGByZWR1Y2VyRGVmaW5pdGlvblR5cGVgIGlzIG5vdCBhc3NpZ25lZCB0byB0aGUgb3JpZ2luYWxcbiAgICAgICAgW2Nhc2VSZWR1Y2VyLm5hbWVdKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gY2FzZVJlZHVjZXIoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH1bY2FzZVJlZHVjZXIubmFtZV0sIHtcbiAgICAgICAgX3JlZHVjZXJEZWZpbml0aW9uVHlwZTogXCJyZWR1Y2VyXCIgLyogcmVkdWNlciAqL1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwcmVwYXJlZFJlZHVjZXIocHJlcGFyZSwgcmVkdWNlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX3JlZHVjZXJEZWZpbml0aW9uVHlwZTogXCJyZWR1Y2VyV2l0aFByZXBhcmVcIiAvKiByZWR1Y2VyV2l0aFByZXBhcmUgKi8sXG4gICAgICAgIHByZXBhcmUsXG4gICAgICAgIHJlZHVjZXJcbiAgICAgIH07XG4gICAgfSxcbiAgICBhc3luY1RodW5rXG4gIH07XG59XG5mdW5jdGlvbiBoYW5kbGVOb3JtYWxSZWR1Y2VyRGVmaW5pdGlvbih7XG4gIHR5cGUsXG4gIHJlZHVjZXJOYW1lLFxuICBjcmVhdGVOb3RhdGlvblxufSwgbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUsIGNvbnRleHQpIHtcbiAgbGV0IGNhc2VSZWR1Y2VyO1xuICBsZXQgcHJlcGFyZUNhbGxiYWNrO1xuICBpZiAoXCJyZWR1Y2VyXCIgaW4gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUpIHtcbiAgICBpZiAoY3JlYXRlTm90YXRpb24gJiYgIWlzQ2FzZVJlZHVjZXJXaXRoUHJlcGFyZURlZmluaXRpb24obWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNykgOiBcIlBsZWFzZSB1c2UgdGhlIGBjcmVhdGUucHJlcGFyZWRSZWR1Y2VyYCBub3RhdGlvbiBmb3IgcHJlcGFyZWQgYWN0aW9uIGNyZWF0b3JzIHdpdGggdGhlIGBjcmVhdGVgIG5vdGF0aW9uLlwiKTtcbiAgICB9XG4gICAgY2FzZVJlZHVjZXIgPSBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZS5yZWR1Y2VyO1xuICAgIHByZXBhcmVDYWxsYmFjayA9IG1heWJlUmVkdWNlcldpdGhQcmVwYXJlLnByZXBhcmU7XG4gIH0gZWxzZSB7XG4gICAgY2FzZVJlZHVjZXIgPSBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZTtcbiAgfVxuICBjb250ZXh0LmFkZENhc2UodHlwZSwgY2FzZVJlZHVjZXIpLmV4cG9zZUNhc2VSZWR1Y2VyKHJlZHVjZXJOYW1lLCBjYXNlUmVkdWNlcikuZXhwb3NlQWN0aW9uKHJlZHVjZXJOYW1lLCBwcmVwYXJlQ2FsbGJhY2sgPyBjcmVhdGVBY3Rpb24odHlwZSwgcHJlcGFyZUNhbGxiYWNrKSA6IGNyZWF0ZUFjdGlvbih0eXBlKSk7XG59XG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtTbGljZVJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZWZpbml0aW9uKSB7XG4gIHJldHVybiByZWR1Y2VyRGVmaW5pdGlvbi5fcmVkdWNlckRlZmluaXRpb25UeXBlID09PSBcImFzeW5jVGh1bmtcIiAvKiBhc3luY1RodW5rICovO1xufVxuZnVuY3Rpb24gaXNDYXNlUmVkdWNlcldpdGhQcmVwYXJlRGVmaW5pdGlvbihyZWR1Y2VyRGVmaW5pdGlvbikge1xuICByZXR1cm4gcmVkdWNlckRlZmluaXRpb24uX3JlZHVjZXJEZWZpbml0aW9uVHlwZSA9PT0gXCJyZWR1Y2VyV2l0aFByZXBhcmVcIiAvKiByZWR1Y2VyV2l0aFByZXBhcmUgKi87XG59XG5mdW5jdGlvbiBoYW5kbGVUaHVua0Nhc2VSZWR1Y2VyRGVmaW5pdGlvbih7XG4gIHR5cGUsXG4gIHJlZHVjZXJOYW1lXG59LCByZWR1Y2VyRGVmaW5pdGlvbiwgY29udGV4dCwgY0FUKSB7XG4gIGlmICghY0FUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTgpIDogXCJDYW5ub3QgdXNlIGBjcmVhdGUuYXN5bmNUaHVua2AgaW4gdGhlIGJ1aWx0LWluIGBjcmVhdGVTbGljZWAuIFVzZSBgYnVpbGRDcmVhdGVTbGljZSh7IGNyZWF0b3JzOiB7IGFzeW5jVGh1bms6IGFzeW5jVGh1bmtDcmVhdG9yIH0gfSlgIHRvIGNyZWF0ZSBhIGN1c3RvbWlzZWQgdmVyc2lvbiBvZiBgY3JlYXRlU2xpY2VgLlwiKTtcbiAgfVxuICBjb25zdCB7XG4gICAgcGF5bG9hZENyZWF0b3IsXG4gICAgZnVsZmlsbGVkLFxuICAgIHBlbmRpbmcsXG4gICAgcmVqZWN0ZWQsXG4gICAgc2V0dGxlZCxcbiAgICBvcHRpb25zXG4gIH0gPSByZWR1Y2VyRGVmaW5pdGlvbjtcbiAgY29uc3QgdGh1bmsgPSBjQVQodHlwZSwgcGF5bG9hZENyZWF0b3IsIG9wdGlvbnMpO1xuICBjb250ZXh0LmV4cG9zZUFjdGlvbihyZWR1Y2VyTmFtZSwgdGh1bmspO1xuICBpZiAoZnVsZmlsbGVkKSB7XG4gICAgY29udGV4dC5hZGRDYXNlKHRodW5rLmZ1bGZpbGxlZCwgZnVsZmlsbGVkKTtcbiAgfVxuICBpZiAocGVuZGluZykge1xuICAgIGNvbnRleHQuYWRkQ2FzZSh0aHVuay5wZW5kaW5nLCBwZW5kaW5nKTtcbiAgfVxuICBpZiAocmVqZWN0ZWQpIHtcbiAgICBjb250ZXh0LmFkZENhc2UodGh1bmsucmVqZWN0ZWQsIHJlamVjdGVkKTtcbiAgfVxuICBpZiAoc2V0dGxlZCkge1xuICAgIGNvbnRleHQuYWRkTWF0Y2hlcih0aHVuay5zZXR0bGVkLCBzZXR0bGVkKTtcbiAgfVxuICBjb250ZXh0LmV4cG9zZUNhc2VSZWR1Y2VyKHJlZHVjZXJOYW1lLCB7XG4gICAgZnVsZmlsbGVkOiBmdWxmaWxsZWQgfHwgbm9vcCxcbiAgICBwZW5kaW5nOiBwZW5kaW5nIHx8IG5vb3AsXG4gICAgcmVqZWN0ZWQ6IHJlamVjdGVkIHx8IG5vb3AsXG4gICAgc2V0dGxlZDogc2V0dGxlZCB8fCBub29wXG4gIH0pO1xufVxuZnVuY3Rpb24gbm9vcCgpIHtcbn1cblxuLy8gc3JjL2VudGl0aWVzL2VudGl0eV9zdGF0ZS50c1xuZnVuY3Rpb24gZ2V0SW5pdGlhbEVudGl0eVN0YXRlKCkge1xuICByZXR1cm4ge1xuICAgIGlkczogW10sXG4gICAgZW50aXRpZXM6IHt9XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJbml0aWFsU3RhdGVGYWN0b3J5KHN0YXRlQWRhcHRlcikge1xuICBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoYWRkaXRpb25hbFN0YXRlID0ge30sIGVudGl0aWVzKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBPYmplY3QuYXNzaWduKGdldEluaXRpYWxFbnRpdHlTdGF0ZSgpLCBhZGRpdGlvbmFsU3RhdGUpO1xuICAgIHJldHVybiBlbnRpdGllcyA/IHN0YXRlQWRhcHRlci5zZXRBbGwoc3RhdGUsIGVudGl0aWVzKSA6IHN0YXRlO1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0SW5pdGlhbFN0YXRlXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9zdGF0ZV9zZWxlY3RvcnMudHNcbmZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yc0ZhY3RvcnkoKSB7XG4gIGZ1bmN0aW9uIGdldFNlbGVjdG9ycyhzZWxlY3RTdGF0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY3JlYXRlU2VsZWN0b3I6IGNyZWF0ZVNlbGVjdG9yMiA9IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc2VsZWN0SWRzID0gKHN0YXRlKSA9PiBzdGF0ZS5pZHM7XG4gICAgY29uc3Qgc2VsZWN0RW50aXRpZXMgPSAoc3RhdGUpID0+IHN0YXRlLmVudGl0aWVzO1xuICAgIGNvbnN0IHNlbGVjdEFsbCA9IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RJZHMsIHNlbGVjdEVudGl0aWVzLCAoaWRzLCBlbnRpdGllcykgPT4gaWRzLm1hcCgoaWQpID0+IGVudGl0aWVzW2lkXSkpO1xuICAgIGNvbnN0IHNlbGVjdElkID0gKF8sIGlkKSA9PiBpZDtcbiAgICBjb25zdCBzZWxlY3RCeUlkID0gKGVudGl0aWVzLCBpZCkgPT4gZW50aXRpZXNbaWRdO1xuICAgIGNvbnN0IHNlbGVjdFRvdGFsID0gY3JlYXRlU2VsZWN0b3IyKHNlbGVjdElkcywgKGlkcykgPT4gaWRzLmxlbmd0aCk7XG4gICAgaWYgKCFzZWxlY3RTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0SWRzLFxuICAgICAgICBzZWxlY3RFbnRpdGllcyxcbiAgICAgICAgc2VsZWN0QWxsLFxuICAgICAgICBzZWxlY3RUb3RhbCxcbiAgICAgICAgc2VsZWN0QnlJZDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdEVudGl0aWVzLCBzZWxlY3RJZCwgc2VsZWN0QnlJZClcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdEdsb2JhbGl6ZWRFbnRpdGllcyA9IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTdGF0ZSwgc2VsZWN0RW50aXRpZXMpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RJZHM6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTdGF0ZSwgc2VsZWN0SWRzKSxcbiAgICAgIHNlbGVjdEVudGl0aWVzOiBzZWxlY3RHbG9iYWxpemVkRW50aXRpZXMsXG4gICAgICBzZWxlY3RBbGw6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTdGF0ZSwgc2VsZWN0QWxsKSxcbiAgICAgIHNlbGVjdFRvdGFsOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdFRvdGFsKSxcbiAgICAgIHNlbGVjdEJ5SWQ6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RHbG9iYWxpemVkRW50aXRpZXMsIHNlbGVjdElkLCBzZWxlY3RCeUlkKVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXRTZWxlY3RvcnNcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3N0YXRlX2FkYXB0ZXIudHNcbnZhciBpc0RyYWZ0VHlwZWQgPSBpc0RyYWZ0O1xuZnVuY3Rpb24gY3JlYXRlU2luZ2xlQXJndW1lbnRTdGF0ZU9wZXJhdG9yKG11dGF0b3IpIHtcbiAgY29uc3Qgb3BlcmF0b3IgPSBjcmVhdGVTdGF0ZU9wZXJhdG9yKChfLCBzdGF0ZSkgPT4gbXV0YXRvcihzdGF0ZSkpO1xuICByZXR1cm4gZnVuY3Rpb24gb3BlcmF0aW9uKHN0YXRlKSB7XG4gICAgcmV0dXJuIG9wZXJhdG9yKHN0YXRlLCB2b2lkIDApO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlU3RhdGVPcGVyYXRvcihtdXRhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiBvcGVyYXRpb24oc3RhdGUsIGFyZykge1xuICAgIGZ1bmN0aW9uIGlzUGF5bG9hZEFjdGlvbkFyZ3VtZW50KGFyZzIpIHtcbiAgICAgIHJldHVybiBpc0ZTQShhcmcyKTtcbiAgICB9XG4gICAgY29uc3QgcnVuTXV0YXRvciA9IChkcmFmdCkgPT4ge1xuICAgICAgaWYgKGlzUGF5bG9hZEFjdGlvbkFyZ3VtZW50KGFyZykpIHtcbiAgICAgICAgbXV0YXRvcihhcmcucGF5bG9hZCwgZHJhZnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXV0YXRvcihhcmcsIGRyYWZ0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpc0RyYWZ0VHlwZWQoc3RhdGUpKSB7XG4gICAgICBydW5NdXRhdG9yKHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2R1Y2Uoc3RhdGUsIHJ1bk11dGF0b3IpO1xuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvdXRpbHMudHNcbmZ1bmN0aW9uIHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCkge1xuICBjb25zdCBrZXkgPSBzZWxlY3RJZChlbnRpdHkpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGtleSA9PT0gdm9pZCAwKSB7XG4gICAgY29uc29sZS53YXJuKFwiVGhlIGVudGl0eSBwYXNzZWQgdG8gdGhlIGBzZWxlY3RJZGAgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgdW5kZWZpbmVkLlwiLCBcIllvdSBzaG91bGQgcHJvYmFibHkgcHJvdmlkZSB5b3VyIG93biBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uLlwiLCBcIlRoZSBlbnRpdHkgdGhhdCB3YXMgcGFzc2VkOlwiLCBlbnRpdHksIFwiVGhlIGBzZWxlY3RJZGAgaW1wbGVtZW50YXRpb246XCIsIHNlbGVjdElkLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiBrZXk7XG59XG5mdW5jdGlvbiBlbnN1cmVFbnRpdGllc0FycmF5KGVudGl0aWVzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShlbnRpdGllcykpIHtcbiAgICBlbnRpdGllcyA9IE9iamVjdC52YWx1ZXMoZW50aXRpZXMpO1xuICB9XG4gIHJldHVybiBlbnRpdGllcztcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnQodmFsdWUpIHtcbiAgcmV0dXJuIGlzRHJhZnQodmFsdWUpID8gY3VycmVudCh2YWx1ZSkgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNwbGl0QWRkZWRVcGRhdGVkRW50aXRpZXMobmV3RW50aXRpZXMsIHNlbGVjdElkLCBzdGF0ZSkge1xuICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICBjb25zdCBleGlzdGluZ0lkc0FycmF5ID0gZ2V0Q3VycmVudChzdGF0ZS5pZHMpO1xuICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQoZXhpc3RpbmdJZHNBcnJheSk7XG4gIGNvbnN0IGFkZGVkID0gW107XG4gIGNvbnN0IGFkZGVkSWRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW10pO1xuICBjb25zdCB1cGRhdGVkID0gW107XG4gIGZvciAoY29uc3QgZW50aXR5IG9mIG5ld0VudGl0aWVzKSB7XG4gICAgY29uc3QgaWQgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xuICAgIGlmIChleGlzdGluZ0lkcy5oYXMoaWQpIHx8IGFkZGVkSWRzLmhhcyhpZCkpIHtcbiAgICAgIHVwZGF0ZWQucHVzaCh7XG4gICAgICAgIGlkLFxuICAgICAgICBjaGFuZ2VzOiBlbnRpdHlcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRlZElkcy5hZGQoaWQpO1xuICAgICAgYWRkZWQucHVzaChlbnRpdHkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2FkZGVkLCB1cGRhdGVkLCBleGlzdGluZ0lkc0FycmF5XTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3Vuc29ydGVkX3N0YXRlX2FkYXB0ZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZVVuc29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkKSB7XG4gIGZ1bmN0aW9uIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIGNvbnN0IGtleSA9IHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCk7XG4gICAgaWYgKGtleSBpbiBzdGF0ZS5lbnRpdGllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZS5pZHMucHVzaChrZXkpO1xuICAgIHN0YXRlLmVudGl0aWVzW2tleV0gPSBlbnRpdHk7XG4gIH1cbiAgZnVuY3Rpb24gYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBuZXdFbnRpdGllcykge1xuICAgICAgYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgY29uc3Qga2V5ID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcbiAgICBpZiAoIShrZXkgaW4gc3RhdGUuZW50aXRpZXMpKSB7XG4gICAgICBzdGF0ZS5pZHMucHVzaChrZXkpO1xuICAgIH1cbiAgICA7XG4gICAgc3RhdGUuZW50aXRpZXNba2V5XSA9IGVudGl0eTtcbiAgfVxuICBmdW5jdGlvbiBzZXRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIG5ld0VudGl0aWVzKSB7XG4gICAgICBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRBbGxNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgc3RhdGUuaWRzID0gW107XG4gICAgc3RhdGUuZW50aXRpZXMgPSB7fTtcbiAgICBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZU9uZU11dGFibHkoa2V5LCBzdGF0ZSkge1xuICAgIHJldHVybiByZW1vdmVNYW55TXV0YWJseShba2V5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZU1hbnlNdXRhYmx5KGtleXMsIHN0YXRlKSB7XG4gICAgbGV0IGRpZE11dGF0ZSA9IGZhbHNlO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5IGluIHN0YXRlLmVudGl0aWVzKSB7XG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1trZXldO1xuICAgICAgICBkaWRNdXRhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChkaWRNdXRhdGUpIHtcbiAgICAgIHN0YXRlLmlkcyA9IHN0YXRlLmlkcy5maWx0ZXIoKGlkKSA9PiBpZCBpbiBzdGF0ZS5lbnRpdGllcyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZUFsbE11dGFibHkoc3RhdGUpIHtcbiAgICBPYmplY3QuYXNzaWduKHN0YXRlLCB7XG4gICAgICBpZHM6IFtdLFxuICAgICAgZW50aXRpZXM6IHt9XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gdGFrZU5ld0tleShrZXlzLCB1cGRhdGUsIHN0YXRlKSB7XG4gICAgY29uc3Qgb3JpZ2luYWwzID0gc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICBpZiAob3JpZ2luYWwzID09PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZCA9IE9iamVjdC5hc3NpZ24oe30sIG9yaWdpbmFsMywgdXBkYXRlLmNoYW5nZXMpO1xuICAgIGNvbnN0IG5ld0tleSA9IHNlbGVjdElkVmFsdWUodXBkYXRlZCwgc2VsZWN0SWQpO1xuICAgIGNvbnN0IGhhc05ld0tleSA9IG5ld0tleSAhPT0gdXBkYXRlLmlkO1xuICAgIGlmIChoYXNOZXdLZXkpIHtcbiAgICAgIGtleXNbdXBkYXRlLmlkXSA9IG5ld0tleTtcbiAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgIH1cbiAgICA7XG4gICAgc3RhdGUuZW50aXRpZXNbbmV3S2V5XSA9IHVwZGF0ZWQ7XG4gICAgcmV0dXJuIGhhc05ld0tleTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVPbmVNdXRhYmx5KHVwZGF0ZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBkYXRlTWFueU11dGFibHkoW3VwZGF0ZV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVzLCBzdGF0ZSkge1xuICAgIGNvbnN0IG5ld0tleXMgPSB7fTtcbiAgICBjb25zdCB1cGRhdGVzUGVyRW50aXR5ID0ge307XG4gICAgdXBkYXRlcy5mb3JFYWNoKCh1cGRhdGUpID0+IHtcbiAgICAgIGlmICh1cGRhdGUuaWQgaW4gc3RhdGUuZW50aXRpZXMpIHtcbiAgICAgICAgdXBkYXRlc1BlckVudGl0eVt1cGRhdGUuaWRdID0ge1xuICAgICAgICAgIGlkOiB1cGRhdGUuaWQsXG4gICAgICAgICAgLy8gU3ByZWFkcyBpZ25vcmUgZmFsc3kgdmFsdWVzLCBzbyB0aGlzIHdvcmtzIGV2ZW4gaWYgdGhlcmUgaXNuJ3RcbiAgICAgICAgICAvLyBhbiBleGlzdGluZyB1cGRhdGUgYWxyZWFkeSBhdCB0aGlzIGtleVxuICAgICAgICAgIGNoYW5nZXM6IHtcbiAgICAgICAgICAgIC4uLnVwZGF0ZXNQZXJFbnRpdHlbdXBkYXRlLmlkXT8uY2hhbmdlcyxcbiAgICAgICAgICAgIC4uLnVwZGF0ZS5jaGFuZ2VzXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVwZGF0ZXMgPSBPYmplY3QudmFsdWVzKHVwZGF0ZXNQZXJFbnRpdHkpO1xuICAgIGNvbnN0IGRpZE11dGF0ZUVudGl0aWVzID0gdXBkYXRlcy5sZW5ndGggPiAwO1xuICAgIGlmIChkaWRNdXRhdGVFbnRpdGllcykge1xuICAgICAgY29uc3QgZGlkTXV0YXRlSWRzID0gdXBkYXRlcy5maWx0ZXIoKHVwZGF0ZSkgPT4gdGFrZU5ld0tleShuZXdLZXlzLCB1cGRhdGUsIHN0YXRlKSkubGVuZ3RoID4gMDtcbiAgICAgIGlmIChkaWRNdXRhdGVJZHMpIHtcbiAgICAgICAgc3RhdGUuaWRzID0gT2JqZWN0LnZhbHVlcyhzdGF0ZS5lbnRpdGllcykubWFwKChlKSA9PiBzZWxlY3RJZFZhbHVlKGUsIHNlbGVjdElkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHVwc2VydE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiB1cHNlcnRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHVwc2VydE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIGNvbnN0IFthZGRlZCwgdXBkYXRlZF0gPSBzcGxpdEFkZGVkVXBkYXRlZEVudGl0aWVzKG5ld0VudGl0aWVzLCBzZWxlY3RJZCwgc3RhdGUpO1xuICAgIGFkZE1hbnlNdXRhYmx5KGFkZGVkLCBzdGF0ZSk7XG4gICAgdXBkYXRlTWFueU11dGFibHkodXBkYXRlZCwgc3RhdGUpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVtb3ZlQWxsOiBjcmVhdGVTaW5nbGVBcmd1bWVudFN0YXRlT3BlcmF0b3IocmVtb3ZlQWxsTXV0YWJseSksXG4gICAgYWRkT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE9uZU11dGFibHkpLFxuICAgIGFkZE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkTWFueU11dGFibHkpLFxuICAgIHNldE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRPbmVNdXRhYmx5KSxcbiAgICBzZXRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE1hbnlNdXRhYmx5KSxcbiAgICBzZXRBbGw6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0QWxsTXV0YWJseSksXG4gICAgdXBkYXRlT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU9uZU11dGFibHkpLFxuICAgIHVwZGF0ZU1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlTWFueU11dGFibHkpLFxuICAgIHVwc2VydE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRPbmVNdXRhYmx5KSxcbiAgICB1cHNlcnRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE1hbnlNdXRhYmx5KSxcbiAgICByZW1vdmVPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IocmVtb3ZlT25lTXV0YWJseSksXG4gICAgcmVtb3ZlTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihyZW1vdmVNYW55TXV0YWJseSlcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3NvcnRlZF9zdGF0ZV9hZGFwdGVyLnRzXG5mdW5jdGlvbiBmaW5kSW5zZXJ0SW5kZXgoc29ydGVkSXRlbXMsIGl0ZW0sIGNvbXBhcmlzb25GdW5jdGlvbikge1xuICBsZXQgbG93SW5kZXggPSAwO1xuICBsZXQgaGlnaEluZGV4ID0gc29ydGVkSXRlbXMubGVuZ3RoO1xuICB3aGlsZSAobG93SW5kZXggPCBoaWdoSW5kZXgpIHtcbiAgICBsZXQgbWlkZGxlSW5kZXggPSBsb3dJbmRleCArIGhpZ2hJbmRleCA+Pj4gMTtcbiAgICBjb25zdCBjdXJyZW50SXRlbSA9IHNvcnRlZEl0ZW1zW21pZGRsZUluZGV4XTtcbiAgICBjb25zdCByZXMgPSBjb21wYXJpc29uRnVuY3Rpb24oaXRlbSwgY3VycmVudEl0ZW0pO1xuICAgIGlmIChyZXMgPj0gMCkge1xuICAgICAgbG93SW5kZXggPSBtaWRkbGVJbmRleCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZ2hJbmRleCA9IG1pZGRsZUluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbG93SW5kZXg7XG59XG5mdW5jdGlvbiBpbnNlcnQoc29ydGVkSXRlbXMsIGl0ZW0sIGNvbXBhcmlzb25GdW5jdGlvbikge1xuICBjb25zdCBpbnNlcnRBdEluZGV4ID0gZmluZEluc2VydEluZGV4KHNvcnRlZEl0ZW1zLCBpdGVtLCBjb21wYXJpc29uRnVuY3Rpb24pO1xuICBzb3J0ZWRJdGVtcy5zcGxpY2UoaW5zZXJ0QXRJbmRleCwgMCwgaXRlbSk7XG4gIHJldHVybiBzb3J0ZWRJdGVtcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCwgY29tcGFyZXIpIHtcbiAgY29uc3Qge1xuICAgIHJlbW92ZU9uZSxcbiAgICByZW1vdmVNYW55LFxuICAgIHJlbW92ZUFsbFxuICB9ID0gY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpO1xuICBmdW5jdGlvbiBhZGRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gYWRkTWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUsIGV4aXN0aW5nSWRzKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBjb25zdCBleGlzdGluZ0tleXMgPSBuZXcgU2V0KGV4aXN0aW5nSWRzID8/IGdldEN1cnJlbnQoc3RhdGUuaWRzKSk7XG4gICAgY29uc3QgYWRkZWRLZXlzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBjb25zdCBtb2RlbHMgPSBuZXdFbnRpdGllcy5maWx0ZXIoKG1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbElkID0gc2VsZWN0SWRWYWx1ZShtb2RlbCwgc2VsZWN0SWQpO1xuICAgICAgY29uc3Qgbm90QWRkZWQgPSAhYWRkZWRLZXlzLmhhcyhtb2RlbElkKTtcbiAgICAgIGlmIChub3RBZGRlZCkgYWRkZWRLZXlzLmFkZChtb2RlbElkKTtcbiAgICAgIHJldHVybiAhZXhpc3RpbmdLZXlzLmhhcyhtb2RlbElkKSAmJiBub3RBZGRlZDtcbiAgICB9KTtcbiAgICBpZiAobW9kZWxzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgbWVyZ2VGdW5jdGlvbihzdGF0ZSwgbW9kZWxzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHNldE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbGV0IGRlZHVwbGljYXRlZEVudGl0aWVzID0ge307XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBpZiAobmV3RW50aXRpZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3RW50aXRpZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SWQgPSBzZWxlY3RJZChpdGVtKTtcbiAgICAgICAgZGVkdXBsaWNhdGVkRW50aXRpZXNbZW50aXR5SWRdID0gaXRlbTtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW2VudGl0eUlkXTtcbiAgICAgIH1cbiAgICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShkZWR1cGxpY2F0ZWRFbnRpdGllcyk7XG4gICAgICBtZXJnZUZ1bmN0aW9uKHN0YXRlLCBuZXdFbnRpdGllcyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldEFsbE11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBzdGF0ZS5lbnRpdGllcyA9IHt9O1xuICAgIHN0YXRlLmlkcyA9IFtdO1xuICAgIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSwgW10pO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZU9uZU11dGFibHkodXBkYXRlLCBzdGF0ZSkge1xuICAgIHJldHVybiB1cGRhdGVNYW55TXV0YWJseShbdXBkYXRlXSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZXMsIHN0YXRlKSB7XG4gICAgbGV0IGFwcGxpZWRVcGRhdGVzID0gZmFsc2U7XG4gICAgbGV0IHJlcGxhY2VkSWRzID0gZmFsc2U7XG4gICAgZm9yIChsZXQgdXBkYXRlIG9mIHVwZGF0ZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgICBpZiAoIWVudGl0eSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGFwcGxpZWRVcGRhdGVzID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW50aXR5LCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgICBjb25zdCBuZXdJZCA9IHNlbGVjdElkKGVudGl0eSk7XG4gICAgICBpZiAodXBkYXRlLmlkICE9PSBuZXdJZCkge1xuICAgICAgICByZXBsYWNlZElkcyA9IHRydWU7XG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgICAgICBjb25zdCBvbGRJbmRleCA9IHN0YXRlLmlkcy5pbmRleE9mKHVwZGF0ZS5pZCk7XG4gICAgICAgIHN0YXRlLmlkc1tvbGRJbmRleF0gPSBuZXdJZDtcbiAgICAgICAgc3RhdGUuZW50aXRpZXNbbmV3SWRdID0gZW50aXR5O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXBwbGllZFVwZGF0ZXMpIHtcbiAgICAgIG1lcmdlRnVuY3Rpb24oc3RhdGUsIFtdLCBhcHBsaWVkVXBkYXRlcywgcmVwbGFjZWRJZHMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBzZXJ0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBjb25zdCBbYWRkZWQsIHVwZGF0ZWQsIGV4aXN0aW5nSWRzQXJyYXldID0gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKTtcbiAgICBpZiAoYWRkZWQubGVuZ3RoKSB7XG4gICAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUsIGV4aXN0aW5nSWRzQXJyYXkpO1xuICAgIH1cbiAgICBpZiAodXBkYXRlZC5sZW5ndGgpIHtcbiAgICAgIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYXJlQXJyYXlzRXF1YWwoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSA9PT0gYltpXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgbWVyZ2VGdW5jdGlvbiA9IChzdGF0ZSwgYWRkZWRJdGVtcywgYXBwbGllZFVwZGF0ZXMsIHJlcGxhY2VkSWRzKSA9PiB7XG4gICAgY29uc3QgY3VycmVudEVudGl0aWVzID0gZ2V0Q3VycmVudChzdGF0ZS5lbnRpdGllcyk7XG4gICAgY29uc3QgY3VycmVudElkcyA9IGdldEN1cnJlbnQoc3RhdGUuaWRzKTtcbiAgICBjb25zdCBzdGF0ZUVudGl0aWVzID0gc3RhdGUuZW50aXRpZXM7XG4gICAgbGV0IGlkcyA9IGN1cnJlbnRJZHM7XG4gICAgaWYgKHJlcGxhY2VkSWRzKSB7XG4gICAgICBpZHMgPSBuZXcgU2V0KGN1cnJlbnRJZHMpO1xuICAgIH1cbiAgICBsZXQgc29ydGVkRW50aXRpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gY3VycmVudEVudGl0aWVzW2lkXTtcbiAgICAgIGlmIChlbnRpdHkpIHtcbiAgICAgICAgc29ydGVkRW50aXRpZXMucHVzaChlbnRpdHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB3YXNQcmV2aW91c2x5RW1wdHkgPSBzb3J0ZWRFbnRpdGllcy5sZW5ndGggPT09IDA7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGFkZGVkSXRlbXMpIHtcbiAgICAgIHN0YXRlRW50aXRpZXNbc2VsZWN0SWQoaXRlbSldID0gaXRlbTtcbiAgICAgIGlmICghd2FzUHJldmlvdXNseUVtcHR5KSB7XG4gICAgICAgIGluc2VydChzb3J0ZWRFbnRpdGllcywgaXRlbSwgY29tcGFyZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAod2FzUHJldmlvdXNseUVtcHR5KSB7XG4gICAgICBzb3J0ZWRFbnRpdGllcyA9IGFkZGVkSXRlbXMuc2xpY2UoKS5zb3J0KGNvbXBhcmVyKTtcbiAgICB9IGVsc2UgaWYgKGFwcGxpZWRVcGRhdGVzKSB7XG4gICAgICBzb3J0ZWRFbnRpdGllcy5zb3J0KGNvbXBhcmVyKTtcbiAgICB9XG4gICAgY29uc3QgbmV3U29ydGVkSWRzID0gc29ydGVkRW50aXRpZXMubWFwKHNlbGVjdElkKTtcbiAgICBpZiAoIWFyZUFycmF5c0VxdWFsKGN1cnJlbnRJZHMsIG5ld1NvcnRlZElkcykpIHtcbiAgICAgIHN0YXRlLmlkcyA9IG5ld1NvcnRlZElkcztcbiAgICB9XG4gIH07XG4gIHJldHVybiB7XG4gICAgcmVtb3ZlT25lLFxuICAgIHJlbW92ZU1hbnksXG4gICAgcmVtb3ZlQWxsLFxuICAgIGFkZE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRPbmVNdXRhYmx5KSxcbiAgICB1cGRhdGVPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlT25lTXV0YWJseSksXG4gICAgdXBzZXJ0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE9uZU11dGFibHkpLFxuICAgIHNldE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRPbmVNdXRhYmx5KSxcbiAgICBzZXRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE1hbnlNdXRhYmx5KSxcbiAgICBzZXRBbGw6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0QWxsTXV0YWJseSksXG4gICAgYWRkTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRNYW55TXV0YWJseSksXG4gICAgdXBkYXRlTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVNYW55TXV0YWJseSksXG4gICAgdXBzZXJ0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRNYW55TXV0YWJseSlcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL2NyZWF0ZV9hZGFwdGVyLnRzXG5mdW5jdGlvbiBjcmVhdGVFbnRpdHlBZGFwdGVyKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgc2VsZWN0SWQsXG4gICAgc29ydENvbXBhcmVyXG4gIH0gPSB7XG4gICAgc29ydENvbXBhcmVyOiBmYWxzZSxcbiAgICBzZWxlY3RJZDogKGluc3RhbmNlKSA9PiBpbnN0YW5jZS5pZCxcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIGNvbnN0IHN0YXRlQWRhcHRlciA9IHNvcnRDb21wYXJlciA/IGNyZWF0ZVNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCwgc29ydENvbXBhcmVyKSA6IGNyZWF0ZVVuc29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkKTtcbiAgY29uc3Qgc3RhdGVGYWN0b3J5ID0gY3JlYXRlSW5pdGlhbFN0YXRlRmFjdG9yeShzdGF0ZUFkYXB0ZXIpO1xuICBjb25zdCBzZWxlY3RvcnNGYWN0b3J5ID0gY3JlYXRlU2VsZWN0b3JzRmFjdG9yeSgpO1xuICByZXR1cm4ge1xuICAgIHNlbGVjdElkLFxuICAgIHNvcnRDb21wYXJlcixcbiAgICAuLi5zdGF0ZUZhY3RvcnksXG4gICAgLi4uc2VsZWN0b3JzRmFjdG9yeSxcbiAgICAuLi5zdGF0ZUFkYXB0ZXJcbiAgfTtcbn1cblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS9leGNlcHRpb25zLnRzXG52YXIgdGFzayA9IFwidGFza1wiO1xudmFyIGxpc3RlbmVyID0gXCJsaXN0ZW5lclwiO1xudmFyIGNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG52YXIgY2FuY2VsbGVkID0gXCJjYW5jZWxsZWRcIjtcbnZhciB0YXNrQ2FuY2VsbGVkID0gYHRhc2stJHtjYW5jZWxsZWR9YDtcbnZhciB0YXNrQ29tcGxldGVkID0gYHRhc2stJHtjb21wbGV0ZWR9YDtcbnZhciBsaXN0ZW5lckNhbmNlbGxlZCA9IGAke2xpc3RlbmVyfS0ke2NhbmNlbGxlZH1gO1xudmFyIGxpc3RlbmVyQ29tcGxldGVkID0gYCR7bGlzdGVuZXJ9LSR7Y29tcGxldGVkfWA7XG52YXIgVGFza0Fib3J0RXJyb3IgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvZGUpIHtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIHRoaXMubWVzc2FnZSA9IGAke3Rhc2t9ICR7Y2FuY2VsbGVkfSAocmVhc29uOiAke2NvZGV9KWA7XG4gIH1cbiAgbmFtZSA9IFwiVGFza0Fib3J0RXJyb3JcIjtcbiAgbWVzc2FnZTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvdXRpbHMudHNcbnZhciBhc3NlcnRGdW5jdGlvbiA9IChmdW5jLCBleHBlY3RlZCkgPT4ge1xuICBpZiAodHlwZW9mIGZ1bmMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMikgOiBgJHtleHBlY3RlZH0gaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgfVxufTtcbnZhciBub29wMiA9ICgpID0+IHtcbn07XG52YXIgY2F0Y2hSZWplY3Rpb24gPSAocHJvbWlzZSwgb25FcnJvciA9IG5vb3AyKSA9PiB7XG4gIHByb21pc2UuY2F0Y2gob25FcnJvcik7XG4gIHJldHVybiBwcm9taXNlO1xufTtcbnZhciBhZGRBYm9ydFNpZ25hbExpc3RlbmVyID0gKGFib3J0U2lnbmFsLCBjYWxsYmFjaykgPT4ge1xuICBhYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgY2FsbGJhY2ssIHtcbiAgICBvbmNlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gKCkgPT4gYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGNhbGxiYWNrKTtcbn07XG52YXIgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbiA9IChhYm9ydENvbnRyb2xsZXIsIHJlYXNvbikgPT4ge1xuICBjb25zdCBzaWduYWwgPSBhYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCEoXCJyZWFzb25cIiBpbiBzaWduYWwpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNpZ25hbCwgXCJyZWFzb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiByZWFzb24sXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIDtcbiAgYWJvcnRDb250cm9sbGVyLmFib3J0KHJlYXNvbik7XG59O1xuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL3Rhc2sudHNcbnZhciB2YWxpZGF0ZUFjdGl2ZSA9IChzaWduYWwpID0+IHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVhc29uXG4gICAgfSA9IHNpZ25hbDtcbiAgICB0aHJvdyBuZXcgVGFza0Fib3J0RXJyb3IocmVhc29uKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHJhY2VXaXRoU2lnbmFsKHNpZ25hbCwgcHJvbWlzZSkge1xuICBsZXQgY2xlYW51cCA9IG5vb3AyO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG5vdGlmeVJlamVjdGlvbiA9ICgpID0+IHJlamVjdChuZXcgVGFza0Fib3J0RXJyb3Ioc2lnbmFsLnJlYXNvbikpO1xuICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgbm90aWZ5UmVqZWN0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNsZWFudXAgPSBhZGRBYm9ydFNpZ25hbExpc3RlbmVyKHNpZ25hbCwgbm90aWZ5UmVqZWN0aW9uKTtcbiAgICBwcm9taXNlLmZpbmFsbHkoKCkgPT4gY2xlYW51cCgpKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGNsZWFudXAgPSBub29wMjtcbiAgfSk7XG59XG52YXIgcnVuVGFzayA9IGFzeW5jICh0YXNrMiwgY2xlYW5VcCkgPT4ge1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGFzazIoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBcIm9rXCIsXG4gICAgICB2YWx1ZVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogZXJyb3IgaW5zdGFuY2VvZiBUYXNrQWJvcnRFcnJvciA/IFwiY2FuY2VsbGVkXCIgOiBcInJlamVjdGVkXCIsXG4gICAgICBlcnJvclxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYW5VcD8uKCk7XG4gIH1cbn07XG52YXIgY3JlYXRlUGF1c2UgPSAoc2lnbmFsKSA9PiB7XG4gIHJldHVybiAocHJvbWlzZSkgPT4ge1xuICAgIHJldHVybiBjYXRjaFJlamVjdGlvbihyYWNlV2l0aFNpZ25hbChzaWduYWwsIHByb21pc2UpLnRoZW4oKG91dHB1dCkgPT4ge1xuICAgICAgdmFsaWRhdGVBY3RpdmUoc2lnbmFsKTtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSkpO1xuICB9O1xufTtcbnZhciBjcmVhdGVEZWxheSA9IChzaWduYWwpID0+IHtcbiAgY29uc3QgcGF1c2UgPSBjcmVhdGVQYXVzZShzaWduYWwpO1xuICByZXR1cm4gKHRpbWVvdXRNcykgPT4ge1xuICAgIHJldHVybiBwYXVzZShuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lb3V0TXMpKSk7XG4gIH07XG59O1xuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL2luZGV4LnRzXG52YXIge1xuICBhc3NpZ25cbn0gPSBPYmplY3Q7XG52YXIgSU5URVJOQUxfTklMX1RPS0VOID0ge307XG52YXIgYWxtID0gXCJsaXN0ZW5lck1pZGRsZXdhcmVcIjtcbnZhciBjcmVhdGVGb3JrID0gKHBhcmVudEFib3J0U2lnbmFsLCBwYXJlbnRCbG9ja2luZ1Byb21pc2VzKSA9PiB7XG4gIGNvbnN0IGxpbmtDb250cm9sbGVycyA9IChjb250cm9sbGVyKSA9PiBhZGRBYm9ydFNpZ25hbExpc3RlbmVyKHBhcmVudEFib3J0U2lnbmFsLCAoKSA9PiBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNvbnRyb2xsZXIsIHBhcmVudEFib3J0U2lnbmFsLnJlYXNvbikpO1xuICByZXR1cm4gKHRhc2tFeGVjdXRvciwgb3B0cykgPT4ge1xuICAgIGFzc2VydEZ1bmN0aW9uKHRhc2tFeGVjdXRvciwgXCJ0YXNrRXhlY3V0b3JcIik7XG4gICAgY29uc3QgY2hpbGRBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgbGlua0NvbnRyb2xsZXJzKGNoaWxkQWJvcnRDb250cm9sbGVyKTtcbiAgICBjb25zdCByZXN1bHQgPSBydW5UYXNrKGFzeW5jICgpID0+IHtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKHBhcmVudEFib3J0U2lnbmFsKTtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICBjb25zdCByZXN1bHQyID0gYXdhaXQgdGFza0V4ZWN1dG9yKHtcbiAgICAgICAgcGF1c2U6IGNyZWF0ZVBhdXNlKGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgIGRlbGF5OiBjcmVhdGVEZWxheShjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICBzaWduYWw6IGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbFxuICAgICAgfSk7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgcmV0dXJuIHJlc3VsdDI7XG4gICAgfSwgKCkgPT4gYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjaGlsZEFib3J0Q29udHJvbGxlciwgdGFza0NvbXBsZXRlZCkpO1xuICAgIGlmIChvcHRzPy5hdXRvSm9pbikge1xuICAgICAgcGFyZW50QmxvY2tpbmdQcm9taXNlcy5wdXNoKHJlc3VsdC5jYXRjaChub29wMikpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0OiBjcmVhdGVQYXVzZShwYXJlbnRBYm9ydFNpZ25hbCkocmVzdWx0KSxcbiAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjaGlsZEFib3J0Q29udHJvbGxlciwgdGFza0NhbmNlbGxlZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn07XG52YXIgY3JlYXRlVGFrZVBhdHRlcm4gPSAoc3RhcnRMaXN0ZW5pbmcsIHNpZ25hbCkgPT4ge1xuICBjb25zdCB0YWtlID0gYXN5bmMgKHByZWRpY2F0ZSwgdGltZW91dCkgPT4ge1xuICAgIHZhbGlkYXRlQWN0aXZlKHNpZ25hbCk7XG4gICAgbGV0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgIH07XG4gICAgY29uc3QgdHVwbGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHN0b3BMaXN0ZW5pbmcgPSBzdGFydExpc3RlbmluZyh7XG4gICAgICAgIHByZWRpY2F0ZSxcbiAgICAgICAgZWZmZWN0OiAoYWN0aW9uLCBsaXN0ZW5lckFwaSkgPT4ge1xuICAgICAgICAgIGxpc3RlbmVyQXBpLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgcmVzb2x2ZShbYWN0aW9uLCBsaXN0ZW5lckFwaS5nZXRTdGF0ZSgpLCBsaXN0ZW5lckFwaS5nZXRPcmlnaW5hbFN0YXRlKCldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICAgICAgc3RvcExpc3RlbmluZygpO1xuICAgICAgICByZWplY3QoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbdHVwbGVQcm9taXNlXTtcbiAgICBpZiAodGltZW91dCAhPSBudWxsKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXQsIG51bGwpKSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByYWNlV2l0aFNpZ25hbChzaWduYWwsIFByb21pc2UucmFjZShwcm9taXNlcykpO1xuICAgICAgdmFsaWRhdGVBY3RpdmUoc2lnbmFsKTtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gKHByZWRpY2F0ZSwgdGltZW91dCkgPT4gY2F0Y2hSZWplY3Rpb24odGFrZShwcmVkaWNhdGUsIHRpbWVvdXQpKTtcbn07XG52YXIgZ2V0TGlzdGVuZXJFbnRyeVByb3BzRnJvbSA9IChvcHRpb25zKSA9PiB7XG4gIGxldCB7XG4gICAgdHlwZSxcbiAgICBhY3Rpb25DcmVhdG9yLFxuICAgIG1hdGNoZXIsXG4gICAgcHJlZGljYXRlLFxuICAgIGVmZmVjdFxuICB9ID0gb3B0aW9ucztcbiAgaWYgKHR5cGUpIHtcbiAgICBwcmVkaWNhdGUgPSBjcmVhdGVBY3Rpb24odHlwZSkubWF0Y2g7XG4gIH0gZWxzZSBpZiAoYWN0aW9uQ3JlYXRvcikge1xuICAgIHR5cGUgPSBhY3Rpb25DcmVhdG9yLnR5cGU7XG4gICAgcHJlZGljYXRlID0gYWN0aW9uQ3JlYXRvci5tYXRjaDtcbiAgfSBlbHNlIGlmIChtYXRjaGVyKSB7XG4gICAgcHJlZGljYXRlID0gbWF0Y2hlcjtcbiAgfSBlbHNlIGlmIChwcmVkaWNhdGUpIHtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMSkgOiBcIkNyZWF0aW5nIG9yIHJlbW92aW5nIGEgbGlzdGVuZXIgcmVxdWlyZXMgb25lIG9mIHRoZSBrbm93biBmaWVsZHMgZm9yIG1hdGNoaW5nIGFuIGFjdGlvblwiKTtcbiAgfVxuICBhc3NlcnRGdW5jdGlvbihlZmZlY3QsIFwib3B0aW9ucy5saXN0ZW5lclwiKTtcbiAgcmV0dXJuIHtcbiAgICBwcmVkaWNhdGUsXG4gICAgdHlwZSxcbiAgICBlZmZlY3RcbiAgfTtcbn07XG52YXIgY3JlYXRlTGlzdGVuZXJFbnRyeSA9IC8qIEBfX1BVUkVfXyAqLyBhc3NpZ24oKG9wdGlvbnMpID0+IHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcHJlZGljYXRlLFxuICAgIGVmZmVjdFxuICB9ID0gZ2V0TGlzdGVuZXJFbnRyeVByb3BzRnJvbShvcHRpb25zKTtcbiAgY29uc3QgZW50cnkgPSB7XG4gICAgaWQ6IG5hbm9pZCgpLFxuICAgIGVmZmVjdCxcbiAgICB0eXBlLFxuICAgIHByZWRpY2F0ZSxcbiAgICBwZW5kaW5nOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLFxuICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMikgOiBcIlVuc3Vic2NyaWJlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBlbnRyeTtcbn0sIHtcbiAgd2l0aFR5cGVzOiAoKSA9PiBjcmVhdGVMaXN0ZW5lckVudHJ5XG59KTtcbnZhciBmaW5kTGlzdGVuZXJFbnRyeSA9IChsaXN0ZW5lck1hcCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICBlZmZlY3QsXG4gICAgcHJlZGljYXRlXG4gIH0gPSBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tKG9wdGlvbnMpO1xuICByZXR1cm4gQXJyYXkuZnJvbShsaXN0ZW5lck1hcC52YWx1ZXMoKSkuZmluZCgoZW50cnkpID0+IHtcbiAgICBjb25zdCBtYXRjaFByZWRpY2F0ZU9yVHlwZSA9IHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiID8gZW50cnkudHlwZSA9PT0gdHlwZSA6IGVudHJ5LnByZWRpY2F0ZSA9PT0gcHJlZGljYXRlO1xuICAgIHJldHVybiBtYXRjaFByZWRpY2F0ZU9yVHlwZSAmJiBlbnRyeS5lZmZlY3QgPT09IGVmZmVjdDtcbiAgfSk7XG59O1xudmFyIGNhbmNlbEFjdGl2ZUxpc3RlbmVycyA9IChlbnRyeSkgPT4ge1xuICBlbnRyeS5wZW5kaW5nLmZvckVhY2goKGNvbnRyb2xsZXIpID0+IHtcbiAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNvbnRyb2xsZXIsIGxpc3RlbmVyQ2FuY2VsbGVkKTtcbiAgfSk7XG59O1xudmFyIGNyZWF0ZUNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlID0gKGxpc3RlbmVyTWFwLCBleGVjdXRpbmdMaXN0ZW5lcnMpID0+IHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyMiBvZiBleGVjdXRpbmdMaXN0ZW5lcnMua2V5cygpKSB7XG4gICAgICBjYW5jZWxBY3RpdmVMaXN0ZW5lcnMobGlzdGVuZXIyKTtcbiAgICB9XG4gICAgbGlzdGVuZXJNYXAuY2xlYXIoKTtcbiAgfTtcbn07XG52YXIgc2FmZWx5Tm90aWZ5RXJyb3IgPSAoZXJyb3JIYW5kbGVyLCBlcnJvclRvTm90aWZ5LCBlcnJvckluZm8pID0+IHtcbiAgdHJ5IHtcbiAgICBlcnJvckhhbmRsZXIoZXJyb3JUb05vdGlmeSwgZXJyb3JJbmZvKTtcbiAgfSBjYXRjaCAoZXJyb3JIYW5kbGVyRXJyb3IpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRocm93IGVycm9ySGFuZGxlckVycm9yO1xuICAgIH0sIDApO1xuICB9XG59O1xudmFyIGFkZExpc3RlbmVyID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vYWRkYCksIHtcbiAgd2l0aFR5cGVzOiAoKSA9PiBhZGRMaXN0ZW5lclxufSk7XG52YXIgY2xlYXJBbGxMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vcmVtb3ZlQWxsYCk7XG52YXIgcmVtb3ZlTGlzdGVuZXIgPSAvKiBAX19QVVJFX18gKi8gYXNzaWduKC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBY3Rpb24oYCR7YWxtfS9yZW1vdmVgKSwge1xuICB3aXRoVHlwZXM6ICgpID0+IHJlbW92ZUxpc3RlbmVyXG59KTtcbnZhciBkZWZhdWx0RXJyb3JIYW5kbGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc29sZS5lcnJvcihgJHthbG19L2Vycm9yYCwgLi4uYXJncyk7XG59O1xudmFyIGNyZWF0ZUxpc3RlbmVyTWlkZGxld2FyZSA9IChtaWRkbGV3YXJlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IGxpc3RlbmVyTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3QgZXhlY3V0aW5nTGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3QgdHJhY2tFeGVjdXRpbmdMaXN0ZW5lciA9IChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IGNvdW50ID0gZXhlY3V0aW5nTGlzdGVuZXJzLmdldChlbnRyeSkgPz8gMDtcbiAgICBleGVjdXRpbmdMaXN0ZW5lcnMuc2V0KGVudHJ5LCBjb3VudCArIDEpO1xuICB9O1xuICBjb25zdCB1bnRyYWNrRXhlY3V0aW5nTGlzdGVuZXIgPSAoZW50cnkpID0+IHtcbiAgICBjb25zdCBjb3VudCA9IGV4ZWN1dGluZ0xpc3RlbmVycy5nZXQoZW50cnkpID8/IDE7XG4gICAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICBleGVjdXRpbmdMaXN0ZW5lcnMuZGVsZXRlKGVudHJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhlY3V0aW5nTGlzdGVuZXJzLnNldChlbnRyeSwgY291bnQgLSAxKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHtcbiAgICBleHRyYSxcbiAgICBvbkVycm9yID0gZGVmYXVsdEVycm9ySGFuZGxlclxuICB9ID0gbWlkZGxld2FyZU9wdGlvbnM7XG4gIGFzc2VydEZ1bmN0aW9uKG9uRXJyb3IsIFwib25FcnJvclwiKTtcbiAgY29uc3QgaW5zZXJ0RW50cnkgPSAoZW50cnkpID0+IHtcbiAgICBlbnRyeS51bnN1YnNjcmliZSA9ICgpID0+IGxpc3RlbmVyTWFwLmRlbGV0ZShlbnRyeS5pZCk7XG4gICAgbGlzdGVuZXJNYXAuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgcmV0dXJuIChjYW5jZWxPcHRpb25zKSA9PiB7XG4gICAgICBlbnRyeS51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKGNhbmNlbE9wdGlvbnM/LmNhbmNlbEFjdGl2ZSkge1xuICAgICAgICBjYW5jZWxBY3RpdmVMaXN0ZW5lcnMoZW50cnkpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG4gIGNvbnN0IHN0YXJ0TGlzdGVuaW5nID0gKG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGZpbmRMaXN0ZW5lckVudHJ5KGxpc3RlbmVyTWFwLCBvcHRpb25zKSA/PyBjcmVhdGVMaXN0ZW5lckVudHJ5KG9wdGlvbnMpO1xuICAgIHJldHVybiBpbnNlcnRFbnRyeShlbnRyeSk7XG4gIH07XG4gIGFzc2lnbihzdGFydExpc3RlbmluZywge1xuICAgIHdpdGhUeXBlczogKCkgPT4gc3RhcnRMaXN0ZW5pbmdcbiAgfSk7XG4gIGNvbnN0IHN0b3BMaXN0ZW5pbmcgPSAob3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gZmluZExpc3RlbmVyRW50cnkobGlzdGVuZXJNYXAsIG9wdGlvbnMpO1xuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudW5zdWJzY3JpYmUoKTtcbiAgICAgIGlmIChvcHRpb25zLmNhbmNlbEFjdGl2ZSkge1xuICAgICAgICBjYW5jZWxBY3RpdmVMaXN0ZW5lcnMoZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gISFlbnRyeTtcbiAgfTtcbiAgYXNzaWduKHN0b3BMaXN0ZW5pbmcsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHN0b3BMaXN0ZW5pbmdcbiAgfSk7XG4gIGNvbnN0IG5vdGlmeUxpc3RlbmVyID0gYXN5bmMgKGVudHJ5LCBhY3Rpb24sIGFwaSwgZ2V0T3JpZ2luYWxTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IGludGVybmFsVGFza0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdGFrZSA9IGNyZWF0ZVRha2VQYXR0ZXJuKHN0YXJ0TGlzdGVuaW5nLCBpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgY29uc3QgYXV0b0pvaW5Qcm9taXNlcyA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBlbnRyeS5wZW5kaW5nLmFkZChpbnRlcm5hbFRhc2tDb250cm9sbGVyKTtcbiAgICAgIHRyYWNrRXhlY3V0aW5nTGlzdGVuZXIoZW50cnkpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKGVudHJ5LmVmZmVjdChcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICAvLyBVc2UgYXNzaWduKCkgcmF0aGVyIHRoYW4gLi4uIHRvIGF2b2lkIGV4dHJhIGhlbHBlciBmdW5jdGlvbnMgYWRkZWQgdG8gYnVuZGxlXG4gICAgICAgIGFzc2lnbih7fSwgYXBpLCB7XG4gICAgICAgICAgZ2V0T3JpZ2luYWxTdGF0ZSxcbiAgICAgICAgICBjb25kaXRpb246IChwcmVkaWNhdGUsIHRpbWVvdXQpID0+IHRha2UocHJlZGljYXRlLCB0aW1lb3V0KS50aGVuKEJvb2xlYW4pLFxuICAgICAgICAgIHRha2UsXG4gICAgICAgICAgZGVsYXk6IGNyZWF0ZURlbGF5KGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgICBwYXVzZTogY3JlYXRlUGF1c2UoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICAgIGV4dHJhLFxuICAgICAgICAgIHNpZ25hbDogaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgZm9yazogY3JlYXRlRm9yayhpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCwgYXV0b0pvaW5Qcm9taXNlcyksXG4gICAgICAgICAgdW5zdWJzY3JpYmU6IGVudHJ5LnVuc3Vic2NyaWJlLFxuICAgICAgICAgIHN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXJNYXAuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjYW5jZWxBY3RpdmVMaXN0ZW5lcnM6ICgpID0+IHtcbiAgICAgICAgICAgIGVudHJ5LnBlbmRpbmcuZm9yRWFjaCgoY29udHJvbGxlciwgXywgc2V0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9PSBpbnRlcm5hbFRhc2tDb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjb250cm9sbGVyLCBsaXN0ZW5lckNhbmNlbGxlZCk7XG4gICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oaW50ZXJuYWxUYXNrQ29udHJvbGxlciwgbGlzdGVuZXJDYW5jZWxsZWQpO1xuICAgICAgICAgICAgZW50cnkucGVuZGluZy5kZWxldGUoaW50ZXJuYWxUYXNrQ29udHJvbGxlcik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aHJvd0lmQ2FuY2VsbGVkOiAoKSA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFjdGl2ZShpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKSk7XG4gICAgfSBjYXRjaCAobGlzdGVuZXJFcnJvcikge1xuICAgICAgaWYgKCEobGlzdGVuZXJFcnJvciBpbnN0YW5jZW9mIFRhc2tBYm9ydEVycm9yKSkge1xuICAgICAgICBzYWZlbHlOb3RpZnlFcnJvcihvbkVycm9yLCBsaXN0ZW5lckVycm9yLCB7XG4gICAgICAgICAgcmFpc2VkQnk6IFwiZWZmZWN0XCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGF1dG9Kb2luUHJvbWlzZXMpO1xuICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihpbnRlcm5hbFRhc2tDb250cm9sbGVyLCBsaXN0ZW5lckNvbXBsZXRlZCk7XG4gICAgICB1bnRyYWNrRXhlY3V0aW5nTGlzdGVuZXIoZW50cnkpO1xuICAgICAgZW50cnkucGVuZGluZy5kZWxldGUoaW50ZXJuYWxUYXNrQ29udHJvbGxlcik7XG4gICAgfVxuICB9O1xuICBjb25zdCBjbGVhckxpc3RlbmVyTWlkZGxld2FyZSA9IGNyZWF0ZUNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlKGxpc3RlbmVyTWFwLCBleGVjdXRpbmdMaXN0ZW5lcnMpO1xuICBjb25zdCBtaWRkbGV3YXJlID0gKGFwaSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAoIWlzQWN0aW9uKGFjdGlvbikpIHtcbiAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgfVxuICAgIGlmIChhZGRMaXN0ZW5lci5tYXRjaChhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gc3RhcnRMaXN0ZW5pbmcoYWN0aW9uLnBheWxvYWQpO1xuICAgIH1cbiAgICBpZiAoY2xlYXJBbGxMaXN0ZW5lcnMubWF0Y2goYWN0aW9uKSkge1xuICAgICAgY2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlbW92ZUxpc3RlbmVyLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIHJldHVybiBzdG9wTGlzdGVuaW5nKGFjdGlvbi5wYXlsb2FkKTtcbiAgICB9XG4gICAgbGV0IG9yaWdpbmFsU3RhdGUgPSBhcGkuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBnZXRPcmlnaW5hbFN0YXRlID0gKCkgPT4ge1xuICAgICAgaWYgKG9yaWdpbmFsU3RhdGUgPT09IElOVEVSTkFMX05JTF9UT0tFTikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMykgOiBgJHthbG19OiBnZXRPcmlnaW5hbFN0YXRlIGNhbiBvbmx5IGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWxTdGF0ZTtcbiAgICB9O1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IG5leHQoYWN0aW9uKTtcbiAgICAgIGlmIChsaXN0ZW5lck1hcC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBhcGkuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJFbnRyaWVzID0gQXJyYXkuZnJvbShsaXN0ZW5lck1hcC52YWx1ZXMoKSk7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgbGlzdGVuZXJFbnRyaWVzKSB7XG4gICAgICAgICAgbGV0IHJ1bkxpc3RlbmVyID0gZmFsc2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJ1bkxpc3RlbmVyID0gZW50cnkucHJlZGljYXRlKGFjdGlvbiwgY3VycmVudFN0YXRlLCBvcmlnaW5hbFN0YXRlKTtcbiAgICAgICAgICB9IGNhdGNoIChwcmVkaWNhdGVFcnJvcikge1xuICAgICAgICAgICAgcnVuTGlzdGVuZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHNhZmVseU5vdGlmeUVycm9yKG9uRXJyb3IsIHByZWRpY2F0ZUVycm9yLCB7XG4gICAgICAgICAgICAgIHJhaXNlZEJ5OiBcInByZWRpY2F0ZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFydW5MaXN0ZW5lcikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKGVudHJ5LCBhY3Rpb24sIGFwaSwgZ2V0T3JpZ2luYWxTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgb3JpZ2luYWxTdGF0ZSA9IElOVEVSTkFMX05JTF9UT0tFTjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtaWRkbGV3YXJlLFxuICAgIHN0YXJ0TGlzdGVuaW5nLFxuICAgIHN0b3BMaXN0ZW5pbmcsXG4gICAgY2xlYXJMaXN0ZW5lcnM6IGNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlXG4gIH07XG59O1xuXG4vLyBzcmMvZHluYW1pY01pZGRsZXdhcmUvaW5kZXgudHNcbnZhciBjcmVhdGVNaWRkbGV3YXJlRW50cnkgPSAobWlkZGxld2FyZSkgPT4gKHtcbiAgbWlkZGxld2FyZSxcbiAgYXBwbGllZDogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKVxufSk7XG52YXIgbWF0Y2hJbnN0YW5jZSA9IChpbnN0YW5jZUlkKSA9PiAoYWN0aW9uKSA9PiBhY3Rpb24/Lm1ldGE/Lmluc3RhbmNlSWQgPT09IGluc3RhbmNlSWQ7XG52YXIgY3JlYXRlRHluYW1pY01pZGRsZXdhcmUgPSAoKSA9PiB7XG4gIGNvbnN0IGluc3RhbmNlSWQgPSBuYW5vaWQoKTtcbiAgY29uc3QgbWlkZGxld2FyZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IHdpdGhNaWRkbGV3YXJlID0gT2JqZWN0LmFzc2lnbihjcmVhdGVBY3Rpb24oXCJkeW5hbWljTWlkZGxld2FyZS9hZGRcIiwgKC4uLm1pZGRsZXdhcmVzKSA9PiAoe1xuICAgIHBheWxvYWQ6IG1pZGRsZXdhcmVzLFxuICAgIG1ldGE6IHtcbiAgICAgIGluc3RhbmNlSWRcbiAgICB9XG4gIH0pKSwge1xuICAgIHdpdGhUeXBlczogKCkgPT4gd2l0aE1pZGRsZXdhcmVcbiAgfSk7XG4gIGNvbnN0IGFkZE1pZGRsZXdhcmUgPSBPYmplY3QuYXNzaWduKGZ1bmN0aW9uIGFkZE1pZGRsZXdhcmUyKC4uLm1pZGRsZXdhcmVzKSB7XG4gICAgbWlkZGxld2FyZXMuZm9yRWFjaCgobWlkZGxld2FyZTIpID0+IHtcbiAgICAgIGdldE9ySW5zZXJ0Q29tcHV0ZWQobWlkZGxld2FyZU1hcCwgbWlkZGxld2FyZTIsIGNyZWF0ZU1pZGRsZXdhcmVFbnRyeSk7XG4gICAgfSk7XG4gIH0sIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IGFkZE1pZGRsZXdhcmVcbiAgfSk7XG4gIGNvbnN0IGdldEZpbmFsTWlkZGxld2FyZSA9IChhcGkpID0+IHtcbiAgICBjb25zdCBhcHBsaWVkTWlkZGxld2FyZSA9IEFycmF5LmZyb20obWlkZGxld2FyZU1hcC52YWx1ZXMoKSkubWFwKChlbnRyeSkgPT4gZ2V0T3JJbnNlcnRDb21wdXRlZChlbnRyeS5hcHBsaWVkLCBhcGksIGVudHJ5Lm1pZGRsZXdhcmUpKTtcbiAgICByZXR1cm4gY29tcG9zZSguLi5hcHBsaWVkTWlkZGxld2FyZSk7XG4gIH07XG4gIGNvbnN0IGlzV2l0aE1pZGRsZXdhcmUgPSBpc0FsbE9mKHdpdGhNaWRkbGV3YXJlLCBtYXRjaEluc3RhbmNlKGluc3RhbmNlSWQpKTtcbiAgY29uc3QgbWlkZGxld2FyZSA9IChhcGkpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgaWYgKGlzV2l0aE1pZGRsZXdhcmUoYWN0aW9uKSkge1xuICAgICAgYWRkTWlkZGxld2FyZSguLi5hY3Rpb24ucGF5bG9hZCk7XG4gICAgICByZXR1cm4gYXBpLmRpc3BhdGNoO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0RmluYWxNaWRkbGV3YXJlKGFwaSkobmV4dCkoYWN0aW9uKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtaWRkbGV3YXJlLFxuICAgIGFkZE1pZGRsZXdhcmUsXG4gICAgd2l0aE1pZGRsZXdhcmUsXG4gICAgaW5zdGFuY2VJZFxuICB9O1xufTtcblxuLy8gc3JjL2NvbWJpbmVTbGljZXMudHNcbmltcG9ydCB7IGNvbWJpbmVSZWR1Y2VycyBhcyBjb21iaW5lUmVkdWNlcnMyIH0gZnJvbSBcInJlZHV4XCI7XG52YXIgaXNTbGljZUxpa2UgPSAobWF5YmVTbGljZUxpa2UpID0+IFwicmVkdWNlclBhdGhcIiBpbiBtYXliZVNsaWNlTGlrZSAmJiB0eXBlb2YgbWF5YmVTbGljZUxpa2UucmVkdWNlclBhdGggPT09IFwic3RyaW5nXCI7XG52YXIgZ2V0UmVkdWNlcnMgPSAoc2xpY2VzKSA9PiBzbGljZXMuZmxhdE1hcCgoc2xpY2VPck1hcCkgPT4gaXNTbGljZUxpa2Uoc2xpY2VPck1hcCkgPyBbW3NsaWNlT3JNYXAucmVkdWNlclBhdGgsIHNsaWNlT3JNYXAucmVkdWNlcl1dIDogT2JqZWN0LmVudHJpZXMoc2xpY2VPck1hcCkpO1xudmFyIE9SSUdJTkFMX1NUQVRFID0gU3ltYm9sLmZvcihcInJ0ay1zdGF0ZS1wcm94eS1vcmlnaW5hbFwiKTtcbnZhciBpc1N0YXRlUHJveHkgPSAodmFsdWUpID0+ICEhdmFsdWUgJiYgISF2YWx1ZVtPUklHSU5BTF9TVEFURV07XG52YXIgc3RhdGVQcm94eU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xudmFyIGNyZWF0ZVN0YXRlUHJveHkgPSAoc3RhdGUsIHJlZHVjZXJNYXAsIGluaXRpYWxTdGF0ZUNhY2hlKSA9PiBnZXRPckluc2VydENvbXB1dGVkKHN0YXRlUHJveHlNYXAsIHN0YXRlLCAoKSA9PiBuZXcgUHJveHkoc3RhdGUsIHtcbiAgZ2V0OiAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4ge1xuICAgIGlmIChwcm9wID09PSBPUklHSU5BTF9TVEFURSkgcmV0dXJuIHRhcmdldDtcbiAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgY2FjaGVkID0gaW5pdGlhbFN0YXRlQ2FjaGVbcHJvcF07XG4gICAgICBpZiAodHlwZW9mIGNhY2hlZCAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGNhY2hlZDtcbiAgICAgIGNvbnN0IHJlZHVjZXIgPSByZWR1Y2VyTWFwW3Byb3BdO1xuICAgICAgaWYgKHJlZHVjZXIpIHtcbiAgICAgICAgY29uc3QgcmVkdWNlclJlc3VsdCA9IHJlZHVjZXIodm9pZCAwLCB7XG4gICAgICAgICAgdHlwZTogbmFub2lkKClcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVkdWNlclJlc3VsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI0KSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtwcm9wLnRvU3RyaW5nKCl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gY2FsbGVkIGZvciBzZWxlY3RvcigpLiBJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCB5b3UgY2FuIHVzZSBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxTdGF0ZUNhY2hlW3Byb3BdID0gcmVkdWNlclJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHJlZHVjZXJSZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pKTtcbnZhciBvcmlnaW5hbCA9IChzdGF0ZSkgPT4ge1xuICBpZiAoIWlzU3RhdGVQcm94eShzdGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNSkgOiBcIm9yaWdpbmFsIG11c3QgYmUgdXNlZCBvbiBzdGF0ZSBQcm94eVwiKTtcbiAgfVxuICByZXR1cm4gc3RhdGVbT1JJR0lOQUxfU1RBVEVdO1xufTtcbnZhciBlbXB0eU9iamVjdCA9IHt9O1xudmFyIG5vb3BSZWR1Y2VyID0gKHN0YXRlID0gZW1wdHlPYmplY3QpID0+IHN0YXRlO1xuZnVuY3Rpb24gY29tYmluZVNsaWNlcyguLi5zbGljZXMpIHtcbiAgY29uc3QgcmVkdWNlck1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhnZXRSZWR1Y2VycyhzbGljZXMpKTtcbiAgY29uc3QgZ2V0UmVkdWNlciA9ICgpID0+IE9iamVjdC5rZXlzKHJlZHVjZXJNYXApLmxlbmd0aCA/IGNvbWJpbmVSZWR1Y2VyczIocmVkdWNlck1hcCkgOiBub29wUmVkdWNlcjtcbiAgbGV0IHJlZHVjZXIgPSBnZXRSZWR1Y2VyKCk7XG4gIGZ1bmN0aW9uIGNvbWJpbmVkUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gIH1cbiAgY29tYmluZWRSZWR1Y2VyLndpdGhMYXp5TG9hZGVkU2xpY2VzID0gKCkgPT4gY29tYmluZWRSZWR1Y2VyO1xuICBjb25zdCBpbml0aWFsU3RhdGVDYWNoZSA9IHt9O1xuICBjb25zdCBpbmplY3QgPSAoc2xpY2UsIGNvbmZpZyA9IHt9KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmVkdWNlclBhdGgsXG4gICAgICByZWR1Y2VyOiByZWR1Y2VyVG9JbmplY3RcbiAgICB9ID0gc2xpY2U7XG4gICAgY29uc3QgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyTWFwW3JlZHVjZXJQYXRoXTtcbiAgICBpZiAoIWNvbmZpZy5vdmVycmlkZUV4aXN0aW5nICYmIGN1cnJlbnRSZWR1Y2VyICYmIGN1cnJlbnRSZWR1Y2VyICE9PSByZWR1Y2VyVG9JbmplY3QpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYGNhbGxlZCBcXGBpbmplY3RcXGAgdG8gb3ZlcnJpZGUgYWxyZWFkeS1leGlzdGluZyByZWR1Y2VyICR7cmVkdWNlclBhdGh9IHdpdGhvdXQgc3BlY2lmeWluZyBcXGBvdmVycmlkZUV4aXN0aW5nOiB0cnVlXFxgYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29tYmluZWRSZWR1Y2VyO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLm92ZXJyaWRlRXhpc3RpbmcgJiYgY3VycmVudFJlZHVjZXIgIT09IHJlZHVjZXJUb0luamVjdCkge1xuICAgICAgZGVsZXRlIGluaXRpYWxTdGF0ZUNhY2hlW3JlZHVjZXJQYXRoXTtcbiAgICB9XG4gICAgcmVkdWNlck1hcFtyZWR1Y2VyUGF0aF0gPSByZWR1Y2VyVG9JbmplY3Q7XG4gICAgcmVkdWNlciA9IGdldFJlZHVjZXIoKTtcbiAgICByZXR1cm4gY29tYmluZWRSZWR1Y2VyO1xuICB9O1xuICBjb25zdCBzZWxlY3RvciA9IE9iamVjdC5hc3NpZ24oZnVuY3Rpb24gbWFrZVNlbGVjdG9yKHNlbGVjdG9yRm4sIHNlbGVjdFN0YXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHNlbGVjdG9yMihzdGF0ZSwgLi4uYXJncykge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yRm4oY3JlYXRlU3RhdGVQcm94eShzZWxlY3RTdGF0ZSA/IHNlbGVjdFN0YXRlKHN0YXRlLCAuLi5hcmdzKSA6IHN0YXRlLCByZWR1Y2VyTWFwLCBpbml0aWFsU3RhdGVDYWNoZSksIC4uLmFyZ3MpO1xuICAgIH07XG4gIH0sIHtcbiAgICBvcmlnaW5hbFxuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oY29tYmluZWRSZWR1Y2VyLCB7XG4gICAgaW5qZWN0LFxuICAgIHNlbGVjdG9yXG4gIH0pO1xufVxuXG4vLyBzcmMvZm9ybWF0UHJvZEVycm9yTWVzc2FnZS50c1xuZnVuY3Rpb24gZm9ybWF0UHJvZEVycm9yTWVzc2FnZShjb2RlKSB7XG4gIHJldHVybiBgTWluaWZpZWQgUmVkdXggVG9vbGtpdCBlcnJvciAjJHtjb2RlfTsgdmlzaXQgaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy9FcnJvcnM/Y29kZT0ke2NvZGV9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMuIGA7XG59XG5leHBvcnQge1xuICBSZWR1Y2VyVHlwZSxcbiAgU0hPVUxEX0FVVE9CQVRDSCxcbiAgVGFza0Fib3J0RXJyb3IsXG4gIFR1cGxlLFxuICBhZGRMaXN0ZW5lcixcbiAgYXN5bmNUaHVua0NyZWF0b3IsXG4gIGF1dG9CYXRjaEVuaGFuY2VyLFxuICBidWlsZENyZWF0ZVNsaWNlLFxuICBjbGVhckFsbExpc3RlbmVycyxcbiAgY29tYmluZVNsaWNlcyxcbiAgY29uZmlndXJlU3RvcmUsXG4gIGNyZWF0ZUFjdGlvbixcbiAgY3JlYXRlQWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUsXG4gIGNyZWF0ZUFzeW5jVGh1bmssXG4gIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yLFxuICBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvckNyZWF0b3IsXG4gIGNyZWF0ZUR5bmFtaWNNaWRkbGV3YXJlLFxuICBjcmVhdGVFbnRpdHlBZGFwdGVyLFxuICBjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUsXG4gIGNyZWF0ZUxpc3RlbmVyTWlkZGxld2FyZSxcbiAgcHJvZHVjZSBhcyBjcmVhdGVOZXh0U3RhdGUsXG4gIGNyZWF0ZVJlZHVjZXIsXG4gIGNyZWF0ZVNlbGVjdG9yLFxuICBjcmVhdGVTZWxlY3RvckNyZWF0b3IsXG4gIGNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSxcbiAgY3JlYXRlU2xpY2UsXG4gIGN1cnJlbnQsXG4gIGZpbmROb25TZXJpYWxpemFibGVWYWx1ZSxcbiAgZm9ybWF0UHJvZEVycm9yTWVzc2FnZSxcbiAgZnJlZXplLFxuICBpc0FjdGlvbkNyZWF0b3IsXG4gIGlzQWxsT2YsXG4gIGlzQW55T2YsXG4gIGlzQXN5bmNUaHVua0FjdGlvbixcbiAgaXNEcmFmdCxcbiAgaXNGU0EgYXMgaXNGbHV4U3RhbmRhcmRBY3Rpb24sXG4gIGlzRnVsZmlsbGVkLFxuICBpc0ltbXV0YWJsZURlZmF1bHQsXG4gIGlzUGVuZGluZyxcbiAgaXNQbGFpbixcbiAgaXNSZWplY3RlZCxcbiAgaXNSZWplY3RlZFdpdGhWYWx1ZSxcbiAgbHJ1TWVtb2l6ZSxcbiAgbWluaVNlcmlhbGl6ZUVycm9yLFxuICBuYW5vaWQsXG4gIG9yaWdpbmFsMiBhcyBvcmlnaW5hbCxcbiAgcHJlcGFyZUF1dG9CYXRjaGVkLFxuICByZW1vdmVMaXN0ZW5lcixcbiAgdW53cmFwUmVzdWx0LFxuICB3ZWFrTWFwTWVtb2l6ZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZHV4LXRvb2xraXQubW9kZXJuLm1qcy5tYXAiLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU25hY2tiYXIgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblN0b3JlIH0gZnJvbSAnLi9hcHBsaWNhdGlvbi1zdG9yZSc7XG52YXIgU25hY2tiYXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuZXhwb3J0IHZhciBTbmFja2JhclByb3ZpZGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW47XG4gICAgdmFyIHNuYWNrYmFyID0gQXBwbGljYXRpb25TdG9yZS51c2VTdGF0ZShmdW5jdGlvbiAocykgeyByZXR1cm4gcy5zbmFja2JhcjsgfSk7XG4gICAgdmFyIHNob3dTbmFja2JhciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBzZXZlcml0eSkge1xuICAgICAgICBpZiAoc2V2ZXJpdHkgPT09IHZvaWQgMCkgeyBzZXZlcml0eSA9ICdpbmZvJzsgfVxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIChfanN4cyhTbmFja2JhckNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHsgc2hvd1NuYWNrYmFyOiBzaG93U25hY2tiYXIgfSwgY2hpbGRyZW46IFtjaGlsZHJlbiwgX2pzeChTbmFja2JhciwgeyBvcGVuOiBzbmFja2Jhci5vcGVuLCBtZXNzYWdlOiBzbmFja2Jhci5tZXNzYWdlLCBzZXZlcml0eTogc25hY2tiYXIuc2V2ZXJpdHksIGF1dG9IaWRlRHVyYXRpb246IDE1MDAsIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IH0pXSB9KSk7XG59O1xuIiwiaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGNvbWJpbmVSZWR1Y2VycywgY29uZmlndXJlU3RvcmUsIH0gZnJvbSAnQHJlZHV4anMvdG9vbGtpdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBRdWVyeUNsaWVudCwgUXVlcnlDbGllbnRQcm92aWRlciB9IGZyb20gJ3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgQnJvd3NlclJvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuaW1wb3J0IHsgaW5zdGl0dXRpb25Db2RlLCB0ZW5hbnRDb2RlLCB3b3Jrc3BhY2UgfSBmcm9tICcuLi91dGlscy9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZ1Byb3ZpZGVyIH0gZnJvbSAnLi9Db25maXJtRGlhbG9nUHJvdmlkZXInO1xuaW1wb3J0IHsgU25hY2tiYXJQcm92aWRlciB9IGZyb20gJy4vU25hY2tiYXJQcm92aWRlcic7XG4vLyBXZSdsbCBhZGQgdGhpcyBleHBvcnQgdG8gZW5zdXJlIFJvdXRlciBpcyBwcm9wZXJseSBleHBvcnRlZFxuZXhwb3J0IHsgQnJvd3NlclJvdXRlciB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nO1xuZXhwb3J0IHZhciBQcm92aWRlcnMgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgYmFzZW5hbWUgPSBfYS5iYXNlbmFtZSwgX2IgPSBfYS5yZWR1Y2VycywgcmVkdWNlcnMgPSBfYiA9PT0gdm9pZCAwID8ge30gOiBfYjtcbiAgICB2YXIgcXVlcnlDbGllbnQgPSBuZXcgUXVlcnlDbGllbnQoe1xuICAgICAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgICAgICAgcXVlcmllczoge1xuICAgICAgICAgICAgICAgIHJlZmV0Y2hPbldpbmRvd0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXRyeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdXNlRXJyb3JCb3VuZGFyeTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgdmFyIGJhc2VOYW1lID0gdGVuYW50Q29kZSAmJiBpbnN0aXR1dGlvbkNvZGUgJiYgd29ya3NwYWNlXG4gICAgICAgID8gXCIvXCIuY29uY2F0KGluc3RpdHV0aW9uQ29kZSwgXCIvXCIpLmNvbmNhdCh3b3Jrc3BhY2UpXG4gICAgICAgIDogJy8nO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgPT09ICcvJyAmJlxuICAgICAgICAgICAgaW5zdGl0dXRpb25Db2RlICYmXG4gICAgICAgICAgICB3b3Jrc3BhY2UgJiZcbiAgICAgICAgICAgIHRlbmFudENvZGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi9cIi5jb25jYXQoaW5zdGl0dXRpb25Db2RlLCBcIi9cIikuY29uY2F0KHdvcmtzcGFjZSkpO1xuICAgICAgICB9XG4gICAgfSwgW2luc3RpdHV0aW9uQ29kZSwgdGVuYW50Q29kZSwgd29ya3NwYWNlXSk7XG4gICAgdmFyIHN0b3JlID0gY29uZmlndXJlU3RvcmUoe1xuICAgICAgICByZWR1Y2VyOiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpLFxuICAgIH0pO1xuICAgIHJldHVybiAoX2pzeChQcm92aWRlciwgeyBzdG9yZTogc3RvcmUsIGNoaWxkcmVuOiBfanN4KEJyb3dzZXJSb3V0ZXIsIHsgYmFzZW5hbWU6IGJhc2VuYW1lICE9PSBudWxsICYmIGJhc2VuYW1lICE9PSB2b2lkIDAgPyBiYXNlbmFtZSA6IGJhc2VOYW1lLCBjaGlsZHJlbjogX2pzeChRdWVyeUNsaWVudFByb3ZpZGVyLCB7IGNsaWVudDogcXVlcnlDbGllbnQsIGNoaWxkcmVuOiBfanN4KFNuYWNrYmFyUHJvdmlkZXIsIHsgY2hpbGRyZW46IF9qc3goQ29uZmlybURpYWxvZ1Byb3ZpZGVyLCB7IGNoaWxkcmVuOiBjaGlsZHJlbiB9KSB9KSB9KSB9KSB9KSk7XG59O1xuIiwiaW1wb3J0IHsgQXBwbGljYXRpb25TdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvYXBwbGljYXRpb24tc3RvcmUnO1xudmFyIGRlZmF1bHRDb25maXJtRGlhbG9nU3RhdGUgPSB7XG4gICAgaXNPcGVuOiBmYWxzZSxcbiAgICB0aXRsZTogJycsXG4gICAgbWVzc2FnZTogJycsXG4gICAgY29uZmlybUJ1dHRvblRleHQ6ICcnLFxuICAgIGNhbmNlbEJ1dHRvblRleHQ6ICcnLFxuICAgIHR5cGU6ICdjb25maXJtJyxcbiAgICBvbkNvbmZpcm06IGZ1bmN0aW9uICgpIHsgfSxcbiAgICBvbkNhbmNlbDogZnVuY3Rpb24gKCkgeyB9LFxufTtcbmV4cG9ydCB2YXIgdXNlQ29uZmlybSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaXNDb25maXJtZWQgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIHRpdGxlID0gX2EudGl0bGUsIG1lc3NhZ2UgPSBfYS5tZXNzYWdlLCBjb25maXJtQnV0dG9uVGV4dCA9IF9hLmNvbmZpcm1CdXR0b25UZXh0LCBjYW5jZWxCdXR0b25UZXh0ID0gX2EuY2FuY2VsQnV0dG9uVGV4dCwgX2IgPSBfYS50eXBlLCB0eXBlID0gX2IgPT09IHZvaWQgMCA/ICdjb25maXJtJyA6IF9iO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgcy5jb25maXJtRGlhbG9nID0ge1xuICAgICAgICAgICAgICAgICAgICBpc09wZW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IGNvbmZpcm1CdXR0b25UZXh0LFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiBjYW5jZWxCdXR0b25UZXh0LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldERpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldERpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgcmVzZXREaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLmNvbmZpcm1EaWFsb2cgPSBkZWZhdWx0Q29uZmlybURpYWxvZ1N0YXRlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBpc0NvbmZpcm1lZDtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBCYXRjaFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJCYXRjaFwiIH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9iYXRjaGVzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBDb3Vyc2VTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ2NvdXJzZU5hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICdsZXZlbCcsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2NvdXJzZXNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIERlcGFydG1lbnRTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnX2lkJyxcbiAgICAgICAgICAgIGlzT2JqZWN0SWQ6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2RlcGFydG1lbnRzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBFbXBsb3llZXNTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ19pZCcsXG4gICAgICAgICAgICBpc09iamVjdElkOiB0cnVlLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnZnVsbE5hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICdlbXBsb3llZUlkJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvZW1wbG95ZWVzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBFeGFtc1JlZ3VsYXRpb25TZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIlJlZ3VsYXRpb25cIiB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvZXhhbS1yZWd1bGF0aW9uc1wiLCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgbGFiZWxLZXk6ICdyLm5hbWUnLFxuICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICB2YWx1ZUtleTogJ3IubmFtZScsXG4gICAgfSB9KSkpOyB9O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbnZhciBleGFtVHlwZU9wdGlvbnMgPSBbXG4gICAgeyBsYWJlbDogJ0FsbCcsIHZhbHVlOiBudWxsIH0sXG4gICAgeyBsYWJlbDogJ1JFR1VMQVInLCB2YWx1ZTogJ1InIH0sXG4gICAgeyBsYWJlbDogJ1NVUFBMRU1FTlRBUlknLCB2YWx1ZTogJ1MnIH0sXG5dO1xuZXhwb3J0IHZhciBFeGFtVHlwZVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7IHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiRXhhbSBUeXBlXCIsIG9wdGlvbnM6IGV4YW1UeXBlT3B0aW9ucyB9LCBwcm9wcykpKTsgfTtcbiIsImV4cG9ydCB2YXIgRmVlVHlwZXMgPSBbXG4gICAge1xuICAgICAgICBsYWJlbDogJ1R1aXRpb24gRmVlJyxcbiAgICAgICAgdmFsdWU6ICd0dWl0aW9uX2ZlZScsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnQWRtaXNzaW9uIEZlZScsXG4gICAgICAgIHZhbHVlOiAnYWRtaXNzaW9uX2ZlZScsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnSG9zdGVsIEZlZScsXG4gICAgICAgIHZhbHVlOiAnaG9zdGVsX2ZlZScsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnVHJhbnNwb3J0IEZlZScsXG4gICAgICAgIHZhbHVlOiAndHJhbnNwb3J0X2ZlZScsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnRXhhbSBGZWUnLFxuICAgICAgICB2YWx1ZTogJ2V4YW1fZmVlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbGFiZWw6ICdPdGhlciBGZWUnLFxuICAgICAgICB2YWx1ZTogJ290aGVyX2ZlZScsXG4gICAgfSxcbl07XG5leHBvcnQgdmFyIHllYXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogNiB9LCBmdW5jdGlvbiAoXywgaSkge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBpO1xufSk7XG5leHBvcnQgdmFyIGJhdGNoT3B0aW9ucyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDEyIH0sIGZ1bmN0aW9uIChfLCBpKSB7IHJldHVybiAoe1xuICAgIGxhYmVsOiBcIlwiLmNvbmNhdChuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBpLCBcIiAtIFwiKS5jb25jYXQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gaSArIDEpLFxuICAgIHZhbHVlOiBcIlwiLmNvbmNhdChuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBpLCBcIiAtIFwiKS5jb25jYXQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gaSArIDEpLFxufSk7IH0pO1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IEZlZVR5cGVzIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgdmFyIEZlZVR5cGVTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiRmVlIFR5cGVcIiwgb3B0aW9uczogRmVlVHlwZXMgPT09IG51bGwgfHwgRmVlVHlwZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEZlZVR5cGVzLm1hcChmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IGl0ZW0udmFsdWUsXG4gICAgICAgIH0pOyB9KSB9LCBwcm9wcykpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBIb3N0ZWxCbG9ja1NlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICAgICAgaXNJbnQ6IHRydWUsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAndHlwZScsXG4gICAgICAgICAgICB1c2VMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZVN1YkxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9ob3N0ZWwtYmxvY2tzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBIb3N0ZWxGbG9vclNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJIb3N0ZWwgUm9vbSBOby5cIiwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2Zsb29yJyxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ2Zsb29yJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9mbG9vcnNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEhvc3RlbFJvb21TZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiSG9zdGVsIFJvb21cIiwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ3Jvb21fbnVtYmVyJyxcbiAgICAgICAgICAgIHVzZUxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICAgICAgLy8gc3ViTGFiZWxLZXk6ICdmbG9vcicsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9ob3N0ZWwtcm9vbXNcIiwgZXh0ZXJuYWxBeGlvczogYXhpb3MgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBNb250aFllYXJTZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIk1vbnRoICYgWWVhclwiIH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9tb250aC15ZWFyc1wiIH0pKSk7IH07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgYXMgYXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBQcmludEZvcm1hdFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3R5cGUnLFxuICAgICAgICAgICAgdXNlU3ViTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3ByaW50LWZvcm1hdHNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFByb2dyYW1TZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ2JyYW5jaENvZGUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICdicmFuY2hEaXNwbGF5JyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvcHJvZ3JhbXNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFJlZ3VsYXRpb25TZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiUmVndWxhdGlvblwiLCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAncmVndWxhdGlvbl9pZCcsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdyLm5hbWUnLFxuICAgICAgICB9IH0sIHByb3BzLCB7IG9wdGlvbnNBcGlFbmRQb2ludDogXCJkcm9wZG93bnMvcmVndWxhdGlvbnNcIiwgZXh0ZXJuYWxBeGlvczogYXhpb3MgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgbm9uV29ya3NwYWNlQXhpb3MgfSBmcm9tICcuLi9jb25maWcnO1xuZXhwb3J0IHZhciBSZXNlYXJjaEV4cGVydFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ29yZ2FuaXphdGlvbicsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9yZXNlYXJjaC1leHBlcnRzXCIsIGV4dGVybmFsQXhpb3M6IG5vbldvcmtzcGFjZUF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUmVzZWFyY2hTdGFnZVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgLy8gRXNjYXBlICdvcmRlcicgY29sdW1uIG5hbWUgYXMgaXQncyBhIHJlc2VydmVkIGtleXdvcmQgaW4gTXlTUUxcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdgb3JkZXJgJyxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICdgb3JkZXJgJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiZHJvcGRvd25zL3Jlc2VhcmNoLXN0YWdlc1wiLCBleHRlcm5hbEF4aW9zOiBub25Xb3Jrc3BhY2VBeGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFNlbWVzdGVyU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAneWVhcicsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvc2VtZXN0ZXJzXCIsIGV4dGVybmFsQXhpb3M6IGF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgU3R1ZGVudFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnc2x1ZycsXG4gICAgICAgICAgICB1c2VMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvc3R1ZGVudHNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFN0dWRlbnRTZXJ2aWNlc1NlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnc2x1ZycsXG4gICAgICAgICAgICB1c2VMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvc3R1ZGVudC1zZXJ2aWNlc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgeWVhcnMgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB2YXIgWWVhclJhbmdlU2VsZWN0b3IgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgX2IgPSBfYS5zdWZmaXgsIHN1ZmZpeCA9IF9iID09PSB2b2lkIDAgPyBudWxsIDogX2IsIF9jID0gX2EudmFsdWVLZXksIHZhbHVlS2V5ID0gX2MgPT09IHZvaWQgMCA/ICd5ZWFyUmFuZ2UnIDogX2MsIHByb3BzID0gX19yZXN0KF9hLCBbXCJzdWZmaXhcIiwgXCJ2YWx1ZUtleVwiXSk7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJZZWFyIFJhbmdlXCIsIG9wdGlvbnM6IHllYXJzID09PSBudWxsIHx8IHllYXJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB5ZWFycy5tYXAoZnVuY3Rpb24gKHllYXIpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICBsYWJlbDogc3VmZml4XG4gICAgICAgICAgICAgICAgPyBcIlwiLmNvbmNhdChzdWZmaXgsIFwiIFwiKS5jb25jYXQoeWVhciwgXCIgLSBcIikuY29uY2F0KHllYXIgKyAxKVxuICAgICAgICAgICAgICAgIDogXCJcIi5jb25jYXQoeWVhciwgXCIgLSBcIikuY29uY2F0KHllYXIgKyAxKSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZUtleSA9PT0gJ3llYXJSYW5nZScgPyBcIlwiLmNvbmNhdCh5ZWFyLCBcIiAtIFwiKS5jb25jYXQoeWVhciArIDEpIDogeWVhcixcbiAgICAgICAgfSk7IH0pIH0sIHByb3BzKSkpO1xufTtcbiIsImV4cG9ydCB2YXIgb3BlbkluTmV3VGFiID0gZnVuY3Rpb24gKHBhdGhBZnRlckJhc2UsIGV4Y2x1ZGVJbnN0aXR1dGlvbiwgZXhjbHVkZVdvcmtzcGFjZSkge1xuICAgIGlmIChleGNsdWRlSW5zdGl0dXRpb24gPT09IHZvaWQgMCkgeyBleGNsdWRlSW5zdGl0dXRpb24gPSBmYWxzZTsgfVxuICAgIGlmIChleGNsdWRlV29ya3NwYWNlID09PSB2b2lkIDApIHsgZXhjbHVkZVdvcmtzcGFjZSA9IGZhbHNlOyB9XG4gICAgdmFyIGN1cnJlbnRQYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIHZhciBzZWdtZW50cyA9IGN1cnJlbnRQYXRoLnNwbGl0KCcvJyk7XG4gICAgLy8gQnVpbGQgYmFzZSBwYXRoIGJhc2VkIG9uIGV4Y2x1c2lvbiBmbGFnc1xuICAgIHZhciBiYXNlUGFydHMgPSBbXTtcbiAgICAvLyBBZGQgc2VnbWVudCAxIChpbnN0aXR1dGlvbikgdW5sZXNzIGV4Y2x1ZGVkXG4gICAgaWYgKCFleGNsdWRlSW5zdGl0dXRpb24gJiYgc2VnbWVudHNbMV0pIHtcbiAgICAgICAgYmFzZVBhcnRzLnB1c2goc2VnbWVudHNbMV0pO1xuICAgIH1cbiAgICAvLyBBZGQgc2VnbWVudCAyICh3b3Jrc3BhY2UpIHVubGVzcyBleGNsdWRlZFxuICAgIGlmICghZXhjbHVkZVdvcmtzcGFjZSAmJiBzZWdtZW50c1syXSkge1xuICAgICAgICBiYXNlUGFydHMucHVzaChzZWdtZW50c1syXSk7XG4gICAgfVxuICAgIHZhciBiYXNlID0gYmFzZVBhcnRzLmxlbmd0aCA+IDAgPyAnLycgKyBiYXNlUGFydHMuam9pbignLycpIDogJyc7XG4gICAgLy8gQ29uc3RydWN0IGZ1bGwgVVJMIGFuZCBvcGVuIGluIG5ldyB0YWJcbiAgICB2YXIgZnVsbFBhdGggPSBcIlwiLmNvbmNhdCh3aW5kb3cubG9jYXRpb24ub3JpZ2luKS5jb25jYXQoYmFzZSwgXCIvXCIpLmNvbmNhdChwYXRoQWZ0ZXJCYXNlKTtcbiAgICB3aW5kb3cub3BlbihmdWxsUGF0aCwgJ19ibGFuaycpO1xufTtcbiJdLCJuYW1lcyI6WyJfX2Fzc2lnbiIsIk9iamVjdCIsImFzc2lnbiIsInQiLCJzIiwiaSIsIm4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJwIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiYXBwbHkiLCJ0aGlzIiwiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJ2YWx1ZSIsInN0ZXAiLCJuZXh0IiwiZSIsInJlamVjdGVkIiwicmVzdWx0IiwiZG9uZSIsInRoZW4iLCJfX2dlbmVyYXRvciIsImJvZHkiLCJmIiwieSIsIl8iLCJsYWJlbCIsInNlbnQiLCJ0cnlzIiwib3BzIiwiZyIsImNyZWF0ZSIsIkl0ZXJhdG9yIiwidmVyYiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwidiIsIm9wIiwiVHlwZUVycm9yIiwicG9wIiwicHVzaCIsInRhcmdldCIsInNvdXJjZSIsImtleSIsIlN1cHByZXNzZWRFcnJvciIsImFwaSIsImluaXQiLCJjb252ZXJ0ZXIiLCJkZWZhdWx0QXR0cmlidXRlcyIsInNldCIsIm5hbWUiLCJhdHRyaWJ1dGVzIiwiZG9jdW1lbnQiLCJleHBpcmVzIiwiRGF0ZSIsIm5vdyIsInRvVVRDU3RyaW5nIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicmVwbGFjZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImVzY2FwZSIsInN0cmluZ2lmaWVkQXR0cmlidXRlcyIsImF0dHJpYnV0ZU5hbWUiLCJzcGxpdCIsImNvb2tpZSIsIndyaXRlIiwiZ2V0IiwiY29va2llcyIsImphciIsInBhcnRzIiwic2xpY2UiLCJqb2luIiwiZm91bmQiLCJyZWFkIiwicmVtb3ZlIiwid2l0aEF0dHJpYnV0ZXMiLCJ3aXRoQ29udmVydGVyIiwiZnJlZXplIiwicGF0aCIsImluaXRpYWxBcHBsaWNhdGlvblN0YXRlIiwiaXNMb2dpbkRpYWxvZ09wZW4iLCJzbmFja2JhciIsIm9wZW4iLCJtZXNzYWdlIiwic2V2ZXJpdHkiLCJjb25maXJtRGlhbG9nIiwiaXNPcGVuIiwidGl0bGUiLCJvbkNvbmZpcm0iLCJvbkNhbmNlbCIsInR5cGUiLCJ1c2VyIiwidW5kZWZpbmVkIiwiaW5zdGl0dXRpb25JbmZvIiwiYXNzZXQiLCJBcHBsaWNhdGlvblN0b3JlIiwiU3RvcmUiLCJpc0RldmVsb3BtZW50Iiwid2luZG93IiwibG9jYXRpb24iLCJob3N0bmFtZSIsImluY2x1ZGVzIiwidGVuYW50Q29kZSIsImluc3RpdHV0aW9uQ29kZSIsInBhdGhuYW1lIiwid29ya3NwYWNlIiwid29ya3NwYWNlQXBpTWFwcGluZyIsImF4aW9zIiwiQXhpb3MiLCJiYXNlVVJMIiwicHJvY2VzcyIsImVudiIsIlJFQUNUX0FQUF9BUElfSE9TVCIsIndpdGhDcmVkZW50aWFscyIsImhlYWRlcnMiLCJjcmVhdGVSc2J1aWxkU2hhcmVkQ29uZmlnIiwiZGVwZW5kZW5jaWVzIiwiYWx3YXlzRWFnZXIiLCJzaGFyZWREZXBlbmRlbmNpZXNMaXN0IiwicmVkdWNlIiwiYWNjIiwicGtnIiwidmVyc2lvbiIsInNpbmdsZXRvbiIsInJlcXVpcmVkVmVyc2lvbiIsImVhZ2VyIiwiaW50ZXJjZXB0b3JzIiwicmVxdWVzdCIsInVzZSIsImNvbmZpZyIsInBhcmFtcyIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsIm1hcCIsIl9hIiwiZm9ybWF0UGFyYW1zIiwid29ya3NwYWNlUHJlZml4IiwidXJsIiwiY29uY2F0Iiwic2Vzc2lvbktleSIsIkNvb2tpZXMiLCJvcGVuUGF5bWVudHNLZXkiLCJzdHVkZW50U2Vzc2lvbktleSIsInNraXBJbnN0aXR1dGlvbkNvZGUiLCJkZWxldGUiLCJlcnJvciIsInJlc3BvbnNlIiwiZGF0YSIsImhpZGVTbmFja2JhciIsIm1ldGhvZCIsInN0YXR1cyIsInVwZGF0ZSIsImVyciIsIl9iIiwiX2MiLCJfZCIsInNob3VsZEhpZGVTbmFja2JhciIsIm5vbldvcmtzcGFjZUF4aW9zIiwiQ29uZmlybUNvbnRleHQiLCJjcmVhdGVDb250ZXh0Iiwic2hvd0NvbmZpcm1EaWFsb2ciLCJDb25maXJtRGlhbG9nUHJvdmlkZXIiLCJjaGlsZHJlbiIsInVzZVN0YXRlIiwiaGFuZGxlQ2xvc2VEaWFsb2ciLCJfanN4cyIsIlByb3ZpZGVyIiwiY29uZmlybUJ1dHRvblRleHQiLCJjYW5jZWxCdXR0b25UZXh0IiwiX2pzeCIsIkNvbmZpcm1EaWFsb2ciLCJfc2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsImJpbmQiLCJfX3Byb3RvX18iLCJpbml0aWFsU3RhdGUiLCJFcnJvckJvdW5kYXJ5IiwiX1JlYWN0JENvbXBvbmVudCIsIl90aGlzIiwiX2xlbiIsIl9hcmdzIiwiQXJyYXkiLCJfa2V5Iiwic3RhdGUiLCJyZXNldEVycm9yQm91bmRhcnkiLCJfdGhpcyRwcm9wcyIsIl9sZW4yIiwiYXJncyIsIl9rZXkyIiwicHJvcHMiLCJvblJlc2V0IiwicmVzZXQiLCJvIiwiY29uc3RydWN0b3IiLCJfaW5oZXJpdHNMb29zZSIsImdldERlcml2ZWRTdGF0ZUZyb21FcnJvciIsIl9wcm90byIsInNldFN0YXRlIiwiY29tcG9uZW50RGlkQ2F0Y2giLCJpbmZvIiwiX3RoaXMkcHJvcHMkb25FcnJvciIsIl90aGlzJHByb3BzMiIsIm9uRXJyb3IiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJfdGhpcyRwcm9wcyRvblJlc2V0S2UiLCJfdGhpcyRwcm9wczMiLCJhIiwiYiIsInJlc2V0S2V5cyIsInNvbWUiLCJpdGVtIiwiaW5kZXgiLCJpcyIsIm9uUmVzZXRLZXlzQ2hhbmdlIiwicmVuZGVyIiwiX3RoaXMkcHJvcHM0IiwiZmFsbGJhY2tSZW5kZXIiLCJGYWxsYmFja0NvbXBvbmVudCIsImZhbGxiYWNrIiwiX3Byb3BzIiwiUmVhY3QiLCJpc1ZhbGlkRWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJFcnJvciIsIkNvbXBvbmVudCIsImMiLCJyIiwidSIsImNvbnRleHQiLCJOT0RFX0VOViIsIm1vZGUiLCJhYm9ydEVhcmx5Iiwic2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbiIsInZhbHVlcyIsInJhd1ZhbHVlcyIsImVycm9ycyIsImlubmVyIiwiY3JpdGVyaWFNb2RlIiwidHlwZXMiLCJwZXJmb3JtTG9naW4iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImZldGNoIiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbnNpZGVySXAiLCJqc29uIiwibGF0IiwibG5nIiwicG9zdCIsInJlcyIsInZhbGlkYXRpb25TY2hlbWEiLCJZdXAiLCJvYmplY3QiLCJzaGFwZSIsInVzZXJuYW1lIiwic3RyaW5nIiwicmVxdWlyZWQiLCJwYXNzd29yZCIsIkxvZ2luIiwiY2xvc2UiLCJkZXZpY2VJbmZvcm1hdGlvbiIsImRldmljZVR5cGUiLCJjbGllbnROYW1lIiwib3MiLCJvc1ZlcnNpb24iLCJ0b2tlblR5cGUiLCJpc0xvY2F0aW9uQWxsb3dlZCIsImRldmljZVN0YXRlIiwic2V0RGV2aWNlU3RhdGUiLCJuYXZpZ2F0ZSIsInVzZU5hdmlnYXRlIiwidXNlRWZmZWN0IiwibmF2aWdhdG9yIiwiZ2VvbG9jYXRpb24iLCJnZXRDdXJyZW50UG9zaXRpb24iLCJwb3NpdGlvbiIsImNvb3JkcyIsInBlcm1pc3Npb25zIiwicXVlcnkiLCJwZXJtaXNzaW9uU3RhdHVzIiwiZGV2aWNlSW5mbyIsIkRldmljZURldGVjdG9yIiwicGFyc2UiLCJ1c2VyQWdlbnQiLCJjbGllbnQiLCJ1c2VGb3JtIiwicmVzb2x2ZXIiLCJ5dXBSZXNvbHZlciIsImhhbmRsZVN1Ym1pdCIsImNvbnRyb2wiLCJmb3JtU3RhdGUiLCJ1c2VNdXRhdGlvbiIsIm9uU3VjY2VzcyIsInNlc3Npb24iLCJ0b2tlbiIsInJlbG9hZCIsIm11dGF0ZSIsImlzTG9hZGluZyIsImNsYXNzTmFtZSIsIkljb25zIiwiQ2FtcHhGdWxsTG9nb0ljb24iLCJDb250cm9sbGVyIiwiZmllbGQiLCJUZXh0RmllbGQiLCJwbGFjZWhvbGRlciIsIm9uQ2hhbmdlIiwiZnVsbFdpZHRoIiwiUGFzc3dvcmRGaWVsZCIsIkJ1dHRvbiIsImNvbG9yIiwidmFyaWFudCIsIm9uQ2xpY2siLCJsb2dpbklkIiwibG9naW5UeXBlIiwiZGlzYWJsZWQiLCJsb2FkaW5nIiwidXNlTG9jYXRpb24iLCJRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSIsIlJlYWN0RXJyb3JCb3VuZGFyeSIsIkVycm9yRmFsbGJhY2siLCJfZSIsIl9mIiwiX2ciLCJfaCIsIlVuQXV0aCIsIkludGVybmFsU2VydmVyRXJyb3IiLCJyZXNldEJvdW5kYXJ5IiwiUmVzb3VyY2VOb3RGb3VuZCIsImNvZGUiLCJOb0ludGVybmVDb25uZWN0aW9uIiwic2l6ZSIsImlzTW9kYWxPcGVuIiwic2V0TW9kYWxPcGVuIiwic2Vzc2lvbkNvb2tpZSIsIlVuQXV0aG9yaXplZCIsImNvbXBvbmVudCIsIl9GcmFnbWVudCIsIkRpYWxvZyIsIm9uQ2xvc2UiLCJjb250ZW50IiwiZm9ybWF0UHJvZEVycm9yTWVzc2FnZSIsInN5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHQiLCJvYnNlcnZhYmxlIiwicmFuZG9tU3RyaW5nIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyaW5nIiwiYWN0aW9uVHlwZXNfZGVmYXVsdCIsIklOSVQiLCJSRVBMQUNFIiwiUFJPQkVfVU5LTk9XTl9BQ1RJT04iLCJpc1BsYWluT2JqZWN0Iiwib2JqIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIm1pbmlLaW5kT2YiLCJ2YWwiLCJpc0FycmF5IiwidG9EYXRlU3RyaW5nIiwiZ2V0RGF0ZSIsInNldERhdGUiLCJpc0RhdGUiLCJzdGFja1RyYWNlTGltaXQiLCJpc0Vycm9yIiwiY29uc3RydWN0b3JOYW1lIiwiY3Rvck5hbWUiLCJ0b0xvd2VyQ2FzZSIsImtpbmRPZiIsInR5cGVPZlZhbCIsImNyZWF0ZVN0b3JlIiwicmVkdWNlciIsInByZWxvYWRlZFN0YXRlIiwiZW5oYW5jZXIiLCJjdXJyZW50UmVkdWNlciIsImN1cnJlbnRTdGF0ZSIsImN1cnJlbnRMaXN0ZW5lcnMiLCJNYXAiLCJuZXh0TGlzdGVuZXJzIiwibGlzdGVuZXJJZENvdW50ZXIiLCJpc0Rpc3BhdGNoaW5nIiwiZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycyIsImZvckVhY2giLCJsaXN0ZW5lciIsImdldFN0YXRlIiwic3Vic2NyaWJlIiwiaXNTdWJzY3JpYmVkIiwibGlzdGVuZXJJZCIsImRpc3BhdGNoIiwiYWN0aW9uIiwicmVwbGFjZVJlZHVjZXIiLCJuZXh0UmVkdWNlciIsIm91dGVyU3Vic2NyaWJlIiwib2JzZXJ2ZXIiLCJvYnNlcnZlU3RhdGUiLCJvYnNlcnZlckFzT2JzZXJ2ZXIiLCJ1bnN1YnNjcmliZSIsIndhcm5pbmciLCJjb25zb2xlIiwiY29tYmluZVJlZHVjZXJzIiwicmVkdWNlcnMiLCJyZWR1Y2VyS2V5cyIsImtleXMiLCJmaW5hbFJlZHVjZXJzIiwiZmluYWxSZWR1Y2VyS2V5cyIsInVuZXhwZWN0ZWRLZXlDYWNoZSIsInNoYXBlQXNzZXJ0aW9uRXJyb3IiLCJhc3NlcnRSZWR1Y2VyU2hhcGUiLCJ3YXJuaW5nTWVzc2FnZSIsImlucHV0U3RhdGUiLCJhcmd1bWVudE5hbWUiLCJ1bmV4cGVjdGVkS2V5cyIsImZpbHRlciIsImdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UiLCJoYXNDaGFuZ2VkIiwibmV4dFN0YXRlIiwicHJldmlvdXNTdGF0ZUZvcktleSIsIm5leHRTdGF0ZUZvcktleSIsImFjdGlvblR5cGUiLCJTdHJpbmciLCJjb21wb3NlIiwiZnVuY3MiLCJhcmciLCJOT1RISU5HIiwiZm9yIiwiRFJBRlRBQkxFIiwiRFJBRlRfU1RBVEUiLCJwbHVnaW4iLCJ0aGluZyIsImRpZSIsIm1zZyIsImlzRHJhZnQiLCJpc0RyYWZ0YWJsZSIsImlzTWFwIiwiaXNTZXQiLCJvYmplY3RDdG9yU3RyaW5nIiwiY2FjaGVkQ3RvclN0cmluZ3MiLCJXZWFrTWFwIiwiQ3RvciIsImN0b3JTdHJpbmciLCJGdW5jdGlvbiIsImVhY2giLCJpdGVyIiwic3RyaWN0IiwiZ2V0QXJjaHR5cGUiLCJSZWZsZWN0Iiwib3duS2V5cyIsImVudHJ5IiwidHlwZV8iLCJoYXMiLCJwcm9wIiwicHJvcE9yT2xkVmFsdWUiLCJhZGQiLCJTZXQiLCJsYXRlc3QiLCJjb3B5XyIsImJhc2VfIiwic2hhbGxvd0NvcHkiLCJiYXNlIiwiaXNQbGFpbiIsImRlc2NyaXB0b3JzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlc2MiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJkZWVwIiwiaXNGcm96ZW4iLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZG9udE11dGF0ZU1ldGhvZE92ZXJyaWRlIiwiY2xlYXIiLCJjdXJyZW50U2NvcGUiLCJwbHVnaW5zIiwiZ2V0UGx1Z2luIiwicGx1Z2luS2V5IiwiZ2V0Q3VycmVudFNjb3BlIiwidXNlUGF0Y2hlc0luU2NvcGUiLCJzY29wZSIsInBhdGNoTGlzdGVuZXIiLCJwYXRjaGVzXyIsImludmVyc2VQYXRjaGVzXyIsInBhdGNoTGlzdGVuZXJfIiwicmV2b2tlU2NvcGUiLCJsZWF2ZVNjb3BlIiwiZHJhZnRzXyIsInJldm9rZURyYWZ0IiwicGFyZW50XyIsImVudGVyU2NvcGUiLCJpbW1lcjIiLCJpbW1lcl8iLCJjYW5BdXRvRnJlZXplXyIsInVuZmluYWxpemVkRHJhZnRzXyIsImRyYWZ0IiwicmV2b2tlXyIsInJldm9rZWRfIiwicHJvY2Vzc1Jlc3VsdCIsImJhc2VEcmFmdCIsIm1vZGlmaWVkXyIsImZpbmFsaXplIiwibWF5YmVGcmVlemUiLCJnZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18iLCJyb290U2NvcGUiLCJ1c2VTdHJpY3RJdGVyYXRpb24iLCJzaG91bGRVc2VTdHJpY3RJdGVyYXRpb24iLCJjaGlsZFZhbHVlIiwiZmluYWxpemVQcm9wZXJ0eSIsInNjb3BlXyIsImZpbmFsaXplZF8iLCJyZXN1bHRFYWNoIiwiaXNTZXQyIiwiZ2VuZXJhdGVQYXRjaGVzXyIsInBhcmVudFN0YXRlIiwidGFyZ2V0T2JqZWN0Iiwicm9vdFBhdGgiLCJ0YXJnZXRJc1NldCIsImNoaWxkSXNGcm96ZW4iLCJhc3NpZ25lZF8iLCJhdXRvRnJlZXplXyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwib2JqZWN0VHJhcHMiLCJnZXREZXNjcmlwdG9yRnJvbVByb3RvIiwiZHJhZnRfIiwicmVhZFByb3BGcm9tUHJvdG8iLCJwZWVrIiwicHJlcGFyZUNvcHkiLCJjcmVhdGVQcm94eSIsImN1cnJlbnQyIiwieCIsIm1hcmtDaGFuZ2VkIiwiTnVtYmVyIiwiaXNOYU4iLCJkZWxldGVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bmVyIiwiZGVmaW5lUHJvcGVydHkiLCJhcnJheVRyYXBzIiwidXNlU3RyaWN0U2hhbGxvd0NvcHlfIiwiZm4iLCJwYXJzZUludCIsInBhcmVudCIsInByb3h5TWFwXyIsInByb3h5U2V0XyIsImlzTWFudWFsXyIsInRyYXBzIiwicmV2b2tlIiwicHJveHkiLCJQcm94eSIsInJldm9jYWJsZSIsImNyZWF0ZVByb3h5UHJveHkiLCJjdXJyZW50SW1wbCIsImNvcHkiLCJpbW1lciIsInVzZVN0cmljdEl0ZXJhdGlvbl8iLCJwcm9kdWNlIiwicmVjaXBlIiwiZGVmYXVsdEJhc2UiLCJzZWxmIiwiYmFzZTIiLCJoYXNFcnJvciIsImlwIiwicHJvZHVjZVdpdGhQYXRjaGVzIiwicGF0Y2hlcyIsImludmVyc2VQYXRjaGVzIiwiYXV0b0ZyZWV6ZSIsInNldEF1dG9GcmVlemUiLCJ1c2VTdHJpY3RTaGFsbG93Q29weSIsInNldFVzZVN0cmljdFNoYWxsb3dDb3B5Iiwic2V0VXNlU3RyaWN0SXRlcmF0aW9uIiwiY3JlYXRlRHJhZnQiLCJjdXJyZW50IiwiZmluaXNoRHJhZnQiLCJhcHBseVBhdGNoZXMiLCJwYXRjaCIsImFwcGx5UGF0Y2hlc0ltcGwiLCJhcHBseVBhdGNoZXNfIiwiY3JlYXRlVGh1bmtNaWRkbGV3YXJlIiwiZXh0cmFBcmd1bWVudCIsInRodW5rIiwid2l0aEV4dHJhQXJndW1lbnQiLCJjb21wb3NlV2l0aERldlRvb2xzIiwiX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fIiwiaXNBY3Rpb25DcmVhdG9yIiwibWF0Y2giLCJnZXRUaW1lTWVhc3VyZVV0aWxzIiwibWF4RGVsYXkiLCJmbk5hbWUiLCJlbGFwc2VkIiwibWVhc3VyZVRpbWUiLCJzdGFydGVkIiwiZmluaXNoZWQiLCJ3YXJuSWZFeGNlZWRlZCIsIlR1cGxlIiwiX1R1cGxlIiwiaXRlbXMiLCJzdXBlciIsInNwZWNpZXMiLCJhcnIiLCJwcmVwZW5kIiwiaXNJbW11dGFibGVEZWZhdWx0IiwidHJhY2tGb3JNdXRhdGlvbnMiLCJpc0ltbXV0YWJsZSIsImlnbm9yZVBhdGhzIiwidHJhY2tlZFByb3BlcnRpZXMiLCJ0cmFja1Byb3BlcnRpZXMiLCJkZXRlY3RNdXRhdGlvbnMiLCJjaGVja2VkT2JqZWN0cyIsInRyYWNrZWQiLCJjaGlsZFBhdGgiLCJpbmRleE9mIiwiaWdub3JlZFBhdGhzIiwidHJhY2tlZFByb3BlcnR5Iiwic2FtZVBhcmVudFJlZiIsInByZXZPYmoiLCJzYW1lUmVmIiwid2FzTXV0YXRlZCIsImtleXNUb0RldGVjdCIsImhhc0lnbm9yZWRQYXRocyIsIm5lc3RlZFBhdGgiLCJpZ25vcmVkIiwiUmVnRXhwIiwidGVzdCIsImZpbmROb25TZXJpYWxpemFibGVWYWx1ZSIsImlzU2VyaWFsaXphYmxlIiwiZ2V0RW50cmllcyIsImNhY2hlIiwiZm91bmROZXN0ZWRTZXJpYWxpemFibGUiLCJrZXlQYXRoIiwibmVzdGVkVmFsdWUiLCJpc05lc3RlZEZyb3plbiIsImNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSIsIm9wdGlvbnMiLCJpZ25vcmVkQWN0aW9ucyIsImlnbm9yZWRBY3Rpb25QYXRocyIsIndhcm5BZnRlciIsImlnbm9yZVN0YXRlIiwiaWdub3JlQWN0aW9ucyIsImRpc2FibGVDYWNoZSIsIldlYWtTZXQiLCJzdG9yZUFQSSIsImlzQWN0aW9uIiwibWVhc3VyZVV0aWxzIiwiZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSIsImZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSIsImlzQm9vbGVhbiIsImJ1aWxkR2V0RGVmYXVsdE1pZGRsZXdhcmUiLCJpbW11dGFibGVDaGVjayIsInNlcmlhbGl6YWJsZUNoZWNrIiwiYWN0aW9uQ3JlYXRvckNoZWNrIiwibWlkZGxld2FyZUFycmF5IiwidGh1bmtNaWRkbGV3YXJlIiwiaW1tdXRhYmxlT3B0aW9ucyIsInVuc2hpZnQiLCJzdHJpbmdpZnkyIiwic2VyaWFsaXplciIsImluZGVudCIsImRlY3ljbGVyIiwiZ2V0U2VyaWFsaXplMiIsInN0YWNrIiwidGhpc1BvcyIsInNwbGljZSIsIkluZmluaXR5IiwidHJhY2siLCJ0cmFja2VyIiwiZGlzcGF0Y2hlZEFjdGlvbiIsImNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSIsInNlcmlhbGl6YWJsZU9wdGlvbnMiLCJhY3Rpb25DcmVhdG9yT3B0aW9ucyIsImlzQWN0aW9uQ3JlYXRvcjIiLCJjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZSIsImNyZWF0ZVF1ZXVlV2l0aFRpbWVyIiwidGltZW91dCIsIm5vdGlmeSIsInNldFRpbWVvdXQiLCJidWlsZEdldERlZmF1bHRFbmhhbmNlcnMiLCJtaWRkbGV3YXJlRW5oYW5jZXIiLCJhdXRvQmF0Y2giLCJlbmhhbmNlckFycmF5Iiwic3RvcmUiLCJub3RpZnlpbmciLCJzaG91bGROb3RpZnlBdEVuZE9mVGljayIsIm5vdGlmaWNhdGlvblF1ZXVlZCIsImxpc3RlbmVycyIsInF1ZXVlQ2FsbGJhY2siLCJxdWV1ZU1pY3JvdGFzayIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInF1ZXVlTm90aWZpY2F0aW9uIiwibm90aWZ5TGlzdGVuZXJzIiwibCIsImxpc3RlbmVyMiIsIm1ldGEiLCJhdXRvQmF0Y2hFbmhhbmNlciIsImNvbmZpZ3VyZVN0b3JlIiwiZ2V0RGVmYXVsdE1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlIiwiZGV2VG9vbHMiLCJkdXBsaWNhdGVNaWRkbGV3YXJlQ2hlY2siLCJlbmhhbmNlcnMiLCJyb290UmVkdWNlciIsImZpbmFsTWlkZGxld2FyZSIsIm1pZGRsZXdhcmVSZWZlcmVuY2VzIiwibWlkZGxld2FyZTIiLCJmaW5hbENvbXBvc2UiLCJ0cmFjZSIsIm1pZGRsZXdhcmVzIiwiY3JlYXRlU3RvcmUyIiwibWlkZGxld2FyZUFQSSIsImNoYWluIiwiYXBwbHlNaWRkbGV3YXJlIiwiZ2V0RGVmYXVsdEVuaGFuY2VycyIsInN0b3JlRW5oYW5jZXJzIiwiU25hY2tiYXJDb250ZXh0IiwiU25hY2tiYXJQcm92aWRlciIsInNob3dTbmFja2JhciIsIlNuYWNrYmFyIiwiYXV0b0hpZGVEdXJhdGlvbiIsIlByb3ZpZGVycyIsImJhc2VuYW1lIiwicXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudCIsImRlZmF1bHRPcHRpb25zIiwicXVlcmllcyIsInJlZmV0Y2hPbldpbmRvd0ZvY3VzIiwicmV0cnkiLCJ1c2VFcnJvckJvdW5kYXJ5IiwiYmFzZU5hbWUiLCJvcmlnaW4iLCJCcm93c2VyUm91dGVyIiwiUXVlcnlDbGllbnRQcm92aWRlciIsImRlZmF1bHRDb25maXJtRGlhbG9nU3RhdGUiLCJ1c2VDb25maXJtIiwicmVzZXREaWFsb2ciLCJCYXRjaFNlbGVjdG9yIiwiU2luZ2xlU2VsZWN0IiwiZXh0ZXJuYWxBeGlvcyIsIm9wdGlvbnNBcGlFbmRQb2ludCIsIkNvdXJzZVNlbGVjdG9yIiwiZGJMYWJlbFByb3BzIiwibGFiZWxLZXkiLCJzdWJMYWJlbEtleSIsIkRlcGFydG1lbnRTZWxlY3RvciIsImRiVmFsdWVQcm9wcyIsInZhbHVlS2V5IiwiaXNPYmplY3RJZCIsIkVtcGxveWVlc1NlbGVjdG9yIiwiRXhhbXNSZWd1bGF0aW9uU2VsZWN0b3IiLCJleGFtVHlwZU9wdGlvbnMiLCJFeGFtVHlwZVNlbGVjdG9yIiwiRmVlVHlwZXMiLCJ5ZWFycyIsImZyb20iLCJnZXRGdWxsWWVhciIsIkZlZVR5cGVTZWxlY3RvciIsIkhvc3RlbEJsb2NrU2VsZWN0b3IiLCJpc0ludCIsInVzZUxhYmVsU3RhcnRDYXNlIiwidXNlU3ViTGFiZWxTdGFydENhc2UiLCJIb3N0ZWxGbG9vclNlbGVjdG9yIiwiSG9zdGVsUm9vbVNlbGVjdG9yIiwiTW9udGhZZWFyU2VsZWN0b3IiLCJQcmludEZvcm1hdFNlbGVjdG9yIiwiUHJvZ3JhbVNlbGVjdG9yIiwiUmVndWxhdGlvblNlbGVjdG9yIiwiUmVzZWFyY2hFeHBlcnRTZWxlY3RvciIsIlJlc2VhcmNoU3RhZ2VTZWxlY3RvciIsIlNlbWVzdGVyU2VsZWN0b3IiLCJTdHVkZW50U2VsZWN0b3IiLCJTdHVkZW50U2VydmljZXNTZWxlY3RvciIsIlllYXJSYW5nZVNlbGVjdG9yIiwic3VmZml4IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiX19yZXN0IiwieWVhciIsIm9wZW5Jbk5ld1RhYiIsInBhdGhBZnRlckJhc2UiLCJleGNsdWRlSW5zdGl0dXRpb24iLCJleGNsdWRlV29ya3NwYWNlIiwic2VnbWVudHMiLCJiYXNlUGFydHMiLCJmdWxsUGF0aCJdLCJtYXBwaW5ncyI6Im83QkErQk8sSUFBSUEsRUFBVyxXQVFsQixPQVBBQSxFQUFXQyxPQUFPQyxRQUFVLFNBQWtCQyxHQUMxQyxJQUFLLElBQUlDLEVBQUdDLEVBQUksRUFBR0MsRUFBSUMsVUFBVUMs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