@campxdev/campx-web-utils 2.1.2 → 2.1.3
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/cjs/index.js +1 -1
- package/dist/cjs/types/src/utils/client-auth-token.d.ts +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/types/src/utils/client-auth-token.d.ts +1 -0
- package/dist/styles.css +1002 -165
- package/package.json +3 -1
- package/src/config/axios.ts +11 -0
- package/src/config/nonWorkspaceAxios.ts +11 -0
- package/src/utils/client-auth-token.ts +17 -0
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"axios";import t from"js-cookie";import{Store as n}from"pullstate";import{jsxs as r,jsx as o,Fragment as i}from"react/jsx-runtime";import{ConfirmDialog as a,Icons as s,TextField as c,PasswordField as l,Button as u,ResourceNotFound as d,InternalServerError as p,NoInterneConnection as f,UnAuthorized as h,Dialog as m,Snackbar as v,MultiSelect as b,SingleSelect as y,Typography as g,RadioGroup as w,Textarea as _}from"@campxdev/react-blueprint";import*as N from"react";import{createContext as E,useState as x,useEffect as k,useRef as S,useCallback as O,useContext as D}from"react";import{useMutation as C,QueryErrorResetBoundary as P,QueryClient as I,QueryClientProvider as A,useQueryClient as j}from"react-query";import{useNavigate as T,useLocation as L,BrowserRouter as V}from"react-router-dom";export{BrowserRouter}from"react-router-dom";import{validateFieldsNatively as M,toNestError as R}from"@hookform/resolvers";import{appendErrors as K,useForm as F,Controller as z}from"react-hook-form";import U from"device-detector-js";import*as q from"yup";import{Provider as $}from"react-redux";import B from"@exotel-npm-dev/exotel-ip-calling-crm-websdk";import{X as W,PhoneOutgoing as H,PhoneIncoming as Y,Phone as X,MicOff as G,Mic as J,Play as Q,Pause as Z,VolumeX as ee,Volume2 as te,PhoneOff as ne,AlertCircle as re}from"lucide-react";import{createPortal as oe}from"react-dom";import{syncScrypt as ie}from"scrypt-js";var ae=function(){return ae=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},ae.apply(this,arguments)};function se(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 ce(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"==typeof SuppressedError&&SuppressedError;var le={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},ue=new n(le),de=window.location.hostname.includes("localhost"),pe=window.location.hostname.split(".")[0],fe=window.location.pathname.split("/")[1],he=window.location.pathname.split("/")[2],me={"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","external-expert-workspace":"external-expert-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","admissions-director-workspace":"/admissions-director-api"},ve=e.create({baseURL:process.env.REACT_APP_API_HOST||"",withCredentials:!0,headers:{"x-tenant-id":pe,"x-institution-code":fe}});function be(e,t,n){return n.reduce(function(n,r){var o=e[r];return o&&(n[r]=ae({singleton:!0,requiredVersion:o,version:o.replace(/^[\^~]/,"")},t.includes(r)?{eager:!0}:{})),n},{})}ve.interceptors.request.use(function(e){var n=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&&he&&me[he]&&"common-workspace"!==he){var r=me[he];e.url="".concat(r).concat(e.url)}var o=t.get("campx_session_key"),i=t.get("campx_open_payments_key"),a=t.get("campx_student_key");return de&&o&&e.headers.set("campx_session_key",o),de&&a&&e.headers.set("campx_student_key",a),i&&e.headers.set("campx_open_payments_key",i),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),ae(ae({},e),{params:n})},function(e){return Promise.reject(e)}),ve.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)&&ue.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)&&ue.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)&&ue.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var ye=e.create({baseURL:process.env.REACT_APP_API_HOST||"",withCredentials:!0,workspace:!1,headers:{"x-tenant-id":pe,"x-institution-code":fe}});ye.interceptors.request.use(function(e){var n=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),r=t.get("campx_session_key"),o=t.get("campx_open_payments_key"),i=t.get("campx_student_key");return de&&r&&e.headers.set("campx_session_key",r),de&&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"),ae(ae({},e),{params:n})},function(e){return Promise.reject(e)}),ye.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)&&ue.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)&&ue.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)&&ue.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var ge=["admissions-director-workspace","admissions-counsellor-workspace","admissions-officer-workspace","tele-counsellor-workspace"];function we(e){return ge.includes(e)}var _e=E({showConfirmDialog:function(){}}),Ne=function(e){var t=e.children,n=ue.useState(function(e){return e.confirmDialog}),i=function(){ue.update(function(e){e.confirmDialog.isOpen=!1})};return r(_e.Provider,{value:{showConfirmDialog:function(e,t,n,r,o,i,a){void 0===o&&(o="confirm"),ue.update(function(s){s.confirmDialog={isOpen:!0,title:e,message:t,onConfirm:n,onCancel:r,type:o,confirmButtonText:i,cancelButtonText:a}})}},children:[t,o(a,{open:n.isOpen,title:n.title,message:n.message,variant:n.type,confirmText:n.confirmButtonText,cancelText:n.cancelButtonText,onConfirm:function(){n.onConfirm(),i()},onClose:function(){n.onCancel(),i()}})]})};function Ee(e,t){return Ee=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Ee(e,t)}var xe={error:null},ke=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=xe,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,Ee(e,t)}(t,e),t.getDerivedStateFromError=function(e){return{error:e}};var n=t.prototype;return n.reset=function(){this.setState(xe)},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(N.isValidElement(o))return o;if("function"==typeof n)return n(i);if(r)return N.createElement(r,i);throw new Error("react-error-boundary requires either a fallback, fallbackRender, or FallbackComponent prop")}return this.props.children},t}(N.Component),Se=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&&M({},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:R((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]=K(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)}}},Oe=function(e){return se(void 0,void 0,void 0,function(){var t;return ce(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,ve.post("/auth-server/auth-v2/login",e,{workspace:!1}).then(function(e){return e.data})]}})})},De=q.object().shape({username:q.string().required("Username is required"),password:q.string().required("Password is required")}),Ce=function(e){var n=e.close,i=x({deviceInformation:{deviceType:"browser",clientName:"unknown",os:"unknown",osVersion:"unknown",latitude:null,longitude:null,tokenType:"WEB"},isLocationAllowed:!0}),a=i[0],d=i[1],p=T();k(function(){navigator.geolocation.getCurrentPosition(function(e){d(function(t){return ae(ae({},t),{deviceInformation:ae(ae({},t.deviceInformation),{latitude:e.coords.latitude,longitude:e.coords.longitude})})})}),navigator.permissions.query({name:"geolocation"}).then(function(e){"denied"===e.state&&d(function(e){return ae(ae({},e),{isLocationAllowed:!1})})});var e=(new U).parse(navigator.userAgent);d(function(t){var n,r,o;return ae(ae({},t),{deviceInformation:ae(ae({},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 f=F({resolver:Se(De)}),h=f.handleSubmit,m=f.control,v=f.formState.errors,b=C(Oe,{onSuccess:function(e){de&&(t.remove("campx_session_key"),t.set("campx_session_key",e.session.token),n(),p("/".concat(e.session.institutionCode,"/workspace")),window.location.reload())}}),y=b.mutate,g=b.isLoading;return r("div",{className:"flex flex-col gap-8 justify-center items-center p-8",children:[o("div",{className:"flex items-center justify-center h-9 w-48",children:o(s.CampxFullLogoIcon,{})}),r("div",{className:"flex flex-col gap-4 w-full max-w-[400px]",children:[o(z,{control:m,render:function(e){var t=e.field;return o(c,{name:"username",placeholder:"Enter Username or Email",onChange:t.onChange,label:"Username or Email",error:!!v.username,required:!0,fullWidth:!0})},name:"username"}),o(z,{control:m,render:function(e){var t=e.field;return o(l,{name:"password",placeholder:"Enter password",onChange:t.onChange,label:"Password",error:!!v.password,required:!0,fullWidth:!0})},name:"password"}),o(u,{type:"submit",color:"primary",variant:"default",onClick:h(function(e){return se(void 0,void 0,void 0,function(){return ce(this,function(t){return y(ae(ae(ae({},e),a.deviceInformation),{loginId:e.username,loginType:"USER"})),[2]})})}),disabled:g,loading:g,fullWidth:!0,children:"Login"})]})]})},Pe=function(e){var t=L();return o(P,{children:function(n){var r=n.reset;return o(ke,{onReset:r,FallbackComponent:Ie,children:e.children},null==t?void 0:t.pathname)}})},Ie=function(e){var t,n,i,a,s,c,l,h=e.error,m=e.resetErrorBoundary;if(null===(t=null==h?void 0:h.response)||void 0===t?void 0:t.status)switch(null===(n=null==h?void 0:h.response)||void 0===n?void 0:n.status){case 401:return o(Ae,{});case 500:return o(p,{resetBoundary:m});case 404:return o(d,{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)?o(f,{resetBoundary:m}):o("div",{className:"mt-4 p-5",children:r("div",{className:"relative h-15 border border-red-200 bg-red-50 flex items-center rounded-md px-2",children:[o("div",{className:"flex-1 text-red-700 bg-transparent",children:null!==(l=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!==l?l:null==h?void 0:h.message}),o(u,{onClick:function(){return m()},size:"sm",variant:"link",className:"hover:no-underline text-destructive",children:"Try Again"})]})})},Ae=function(){var e=T(),n=x(!1),a=n[0],s=n[1],c=t.get("campx_session_key");return o(h,{component:r(i,{children:[o(u,{className:"mt-5",variant:"default",onClick:function(){"localhost"===window.location.hostname.split(".")[1]?s(!0):c||e("prospect-workspace"===he?"".concat(fe,"/ats/login"):"/auth/login")},children:"Click Here To Login"}),o(m,{open:a,onClose:function(){return s(!1)},content:function(e){var t=e.close;return o(Ce,{close:t})}})]})})};function je(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 Te=(()=>"function"==typeof Symbol&&Symbol.observable||"@@observable")(),Le=()=>Math.random().toString(36).substring(7).split("").join("."),Ve={INIT:`@@redux/INIT${Le()}`,REPLACE:`@@redux/REPLACE${Le()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${Le()}`};function Me(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 Re(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 Ke(e){let t=typeof e;return"production"!==process.env.NODE_ENV&&(t=Re(e)),t}function Fe(e,t,n){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?je(2):`Expected the root reducer to be a function. Instead, received: '${Ke(e)}'`);if("function"==typeof t&&"function"==typeof n||"function"==typeof n&&"function"==typeof arguments[3])throw new Error("production"===process.env.NODE_ENV?je(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?je(1):`Expected the enhancer to be a function. Instead, received: '${Ke(n)}'`);return n(Fe)(e,t)}let r=e,o=t,i=new Map,a=i,s=0,c=!1;function l(){a===i&&(a=new Map,i.forEach((e,t)=>{a.set(t,e)}))}function u(){if(c)throw new Error("production"===process.env.NODE_ENV?je(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?je(4):`Expected the listener to be a function. Instead, received: '${Ke(e)}'`);if(c)throw new Error("production"===process.env.NODE_ENV?je(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;l();const n=s++;return a.set(n,e),function(){if(t){if(c)throw new Error("production"===process.env.NODE_ENV?je(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,l(),a.delete(n),i=null}}}function p(e){if(!Me(e))throw new Error("production"===process.env.NODE_ENV?je(7):`Actions must be plain objects. Instead, the actual type was: '${Ke(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?je(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?je(17):`Action "type" property must be a string. Instead, the actual type was: '${Ke(e.type)}'. Value was: '${e.type}' (stringified)`);if(c)throw new Error("production"===process.env.NODE_ENV?je(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:Ve.INIT});return{dispatch:p,subscribe:d,getState:u,replaceReducer:function(e){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?je(10):`Expected the nextReducer to be a function. Instead, received: '${Ke(e)}`);r=e,p({type:Ve.REPLACE})},[Te]:function(){const e=d;return{subscribe(t){if("object"!=typeof t||null===t)throw new Error("production"===process.env.NODE_ENV?je(11):`Expected the observer to be an object. Instead, received: '${Ke(t)}'`);function n(){const e=t;e.next&&e.next(u())}n();return{unsubscribe:e(n)}},[Te](){return this}}}}}function ze(e){"undefined"!=typeof console&&console.error;try{throw new Error(e)}catch(e){}}function Ue(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]&&ze(`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:Ve.INIT}))throw new Error("production"===process.env.NODE_ENV?je(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:Ve.PROBE_UNKNOWN_ACTION()}))throw new Error("production"===process.env.NODE_ENV?je(13):`The slice reducer for key "${t}" returned undefined when probed with a random type. Don't try to handle '${Ve.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===Ve.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(!Me(e))return`The ${i} has unexpected type of "${Ke(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===Ve.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&&ze(r)}let a=!1;const s={};for(let o=0;o<r.length;o++){const i=r[o],c=n[i],l=e[i],u=c(l,t);if(void 0===u){const e=t&&t.type;throw new Error("production"===process.env.NODE_ENV?je(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]=u,a=a||u!==l}return a=a||r.length!==Object.keys(e).length,a?s:e}}function qe(...e){return 0===e.length?e=>e:1===e.length?e[0]:e.reduce((e,t)=>(...n)=>e(t(...n)))}var $e=Symbol.for("immer-nothing"),Be=Symbol.for("immer-draftable"),We=Symbol.for("immer-state"),He="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 Ye(e,...t){if("production"!==process.env.NODE_ENV){const n=He[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 Ge(e){return!!e&&!!e[We]}function Je(e){return!!e&&(et(e)||Array.isArray(e)||!!e[Be]||!!e.constructor?.[Be]||it(e)||at(e))}var Qe=Object.prototype.constructor.toString(),Ze=new WeakMap;function et(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=Ze.get(n);return void 0===r&&(r=Function.toString.call(n),Ze.set(n,r)),r===Qe}function tt(e,t,n=!0){if(0===nt(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 nt(e){const t=e[We];return t?t.type_:Array.isArray(e)?1:it(e)?2:at(e)?3:0}function rt(e,t){return 2===nt(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function ot(e,t,n){const r=nt(e);2===r?e.set(t,n):3===r?e.add(n):e[t]=n}function it(e){return e instanceof Map}function at(e){return e instanceof Set}function st(e){return e.copy_||e.base_}function ct(e,t){if(it(e))return new Map(e);if(at(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const n=et(e);if(!0===t||"class_only"===t&&!n){const t=Object.getOwnPropertyDescriptors(e);delete t[We];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 lt(e,t=!1){return dt(e)||Ge(e)||!Je(e)||(nt(e)>1&&Object.defineProperties(e,{set:ut,add:ut,clear:ut,delete:ut}),Object.freeze(e),t&&Object.values(e).forEach(e=>lt(e,!0))),e}var ut={value:function(){Ye(2)}};function dt(e){return null===e||"object"!=typeof e||Object.isFrozen(e)}var pt,ft={};function ht(e){const t=ft[e];return t||Ye(0,e),t}function mt(){return pt}function vt(e,t){t&&(ht("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function bt(e){yt(e),e.drafts_.forEach(wt),e.drafts_=null}function yt(e){e===pt&&(pt=e.parent_)}function gt(e){return pt={drafts_:[],parent_:pt,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function wt(e){const t=e[We];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function _t(e,t){t.unfinalizedDrafts_=t.drafts_.length;const n=t.drafts_[0];return void 0!==e&&e!==n?(n[We].modified_&&(bt(t),Ye(4)),Je(e)&&(e=Nt(t,e),t.parent_||xt(t,e)),t.patches_&&ht("Patches").generateReplacementPatches_(n[We].base_,e,t.patches_,t.inversePatches_)):e=Nt(t,n,[]),bt(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==$e?e:void 0}function Nt(e,t,n){if(dt(t))return t;const r=e.immer_.shouldUseStrictIteration(),o=t[We];if(!o)return tt(t,(r,i)=>Et(e,o,t,r,i,n),r),t;if(o.scope_!==e)return t;if(!o.modified_)return xt(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),tt(i,(r,i)=>Et(e,o,t,r,i,n,a),r),xt(e,t,!1),n&&e.patches_&&ht("Patches").generatePatches_(o,n,e.patches_,e.inversePatches_)}return o.copy_}function Et(e,t,n,r,o,i,a){if(null==o)return;if("object"!=typeof o&&!a)return;const s=dt(o);if(!s||a){if("production"!==process.env.NODE_ENV&&o===n&&Ye(5),Ge(o)){const a=Nt(e,o,i&&t&&3!==t.type_&&!rt(t.assigned_,r)?i.concat(r):void 0);if(ot(n,r,a),!Ge(a))return;e.canAutoFreeze_=!1}else a&&n.add(o);if(Je(o)&&!s){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;if(t&&t.base_&&t.base_[r]===o&&s)return;Nt(e,o),t&&t.scope_.parent_||"symbol"==typeof r||!(it(n)?n.has(r):Object.prototype.propertyIsEnumerable.call(n,r))||xt(e,o)}}}function xt(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&<(t,n)}var kt={get(e,t){if(t===We)return e;const n=st(e);if(!rt(n,t))return function(e,t,n){const r=Dt(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_||!Je(r)?r:r===Ot(e.base_,t)?(Pt(e),e.copy_[t]=It(r,e)):r},has:(e,t)=>t in st(e),ownKeys:e=>Reflect.ownKeys(st(e)),set(e,t,n){const r=Dt(st(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){const r=Ot(st(e),t),a=r?.[We];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||rt(e.base_,t)))return!0;Pt(e),Ct(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!==Ot(e.base_,t)||t in e.base_?(e.assigned_[t]=!1,Pt(e),Ct(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=st(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{writable:!0,configurable:1!==e.type_||"length"!==t,enumerable:r.enumerable,value:n[t]}:r},defineProperty(){Ye(11)},getPrototypeOf:e=>Xe(e.base_),setPrototypeOf(){Ye(12)}},St={};function Ot(e,t){const n=e[We];return(n?st(n):e)[t]}function Dt(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 Ct(e){e.modified_||(e.modified_=!0,e.parent_&&Ct(e.parent_))}function Pt(e){e.copy_||(e.copy_=ct(e.base_,e.scope_.immer_.useStrictShallowCopy_))}tt(kt,(e,t)=>{St[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}}),St.deleteProperty=function(e,t){return"production"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&Ye(13),St.set.call(this,e,t,void 0)},St.set=function(e,t,n){return"production"!==process.env.NODE_ENV&&"length"!==t&&isNaN(parseInt(t))&&Ye(14),kt.set.call(this,e[0],t,n,e[0])};function It(e,t){const n=it(e)?ht("MapSet").proxyMap_(e,t):at(e)?ht("MapSet").proxySet_(e,t):function(e,t){const n=Array.isArray(e),r={type_:n?1:0,scope_:t?t.scope_:mt(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let o=r,i=kt;n&&(o=[r],i=St);const{revoke:a,proxy:s}=Proxy.revocable(o,i);return r.draft_=s,r.revoke_=a,s}(e,t);return(t?t.scope_:mt()).drafts_.push(n),n}function At(e){if(!Je(e)||dt(e))return e;const t=e[We];let n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=ct(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=ct(e,!0);return tt(n,(e,t)=>{ot(n,e,At(t))},r),t&&(t.finalized_=!1),n}var jt=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&&Ye(6),void 0!==n&&"function"!=typeof n&&Ye(7),Je(e)){const o=gt(this),i=It(e,void 0);let a=!0;try{r=t(i),a=!1}finally{a?bt(o):yt(o)}return vt(o,n),_t(r,o)}if(!e||"object"!=typeof e){if(r=t(e),void 0===r&&(r=e),r===$e&&(r=void 0),this.autoFreeze_&<(r,!0),n){const t=[],o=[];ht("Patches").generateReplacementPatches_(e,r,t,o),n(t,o)}return r}Ye(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){Je(e)||Ye(8),Ge(e)&&(e=function(e){Ge(e)||Ye(10,e);return At(e)}(e));const t=gt(this),n=It(e,void 0);return n[We].isManual_=!0,yt(t),n}finishDraft(e,t){const n=e&&e[We];n&&n.isManual_||Ye(9);const{scope_:r}=n;return vt(r,t),_t(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=ht("Patches").applyPatches_;return Ge(e)?r(e,t):this.produce(e,e=>r(e,t))}};jt.produce;var Tt=jt.setUseStrictIteration.bind(jt);function Lt(e){return({dispatch:t,getState:n})=>r=>o=>"function"==typeof o?o(t,n,e):r(o)}var Vt=Lt(),Mt=Lt,Rt="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(0!==arguments.length)return"object"==typeof arguments[0]?qe:qe.apply(null,arguments)};function Kt(e){return"function"==typeof e&&"type"in e&&((t=e)&&"function"==typeof t.match);var t}function Ft(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 zt=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 Ut(e){return"object"!=typeof e||null==e||Object.isFrozen(e)}function qt(e,t,n){const r=$t(e,t,n);return{detectMutations:()=>Bt(e,t,r,n)}}function $t(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]=$t(e,t,n[o],a))}}return i}function Bt(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 l=t.length>0;for(let o in c){const a=i?i+"."+o:o;if(l){if(t.some(e=>e instanceof RegExp?e.test(a):a===e))continue}const c=Bt(e,t,n.children[o],r[o],s,a);if(c.wasMutated)return c}return{wasMutated:!1}}function Wt(e){const t=typeof e;return null==e||"string"===t||"boolean"===t||"number"===t||Array.isArray(e)||Me(e)}function Ht(e,t="",n=Wt,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,l]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(l))return{keyPath:s,value:l};if("object"==typeof l&&(a=Ht(l,s,n,r,o,i),a))return a}return i&&Yt(e)&&i.add(e),!1}function Yt(e){if(!Object.isFrozen(e))return!1;for(const t of Object.values(e))if("object"==typeof t&&null!==t&&!Yt(t))return!1;return!0}function Xt(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);{const{isSerializable:t=Wt,getEntries:n,ignoredActions:r=[],ignoredActionPaths:o=["meta.arg","meta.baseQueryMeta"],ignoredPaths:i=[],warnAfter:a=32,ignoreState:s=!1,ignoreActions:c=!1,disableCache:l=!1}=e,u=!l&&WeakSet?new WeakSet:void 0;return e=>a=>l=>{if(!function(e){return Me(e)&&"type"in e&&"string"==typeof e.type}(l))return a(l);const d=a(l),p=Ft();return c||r.length&&-1!==r.indexOf(l.type)||p.measureTime(()=>{const e=Ht(l,"",t,n,o,u);if(e){const{keyPath:t,value:n}=e}}),s||(p.measureTime(()=>{const r=Ht(e.getState(),"",t,n,i,u);if(r){const{keyPath:e,value:t}=r}}),p.warnIfExceeded()),d}}}function Gt(e){return"boolean"==typeof e}var Jt=()=>function(e){const{thunk:t=!0,immutableCheck:n=!0,serializableCheck:r=!0,actionCreatorCheck:o=!0}=e??{};let i=new zt;if(t&&(Gt(t)?i.push(Vt):i.push(Mt(t.extraArgument))),"production"!==process.env.NODE_ENV){if(n){let e={};Gt(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=Ut,ignoredPaths:o,warnAfter:i=32}=e;const a=qt.bind(null,r,o);return({getState:e})=>{let n,r=e(),o=a(r);return i=>s=>{const c=Ft();c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?tn(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 l=i(s);return c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?tn(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(),l}}}}(e))}if(r){let e={};Gt(r)||(e=r),i.push(Xt(e))}if(o){let e={};Gt(o)||(e=o),i.unshift(function(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);const{isActionCreator:t=Kt}=e;return()=>e=>n=>(t(n),e(n))}(e))}}return i},Qt=e=>t=>{setTimeout(t,e)},Zt=e=>function(t){const{autoBatch:n=!0}=t??{};let r=new zt(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:Qt(10):"callback"===e.type?e.queueNotification:Qt(e.timeout),l=()=>{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(l))),r.dispatch(e)}finally{o=!0}}})})("object"==typeof n?n:void 0)),r};function en(e){const t=Jt(),{reducer:n,middleware:r,devTools:o=!0,duplicateMiddlewareCheck:i=!0,preloadedState:a,enhancers:s}=e||{};let c,l;if("function"==typeof n)c=n;else{if(!Me(n))throw new Error("production"===process.env.NODE_ENV?tn(1):"`reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers");c=Ue(n)}if("production"!==process.env.NODE_ENV&&r&&"function"!=typeof r)throw new Error("production"===process.env.NODE_ENV?tn(2):"`middleware` field must be a callback");if("function"==typeof r){if(l=r(t),"production"!==process.env.NODE_ENV&&!Array.isArray(l))throw new Error("production"===process.env.NODE_ENV?tn(3):"when using a middleware builder function, an array of middleware must be returned")}else l=t();if("production"!==process.env.NODE_ENV&&l.some(e=>"function"!=typeof e))throw new Error("production"===process.env.NODE_ENV?tn(4):"each middleware provided to configureStore must be a function");if("production"!==process.env.NODE_ENV&&i){let e=new Set;l.forEach(t=>{if(e.has(t))throw new Error("production"===process.env.NODE_ENV?tn(42):"Duplicate middleware references found when creating the store. Ensure that each middleware is only included once.");e.add(t)})}let u=qe;o&&(u=Rt({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?je(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=qe(...s)(o.dispatch),{...o,dispatch:i}}}(...l),p=Zt(d);if("production"!==process.env.NODE_ENV&&s&&"function"!=typeof s)throw new Error("production"===process.env.NODE_ENV?tn(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?tn(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?tn(7):"each enhancer provided to configureStore must be a function");"production"!==process.env.NODE_ENV&&l.length&&f.includes(d);return Fe(c,a,u(...f))}function tn(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. `}Tt(!1);var nn=E(void 0),rn=function(e){var t=e.children,n=ue.useState(function(e){return e.snackbar});return r(nn.Provider,{value:{showSnackbar:function(e,t){void 0===t&&(t="info"),ue.update(function(n){n.snackbar.open=!0,n.snackbar.message=e,n.snackbar.severity=t})}},children:[t,o(v,{open:n.open,message:n.message,severity:n.severity,autoHideDuration:1500,onClose:function(){ue.update(function(e){e.snackbar.open=!1})}})]})},on=function(e){var t=e.children,n=e.basename,r=e.reducers,i=void 0===r?{}:r,a=new I({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:!1,useErrorBoundary:!0}}}),s=pe&&fe&&he?"/".concat(fe,"/").concat(he):"/";k(function(){"/"===window.location.pathname&&fe&&he&&pe&&window.location.replace(window.location.origin+"/".concat(fe,"/").concat(he))},[fe,pe,he]);var c=en({reducer:Ue(i)});return o($,{store:c,children:o(V,{basename:null!=n?n:s,children:o(A,{client:a,children:o(rn,{children:o(Ne,{children:t})})})})})},an={isOpen:!1,title:"",message:"",confirmButtonText:"",cancelButtonText:"",type:"confirm",onConfirm:function(){},onCancel:function(){}},sn=function(){var e=function(){ue.update(function(e){e.confirmDialog=an})};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){ue.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()}}})})}},cn=function(e){return o(b,ae({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"_id",isObjectId:!0}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/departments"}))},ln=function(e){return o(b,ae({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"id",isInt:!0}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/departments-sql"}))},un=function(e){return o(y,ae({label:"Batch"},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/batches"}))},dn=function(e){return o(y,ae({dbLabelProps:{labelKey:"courseName",subLabelKey:"level"}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/courses"}))},pn=function(e){return o(y,ae({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"_id",isObjectId:!0}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/departments"}))},fn=function(e){return o(y,ae({dbValueProps:{valueKey:"_id",isObjectId:!0},dbLabelProps:{labelKey:"fullName",subLabelKey:"employeeId"}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/employees"}))},hn=function(e){return o(y,ae({label:"Regulation"},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/exam-regulations",dbLabelProps:{labelKey:"r.name"},dbValueProps:{valueKey:"r.name"}}))},mn=[{label:"All",value:null},{label:"REGULAR",value:"R"},{label:"SUPPLEMENTARY",value:"S"}],vn=function(e){return o(y,ae({label:"Exam Type",options:mn},e))},bn=[{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"}],yn=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 gn=function(e){return o(y,ae({label:"Fee Type",options:null==bn?void 0:bn.map(function(e){return{label:e.label,value:e.value}})},e))},wn=function(e){return o(y,ae({dbValueProps:{valueKey:"id",isInt:!0},dbLabelProps:{labelKey:"name",subLabelKey:"type",useLabelStartCase:!0,useSubLabelStartCase:!0}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/hostel-blocks"}))},_n=function(e){return o(y,ae({label:"Hostel Room No.",dbValueProps:{valueKey:"floor"},dbLabelProps:{labelKey:"floor"}},e,{externalAxios:ye,optionsApiEndPoint:"dropdowns/floors"}))},Nn=function(e){return o(y,ae({label:"Hostel Room",dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"room_number",useLabelStartCase:!0}},e,{optionsApiEndPoint:"dropdowns/hostel-rooms",externalAxios:ye}))},En=function(e){return o(y,ae({label:"Month & Year"},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/month-years"}))},xn=function(e){return o(y,ae({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/print-formats"}))},kn=function(e){return o(y,ae({dbLabelProps:{labelKey:"branchCode",subLabelKey:"branchDisplay"}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/programs"}))},Sn=function(e){return o(y,ae({label:"Regulation",dbValueProps:{valueKey:"regulation_id"},dbLabelProps:{labelKey:"r.name"}},e,{optionsApiEndPoint:"dropdowns/regulations",externalAxios:ye}))},On=function(e){return o(y,ae({dbLabelProps:{labelKey:"name"},dbValueProps:{valueKey:"id",isInt:!0}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/research-expert-designations"}))},Dn=function(e){return o(y,ae({dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"name",subLabelKey:"type"}},e,{optionsApiEndPoint:"dropdowns/research-experts",externalAxios:ye}))},Cn=function(e){return o(y,ae({dbValueProps:{valueKey:"id",isInt:!0},dbLabelProps:{labelKey:"name",subLabelKey:"`order`"}},e,{optionsApiEndPoint:"dropdowns/research-stages",externalAxios:ye}))},Pn=function(e){return o(y,ae({dbLabelProps:{labelKey:"name",subLabelKey:"year"}},e,{optionsApiEndPoint:"/dropdowns/semesters",externalAxios:ye}))},In=function(e){return o(y,ae({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/students"}))},An=function(e){return o(y,ae({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:ye,optionsApiEndPoint:"/dropdowns/student-services"}))},jn=function(e){var t=e.suffix,n=void 0===t?null:t,r=e.valueKey,i=void 0===r?"yearRange":r,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 o(y,ae({label:"Year Range",options:null==yn?void 0:yn.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))},Tn=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")},Ln=function(){function e(){var e=this;this.exotelSDK=null,this.webPhone=null,this.callListeners=new Set,this.registerListeners=new Set,this.sessionListeners=new Set,this.permissionStatus="unknown",this.handleCallEvent=function(t,n){e.callListeners.forEach(function(e){return e(t,n)})},this.handleRegisterEvent=function(t){e.registerListeners.forEach(function(e){return e(t)})},this.handleSessionEvent=function(t,n){e.sessionListeners.forEach(function(e){return e(t,n)})}}return e.getInstance=function(){return e.instance||(e.instance=new e),e.instance},e.prototype.initialize=function(e,t){return se(this,arguments,void 0,function(e,t,n){var r;return void 0===n&&(n=!0),ce(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,this.checkAudioPermissions()];case 1:return o.sent(),this.exotelSDK=new B(e,t,n),[4,this.exotelSDK.Initialize(this.handleCallEvent,this.handleRegisterEvent,this.handleSessionEvent)];case 2:return r=o.sent(),this.webPhone=r||null,[2,!!this.webPhone];case 3:return o.sent(),[2,!1];case 4:return[2]}})})},e.prototype.checkAudioPermissions=function(){return se(this,void 0,void 0,function(){var e,t,n=this;return ce(this,function(r){switch(r.label){case 0:return r.trys.push([0,6,,7]),[4,navigator.mediaDevices.enumerateDevices()];case 1:if(e=r.sent(),!e.some(function(e){return"audioinput"===e.kind}))return this.permissionStatus="denied",[2,!1];if(!navigator.permissions||!navigator.permissions.query)return[3,5];r.label=2;case 2:return r.trys.push([2,4,,5]),[4,navigator.permissions.query({name:"microphone"})];case 3:return t=r.sent(),this.permissionStatus=t.state,t.onchange=function(){n.permissionStatus=t.state},[2,"granted"===t.state];case 4:return r.sent(),[3,5];case 5:return[2,!0];case 6:return r.sent(),[2,!1];case 7:return[2]}})})},e.prototype.requestMicrophoneAccess=function(){return se(this,void 0,void 0,function(){return ce(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,navigator.mediaDevices.getUserMedia({audio:!0})];case 1:return e.sent().getTracks().forEach(function(e){return e.stop()}),this.permissionStatus="granted",[2,!0];case 2:return e.sent(),this.permissionStatus="denied",[2,!1];case 3:return[2]}})})},e.prototype.makeCall=function(e){var t=this;return new Promise(function(n,r){t.webPhone?t.webPhone.MakeCall(e,function(e,t){"success"===e?n(t):r(t)}):r(new Error("Web phone not initialized"))})},e.prototype.acceptCall=function(){return se(this,void 0,void 0,function(){return ce(this,function(e){switch(e.label){case 0:if(!this.webPhone)throw new Error("Web phone not initialized");return"granted"===this.permissionStatus?[3,2]:[4,this.requestMicrophoneAccess()];case 1:if(!e.sent())throw new Error("Microphone access denied");e.label=2;case 2:return this.webPhone.AcceptCall(),[2]}})})},e.prototype.hangupCall=function(){var e;null===(e=this.webPhone)||void 0===e||e.HangupCall()},e.prototype.rejectCall=function(){var e;null===(e=this.webPhone)||void 0===e||e.HangupCall()},e.prototype.toggleHold=function(){var e;null===(e=this.webPhone)||void 0===e||e.ToggleHold()},e.prototype.toggleMute=function(){var e;null===(e=this.webPhone)||void 0===e||e.ToggleMute()},e.prototype.sendDTMF=function(e){var t;null===(t=this.webPhone)||void 0===t||t.SendDTMF(e)},e.prototype.registerDevice=function(){return se(this,void 0,void 0,function(){var e;return ce(this,function(t){switch(t.label){case 0:return"granted"===this.permissionStatus?[3,2]:[4,this.requestMicrophoneAccess()];case 1:if(!t.sent())throw new Error("Microphone access denied");t.label=2;case 2:return null===(e=this.webPhone)||void 0===e||e.RegisterDevice(),[2]}})})},e.prototype.unregisterDevice=function(){var e;null===(e=this.webPhone)||void 0===e||e.UnRegisterDevice()},e.prototype.getPermissionStatus=function(){return this.permissionStatus},e.prototype.addCallListener=function(e){this.callListeners.add(e)},e.prototype.removeCallListener=function(e){this.callListeners.delete(e)},e.prototype.addRegisterListener=function(e){this.registerListeners.add(e)},e.prototype.removeRegisterListener=function(e){this.registerListeners.delete(e)},e.prototype.addSessionListener=function(e){this.sessionListeners.add(e)},e.prototype.removeSessionListener=function(e){this.sessionListeners.delete(e)},e}(),Vn=function(){return se(void 0,void 0,void 0,function(){var e,t,n,r,o,i;return ce(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,ve.get("/notifications/notification-configs")];case 1:return e=a.sent().data,(null==(t=null==e?void 0:e.config)?void 0:t.enableVoice)?(n=null===(r=t.voiceConfigs)||void 0===r?void 0:r.find(function(e){return!0===e.isEnabled}))?[2,{enabled:!0,hasValidToken:!!((null===(o=n.EXOTEL)||void 0===o?void 0:o.token)&&(null===(i=n.EXOTEL)||void 0===i?void 0:i.tokenExpiresAt)&&new Date(n.EXOTEL.tokenExpiresAt)>new Date)}]:[2,{enabled:!1,hasValidToken:!1}]:[2,{enabled:!1,hasValidToken:!1}];case 2:return a.sent(),[2,{enabled:!1,hasValidToken:!1}];case 3:return[2]}})})},Mn=function(){return se(void 0,void 0,void 0,function(){return ce(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,ve.get("/notifications/notification-configs/voice-config/active-token")];case 1:return[2,e.sent().data];case 2:return e.sent(),[2,null];case 3:return[2]}})})},Rn=function(){return se(void 0,void 0,void 0,function(){var e;return ce(this,function(t){switch(t.label){case 0:return[4,Mn()];case 1:if(!(e=t.sent()))throw new Error("No active voice configuration found");return[2,{Data:e.token}]}})})},Kn=function(e){return se(void 0,void 0,void 0,function(){return ce(this,function(t){switch(t.label){case 0:return[4,ve.post("/communication-activities/initiate",e)];case 1:return[2,t.sent().data]}})})},Fn=function(e){return se(void 0,void 0,void 0,function(){return ce(this,function(t){switch(t.label){case 0:return[4,ve.post("/communication-activities/register-incoming",e)];case 1:return[2,t.sent().data]}})})},zn=function(e){return se(void 0,void 0,void 0,function(){return ce(this,function(t){switch(t.label){case 0:return[4,ve.get("/communication-activities/by-prospect",{params:{prospectId:e}})];case 1:return[2,t.sent().data]}})})},Un=function(e){return se(void 0,void 0,void 0,function(){return ce(this,function(t){switch(t.label){case 0:return[4,ve.get("/communication-activities/".concat(e))];case 1:return[2,t.sent().data]}})})},qn=function(e){return se(void 0,void 0,void 0,function(){return ce(this,function(t){switch(t.label){case 0:return[4,ve.get("/communication-activities/by-call-sid",{params:{callSid:e}})];case 1:return[2,t.sent().data]}})})},$n=function(e){return se(void 0,void 0,void 0,function(){var t;return ce(this,function(n){switch(n.label){case 0:return[4,ve.get("/communication-activities/count-by-prospect",{params:{prospectId:e}})];case 1:return[2,(null==(t=n.sent().data)?void 0:t.count)||0]}})})},Bn=function(e){return se(void 0,void 0,void 0,function(){var t;return ce(this,function(n){switch(n.label){case 0:return t={callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,prospectStatus:e.prospectStatus,dispositionNotes:e.dispositionNotes,callbackScheduledAt:e.callbackScheduledAt},[4,ve.post("/communication-activities/".concat(e.callId,"/disposition"),t)];case 1:return[2,n.sent().data]}})})},Wn=function(e){return se(void 0,void 0,void 0,function(){return ce(this,function(t){switch(t.label){case 0:return[4,ve.post("/communication-activities/cancel",e)];case 1:return[2,t.sent().data]}})})},Hn="__EXOTEL_CONTEXT__",Yn={phase:"idle",callData:null,isOnHold:!1,isMuted:!1,isSpeakerOff:!1,callDirection:null,callStartTime:null,callDuration:0,callerName:null,callerNumber:null,callActivityId:null,exotelCallSid:null,prospectUniqueId:null,wasAccepted:!1},Xn=function(e){if(!e||e.length<4)return"**********";var t="",n=e;e.startsWith("+91")?(t="+91",n=e.substring(3)):e.startsWith("91")&&e.length>10&&(t="91",n=e.substring(2));var r=n.replace(/\D/g,"");return r.length<4?t+"**********":t+r.substring(0,2)+"*".repeat(r.length-4)+r.substring(r.length-2)},Gn=(window[Hn]||(window[Hn]=E(void 0)),window[Hn]),Jn=function(e){var t=e.children,n=e.accessToken,r=e.agentUserId,i=e.autoConnectVOIP,a=void 0===i||i,s=e.callerName;e.callerNumber;var c=x(!1),l=c[0],u=c[1],d=x(!1),p=d[0],f=d[1],h=x("unknown"),m=h[0],v=h[1],b=x(Yn),y=b[0],g=b[1],w=x(null),_=w[0],N=w[1],E=S(null),D=S(y),C=Ln.getInstance();k(function(){D.current=y},[y]),k(function(){return"connected"===y.phase&&y.callStartTime?E.current=setInterval(function(){g(function(e){return ae(ae({},e),{callDuration:Math.floor((Date.now()-e.callStartTime)/1e3)})})},1e3):E.current&&(clearInterval(E.current),E.current=null),function(){E.current&&clearInterval(E.current)}},[y.phase,y.callStartTime]),k(function(){var e=function(){return se(void 0,void 0,void 0,function(){return ce(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,navigator.mediaDevices.getUserMedia({audio:!0})];case 1:return e.sent().getTracks().forEach(function(e){return e.stop()}),v("granted"),[3,3];case 2:return e.sent(),v("denied"),[3,3];case 3:return[2]}})})};navigator.permissions&&navigator.permissions.query?navigator.permissions.query({name:"microphone"}).then(function(t){v(t.state),t.onchange=function(){v(t.state)},"prompt"===t.state&&e()}).catch(function(t){e()}):e()},[]),k(function(){if(n&&r&&!l){se(void 0,void 0,void 0,function(){var e;return ce(this,function(t){switch(t.label){case 0:return[4,C.initialize(n,r,a)];case 1:return e=t.sent(),u(e),[2]}})})}},[n,r,a]),k(function(){if(l){var e=function(e,t){switch(e){case"incoming":if("outbound"===D.current.callDirection)g(function(e){return ae(ae({},e),{callData:t,isOnHold:!1,isMuted:!1})});else{var n=t.callFromNumber||t.remoteId||null;g(function(e){return ae(ae({},e),{phase:"incoming",callData:t,callDirection:"inbound",callerName:t.remoteDisplayName||null,callerNumber:n?Xn(n):null,isOnHold:!1,isMuted:!1})}),(t.callId||t.sessionId)&&Fn({callSid:t.callId||t.sessionId,fromNumber:t.callFromNumber||t.remoteId||"",toNumber:t.remoteDisplayName||""}).then(function(e){var t,n=null===(t=e.prospect)||void 0===t?void 0:t.mobile;g(function(t){var r,o,i;return ae(ae({},t),{callActivityId:(null===(r=e.data)||void 0===r?void 0:r.id)||t.callActivityId,callerName:(null===(o=e.prospect)||void 0===o?void 0:o.name)||t.callerName,callerNumber:n?Xn(n):t.callerNumber,prospectUniqueId:(null===(i=e.prospect)||void 0===i?void 0:i.uniqueId)||t.prospectUniqueId})})}).catch(function(e){})}break;case"connected":g(function(e){return ae(ae({},e),{phase:"connected",callData:t,callStartTime:Date.now(),callDuration:0})});break;case"callEnded":g(function(e){var n,r;if(e.wasAccepted||"connected"===e.phase||e.callDuration>0){var o={callId:e.callActivityId||t.callId||(null===(n=e.callData)||void 0===n?void 0:n.callId)||"",exotelCallId:t.callId||(null===(r=e.callData)||void 0===r?void 0:r.callId)||"",callDirection:e.callDirection||"outbound",callDuration:e.callDuration,callerName:e.callerName,callerNumber:e.callerNumber};N(o)}return ae(ae({},Yn),{phase:"ended",callData:t})});break;case"holdtoggle":g(function(e){return ae(ae({},e),{isOnHold:!e.isOnHold,callData:t})});break;case"mutetoggle":g(function(e){return ae(ae({},e),{isMuted:!e.isMuted,callData:t})})}},t=function(e){f("registered"===e)},n=function(e,t){};return C.addCallListener(e),C.addRegisterListener(t),C.addSessionListener(n),function(){C.removeCallListener(e),C.removeRegisterListener(t),C.removeSessionListener(n)}}},[l]),k(function(){l&&v(C.getPermissionStatus())},[l]);var P=O(function(e,t,n,r){return se(void 0,void 0,void 0,function(){var o;return ce(this,function(i){switch(i.label){case 0:g(function(o){return ae(ae({},o),{phase:"ready_to_call",callDirection:"outbound",callerName:t||s||null,callerNumber:r||e,callActivityId:n||null,isOnHold:!1,isMuted:!1,callStartTime:null,callDuration:0})}),i.label=1;case 1:return i.trys.push([1,3,,4]),[4,C.makeCall(e)];case 2:return[2,i.sent()];case 3:throw o=i.sent(),g(Yn),o;case 4:return[2]}})})},[s]),I=O(function(){return se(void 0,void 0,void 0,function(){return ce(this,function(e){switch(e.label){case 0:return[4,C.acceptCall()];case 1:return e.sent(),g(function(e){return"outbound"===e.callDirection?ae(ae({},e),{phase:"calling",wasAccepted:!0}):ae(ae({},e),{wasAccepted:!0})}),[2]}})})},[]),A=O(function(){C.hangupCall()},[]),j=O(function(){g(function(e){return ae(ae({},e),{isSpeakerOff:!e.isSpeakerOff})})},[]),T=O(function(){N(null),g(Yn)},[]),L=O(function(e){g(function(t){return ae(ae({},t),{callActivityId:e})})},[]),V=O(function(e){g(function(t){return ae(ae({},t),{exotelCallSid:e})})},[]),M={isInitialized:l,isConnected:p,callState:y,permissionStatus:m,dispositionData:_,makeCall:P,acceptCall:I,hangupCall:A,rejectCall:function(){return C.rejectCall()},toggleHold:function(){return C.toggleHold()},toggleMute:function(){return C.toggleMute()},toggleSpeaker:j,sendDTMF:function(e){return C.sendDTMF(e)},registerDevice:function(){return C.registerDevice()},unregisterDevice:function(){return C.unregisterDevice()},requestMicrophoneAccess:function(){return C.requestMicrophoneAccess()},clearDisposition:T,setCallActivityId:L,setExotelCallSid:V};return o(Gn.Provider,{value:M,children:t})},Qn=function(){var e=D(Gn);if(void 0===e)throw new Error("useExotel must be used within an ExotelProvider");return e},Zn=function(){var e=D(Gn);return null!=e?e:null},er=999999,tr=999998,nr="16px",rr=2e3,or=[{label:"Connected",value:"connected"},{label:"Not Connected",value:"not_connected"}],ir=[{label:"Interested",value:"interested"},{label:"Not Interested",value:"not_interested"},{label:"Not Sure",value:"not_sure"},{label:"Not Eligible",value:"not_eligible"},{label:"Wrong Number",value:"wrong_number"},{label:"Campus Visit",value:"campus_visit"},{label:"Call Back",value:"call_back"},{label:"After JEE Mains",value:"after_jee_mains"},{label:"After IPE",value:"after_ipe"},{label:"After EAPCET",value:"after_eapcet"}],ar=[{label:"Not Answering",value:"not_answering"},{label:"Not Connected",value:"not_connected"},{label:"Fail to Call",value:"fail_to_call"},{label:"Switched Off",value:"switched_off"},{label:"Out of Service",value:"out_of_service"},{label:"Invalid Number",value:"invalid_number"},{label:"Number Busy",value:"number_busy"}],sr=function(e){var t=e.dispositionData,n=e.prospectId,i=e.onClose,a=e.onSave,s=e.existingData,c=j(),l=!!(null==s?void 0:s.dispositionCategory),d=x((null==s?void 0:s.callStatusDisposition)||""),p=d[0],f=d[1],h=x((null==s?void 0:s.dispositionCategory)||""),v=h[0],b=h[1],N=x((null==s?void 0:s.dispositionNotes)||""),E=N[0],k=N[1],S=C(function(e){return a(e)},{onSuccess:function(){c.invalidateQueries("getOneProspect"),c.invalidateQueries("callHistory"),i()}}),O=S.mutate,D=S.isLoading,P=function(e){f(e),b("")},I=function(e){b(e)},A=function(){if(p&&v){var e={prospectId:n,callId:t.callId,channel:"phone",direction:t.callDirection,duration:t.callDuration,callStatusDisposition:p,dispositionCategory:v,remarks:E||"",callerName:t.callerName||"",callerNumber:t.callerNumber||""};O(e)}},T="connected"===p?ir:"not_connected"===p?ar:[];return o(m,{open:!0,onClose:i,title:l?"Edit Disposition":"Call Disposition",maxWidth:"md",content:function(){return r("div",{className:"flex flex-col gap-4 p-4",children:[o(g,{variant:"muted",children:l?"Update the disposition details":"Add details about your call with ".concat(t.callerName||"Unknown")}),r("div",{className:"flex items-center justify-between p-3 bg-gray-100 rounded-lg",children:[o(g,{variant:"small",className:"text-gray-600",children:"Call Duration"}),o(g,{variant:"small",className:"font-semibold",children:(e=t.callDuration,n=Math.floor(e/60),a=e%60,"".concat(n,"m ").concat(a,"s"))})]}),o(w,{name:"callStatusDisposition",label:"Call Status",required:!0,options:or,direction:"row",value:p,onChange:P}),p&&o(y,{name:"dispositionCategory",label:"Call Disposition",required:!0,fullWidth:!0,placeholder:"Search disposition...",options:T,value:v,onChange:I},p),o(_,{name:"remarks",label:"Remarks",placeholder:"Add any additional notes about this call...",rows:3,fullWidth:!0,value:E,onChange:function(e){return k(e.target.value)},className:"break-all"}),r("div",{className:"flex justify-start gap-2 pt-4 border-t",children:[o(u,{onClick:A,disabled:!p||!v,loading:D,children:l?"Update Disposition":"Save Disposition"}),o(u,{variant:"outline",onClick:i,children:"Cancel"})]})]});var e,n,a}})},cr=function(e){var t=e.className,n=e.prospectId,a=e.prospectName,s=e.prospectNumber,c=e.onSaveDisposition,l=Qn(),d=l.callState,p=l.dispositionData,f=l.acceptCall,h=l.hangupCall,m=l.rejectCall,v=l.toggleHold,b=l.toggleMute,y=l.toggleSpeaker,w=l.clearDisposition,_=x(!1),N=_[0],E=_[1],O=x(!1),D=O[0],C=O[1],P=S(null);k(function(){var e="exotel-phone-animations";if(!document.getElementById(e)){var t=document.createElement("style");t.id=e,t.textContent="\n@keyframes pulse-ring {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.15);\n opacity: 0.7;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes pulse-dot {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(249, 115, 22, 0.7);\n }\n 50% {\n box-shadow: 0 0 0 20px rgba(249, 115, 22, 0);\n }\n}\n\n.animate-pulse-ring {\n animation: pulse-ring 1.5s ease-in-out infinite;\n}\n\n.animate-pulse-dot {\n animation: pulse-dot 1.5s ease-in-out infinite;\n}\n",document.head.appendChild(t)}},[]);var I=d.phase;d.callData;var A=d.isOnHold,j=d.isMuted,T=d.isSpeakerOff,L=d.callDirection,V=d.callDuration,M=d.callerName,R=d.callerNumber,K=d.callActivityId,F=d.exotelCallSid,z=d.prospectUniqueId,U=a||M||"Unknown",q=s||R||"No number",$=function(){return se(void 0,void 0,void 0,function(){var e;return ce(this,function(t){switch(t.label){case 0:if(C(!0),"incoming"===I||"ready_to_call"===I?m():h(),!(e=F||K))return[3,4];t.label=1;case 1:return t.trys.push([1,3,,4]),[4,Wn({callSid:e,reason:"connected"===I?"ended":"declined"})];case 2:return t.sent(),[3,4];case 3:return t.sent(),[3,4];case 4:return P.current=setTimeout(function(){C(!1)},rr),[2]}})})};k(function(){"idle"!==I&&"ended"!==I||(P.current&&(clearTimeout(P.current),P.current=null),C(!1))},[I]);if(k(function(){return function(){P.current&&clearTimeout(P.current)}},[]),p){var B=a||p.callerName||M||"Unknown",re=ae(ae({},p),{callerName:B,callerNumber:q});return o(sr,{dispositionData:re,prospectId:n,onClose:w,onSave:function(e){return se(void 0,void 0,void 0,function(){return ce(this,function(t){return c?[2,c(e)]:[2,Bn({callId:e.callId,prospectId:e.prospectId||n||"",callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,dispositionNotes:e.remarks||void 0})]})})},existingData:void 0})}if("idle"===I||"ended"===I)return null;var ie,le,ue,de="outbound"===L,pe="inbound"===L,fe="connected"===I?"bg-green-500":de?"bg-blue-500":"bg-orange-500",he=function(){return"calling"===I?"Connecting to ".concat(U,"..."):null},me=r(i,{children:[o("div",{className:"fixed inset-0 bg-black/50",style:{zIndex:tr},onClick:$}),o("div",{className:"fixed inset-0 flex items-center justify-center p-4 ".concat(t),style:{zIndex:er},children:r("div",{className:"relative w-full max-w-md p-6 bg-white shadow-2xl",style:{borderRadius:nr,border:"1px solid #e5e7eb"},onClick:function(e){return e.stopPropagation()},children:[o("button",{onClick:$,className:"absolute p-1 transition-colors rounded-full top-4 right-4 hover:bg-gray-100",children:o(W,{className:"w-5 h-5 text-gray-500"})}),o("div",{className:"flex justify-center mb-6",children:r("span",{className:"inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-sm font-medium border ".concat(de?"text-blue-600 border-blue-200 bg-blue-50":"text-green-600 border-green-200 bg-green-50"),children:[o(de?H:Y,{className:"w-4 h-4"}),de?"Outgoing Call":"Incoming Call"]})}),o("div",{className:"flex justify-center mb-4",children:o("div",{className:"w-24 h-24 rounded-full ".concat(fe," flex items-center justify-center ").concat("incoming"===I||"ready_to_call"===I?"animate-pulse-ring animate-pulse-dot":""),children:o(pe&&"incoming"===I?Y:X,{className:"w-10 h-10 text-white"})})}),r("div",{className:"mb-4 text-center",children:[o(g,{variant:"h3",className:"text-xl font-semibold text-gray-900",children:U}),z&&r(g,{variant:"small",className:"font-medium text-blue-600",children:["ID: ",z]}),o(g,{variant:"muted",children:q})]}),o("div",{className:"mb-6 text-center",children:o(g,"connected"===I?{variant:"p",className:"text-lg font-medium text-green-500",children:(ie=V,le=Math.floor(ie/60),ue=ie%60,"".concat(le.toString().padStart(2,"0"),":").concat(ue.toString().padStart(2,"0")))}:{variant:"muted",children:function(){switch(I){case"ready_to_call":return"Ready to call...";case"calling":return"Calling...";case"incoming":return"Incoming call...";default:return null}}()})}),"connected"===I&&r("div",{className:"flex justify-center gap-6 mb-6",children:[r("div",{className:"text-center",children:[o("button",{onClick:b,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(j?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:o(j?G:J,{className:"w-5 h-5 text-gray-600"})}),o("p",{className:"mt-1 text-xs text-gray-500",children:j?"Unmute":"Mute"})]}),r("div",{className:"text-center",children:[o("button",{onClick:v,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(A?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:o(A?Q:Z,{className:"w-5 h-5 text-gray-600"})}),o("p",{className:"mt-1 text-xs text-gray-500",children:A?"Resume":"Hold"})]}),r("div",{className:"text-center",children:[o("button",{onClick:y,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(T?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:o(T?ee:te,{className:"w-5 h-5 text-gray-600"})}),o("p",{className:"mt-1 text-xs text-gray-500",children:T?"Speaker On":"Speaker Off"})]})]}),r("div",{className:"flex justify-center gap-4",children:[("ready_to_call"===I||"incoming"===I)&&r(i,{children:[r(u,{variant:"destructive",onClick:$,disabled:D,className:"gap-2 px-6",children:[o(ne,{className:"w-4 h-4"}),D?"Declining...":"Decline"]}),r(u,{variant:"default",onClick:function(){return se(void 0,void 0,void 0,function(){return ce(this,function(e){switch(e.label){case 0:E(!0),e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,f()];case 2:return e.sent(),[3,5];case 3:return e.sent(),[3,5];case 4:return E(!1),[7];case 5:return[2]}})})},disabled:N||D,style:{backgroundColor:"#22c55e"},className:"gap-2 px-6 hover:bg-green-600",children:[o(X,{className:"w-4 h-4"}),"Accept"]})]}),"calling"===I&&r(u,{variant:"destructive",onClick:$,disabled:D,className:"gap-2 px-6",children:[o(ne,{className:"w-4 h-4"}),D?"Ending...":"End Call"]}),"connected"===I&&r(u,{variant:"destructive",onClick:$,disabled:D,className:"gap-2 px-8",children:[o(ne,{className:"w-4 h-4"}),D?"Ending...":"End Call"]})]}),he()&&o(g,{variant:"small",className:"mt-4 text-center text-gray-500",children:he()})]})})]});return oe(me,document.body)},lr=function(){function e(){this.algorithm="aes-256-cbc",this.secretKey=null,this.initialized=!1}return e.prototype.ensureInitialized=function(){if(!this.initialized)try{var e="431fef99-47dc-4d2a-9175-2e8f19b20225";if(e){var t=(new TextEncoder).encode(e),n=(new TextEncoder).encode("salt");this.secretKey=ie(t,n,16384,8,1,32)}this.initialized=!0}catch(e){this.initialized=!0}},e.getInstance=function(){return e.instance||(e.instance=new e),e.instance},e.prototype.decryptData=function(e){if(this.ensureInitialized(),!e||!this.secretKey)return"";try{var t=e.split(":"),n=t[0],r=t[1];if(!n||!r)return"";var o=require("crypto"),i=Buffer.from(n,"hex"),a=o.createDecipheriv(this.algorithm,Buffer.from(this.secretKey),i),s=a.update(r,"hex","utf8");return s+=a.final("utf8")}catch(e){return""}},e.prototype.maskMobile=function(e){if(!e||e.length<4)return"**********";var t="",n=e;e.startsWith("+91")?(t="+91",n=e.substring(3)):e.startsWith("91")&&e.length>10&&(t="91",n=e.substring(2));var r=n.replace(/\D/g,"");return r.length<4?t+"**********":t+r.substring(0,2)+"*".repeat(r.length-4)+r.substring(r.length-2)},e}(),ur=lr.getInstance(),dr=function(e){var t=e.phoneNumber,n=e.encryptedPhoneNumber,i=e.callerName,a=e.prospectId,s=e.className,c=e.disabled,l=Zn(),d=x(!1),p=d[0],f=d[1],h=x(null),m=h[0],v=h[1];if(!l)return null;var b=l.makeCall,y=l.isConnected,g=l.callState,w=l.permissionStatus,_=l.requestMicrophoneAccess,N=l.setCallActivityId,E=l.setExotelCallSid,k="idle"!==g.phase&&"ended"!==g.phase,S=t||n;return r("div",{className:s,children:[r(u,{variant:"outline",size:"sm",onClick:function(){return se(void 0,void 0,void 0,function(){var e,r,o,s,c,l,u,d,p,h,m,w,x,k,S;return ce(this,function(O){switch(O.label){case 0:if(!y||"idle"!==g.phase&&"ended"!==g.phase)return[2];if(v(null),e=t,n&&!e)try{if(!(e=ur.decryptData(n)))return v("Failed to decrypt phone number"),[2]}catch(e){return v("Failed to decrypt phone number"),[2]}return e?(r=ur.maskMobile(e),[4,Ln.getInstance().checkAudioPermissions()]):(v("No phone number available"),[2]);case 1:return O.sent()?[3,3]:[4,_()];case 2:if(!O.sent())return v("Microphone access is required to make calls"),[2];O.label=3;case 3:return O.trys.push([3,9,10,11]),f(!0),[4,b(e,i,void 0,r)];case 4:if(o=O.sent(),(s=null===(w=null==o?void 0:o.Data)||void 0===w?void 0:w.CallSid)&&E(s),!a||!s)return[3,8];O.label=5;case 5:return O.trys.push([5,7,,8]),[4,Kn({prospectId:a,toNumber:e,callSid:s})];case 6:return c=O.sent(),(l=null===(x=c.data)||void 0===x?void 0:x.id)&&N(l),[3,8];case 7:return O.sent(),[3,8];case 8:return[3,11];case 9:if(u=O.sent(),d="Failed to make call",(null==u?void 0:u.Code)||"Failed"===(null==u?void 0:u.Status)){if(p=u.Code,h=null,u.Error&&"string"==typeof u.Error)try{h=JSON.parse(u.Error)}catch(e){}m=null===(S=null===(k=null==h?void 0:h.response)||void 0===k?void 0:k.error_data)||void 0===S?void 0:S.description,d=404===p?m||"User device is currently busy or unavailable":p>=400&&p<500?m||"Unable to complete call. Please try again.":p>=500?m||"Service temporarily unavailable. Please try again later.":m||"Failed to make call"}else(null==u?void 0:u.message)&&(d=u.message);return v(d),[3,11];case 10:return f(!1),[7];case 11:return[2]}})})},disabled:c||!S||!y||k||p,title:y?k?"Call in progress":S?"denied"===w?"Microphone access denied":"Call ".concat(i||"prospect"):"No phone number":"VoIP not connected",className:"gap-1.5",children:[o("denied"===w?G:X,{className:"w-4 h-4"}),p?"Calling...":"Call"]}),m&&o("p",{className:"text-red-500 text-xs mt-1",children:m})]})},pr=function(e){var t=e.onPermissionGranted,n=e.onPermissionDenied,i=Qn(),a=i.permissionStatus,s=i.requestMicrophoneAccess,c=x(!1),l=c[0],d=c[1],p=x(null),f=p[0],h=p[1];return r("div","granted"===a?{className:"flex items-center gap-2 text-green-600",children:[o(J,{className:"w-4 h-4"}),o("span",{className:"text-sm",children:"Microphone access granted"})]}:"denied"===a?{className:"p-4 bg-red-50 rounded-lg border border-red-200",children:[r("div",{className:"flex items-center gap-2 text-red-600 mb-2",children:[o(G,{className:"w-5 h-5"}),o("span",{className:"font-medium",children:"Microphone Access Denied"})]}),o("p",{className:"text-sm text-red-600 mb-3",children:"To use the calling feature, you need to enable microphone access in your browser settings."}),r("div",{className:"text-xs text-gray-600",children:[o("p",{className:"font-medium mb-1",children:"How to enable:"}),r("ol",{className:"list-decimal list-inside space-y-1",children:[o("li",{children:"Click the lock/info icon in your browser's address bar"}),o("li",{children:'Find "Microphone" in the permissions list'}),o("li",{children:'Change the setting to "Allow"'}),o("li",{children:"Refresh the page"})]})]})]}:{className:"p-4 bg-blue-50 rounded-lg border border-blue-200",children:[r("div",{className:"flex items-center gap-2 text-blue-600 mb-2",children:[o(re,{className:"w-5 h-5"}),o("span",{className:"font-medium",children:"Microphone Permission Required"})]}),o("p",{className:"text-sm text-gray-600 mb-3",children:"To make and receive calls, we need access to your microphone. Click the button below to grant permission."}),r(u,{variant:"default",size:"sm",onClick:function(){return se(void 0,void 0,void 0,function(){var e;return ce(this,function(r){switch(r.label){case 0:d(!0),h(null),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,s()];case 2:return r.sent()?null==t||t():(h("Microphone access was denied"),null==n||n()),[3,5];case 3:return e=r.sent(),h(e.message||"Failed to request microphone access"),null==n||n(),[3,5];case 4:return d(!1),[7];case 5:return[2]}})})},loading:l,className:"gap-1.5",children:[o(J,{className:"w-4 h-4"}),"Allow Microphone Access"]}),f&&o("p",{className:"text-red-500 text-xs mt-2",children:f})]})},fr=function(e){var t=e.children,n=e.enabled,a=void 0===n||n,s=e.prospectId,c=e.prospectName,l=e.prospectNumber,u=x(null),d=u[0],p=u[1],f=x(!0);f[0];var h=f[1],m=x(null),v=m[0],b=m[1];return k(function(){if(a){se(void 0,void 0,void 0,function(){var e,t;return ce(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,3,4]),h(!0),[4,Mn()];case 1:return(null==(e=n.sent())?void 0:e.token)?p(e.token):b("Voice calling not configured"),[3,4];case 2:return t=n.sent(),b(t.message||"Failed to initialize calling"),[3,4];case 3:return h(!1),[7];case 4:return[2]}})})}else h(!1)},[a]),a&&!v&&d?r(Jn,{accessToken:d,agentUserId:"0047",autoConnectVOIP:!0,children:[t,o(cr,{prospectId:s,prospectName:c,prospectNumber:l})]}):o(i,{children:t})},hr=function(e){var t=e.children,n=e.workspace,a=e.agentUserId,s=e.prospectId,c=e.prospectName,l=e.prospectNumber,u=e.onSaveDisposition,d=x(null),p=d[0],f=d[1],h=x(!0),m=h[0],v=h[1],b=x(null),y=b[0],g=b[1],w=we(n),_=!!a,N=O(function(e){return se(void 0,void 0,void 0,function(){return ce(this,function(t){return u?[2,u(e)]:[2,Bn({callId:e.callId,prospectId:e.prospectId,callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,dispositionReason:e.dispositionReason||void 0,dispositionNotes:e.remarks||void 0})]})})},[u]);return k(function(){if(w&&_){se(void 0,void 0,void 0,function(){var e,t;return ce(this,function(n){switch(n.label){case 0:return n.trys.push([0,3,4,5]),v(!0),g(null),[4,Vn()];case 1:return n.sent().enabled?[4,Mn()]:(g("Voice calling not enabled for this tenant"),v(!1),[2]);case 2:return(null==(e=n.sent())?void 0:e.token)?f(e.token):g("Voice calling token not available"),[3,5];case 3:return t=n.sent(),g(t.message||"Failed to initialize calling"),[3,5];case 4:return v(!1),[7];case 5:return[2]}})})}else v(!1)},[w,_]),w&&_?m||y||!p?o(i,{children:t}):r(Jn,{accessToken:p,agentUserId:a,autoConnectVOIP:!0,children:[t,o(cr,{prospectId:s,prospectName:c,prospectNumber:l,onSaveDisposition:N})]}):o(i,{children:t})};export{ue as ApplicationStore,un as BatchSelector,dr as CallButton,sr as CallDispositionForm,Ne as ConfirmDialogProvider,dn as CourseSelector,cn as DepartmentMongoMultiSelector,pn as DepartmentSelector,ln as DepartmentSqlMultiSelector,fn as EmployeesSelector,Pe as ErrorBoundary,vn as ExamTypeSelector,hn as ExamsRegulationSelector,cr as ExotelPhone,Jn as ExotelProvider,fr as ExotelWrapper,gn as FeeTypeSelector,wn as HostelBlockSelector,_n as HostelFloorSelector,Nn as HostelRoomSelector,pr as MicrophonePermission,En as MonthYearSelector,xn as PrintFormatSelector,kn as ProgramSelector,on as Providers,Sn as RegulationSelector,On as ResearchExpertDesignationSelector,Dn as ResearchExpertSelector,Cn as ResearchStageSelector,Pn as SemesterSelector,rn as SnackbarProvider,In as StudentSelector,An as StudentServicesSelector,ge as VOIP_ENABLED_WORKSPACES,hr as VoIPProvider,jn as YearRangeSelector,ve as axios,Wn as cancelCall,Vn as checkVoIPEnabled,Rn as createExotelAppToken,be as createRsbuildSharedConfig,zn as fetchCallHistory,Mn as getActiveVoiceToken,qn as getCallActivityByCallSid,Un as getCallActivityById,$n as getCallCountByProspect,le as initialApplicationState,Kn as initiateCallActivity,fe as institutionCode,de as isDevelopment,we as isVoIPEnabledForWorkspace,ye as nonWorkspaceAxios,Tn as openInNewTab,Fn as registerIncomingCall,Bn as saveCallDisposition,pe as tenantCode,sn as useConfirm,Qn as useExotel,Zn as useExotelSafe,he as workspace,me as workspaceApiMapping};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi8uLi9zcmMvY29udGV4dC9hcHBsaWNhdGlvbi1zdG9yZS50cyIsIi4uLy4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi8uLi9zcmMvY29uZmlnL2F4aW9zLnRzIiwiLi4vLi4vc3JjL2NvbmZpZy9jcmVhdGVSc2J1aWxkU2hhcmVkQ29uZmlnLnRzIiwiLi4vLi4vc3JjL2NvbmZpZy9ub25Xb3Jrc3BhY2VBeGlvcy50cyIsIi4uLy4uL3NyYy9jb25maWcvdm9pcC5jb25maWcudHMiLCIuLi8uLi9zcmMvY29udGV4dC9Db25maXJtRGlhbG9nUHJvdmlkZXIudHN4IiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWVycm9yLWJvdW5kYXJ5L2Rpc3QvcmVhY3QtZXJyb3ItYm91bmRhcnkuZXNtLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGhvb2tmb3JtL3Jlc29sdmVycy95dXAvZGlzdC95dXAubWpzIiwiLi4vLi4vc3JjL2NvbnRleHQvRXJyb3JCb3VuZGFyeS9Mb2dpbi50c3giLCIuLi8uLi9zcmMvY29udGV4dC9FcnJvckJvdW5kYXJ5L0Vycm9yQm91bmRhcnkudHN4IiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlZHV4L2Rpc3QvcmVkdXgubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQvbm9kZV9tb2R1bGVzL2ltbWVyL2Rpc3QvaW1tZXIubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2Rpc3QvcmVkdXgtdGh1bmsubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQvZGlzdC9yZWR1eC10b29sa2l0Lm1vZGVybi5tanMiLCIuLi8uLi9zcmMvY29udGV4dC9TbmFja2JhclByb3ZpZGVyLnRzeCIsIi4uLy4uL3NyYy9jb250ZXh0L1Byb3ZpZGVycy50c3giLCIuLi8uLi9zcmMvaG9va3MvdXNlQ29uZmlybS50cyIsIi4uLy4uL3NyYy9tdWx0aS1zZWxlY3RvcnMvRGVwYXJ0bWVudE1vbmdvTXVsdGlTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvbXVsdGktc2VsZWN0b3JzL0RlcGFydG1lbnRTcWxNdWx0aVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvQmF0Y2hTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0NvdXJzZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRGVwYXJ0bWVudFNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRW1wbG95ZWVzU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9FeGFtUmVndWxhdGlvblNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRXhhbVR5cGVTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL3V0aWxzLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRmVlVHlwZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvSG9zdGVsQmxvY2tTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0hvc3RlbEZsb29yU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Ib3N0ZWxSb29tU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Nb250aFllYXJTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1ByaW50Rm9ybWF0U2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Qcm9ncmFtU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZWd1bGF0aW9uU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZXNlYXJjaEV4cGVydERlc2lnbmF0aW9uU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZXNlYXJjaEV4cGVydFNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvUmVzZWFyY2hTdGFnZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvU2VtZXN0ZXJTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1N0dWRlbnRTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1N0dWRlbnRTZXJ2aWNlc1NlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvWWVhclJhbmdlU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3V0aWxzL29wZW5Jbk5ld1RhYi50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9leG90ZWwvRXhvdGVsU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9leG90ZWwvYXBpLnRzIiwiLi4vLi4vc3JjL3Byb3ZpZGVycy9FeG90ZWxQcm92aWRlci50c3giLCIuLi8uLi9zcmMvY29uc3RhbnRzL2V4b3RlbC5jb25zdGFudHMudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9FeG90ZWwvQ2FsbERpc3Bvc2l0aW9uRm9ybS50c3giLCIuLi8uLi9zcmMvdXRpbHMvZXhvdGVsL2Zvcm1hdHRlcnMudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9FeG90ZWwvRXhvdGVsUGhvbmUudHN4IiwiLi4vLi4vc3JjL3NlcnZpY2VzL2NyeXB0by9DcnlwdG9TZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvRXhvdGVsL0NhbGxCdXR0b24udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvRXhvdGVsL01pY3JvcGhvbmVQZXJtaXNzaW9uLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0V4b3RlbC9FeG90ZWxXcmFwcGVyLnRzeCIsIi4uLy4uL3NyYy9wcm92aWRlcnMvVm9JUFByb3ZpZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XHJcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XHJcbiAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICB2YXIgYXIgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb3duS2V5cyhvKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xyXG4gICAgICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhc3luYykge1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcblxyXG59XHJcblxyXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcclxuICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xyXG4gICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcclxuICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdmFyIHIsIHMgPSAwO1xyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoci5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHMgfD0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgZmFpbChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dCgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcclxuICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIF9fZXh0ZW5kczogX19leHRlbmRzLFxyXG4gICAgX19hc3NpZ246IF9fYXNzaWduLFxyXG4gICAgX19yZXN0OiBfX3Jlc3QsXHJcbiAgICBfX2RlY29yYXRlOiBfX2RlY29yYXRlLFxyXG4gICAgX19wYXJhbTogX19wYXJhbSxcclxuICAgIF9fZXNEZWNvcmF0ZTogX19lc0RlY29yYXRlLFxyXG4gICAgX19ydW5Jbml0aWFsaXplcnM6IF9fcnVuSW5pdGlhbGl6ZXJzLFxyXG4gICAgX19wcm9wS2V5OiBfX3Byb3BLZXksXHJcbiAgICBfX3NldEZ1bmN0aW9uTmFtZTogX19zZXRGdW5jdGlvbk5hbWUsXHJcbiAgICBfX21ldGFkYXRhOiBfX21ldGFkYXRhLFxyXG4gICAgX19hd2FpdGVyOiBfX2F3YWl0ZXIsXHJcbiAgICBfX2dlbmVyYXRvcjogX19nZW5lcmF0b3IsXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmc6IF9fY3JlYXRlQmluZGluZyxcclxuICAgIF9fZXhwb3J0U3RhcjogX19leHBvcnRTdGFyLFxyXG4gICAgX192YWx1ZXM6IF9fdmFsdWVzLFxyXG4gICAgX19yZWFkOiBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZDogX19zcHJlYWQsXHJcbiAgICBfX3NwcmVhZEFycmF5czogX19zcHJlYWRBcnJheXMsXHJcbiAgICBfX3NwcmVhZEFycmF5OiBfX3NwcmVhZEFycmF5LFxyXG4gICAgX19hd2FpdDogX19hd2FpdCxcclxuICAgIF9fYXN5bmNHZW5lcmF0b3I6IF9fYXN5bmNHZW5lcmF0b3IsXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yOiBfX2FzeW5jRGVsZWdhdG9yLFxyXG4gICAgX19hc3luY1ZhbHVlczogX19hc3luY1ZhbHVlcyxcclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0OiBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcjogX19pbXBvcnRTdGFyLFxyXG4gICAgX19pbXBvcnREZWZhdWx0OiBfX2ltcG9ydERlZmF1bHQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldDogX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbjogX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG4gICAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2U6IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxyXG4gICAgX19kaXNwb3NlUmVzb3VyY2VzOiBfX2Rpc3Bvc2VSZXNvdXJjZXMsXHJcbiAgICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbjogX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXHJcbn07XHJcbiIsImltcG9ydCB7IFN0b3JlIH0gZnJvbSAncHVsbHN0YXRlJztcbmV4cG9ydCB2YXIgaW5pdGlhbEFwcGxpY2F0aW9uU3RhdGUgPSB7XG4gICAgaXNMb2dpbkRpYWxvZ09wZW46IGZhbHNlLFxuICAgIHNuYWNrYmFyOiB7XG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdzdWNjZXNzJyxcbiAgICB9LFxuICAgIGNvbmZpcm1EaWFsb2c6IHtcbiAgICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uQ2FuY2VsOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIHR5cGU6ICdjb25maXJtJyxcbiAgICB9LFxuICAgIHVzZXI6IHVuZGVmaW5lZCxcbiAgICBpbnN0aXR1dGlvbkluZm86IHVuZGVmaW5lZCxcbiAgICBhc3NldDogdW5kZWZpbmVkLFxufTtcbmV4cG9ydCB2YXIgQXBwbGljYXRpb25TdG9yZSA9IG5ldyBTdG9yZShpbml0aWFsQXBwbGljYXRpb25TdGF0ZSk7XG4iLCJleHBvcnQgdmFyIGlzRGV2ZWxvcG1lbnQgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5jbHVkZXMoJ2xvY2FsaG9zdCcpO1xuZXhwb3J0IHZhciB0ZW5hbnRDb2RlID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNwbGl0KCcuJylbMF07XG4vLyBpZiB1cmwgc2VhcmNoZWQgaXMgYXVwdWxzZS5jYW1weC5pbiB0aGVuIHJlZGlyZWN0IHRvIGF1cHVsc2UuY2FtcHguaW4vYXVwdWxzZVxuZXhwb3J0IHZhciBpbnN0aXR1dGlvbkNvZGUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoJy8nKVsxXTtcbmV4cG9ydCB2YXIgd29ya3NwYWNlID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCcvJylbMl07XG4vLyBXb3Jrc3BhY2UgdG8gQVBJIGVuZHBvaW50IHByZWZpeCBtYXBwaW5nXG5leHBvcnQgdmFyIHdvcmtzcGFjZUFwaU1hcHBpbmcgPSB7XG4gICAgJ3N0dWRlbnQtd29ya3NwYWNlJzogJy9zdHVkZW50LWFwaScsXG4gICAgJ2ZhY3VsdHktd29ya3NwYWNlJzogJy9mYWN1bHR5LWFwaScsXG4gICAgJ2RlcGFydG1lbnQtd29ya3NwYWNlJzogJy9kZXBhcnRtZW50LWFwaScsXG4gICAgJ2FjYWRlbWljLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvYWNhZGVtaWMtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnZmVlZGJhY2stY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy9mZWVkYmFjay1jb29yZGluYXRvci1hcGknLFxuICAgICdjb3Vyc2UtY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy9jb3Vyc2UtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnY2xhc3Nyb29tLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvY2xhc3Nyb29tLWNvb3JkaW5hdG9yLWFwaScsXG4gICAgJ2NvZS13b3Jrc3BhY2UnOiAnL2NvZS1hcGknLFxuICAgICdhY2FkZW1pYy1hZG1pbi13b3Jrc3BhY2UnOiAnL2FjYWRlbWljLWFkbWluLWFwaScsXG4gICAgJ2hvc3RlbC1hZG1pbi13b3Jrc3BhY2UnOiAnL2hvc3RlbC1hZG1pbi1hcGknLFxuICAgICd0cmFuc3BvcnQtY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy90cmFuc3BvcnQtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnZW1wbG95ZWUtd29ya3NwYWNlJzogJy9lbXBsb3llZS1hcGknLFxuICAgICdsaWJyYXJpYW4td29ya3NwYWNlJzogJy9saWJyYXJpYW4tYXBpJyxcbiAgICAnZmVlLXRlcm1pbmFsJzogJy9mZWUtdGVybWluYWwtYXBpJyxcbiAgICAnYWNjb3VudHMtb2ZmaWNlci13b3Jrc3BhY2UnOiAnYWNjb3VudHMtb2ZmaWNlci1hcGknLFxuICAgICdmaW5hbmNlLW9mZmljZXItd29ya3NwYWNlJzogJy9maW5hbmNlLW9mZmljZXItYXBpJyxcbiAgICAnb3V0cmVhY2gtYWdlbnQtd29ya3NwYWNlJzogJ291dHJlYWNoLWFnZW50LWFwaScsXG4gICAgJ3Byb3NwZWN0LXdvcmtzcGFjZSc6ICdwcm9zcGVjdC1hcGknLFxuICAgICdleHRlcm5hbC1leHBlcnQtd29ya3NwYWNlJzogJ2V4dGVybmFsLWV4cGVydC1hcGknLFxuICAgICdyZXNlYXJjaC1jb29yZGluYXRvci13b3Jrc3BhY2UnOiAncmVzZWFyY2gtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAndGVsZS1jb3Vuc2VsbG9yLXdvcmtzcGFjZSc6ICd0ZWxlLWNvdW5zZWxsb3ItYXBpJyxcbiAgICAndGVhbS1vd25lci13b3Jrc3BhY2UnOiAnL3RlYW0tb3duZXItYXBpJyxcbiAgICAnYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLXdvcmtzcGFjZSc6ICcvYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLWFwaScsXG4gICAgJ2FkbWlzc2lvbnMtb2ZmaWNlci13b3Jrc3BhY2UnOiAnL2FkbWlzc2lvbnMtb2ZmaWNlci1hcGknLFxuICAgICdhZG1pc3Npb25zLWRpcmVjdG9yLXdvcmtzcGFjZSc6ICcvYWRtaXNzaW9ucy1kaXJlY3Rvci1hcGknLFxufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L2FwcGxpY2F0aW9uLXN0b3JlJztcbmltcG9ydCB7IGluc3RpdHV0aW9uQ29kZSwgaXNEZXZlbG9wbWVudCwgdGVuYW50Q29kZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VBcGlNYXBwaW5nLCB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG4vLyBHZXQgYmFzZSBVUkwgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbnZhciBnZXRCYXNlVXJsID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIEZvciBDcmVhdGUgUmVhY3QgQXBwXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUElfSE9TVCB8fCAnJztcbn07XG4vLyBGb3JtYXQgcXVlcnkgcGFyYW1ldGVyc1xudmFyIGZvcm1hdFBhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHBhcmFtcyAhPT0gbnVsbCAmJiBwYXJhbXMgIT09IHZvaWQgMCA/IHBhcmFtcyA6IHt9KS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlID09PSAnX19lbXB0eV9fJyA/ICcnIDogdmFsdWUsXG4gICAgICAgIF07XG4gICAgfSkpO1xufTtcbi8vIENyZWF0ZSBheGlvcyBpbnN0YW5jZVxuZXhwb3J0IHZhciBheGlvcyA9IEF4aW9zLmNyZWF0ZSh7XG4gICAgYmFzZVVSTDogZ2V0QmFzZVVybCgpLFxuICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgICd4LXRlbmFudC1pZCc6IHRlbmFudENvZGUsXG4gICAgICAgICd4LWluc3RpdHV0aW9uLWNvZGUnOiBpbnN0aXR1dGlvbkNvZGUsXG4gICAgfSxcbn0pO1xuLy8gUmVxdWVzdCBpbnRlcmNlcHRvclxuYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAvLyBGb3JtYXQgcXVlcnkgcGFyYW1ldGVyc1xuICAgIHZhciBwYXJhbXMgPSBmb3JtYXRQYXJhbXMoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLnBhcmFtcyk7XG4gICAgLy8gSGFuZGxlIHdvcmtzcGFjZSByb3V0aW5nIChkZWZhdWx0OiB0cnVlKVxuICAgIGlmIChjb25maWcud29ya3NwYWNlICE9PSBmYWxzZSAmJlxuICAgICAgICB3b3Jrc3BhY2UgJiZcbiAgICAgICAgd29ya3NwYWNlQXBpTWFwcGluZ1t3b3Jrc3BhY2VdICYmXG4gICAgICAgIHdvcmtzcGFjZSAhPT0gJ2NvbW1vbi13b3Jrc3BhY2UnKSB7XG4gICAgICAgIHZhciB3b3Jrc3BhY2VQcmVmaXggPSB3b3Jrc3BhY2VBcGlNYXBwaW5nW3dvcmtzcGFjZV07XG4gICAgICAgIGNvbmZpZy51cmwgPSBcIlwiLmNvbmNhdCh3b3Jrc3BhY2VQcmVmaXgpLmNvbmNhdChjb25maWcudXJsKTtcbiAgICB9XG4gICAgLy8gQWRkIHNlc3Npb24gdG9rZW5zIGZyb20gY29va2llcyBpZiBpbiBkZXZlbG9wbWVudFxuICAgIHZhciBzZXNzaW9uS2V5ID0gQ29va2llcy5nZXQoJ2NhbXB4X3Nlc3Npb25fa2V5Jyk7XG4gICAgdmFyIG9wZW5QYXltZW50c0tleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9vcGVuX3BheW1lbnRzX2tleScpO1xuICAgIHZhciBzdHVkZW50U2Vzc2lvbktleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zdHVkZW50X2tleScpO1xuICAgIGlmIChpc0RldmVsb3BtZW50ICYmIHNlc3Npb25LZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9zZXNzaW9uX2tleScsIHNlc3Npb25LZXkpO1xuICAgIH1cbiAgICBpZiAoaXNEZXZlbG9wbWVudCAmJiBzdHVkZW50U2Vzc2lvbktleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X3N0dWRlbnRfa2V5Jywgc3R1ZGVudFNlc3Npb25LZXkpO1xuICAgIH1cbiAgICBpZiAob3BlblBheW1lbnRzS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfb3Blbl9wYXltZW50c19rZXknLCBvcGVuUGF5bWVudHNLZXkpO1xuICAgIH1cbiAgICAvLyBTa2lwIHNlbmRpbmcgWC1pbnN0aXR1dGlvbi1jb2RlIGlmIHRoZSBmbGFnIGlzIHNldFxuICAgIGlmIChjb25maWcuc2tpcEluc3RpdHV0aW9uQ29kZSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5kZWxldGUoJ3gtaW5zdGl0dXRpb24tY29kZScpO1xuICAgIH1cbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbmZpZyksIHsgcGFyYW1zOiBwYXJhbXMgfSk7XG59LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xufSk7XG4vLyBSZXNwb25zZSBpbnRlcmNlcHRvclxuYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBoaWRlU25hY2tiYXIgcHJvcGVydHlcbiAgICB2YXIgc2hvdWxkSGlkZVNuYWNrYmFyID0gKChfYSA9IHJlc3BvbnNlLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oaWRlU25hY2tiYXIpID09PSB0cnVlO1xuICAgIC8vIEhhbmRsZSBzdWNjZXNzZnVsIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmXG4gICAgICAgIHJlc3BvbnNlLmNvbmZpZy5tZXRob2QgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhyZXNwb25zZS5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbMjAwLCAyMDEsIDIwMl0uaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSByZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ09wZXJhdGlvbiBzdWNjZXNzZnVsJztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnc3VjY2Vzcyc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIC8vIENoZWNrIGlmIHRoZSBlcnJvciByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2IgPSAoX2EgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kYXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgZXJyb3IgcmVzcG9uc2VzXG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiYgWzQwMCwgNDIyLCA0MTNdLmluY2x1ZGVzKChfYyA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIGVycm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gZXJyLnJlc3BvbnNlLmRhdGEubWVzc2FnZSB8fCAnQmFkIFJlcXVlc3QnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdlcnJvcic7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXNob3VsZEhpZGVTbmFja2JhciAmJlxuICAgICAgICAoKF9kID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhlcnIucmVzcG9uc2UuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWzQwNF0uaW5jbHVkZXMoZXJyLnJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIG5vdCBmb3VuZCBlcnJvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IGVyci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ05vdCBGb3VuZCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ2Vycm9yJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBheGlvcztcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnNidWlsZFNoYXJlZENvbmZpZyhkZXBlbmRlbmNpZXMsIGFsd2F5c0VhZ2VyLCBzaGFyZWREZXBlbmRlbmNpZXNMaXN0KSB7XG4gICAgcmV0dXJuIHNoYXJlZERlcGVuZGVuY2llc0xpc3QucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBrZykge1xuICAgICAgICB2YXIgdmVyc2lvbiA9IGRlcGVuZGVuY2llc1twa2ddO1xuICAgICAgICBpZiAodmVyc2lvbikge1xuICAgICAgICAgICAgYWNjW3BrZ10gPSBfX2Fzc2lnbih7IHNpbmdsZXRvbjogdHJ1ZSwgcmVxdWlyZWRWZXJzaW9uOiB2ZXJzaW9uLCB2ZXJzaW9uOiB2ZXJzaW9uLnJlcGxhY2UoL15bXFxefl0vLCAnJykgfSwgKGFsd2F5c0VhZ2VyLmluY2x1ZGVzKHBrZykgPyB7IGVhZ2VyOiB0cnVlIH0gOiB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xufVxuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBBeGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvYXBwbGljYXRpb24tc3RvcmUnO1xuaW1wb3J0IHsgaW5zdGl0dXRpb25Db2RlLCBpc0RldmVsb3BtZW50LCB0ZW5hbnRDb2RlIH0gZnJvbSAnLi4vdXRpbHMvY29uc3RhbnRzJztcbi8vIEdldCBiYXNlIFVSTCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xudmFyIGdldEJhc2VVcmwgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gRm9yIENyZWF0ZSBSZWFjdCBBcHBcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0FQSV9IT1NUIHx8ICcnO1xufTtcbi8vIEZvcm1hdCBxdWVyeSBwYXJhbWV0ZXJzXG52YXIgZm9ybWF0UGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocGFyYW1zICE9PSBudWxsICYmIHBhcmFtcyAhPT0gdm9pZCAwID8gcGFyYW1zIDoge30pLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUgPT09ICdfX2VtcHR5X18nID8gJycgOiB2YWx1ZSxcbiAgICAgICAgXTtcbiAgICB9KSk7XG59O1xuLy8gQ3JlYXRlIGF4aW9zIGluc3RhbmNlIGZvciBzZWxlY3RvcnMgd2l0aCB3b3Jrc3BhY2U6IGZhbHNlXG5leHBvcnQgdmFyIG5vbldvcmtzcGFjZUF4aW9zID0gQXhpb3MuY3JlYXRlKHtcbiAgICBiYXNlVVJMOiBnZXRCYXNlVXJsKCksXG4gICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIHdvcmtzcGFjZTogZmFsc2UsXG4gICAgaGVhZGVyczoge1xuICAgICAgICAneC10ZW5hbnQtaWQnOiB0ZW5hbnRDb2RlLFxuICAgICAgICAneC1pbnN0aXR1dGlvbi1jb2RlJzogaW5zdGl0dXRpb25Db2RlLFxuICAgIH0sXG59KTtcbi8vIFJlcXVlc3QgaW50ZXJjZXB0b3Jcbm5vbldvcmtzcGFjZUF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgLy8gRm9ybWF0IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICB2YXIgcGFyYW1zID0gZm9ybWF0UGFyYW1zKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5wYXJhbXMpO1xuICAgIC8vIFNraXAgd29ya3NwYWNlIHJvdXRpbmcgc2luY2Ugd29ya3NwYWNlIGlzIHNldCB0byBmYWxzZVxuICAgIC8vIE5vIHdvcmtzcGFjZSByb3V0aW5nIGxvZ2ljIG5lZWRlZCBoZXJlXG4gICAgLy8gQWRkIHNlc3Npb24gdG9rZW5zIGZyb20gY29va2llcyBpZiBpbiBkZXZlbG9wbWVudFxuICAgIHZhciBzZXNzaW9uS2V5ID0gQ29va2llcy5nZXQoJ2NhbXB4X3Nlc3Npb25fa2V5Jyk7XG4gICAgdmFyIG9wZW5QYXltZW50c0tleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9vcGVuX3BheW1lbnRzX2tleScpO1xuICAgIHZhciBzdHVkZW50U2Vzc2lvbktleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zdHVkZW50X2tleScpO1xuICAgIGlmIChpc0RldmVsb3BtZW50ICYmIHNlc3Npb25LZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9zZXNzaW9uX2tleScsIHNlc3Npb25LZXkpO1xuICAgIH1cbiAgICBpZiAoaXNEZXZlbG9wbWVudCAmJiBzdHVkZW50U2Vzc2lvbktleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X3N0dWRlbnRfa2V5Jywgc3R1ZGVudFNlc3Npb25LZXkpO1xuICAgIH1cbiAgICBpZiAob3BlblBheW1lbnRzS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfb3Blbl9wYXltZW50c19rZXknLCBvcGVuUGF5bWVudHNLZXkpO1xuICAgIH1cbiAgICAvLyBTa2lwIHNlbmRpbmcgWC1pbnN0aXR1dGlvbi1jb2RlIGlmIHRoZSBmbGFnIGlzIHNldFxuICAgIGlmIChjb25maWcuc2tpcEluc3RpdHV0aW9uQ29kZSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5kZWxldGUoJ3gtaW5zdGl0dXRpb24tY29kZScpO1xuICAgIH1cbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbmZpZyksIHsgcGFyYW1zOiBwYXJhbXMgfSk7XG59LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xufSk7XG4vLyBSZXNwb25zZSBpbnRlcmNlcHRvclxubm9uV29ya3NwYWNlQXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBoaWRlU25hY2tiYXIgcHJvcGVydHlcbiAgICB2YXIgc2hvdWxkSGlkZVNuYWNrYmFyID0gKChfYSA9IHJlc3BvbnNlLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oaWRlU25hY2tiYXIpID09PSB0cnVlO1xuICAgIC8vIEhhbmRsZSBzdWNjZXNzZnVsIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmXG4gICAgICAgIHJlc3BvbnNlLmNvbmZpZy5tZXRob2QgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhyZXNwb25zZS5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbMjAwLCAyMDEsIDIwMl0uaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSByZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ09wZXJhdGlvbiBzdWNjZXNzZnVsJztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnc3VjY2Vzcyc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIC8vIENoZWNrIGlmIHRoZSBlcnJvciByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2IgPSAoX2EgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kYXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgZXJyb3IgcmVzcG9uc2VzXG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiYgWzQwMCwgNDIyXS5pbmNsdWRlcygoX2MgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBlcnJvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IGVyci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ0JhZCBSZXF1ZXN0JztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnZXJyb3InO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiZcbiAgICAgICAgKChfZCA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFsncHV0JywgJ3Bvc3QnLCAnZGVsZXRlJywgJ3BhdGNoJ10uaW5jbHVkZXMoZXJyLnJlc3BvbnNlLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFs0MDRdLmluY2x1ZGVzKGVyci5yZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBub3QgZm91bmQgZXJyb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSBlcnIucmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdOb3QgRm91bmQnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdlcnJvcic7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbm9uV29ya3NwYWNlQXhpb3M7XG4iLCIvKipcbiAqIFZvSVAgQ29uZmlndXJhdGlvbiBNb2R1bGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBtYW5hZ2VzIFZvSVAvRXhvdGVsIGNvbmZpZ3VyYXRpb24gZm9yIHdvcmtzcGFjZXMuXG4gKiBPbmx5IHdvcmtzcGFjZXMgbGlzdGVkIGluIFZPSVBfRU5BQkxFRF9XT1JLU1BBQ0VTIHdpbGwgaGF2ZSBWb0lQIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbi8qKlxuICogTGlzdCBvZiB3b3Jrc3BhY2VzIHRoYXQgaGF2ZSBWb0lQL0V4b3RlbCBjYWxsaW5nIGVuYWJsZWQuXG4gKiBBZGQgd29ya3NwYWNlIG5hbWVzIGhlcmUgdG8gZW5hYmxlIFZvSVAgZm9yIHRoYXQgd29ya3NwYWNlLlxuICovXG5leHBvcnQgdmFyIFZPSVBfRU5BQkxFRF9XT1JLU1BBQ0VTID0gW1xuICAgICdhZG1pc3Npb25zLWRpcmVjdG9yLXdvcmtzcGFjZScsXG4gICAgJ2FkbWlzc2lvbnMtY291bnNlbGxvci13b3Jrc3BhY2UnLFxuICAgICdhZG1pc3Npb25zLW9mZmljZXItd29ya3NwYWNlJyxcbiAgICAndGVsZS1jb3Vuc2VsbG9yLXdvcmtzcGFjZScsXG5dO1xuLyoqXG4gKiBDaGVjayBpZiBWb0lQIGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gd29ya3NwYWNlXG4gKlxuICogQHBhcmFtIHdvcmtzcGFjZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd29ya3NwYWNlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgaWYgVm9JUCBpcyBlbmFibGVkIGZvciB0aGUgd29ya3NwYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZvSVBFbmFibGVkRm9yV29ya3NwYWNlKHdvcmtzcGFjZU5hbWUpIHtcbiAgICByZXR1cm4gVk9JUF9FTkFCTEVEX1dPUktTUEFDRVMuaW5jbHVkZXMod29ya3NwYWNlTmFtZSk7XG59XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZyB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuL2FwcGxpY2F0aW9uLXN0b3JlJztcbnZhciBDb25maXJtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe1xuICAgIHNob3dDb25maXJtRGlhbG9nOiBmdW5jdGlvbiAoKSB7IH0sXG59KTtcbmV4cG9ydCB2YXIgQ29uZmlybURpYWxvZ1Byb3ZpZGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW47XG4gICAgdmFyIGNvbmZpcm1EaWFsb2cgPSBBcHBsaWNhdGlvblN0b3JlLnVzZVN0YXRlKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLmNvbmZpcm1EaWFsb2c7IH0pO1xuICAgIHZhciBzaG93Q29uZmlybURpYWxvZyA9IGZ1bmN0aW9uICh0aXRsZSwgbWVzc2FnZSwgb25Db25maXJtLCBvbkNhbmNlbCwgdHlwZSwgY29uZmlybVRleHQsIGNhbmNlbFRleHQpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gJ2NvbmZpcm0nOyB9XG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLmNvbmZpcm1EaWFsb2cgPSB7XG4gICAgICAgICAgICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIG9uQ29uZmlybTogb25Db25maXJtLFxuICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiBvbkNhbmNlbCxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBjb25maXJtVGV4dCxcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiBjYW5jZWxUZXh0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlQ2xvc2VEaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLmNvbmZpcm1EaWFsb2cuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIChfanN4cyhDb25maXJtQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogeyBzaG93Q29uZmlybURpYWxvZzogc2hvd0NvbmZpcm1EaWFsb2cgfSwgY2hpbGRyZW46IFtjaGlsZHJlbiwgX2pzeChDb25maXJtRGlhbG9nLCB7IG9wZW46IGNvbmZpcm1EaWFsb2cuaXNPcGVuLCB0aXRsZTogY29uZmlybURpYWxvZy50aXRsZSwgbWVzc2FnZTogY29uZmlybURpYWxvZy5tZXNzYWdlLCB2YXJpYW50OiBjb25maXJtRGlhbG9nLnR5cGUsIGNvbmZpcm1UZXh0OiBjb25maXJtRGlhbG9nLmNvbmZpcm1CdXR0b25UZXh0LCBjYW5jZWxUZXh0OiBjb25maXJtRGlhbG9nLmNhbmNlbEJ1dHRvblRleHQsIG9uQ29uZmlybTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25maXJtRGlhbG9nLm9uQ29uZmlybSgpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZURpYWxvZygpO1xuICAgICAgICAgICAgICAgIH0sIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybURpYWxvZy5vbkNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZURpYWxvZygpO1xuICAgICAgICAgICAgICAgIH0gfSldIH0pKTtcbn07XG4iLCJmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCwgZSkge1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fID0gZSwgdDtcbiAgfSwgX3NldFByb3RvdHlwZU9mKHQsIGUpO1xufVxuZXhwb3J0IHsgX3NldFByb3RvdHlwZU9mIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZSc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbnZhciBjaGFuZ2VkQXJyYXkgPSBmdW5jdGlvbiBjaGFuZ2VkQXJyYXkoYSwgYikge1xuICBpZiAoYSA9PT0gdm9pZCAwKSB7XG4gICAgYSA9IFtdO1xuICB9XG5cbiAgaWYgKGIgPT09IHZvaWQgMCkge1xuICAgIGIgPSBbXTtcbiAgfVxuXG4gIHJldHVybiBhLmxlbmd0aCAhPT0gYi5sZW5ndGggfHwgYS5zb21lKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgIHJldHVybiAhT2JqZWN0LmlzKGl0ZW0sIGJbaW5kZXhdKTtcbiAgfSk7XG59O1xuXG52YXIgaW5pdGlhbFN0YXRlID0ge1xuICBlcnJvcjogbnVsbFxufTtcblxudmFyIEVycm9yQm91bmRhcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoRXJyb3JCb3VuZGFyeSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRXJyb3JCb3VuZGFyeSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgX2FyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBfYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KF9hcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcblxuICAgIF90aGlzLnJlc2V0RXJyb3JCb3VuZGFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcztcblxuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMucHJvcHMub25SZXNldCA9PSBudWxsID8gdm9pZCAwIDogKF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMpLm9uUmVzZXQuYXBwbHkoX3RoaXMkcHJvcHMsIGFyZ3MpO1xuXG4gICAgICBfdGhpcy5yZXNldCgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBFcnJvckJvdW5kYXJ5LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9O1xuXG4gIHZhciBfcHJvdG8gPSBFcnJvckJvdW5kYXJ5LnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHtcbiAgICB0aGlzLnNldFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZENhdGNoID0gZnVuY3Rpb24gY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGluZm8pIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMkb25FcnJvciwgX3RoaXMkcHJvcHMyO1xuXG4gICAgKF90aGlzJHByb3BzJG9uRXJyb3IgPSAoX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcykub25FcnJvcikgPT0gbnVsbCA/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/ICdjb25maXJtJyA6IF9iO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgcy5jb25maXJtRGlhbG9nID0ge1xuICAgICAgICAgICAgICAgICAgICBpc09wZW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IGNvbmZpcm1CdXR0b25UZXh0LFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiBjYW5jZWxCdXR0b25UZXh0LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldERpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldERpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgcmVzZXREaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLmNvbmZpcm1EaWFsb2cgPSBkZWZhdWx0Q29uZmlybURpYWxvZ1N0YXRlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBpc0NvbmZpcm1lZDtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IE11bHRpU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIERlcGFydG1lbnRNb25nb011bHRpU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goTXVsdGlTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICd0eXBlJyxcbiAgICAgICAgICAgIHVzZVN1YkxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnX2lkJyxcbiAgICAgICAgICAgIGlzT2JqZWN0SWQ6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogbm9uV29ya3NwYWNlQXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2RlcGFydG1lbnRzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IE11bHRpU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIERlcGFydG1lbnRTcWxNdWx0aVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KE11bHRpU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAndHlwZScsXG4gICAgICAgICAgICB1c2VTdWJMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgICAgIGlzSW50OiB0cnVlLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IG5vbldvcmtzcGFjZUF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9kZXBhcnRtZW50cy1zcWxcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEJhdGNoU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIkJhdGNoXCIgfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2JhdGNoZXNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIENvdXJzZVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnY291cnNlTmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ2xldmVsJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvY291cnNlc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgRGVwYXJ0bWVudFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3R5cGUnLFxuICAgICAgICAgICAgdXNlU3ViTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdfaWQnLFxuICAgICAgICAgICAgaXNPYmplY3RJZDogdHJ1ZSxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBub25Xb3Jrc3BhY2VBeGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvZGVwYXJ0bWVudHNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEVtcGxveWVlc1NlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnX2lkJyxcbiAgICAgICAgICAgIGlzT2JqZWN0SWQ6IHRydWUsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdmdWxsTmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ2VtcGxveWVlSWQnLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9lbXBsb3llZXNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEV4YW1zUmVndWxhdGlvblNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7IHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiUmVndWxhdGlvblwiIH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9leGFtLXJlZ3VsYXRpb25zXCIsIGRiTGFiZWxQcm9wczoge1xuICAgICAgICBsYWJlbEtleTogJ3IubmFtZScsXG4gICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgIHZhbHVlS2V5OiAnci5uYW1lJyxcbiAgICB9IH0pKSk7IH07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xudmFyIGV4YW1UeXBlT3B0aW9ucyA9IFtcbiAgICB7IGxhYmVsOiAnQWxsJywgdmFsdWU6IG51bGwgfSxcbiAgICB7IGxhYmVsOiAnUkVHVUxBUicsIHZhbHVlOiAnUicgfSxcbiAgICB7IGxhYmVsOiAnU1VQUExFTUVOVEFSWScsIHZhbHVlOiAnUycgfSxcbl07XG5leHBvcnQgdmFyIEV4YW1UeXBlU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHsgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJFeGFtIFR5cGVcIiwgb3B0aW9uczogZXhhbVR5cGVPcHRpb25zIH0sIHByb3BzKSkpOyB9O1xuIiwiZXhwb3J0IHZhciBGZWVUeXBlcyA9IFtcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnVHVpdGlvbiBGZWUnLFxuICAgICAgICB2YWx1ZTogJ3R1aXRpb25fZmVlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbGFiZWw6ICdBZG1pc3Npb24gRmVlJyxcbiAgICAgICAgdmFsdWU6ICdhZG1pc3Npb25fZmVlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbGFiZWw6ICdIb3N0ZWwgRmVlJyxcbiAgICAgICAgdmFsdWU6ICdob3N0ZWxfZmVlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbGFiZWw6ICdUcmFuc3BvcnQgRmVlJyxcbiAgICAgICAgdmFsdWU6ICd0cmFuc3BvcnRfZmVlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbGFiZWw6ICdFeGFtIEZlZScsXG4gICAgICAgIHZhbHVlOiAnZXhhbV9mZWUnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBsYWJlbDogJ090aGVyIEZlZScsXG4gICAgICAgIHZhbHVlOiAnb3RoZXJfZmVlJyxcbiAgICB9LFxuXTtcbmV4cG9ydCB2YXIgeWVhcnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiA2IH0sIGZ1bmN0aW9uIChfLCBpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIGk7XG59KTtcbmV4cG9ydCB2YXIgYmF0Y2hPcHRpb25zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgZnVuY3Rpb24gKF8sIGkpIHsgcmV0dXJuICh7XG4gICAgbGFiZWw6IFwiXCIuY29uY2F0KG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIGksIFwiIC0gXCIpLmNvbmNhdChuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBpICsgMSksXG4gICAgdmFsdWU6IFwiXCIuY29uY2F0KG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIGksIFwiIC0gXCIpLmNvbmNhdChuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBpICsgMSksXG59KTsgfSk7XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgRmVlVHlwZXMgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB2YXIgRmVlVHlwZVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJGZWUgVHlwZVwiLCBvcHRpb25zOiBGZWVUeXBlcyA9PT0gbnVsbCB8fCBGZWVUeXBlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogRmVlVHlwZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgfSk7IH0pIH0sIHByb3BzKSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEhvc3RlbEJsb2NrU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgICAgICBpc0ludDogdHJ1ZSxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICd0eXBlJyxcbiAgICAgICAgICAgIHVzZUxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICAgICAgdXNlU3ViTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2hvc3RlbC1ibG9ja3NcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEhvc3RlbEZsb29yU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIkhvc3RlbCBSb29tIE5vLlwiLCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnZmxvb3InLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnZmxvb3InLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiZHJvcGRvd25zL2Zsb29yc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgSG9zdGVsUm9vbVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJIb3N0ZWwgUm9vbVwiLCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAncm9vbV9udW1iZXInLFxuICAgICAgICAgICAgdXNlTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgICAgICAvLyBzdWJMYWJlbEtleTogJ2Zsb29yJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiZHJvcGRvd25zL2hvc3RlbC1yb29tc1wiLCBleHRlcm5hbEF4aW9zOiBheGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIE1vbnRoWWVhclNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7IHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiTW9udGggJiBZZWFyXCIgfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL21vbnRoLXllYXJzXCIgfSkpKTsgfTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFByaW50Rm9ybWF0U2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAndHlwZScsXG4gICAgICAgICAgICB1c2VTdWJMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvcHJpbnQtZm9ybWF0c1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUHJvZ3JhbVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnYnJhbmNoQ29kZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ2JyYW5jaERpc3BsYXknLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9wcm9ncmFtc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUmVndWxhdGlvblNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJSZWd1bGF0aW9uXCIsIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdyZWd1bGF0aW9uX2lkJyxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ3IubmFtZScsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9yZWd1bGF0aW9uc1wiLCBleHRlcm5hbEF4aW9zOiBheGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFJlc2VhcmNoRXhwZXJ0RGVzaWduYXRpb25TZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICAgICAgaXNJbnQ6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogbm9uV29ya3NwYWNlQXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3Jlc2VhcmNoLWV4cGVydC1kZXNpZ25hdGlvbnNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFJlc2VhcmNoRXhwZXJ0U2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAvLyBkYkxWYWx1ZVByb3BzIGFyZSBub3QgYmVpbmcgdXNlZCBpbiBiYWNrZW5kLlxuICAgIC8vIGRiTGFiZWxQcm9wcy5zZWFyY2gsIGxpbWl0LCBvZmZzZXQgYXJlIGJlaW5nIHVzZWQgaW4gYmFja2VuZC5cbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAndHlwZScsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9yZXNlYXJjaC1leHBlcnRzXCIsIGV4dGVybmFsQXhpb3M6IG5vbldvcmtzcGFjZUF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUmVzZWFyY2hTdGFnZVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgLy8gRXNjYXBlICdvcmRlcicgY29sdW1uIG5hbWUgYXMgaXQncyBhIHJlc2VydmVkIGtleXdvcmQgaW4gTXlTUUxcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgICAgICBpc0ludDogdHJ1ZSxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICdgb3JkZXJgJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiZHJvcGRvd25zL3Jlc2VhcmNoLXN0YWdlc1wiLCBleHRlcm5hbEF4aW9zOiBub25Xb3Jrc3BhY2VBeGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFNlbWVzdGVyU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAneWVhcicsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvc2VtZXN0ZXJzXCIsIGV4dGVybmFsQXhpb3M6IGF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgU3R1ZGVudFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnc2x1ZycsXG4gICAgICAgICAgICB1c2VMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvc3R1ZGVudHNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFN0dWRlbnRTZXJ2aWNlc1NlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnc2x1ZycsXG4gICAgICAgICAgICB1c2VMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvc3R1ZGVudC1zZXJ2aWNlc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgeWVhcnMgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB2YXIgWWVhclJhbmdlU2VsZWN0b3IgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgX2IgPSBfYS5zdWZmaXgsIHN1ZmZpeCA9IF9iID09PSB2b2lkIDAgPyBudWxsIDogX2IsIF9jID0gX2EudmFsdWVLZXksIHZhbHVlS2V5ID0gX2MgPT09IHZvaWQgMCA/ICd5ZWFyUmFuZ2UnIDogX2MsIHByb3BzID0gX19yZXN0KF9hLCBbXCJzdWZmaXhcIiwgXCJ2YWx1ZUtleVwiXSk7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJZZWFyIFJhbmdlXCIsIG9wdGlvbnM6IHllYXJzID09PSBudWxsIHx8IHllYXJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB5ZWFycy5tYXAoZnVuY3Rpb24gKHllYXIpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICBsYWJlbDogc3VmZml4XG4gICAgICAgICAgICAgICAgPyBcIlwiLmNvbmNhdChzdWZmaXgsIFwiIFwiKS5jb25jYXQoeWVhciwgXCIgLSBcIikuY29uY2F0KHllYXIgKyAxKVxuICAgICAgICAgICAgICAgIDogXCJcIi5jb25jYXQoeWVhciwgXCIgLSBcIikuY29uY2F0KHllYXIgKyAxKSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZUtleSA9PT0gJ3llYXJSYW5nZScgPyBcIlwiLmNvbmNhdCh5ZWFyLCBcIiAtIFwiKS5jb25jYXQoeWVhciArIDEpIDogeWVhcixcbiAgICAgICAgfSk7IH0pIH0sIHByb3BzKSkpO1xufTtcbiIsImV4cG9ydCB2YXIgb3BlbkluTmV3VGFiID0gZnVuY3Rpb24gKHBhdGhBZnRlckJhc2UsIGV4Y2x1ZGVJbnN0aXR1dGlvbiwgZXhjbHVkZVdvcmtzcGFjZSkge1xuICAgIGlmIChleGNsdWRlSW5zdGl0dXRpb24gPT09IHZvaWQgMCkgeyBleGNsdWRlSW5zdGl0dXRpb24gPSBmYWxzZTsgfVxuICAgIGlmIChleGNsdWRlV29ya3NwYWNlID09PSB2b2lkIDApIHsgZXhjbHVkZVdvcmtzcGFjZSA9IGZhbHNlOyB9XG4gICAgdmFyIGN1cnJlbnRQYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIHZhciBzZWdtZW50cyA9IGN1cnJlbnRQYXRoLnNwbGl0KCcvJyk7XG4gICAgLy8gQnVpbGQgYmFzZSBwYXRoIGJhc2VkIG9uIGV4Y2x1c2lvbiBmbGFnc1xuICAgIHZhciBiYXNlUGFydHMgPSBbXTtcbiAgICAvLyBBZGQgc2VnbWVudCAxIChpbnN0aXR1dGlvbikgdW5sZXNzIGV4Y2x1ZGVkXG4gICAgaWYgKCFleGNsdWRlSW5zdGl0dXRpb24gJiYgc2VnbWVudHNbMV0pIHtcbiAgICAgICAgYmFzZVBhcnRzLnB1c2goc2VnbWVudHNbMV0pO1xuICAgIH1cbiAgICAvLyBBZGQgc2VnbWVudCAyICh3b3Jrc3BhY2UpIHVubGVzcyBleGNsdWRlZFxuICAgIGlmICghZXhjbHVkZVdvcmtzcGFjZSAmJiBzZWdtZW50c1syXSkge1xuICAgICAgICBiYXNlUGFydHMucHVzaChzZWdtZW50c1syXSk7XG4gICAgfVxuICAgIHZhciBiYXNlID0gYmFzZVBhcnRzLmxlbmd0aCA+IDAgPyAnLycgKyBiYXNlUGFydHMuam9pbignLycpIDogJyc7XG4gICAgLy8gQ29uc3RydWN0IGZ1bGwgVVJMIGFuZCBvcGVuIGluIG5ldyB0YWJcbiAgICB2YXIgZnVsbFBhdGggPSBcIlwiLmNvbmNhdCh3aW5kb3cubG9jYXRpb24ub3JpZ2luKS5jb25jYXQoYmFzZSwgXCIvXCIpLmNvbmNhdChwYXRoQWZ0ZXJCYXNlKTtcbiAgICB3aW5kb3cub3BlbihmdWxsUGF0aCwgJ19ibGFuaycpO1xufTtcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBFeG90ZWxDUk1XZWJTREsgZnJvbSAnQGV4b3RlbC1ucG0tZGV2L2V4b3RlbC1pcC1jYWxsaW5nLWNybS13ZWJzZGsnO1xudmFyIEV4b3RlbFNlcnZpY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXhvdGVsU2VydmljZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5leG90ZWxTREsgPSBudWxsO1xuICAgICAgICB0aGlzLndlYlBob25lID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLnNlc3Npb25MaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMucGVybWlzc2lvblN0YXR1cyA9ICd1bmtub3duJztcbiAgICAgICAgdGhpcy5oYW5kbGVDYWxsRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxEYXRhKSB7XG4gICAgICAgICAgICBfdGhpcy5jYWxsTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBsaXN0ZW5lcihldmVudCwgY2FsbERhdGEpOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVSZWdpc3RlckV2ZW50ID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgICAgICBfdGhpcy5yZWdpc3Rlckxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gbGlzdGVuZXIoc3RhdGUpOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVTZXNzaW9uRXZlbnQgPSBmdW5jdGlvbiAoc3RhdGUsIGRhdGEpIHtcbiAgICAgICAgICAgIF90aGlzLnNlc3Npb25MaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyKHN0YXRlLCBkYXRhKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIEV4b3RlbFNlcnZpY2UuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghRXhvdGVsU2VydmljZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgRXhvdGVsU2VydmljZS5pbnN0YW5jZSA9IG5ldyBFeG90ZWxTZXJ2aWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEV4b3RlbFNlcnZpY2UuaW5zdGFuY2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBFeG90ZWwgU0RLXG4gICAgICogQHBhcmFtIGFjY2Vzc1Rva2VuIC0gVGhlIGFjY2VzcyB0b2tlbiBmb3IgYXV0aGVudGljYXRpb25cbiAgICAgKiBAcGFyYW0gYWdlbnRVc2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgYWdlbnRcbiAgICAgKiBAcGFyYW0gYXV0b0Nvbm5lY3RWT0lQIC0gV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGNvbm5lY3QgVk9JUCAoZGVmYXVsdDogdHJ1ZSlcbiAgICAgKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzc1xuICAgICAqL1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiAoYWNjZXNzVG9rZW5fMSwgYWdlbnRVc2VySWRfMSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiAoYWNjZXNzVG9rZW4sIGFnZW50VXNlcklkLCBhdXRvQ29ubmVjdFZPSVApIHtcbiAgICAgICAgICAgIHZhciBwaG9uZSwgZXJyb3JfMTtcbiAgICAgICAgICAgIGlmIChhdXRvQ29ubmVjdFZPSVAgPT09IHZvaWQgMCkgeyBhdXRvQ29ubmVjdFZPSVAgPSB0cnVlOyB9XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jaGVja0F1ZGlvUGVybWlzc2lvbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhvdGVsU0RLID0gbmV3IEV4b3RlbENSTVdlYlNESyhhY2Nlc3NUb2tlbiwgYWdlbnRVc2VySWQsIGF1dG9Db25uZWN0Vk9JUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4b3RlbFNESy5Jbml0aWFsaXplKHRoaXMuaGFuZGxlQ2FsbEV2ZW50LCB0aGlzLmhhbmRsZVJlZ2lzdGVyRXZlbnQsIHRoaXMuaGFuZGxlU2Vzc2lvbkV2ZW50KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBob25lID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJQaG9uZSA9IHBob25lIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgISF0aGlzLndlYlBob25lXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIEV4b3RlbCBTREs6JywgZXJyb3JfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZmFsc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5jaGVja0F1ZGlvUGVybWlzc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkZXZpY2VzLCBoYXNBdWRpb0RldmljZSwgcGVybWlzc2lvblN0YXR1c18xLCBlcnJvcl8yLCBlcnJvcl8zO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgNiwgLCA3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNBdWRpb0RldmljZSA9IGRldmljZXMuc29tZShmdW5jdGlvbiAoZGV2aWNlKSB7IHJldHVybiBkZXZpY2Uua2luZCA9PT0gJ2F1ZGlvaW5wdXQnOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQXVkaW9EZXZpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBhdWRpbyBpbnB1dCBkZXZpY2VzIGZvdW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uU3RhdHVzID0gJ2RlbmllZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGZhbHNlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG5hdmlnYXRvci5wZXJtaXNzaW9ucyAmJiBuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsyLCA0LCAsIDVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtaWNyb3Bob25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25TdGF0dXNfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblN0YXR1cyA9IHBlcm1pc3Npb25TdGF0dXNfMS5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25TdGF0dXNfMS5vbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5wZXJtaXNzaW9uU3RhdHVzID0gcGVybWlzc2lvblN0YXR1c18xLnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBwZXJtaXNzaW9uU3RhdHVzXzEuc3RhdGUgPT09ICdncmFudGVkJ107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBxdWVyeSBwZXJtaXNzaW9uIHN0YXR1czonLCBlcnJvcl8yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovLCB0cnVlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNoZWNraW5nIGF1ZGlvIHBlcm1pc3Npb25zOicsIGVycm9yXzMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGZhbHNlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUucmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdHJlYW0sIGVycm9yXzQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDIsICwgM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykgeyByZXR1cm4gdHJhY2suc3RvcCgpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblN0YXR1cyA9ICdncmFudGVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0cnVlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfNCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgbWljcm9waG9uZSBhY2Nlc3M6JywgZXJyb3JfNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25TdGF0dXMgPSAnZGVuaWVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmYWxzZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLm1ha2VDYWxsID0gZnVuY3Rpb24gKHBob25lTnVtYmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLndlYlBob25lKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignV2ViIHBob25lIG5vdCBpbml0aWFsaXplZCcpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy53ZWJQaG9uZS5NYWtlQ2FsbChwaG9uZU51bWJlciwgZnVuY3Rpb24gKHN0YXR1cywgZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmFjY2VwdENhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBncmFudGVkO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLndlYlBob25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWIgcGhvbmUgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnBlcm1pc3Npb25TdGF0dXMgIT09ICdncmFudGVkJykpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZXF1ZXN0TWljcm9waG9uZUFjY2VzcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JhbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWljcm9waG9uZSBhY2Nlc3MgZGVuaWVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUGhvbmUuQWNjZXB0Q2FsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmhhbmd1cENhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLkhhbmd1cENhbGwoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlamVjdCBhbiBpbmNvbWluZyBjYWxsIGJlZm9yZSBhY2NlcHRpbmcgaXQuXG4gICAgICogTm90ZTogRXhvdGVsIFNESyBvbmx5IGhhcyBIYW5ndXBDYWxsIC0gbm8gc2VwYXJhdGUgUmVqZWN0Q2FsbCBtZXRob2QuXG4gICAgICogSGFuZ3VwQ2FsbCBpbnRlcm5hbGx5IGNhbGxzIHdlYnJ0Y1NJUFBob25lLnJlamVjdENhbGwoKSAtPiBwaG9uZS5zaXBIYW5nVXAoKVxuICAgICAqL1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnJlamVjdENhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLkhhbmd1cENhbGwoKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnRvZ2dsZUhvbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLlRvZ2dsZUhvbGQoKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnRvZ2dsZU11dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLlRvZ2dsZU11dGUoKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnNlbmREVE1GID0gZnVuY3Rpb24gKGRpZ2l0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLlNlbmREVE1GKGRpZ2l0KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnJlZ2lzdGVyRGV2aWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZ3JhbnRlZDtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMucGVybWlzc2lvblN0YXR1cyAhPT0gJ2dyYW50ZWQnKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlcXVlc3RNaWNyb3Bob25lQWNjZXNzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBncmFudGVkID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmFudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaWNyb3Bob25lIGFjY2VzcyBkZW5pZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLlJlZ2lzdGVyRGV2aWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUudW5yZWdpc3RlckRldmljZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLndlYlBob25lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuVW5SZWdpc3RlckRldmljZSgpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUuZ2V0UGVybWlzc2lvblN0YXR1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvblN0YXR1cztcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmFkZENhbGxMaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnJlbW92ZUNhbGxMaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmFkZFJlZ2lzdGVyTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5yZWdpc3Rlckxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUucmVtb3ZlUmVnaXN0ZXJMaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5hZGRTZXNzaW9uTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5yZW1vdmVTZXNzaW9uTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgICByZXR1cm4gRXhvdGVsU2VydmljZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBFeG90ZWxTZXJ2aWNlO1xuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYXhpb3MgfSBmcm9tICcuLi8uLi9jb25maWcvYXhpb3MnO1xuLyoqXG4gKiBDaGVjayBpZiBWb0lQIGlzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IHRlbmFudCBieSBmZXRjaGluZyBub3RpZmljYXRpb24gY29uZmlnLlxuICogUmV0dXJucyB0cnVlIG9ubHkgaWY6XG4gKiAtIGVuYWJsZVZvaWNlIGlzIHRydWVcbiAqIC0gdm9pY2VDb25maWdzIGhhcyBhdCBsZWFzdCBvbmUgZW5hYmxlZCBjb25maWdcbiAqL1xuZXhwb3J0IHZhciBjaGVja1ZvSVBFbmFibGVkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YSwgY29uZmlnLCBlbmFibGVkVm9pY2VDb25maWcsIGhhc1ZhbGlkVG9rZW4sIGVycm9yXzE7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFswLCAyLCAsIDNdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5nZXQoJy9ub3RpZmljYXRpb25zL25vdGlmaWNhdGlvbi1jb25maWdzJyldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Quc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIGNvbmZpZyA9IGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS5jb25maWc7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdm9pY2UgaXMgZW5hYmxlZCBhdCB0ZW5hbnQgbGV2ZWxcbiAgICAgICAgICAgICAgICBpZiAoIShjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuZW5hYmxlVm9pY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IGVuYWJsZWQ6IGZhbHNlLCBoYXNWYWxpZFRva2VuOiBmYWxzZSB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW5hYmxlZFZvaWNlQ29uZmlnID0gKF9hID0gY29uZmlnLnZvaWNlQ29uZmlncykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbmQoZnVuY3Rpb24gKHZjKSB7IHJldHVybiB2Yy5pc0VuYWJsZWQgPT09IHRydWU7IH0pO1xuICAgICAgICAgICAgICAgIGlmICghZW5hYmxlZFZvaWNlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IGVuYWJsZWQ6IGZhbHNlLCBoYXNWYWxpZFRva2VuOiBmYWxzZSB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFzVmFsaWRUb2tlbiA9ICEhKCgoX2IgPSBlbmFibGVkVm9pY2VDb25maWcuRVhPVEVMKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IudG9rZW4pICYmXG4gICAgICAgICAgICAgICAgICAgICgoX2MgPSBlbmFibGVkVm9pY2VDb25maWcuRVhPVEVMKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudG9rZW5FeHBpcmVzQXQpICYmXG4gICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGVuYWJsZWRWb2ljZUNvbmZpZy5FWE9URUwudG9rZW5FeHBpcmVzQXQpID4gbmV3IERhdGUoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgZW5hYmxlZDogdHJ1ZSwgaGFzVmFsaWRUb2tlbjogaGFzVmFsaWRUb2tlbiB9XTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjaGVjayBWb0lQIGNvbmZpZzonLCBlcnJvcl8xKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBlbmFibGVkOiBmYWxzZSwgaGFzVmFsaWRUb2tlbjogZmFsc2UgfV07XG4gICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEdldCB0aGUgYWN0aXZlIEV4b3RlbCB2b2ljZSB0b2tlbiBmcm9tIHRoZSBiYWNrZW5kLlxuICogVGhlIGJhY2tlbmQgbWFuYWdlcyBjcmVkZW50aWFscyBzZWN1cmVseSBhbmQgYXV0by1yZWZyZXNoZXMgdG9rZW5zLlxuICovXG5leHBvcnQgdmFyIGdldEFjdGl2ZVZvaWNlVG9rZW4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhLCBlcnJvcl8yO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgMiwgLCAzXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MuZ2V0KCcvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb24tY29uZmlncy92b2ljZS1jb25maWcvYWN0aXZlLXRva2VuJyldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBlcnJvcl8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBFeG90ZWwgdG9rZW46JywgZXJyb3JfMik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG51bGxdO1xuICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0QWN0aXZlVm9pY2VUb2tlbiBpbnN0ZWFkLlxuICogVGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBidXQgd2lsbCBiZSByZW1vdmVkLlxuICovXG5leHBvcnQgdmFyIGNyZWF0ZUV4b3RlbEFwcFRva2VuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdG9rZW5EYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRBY3RpdmVWb2ljZVRva2VuKCldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHRva2VuRGF0YSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRva2VuRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGFjdGl2ZSB2b2ljZSBjb25maWd1cmF0aW9uIGZvdW5kJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IERhdGE6IHRva2VuRGF0YS50b2tlbiB9XTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEluaXRpYXRlIGFuIG91dGJvdW5kIGNhbGwgLSBjcmVhdGVzIGNhbGwgYWN0aXZpdHkgcmVjb3JkXG4gKi9cbmV4cG9ydCB2YXIgaW5pdGlhdGVDYWxsQWN0aXZpdHkgPSBmdW5jdGlvbiAoaW5wdXQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLnBvc3QoXCIvY29tbXVuaWNhdGlvbi1hY3Rpdml0aWVzL2luaXRpYXRlXCIsIGlucHV0KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogUmVnaXN0ZXIgYW4gaW5jb21pbmcgY2FsbCAtIGNyZWF0ZXMgY2FsbCBhY3Rpdml0eSByZWNvcmRcbiAqL1xuZXhwb3J0IHZhciByZWdpc3RlckluY29taW5nQ2FsbCA9IGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MucG9zdChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvcmVnaXN0ZXItaW5jb21pbmdcIiwgaW5wdXQpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBGZXRjaCBjYWxsIGhpc3RvcnkgZm9yIGEgcHJvc3BlY3RcbiAqL1xuZXhwb3J0IHZhciBmZXRjaENhbGxIaXN0b3J5ID0gZnVuY3Rpb24gKHByb3NwZWN0SWQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLmdldChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvYnktcHJvc3BlY3RcIiwge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgcHJvc3BlY3RJZDogcHJvc3BlY3RJZCB9LFxuICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBHZXQgY2FsbCBhY3Rpdml0eSBieSBJRFxuICovXG5leHBvcnQgdmFyIGdldENhbGxBY3Rpdml0eUJ5SWQgPSBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLmdldChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvXCIuY29uY2F0KGlkKSldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEdldCBjYWxsIGFjdGl2aXR5IGJ5IENhbGxTaWRcbiAqL1xuZXhwb3J0IHZhciBnZXRDYWxsQWN0aXZpdHlCeUNhbGxTaWQgPSBmdW5jdGlvbiAoY2FsbFNpZCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MuZ2V0KFwiL2NvbW11bmljYXRpb24tYWN0aXZpdGllcy9ieS1jYWxsLXNpZFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBjYWxsU2lkOiBjYWxsU2lkIH0sXG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEdldCBjYWxsIGNvdW50IGZvciBhIHByb3NwZWN0XG4gKi9cbmV4cG9ydCB2YXIgZ2V0Q2FsbENvdW50QnlQcm9zcGVjdCA9IGZ1bmN0aW9uIChwcm9zcGVjdElkKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5nZXQoXCIvY29tbXVuaWNhdGlvbi1hY3Rpdml0aWVzL2NvdW50LWJ5LXByb3NwZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IHByb3NwZWN0SWQ6IHByb3NwZWN0SWQgfSxcbiAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEuY291bnQpIHx8IDBdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogU2F2ZSBjYWxsIGRpc3Bvc2l0aW9uXG4gKi9cbmV4cG9ydCB2YXIgc2F2ZUNhbGxEaXNwb3NpdGlvbiA9IGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVxdWVzdEJvZHksIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxTdGF0dXNEaXNwb3NpdGlvbjogaW5wdXQuY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvbkNhdGVnb3J5OiBpbnB1dC5kaXNwb3NpdGlvbkNhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICBwcm9zcGVjdFN0YXR1czogaW5wdXQucHJvc3BlY3RTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uTm90ZXM6IGlucHV0LmRpc3Bvc2l0aW9uTm90ZXMsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrU2NoZWR1bGVkQXQ6IGlucHV0LmNhbGxiYWNrU2NoZWR1bGVkQXQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5wb3N0KFwiL2NvbW11bmljYXRpb24tYWN0aXZpdGllcy9cIi5jb25jYXQoaW5wdXQuY2FsbElkLCBcIi9kaXNwb3NpdGlvblwiKSwgcmVxdWVzdEJvZHkpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBDYW5jZWwvZGVjbGluZSBhIGNhbGwgYmVmb3JlIGl0IHdhcyBjb25uZWN0ZWRcbiAqIFVwZGF0ZXMgdGhlIGNhbGwgYWN0aXZpdHkgc3RhdHVzIHRvIENBTkNFTEVEXG4gKi9cbmV4cG9ydCB2YXIgY2FuY2VsQ2FsbCA9IGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MucG9zdChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvY2FuY2VsXCIsIGlucHV0KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSwgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXhvdGVsU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9leG90ZWwvRXhvdGVsU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckluY29taW5nQ2FsbCB9IGZyb20gJy4uL3NlcnZpY2VzL2V4b3RlbC9hcGknO1xuLy8gR2xvYmFsIGNvbnRleHQga2V5IGZvciBjcm9zcy1tb2R1bGUtZmVkZXJhdGlvbiBzaGFyaW5nXG52YXIgRVhPVEVMX0NPTlRFWFRfS0VZID0gJ19fRVhPVEVMX0NPTlRFWFRfXyc7XG4vLyBHZXQgb3IgY3JlYXRlIGEgc2hhcmVkIGNvbnRleHQgYWNyb3NzIG1vZHVsZSBmZWRlcmF0aW9uIGJvdW5kYXJpZXNcbnZhciBnZXRTaGFyZWRDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghd2luZG93W0VYT1RFTF9DT05URVhUX0tFWV0pIHtcbiAgICAgICAgO1xuICAgICAgICB3aW5kb3dbRVhPVEVMX0NPTlRFWFRfS0VZXSA9IGNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHdpbmRvd1tFWE9URUxfQ09OVEVYVF9LRVldO1xufTtcbnZhciBpbml0aWFsQ2FsbFN0YXRlID0ge1xuICAgIHBoYXNlOiAnaWRsZScsXG4gICAgY2FsbERhdGE6IG51bGwsXG4gICAgaXNPbkhvbGQ6IGZhbHNlLFxuICAgIGlzTXV0ZWQ6IGZhbHNlLFxuICAgIGlzU3BlYWtlck9mZjogZmFsc2UsXG4gICAgY2FsbERpcmVjdGlvbjogbnVsbCxcbiAgICBjYWxsU3RhcnRUaW1lOiBudWxsLFxuICAgIGNhbGxEdXJhdGlvbjogMCxcbiAgICBjYWxsZXJOYW1lOiBudWxsLFxuICAgIGNhbGxlck51bWJlcjogbnVsbCxcbiAgICBjYWxsQWN0aXZpdHlJZDogbnVsbCxcbiAgICBleG90ZWxDYWxsU2lkOiBudWxsLFxuICAgIHByb3NwZWN0VW5pcXVlSWQ6IG51bGwsXG4gICAgd2FzQWNjZXB0ZWQ6IGZhbHNlLFxufTtcbi8qKlxuICogTWFzayBtb2JpbGUgbnVtYmVyIGZvciBkaXNwbGF5IChmaXJzdCAyIGFuZCBsYXN0IDIgb2YgYWN0dWFsIG51bWJlciB2aXNpYmxlKVxuICogSGFuZGxlcyBjb3VudHJ5IGNvZGUgcHJlZml4ICgrOTEpXG4gKiBlLmcuLCBcIis5MTk4NzY1NDMyMTBcIiAtPiBcIis5MTk4KioqKioqMTBcIlxuICogZS5nLiwgXCI5ODc2NTQzMjEwXCIgLT4gXCI5OCoqKioqKjEwXCJcbiAqL1xudmFyIG1hc2tNb2JpbGUgPSBmdW5jdGlvbiAobW9iaWxlKSB7XG4gICAgaWYgKCFtb2JpbGUgfHwgbW9iaWxlLmxlbmd0aCA8IDQpXG4gICAgICAgIHJldHVybiAnKioqKioqKioqKic7XG4gICAgLy8gQ2hlY2sgZm9yIGNvdW50cnkgY29kZSBwcmVmaXhcbiAgICB2YXIgcHJlZml4ID0gJyc7XG4gICAgdmFyIG51bWJlciA9IG1vYmlsZTtcbiAgICBpZiAobW9iaWxlLnN0YXJ0c1dpdGgoJys5MScpKSB7XG4gICAgICAgIHByZWZpeCA9ICcrOTEnO1xuICAgICAgICBudW1iZXIgPSBtb2JpbGUuc3Vic3RyaW5nKDMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChtb2JpbGUuc3RhcnRzV2l0aCgnOTEnKSAmJiBtb2JpbGUubGVuZ3RoID4gMTApIHtcbiAgICAgICAgcHJlZml4ID0gJzkxJztcbiAgICAgICAgbnVtYmVyID0gbW9iaWxlLnN1YnN0cmluZygyKTtcbiAgICB9XG4gICAgdmFyIGNsZWFuZWQgPSBudW1iZXIucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICBpZiAoY2xlYW5lZC5sZW5ndGggPCA0KVxuICAgICAgICByZXR1cm4gcHJlZml4ICsgJyoqKioqKioqKionO1xuICAgIHJldHVybiBwcmVmaXggKyBjbGVhbmVkLnN1YnN0cmluZygwLCAyKSArICcqJy5yZXBlYXQoY2xlYW5lZC5sZW5ndGggLSA0KSArIGNsZWFuZWQuc3Vic3RyaW5nKGNsZWFuZWQubGVuZ3RoIC0gMik7XG59O1xuLy8gVXNlIHNoYXJlZCBjb250ZXh0IGZvciBjcm9zcy1tb2R1bGUtZmVkZXJhdGlvbiBjb21wYXRpYmlsaXR5XG52YXIgRXhvdGVsQ29udGV4dCA9IGdldFNoYXJlZENvbnRleHQoKTtcbmV4cG9ydCB2YXIgRXhvdGVsUHJvdmlkZXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgYWNjZXNzVG9rZW4gPSBfYS5hY2Nlc3NUb2tlbiwgYWdlbnRVc2VySWQgPSBfYS5hZ2VudFVzZXJJZCwgX2IgPSBfYS5hdXRvQ29ubmVjdFZPSVAsIGF1dG9Db25uZWN0Vk9JUCA9IF9iID09PSB2b2lkIDAgPyB0cnVlIDogX2IsIGRlZmF1bHRDYWxsZXJOYW1lID0gX2EuY2FsbGVyTmFtZSwgZGVmYXVsdENhbGxlck51bWJlciA9IF9hLmNhbGxlck51bWJlcjtcbiAgICB2YXIgX2MgPSB1c2VTdGF0ZShmYWxzZSksIGlzSW5pdGlhbGl6ZWQgPSBfY1swXSwgc2V0SXNJbml0aWFsaXplZCA9IF9jWzFdO1xuICAgIHZhciBfZCA9IHVzZVN0YXRlKGZhbHNlKSwgaXNDb25uZWN0ZWQgPSBfZFswXSwgc2V0SXNDb25uZWN0ZWQgPSBfZFsxXTtcbiAgICB2YXIgX2UgPSB1c2VTdGF0ZSgndW5rbm93bicpLCBwZXJtaXNzaW9uU3RhdHVzID0gX2VbMF0sIHNldFBlcm1pc3Npb25TdGF0dXMgPSBfZVsxXTtcbiAgICB2YXIgX2YgPSB1c2VTdGF0ZShpbml0aWFsQ2FsbFN0YXRlKSwgY2FsbFN0YXRlID0gX2ZbMF0sIHNldENhbGxTdGF0ZSA9IF9mWzFdO1xuICAgIHZhciBfZyA9IHVzZVN0YXRlKG51bGwpLCBkaXNwb3NpdGlvbkRhdGEgPSBfZ1swXSwgc2V0RGlzcG9zaXRpb25EYXRhID0gX2dbMV07XG4gICAgdmFyIHRpbWVyUmVmID0gdXNlUmVmKG51bGwpO1xuICAgIHZhciBjYWxsU3RhdGVSZWYgPSB1c2VSZWYoY2FsbFN0YXRlKTtcbiAgICB2YXIgZXhvdGVsU2VydmljZSA9IEV4b3RlbFNlcnZpY2UuZ2V0SW5zdGFuY2UoKTtcbiAgICAvLyBLZWVwIHJlZiBpbiBzeW5jIHdpdGggc3RhdGUgZm9yIHVzZSBpbiBldmVudCBoYW5kbGVyc1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxTdGF0ZVJlZi5jdXJyZW50ID0gY2FsbFN0YXRlO1xuICAgIH0sIFtjYWxsU3RhdGVdKTtcbiAgICAvLyBUaW1lciBmb3IgY2FsbCBkdXJhdGlvblxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjYWxsU3RhdGUucGhhc2UgPT09ICdjb25uZWN0ZWQnICYmIGNhbGxTdGF0ZS5jYWxsU3RhcnRUaW1lKSB7XG4gICAgICAgICAgICB0aW1lclJlZi5jdXJyZW50ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBjYWxsRHVyYXRpb246IE1hdGguZmxvb3IoKERhdGUubm93KCkgLSBwcmV2LmNhbGxTdGFydFRpbWUpIC8gMTAwMCkgfSkpOyB9KTtcbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRpbWVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIHRpbWVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGltZXJSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJSZWYuY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSwgW2NhbGxTdGF0ZS5waGFzZSwgY2FsbFN0YXRlLmNhbGxTdGFydFRpbWVdKTtcbiAgICAvLyBSZXF1ZXN0IG1pY3JvcGhvbmUgcGVybWlzc2lvbiBiZWZvcmUgaW5pdGlhbGl6aW5nXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlcXVlc3RQZXJtaXNzaW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdHJlYW0sIGVycm9yXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDIsICwgM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykgeyByZXR1cm4gdHJhY2suc3RvcCgpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFBlcm1pc3Npb25TdGF0dXMoJ2dyYW50ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaWNyb3Bob25lIHBlcm1pc3Npb24gZGVuaWVkOicsIGVycm9yXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGVybWlzc2lvblN0YXR1cygnZGVuaWVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyB9O1xuICAgICAgICBpZiAobmF2aWdhdG9yLnBlcm1pc3Npb25zICYmIG5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSkge1xuICAgICAgICAgICAgbmF2aWdhdG9yLnBlcm1pc3Npb25zXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHsgbmFtZTogJ21pY3JvcGhvbmUnIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHNldFBlcm1pc3Npb25TdGF0dXMoc3RhdHVzLnN0YXRlKTtcbiAgICAgICAgICAgICAgICBzdGF0dXMub25jaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFBlcm1pc3Npb25TdGF0dXMoc3RhdHVzLnN0YXRlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMuc3RhdGUgPT09ICdwcm9tcHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQZXJtaXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgcXVlcnkgcGVybWlzc2lvbiBzdGF0dXM6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RQZXJtaXNzaW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcXVlc3RQZXJtaXNzaW9uKCk7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgU0RLXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFhY2Nlc3NUb2tlbiB8fCAhYWdlbnRVc2VySWQgfHwgaXNJbml0aWFsaXplZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGluaXRpYWxpemVFeG90ZWwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHN1Y2Nlc3M7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGV4b3RlbFNlcnZpY2UuaW5pdGlhbGl6ZShhY2Nlc3NUb2tlbiwgYWdlbnRVc2VySWQsIGF1dG9Db25uZWN0Vk9JUCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsaXplZChzdWNjZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7IH07XG4gICAgICAgIGluaXRpYWxpemVFeG90ZWwoKTtcbiAgICB9LCBbYWNjZXNzVG9rZW4sIGFnZW50VXNlcklkLCBhdXRvQ29ubmVjdFZPSVBdKTtcbiAgICAvLyBTZXR1cCBldmVudCBsaXN0ZW5lcnNcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBoYW5kbGVDYWxsRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdpbmNvbWluZyc6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgY3VycmVudCBzdGF0ZSB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGdlbnVpbmUgaW5jb21pbmcgY2FsbFxuICAgICAgICAgICAgICAgICAgICAvLyBvciBqdXN0IHRoZSBhZ2VudCBjYWxsYmFjayBmb3IgYW4gb3V0Ym91bmQgY2xpY2stdG8tY2FsbFxuICAgICAgICAgICAgICAgICAgICB2YXIgaXNPdXRib3VuZENhbGwgPSBjYWxsU3RhdGVSZWYuY3VycmVudC5jYWxsRGlyZWN0aW9uID09PSAnb3V0Ym91bmQnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNPdXRib3VuZENhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBvdXRib3VuZCBjYWxscyAoY2xpY2stdG8tY2FsbCksIEV4b3RlbCBmaXJzdCBjYWxscyB0aGUgYWdlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdHJpZ2dlcnMgJ2luY29taW5nJyBldmVudCBidXQgd2Ugc2hvdWxkIE5PVCBvdmVyd3JpdGUgdGhlIG91dGJvdW5kIGNhbGwgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBjYWxsRGF0YTogZGF0YSwgaXNPbkhvbGQ6IGZhbHNlLCBpc011dGVkOiBmYWxzZSB9KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGdlbnVpbmUgaW5jb21pbmcgY2FsbCAtIHVwZGF0ZSBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluY29taW5nTnVtYmVyXzEgPSBkYXRhLmNhbGxGcm9tTnVtYmVyIHx8IGRhdGEucmVtb3RlSWQgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBwaGFzZTogJ2luY29taW5nJywgY2FsbERhdGE6IGRhdGEsIGNhbGxEaXJlY3Rpb246ICdpbmJvdW5kJywgY2FsbGVyTmFtZTogZGF0YS5yZW1vdGVEaXNwbGF5TmFtZSB8fCBudWxsLCBjYWxsZXJOdW1iZXI6IGluY29taW5nTnVtYmVyXzEgPyBtYXNrTW9iaWxlKGluY29taW5nTnVtYmVyXzEpIDogbnVsbCwgaXNPbkhvbGQ6IGZhbHNlLCBpc011dGVkOiBmYWxzZSB9KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgaW5jb21pbmcgY2FsbCBpbiB0aGUgYmFja2VuZCBhbmQgZ2V0IHByb3NwZWN0IGRldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmNhbGxJZCB8fCBkYXRhLnNlc3Npb25JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVySW5jb21pbmdDYWxsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFNpZDogZGF0YS5jYWxsSWQgfHwgZGF0YS5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21OdW1iZXI6IGRhdGEuY2FsbEZyb21OdW1iZXIgfHwgZGF0YS5yZW1vdGVJZCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9OdW1iZXI6IGRhdGEucmVtb3RlRGlzcGxheU5hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNhbGwgc3RhdGUgd2l0aCBwcm9zcGVjdCBkZXRhaWxzIGFuZCBjYWxsIGFjdGl2aXR5IElEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9zcGVjdE1vYmlsZSA9IChfYSA9IHJlc3BvbnNlLnByb3NwZWN0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgY2FsbEFjdGl2aXR5SWQ6ICgoX2EgPSByZXNwb25zZS5kYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaWQpIHx8IHByZXYuY2FsbEFjdGl2aXR5SWQsIGNhbGxlck5hbWU6ICgoX2IgPSByZXNwb25zZS5wcm9zcGVjdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm5hbWUpIHx8IHByZXYuY2FsbGVyTmFtZSwgY2FsbGVyTnVtYmVyOiBwcm9zcGVjdE1vYmlsZSA/IG1hc2tNb2JpbGUocHJvc3BlY3RNb2JpbGUpIDogcHJldi5jYWxsZXJOdW1iZXIsIHByb3NwZWN0VW5pcXVlSWQ6ICgoX2MgPSByZXNwb25zZS5wcm9zcGVjdCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnVuaXF1ZUlkKSB8fCBwcmV2LnByb3NwZWN0VW5pcXVlSWQgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVnaXN0ZXIgaW5jb21pbmcgY2FsbDonLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdjb25uZWN0ZWQnOlxuICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgcGhhc2U6ICdjb25uZWN0ZWQnLCBjYWxsRGF0YTogZGF0YSwgY2FsbFN0YXJ0VGltZTogRGF0ZS5ub3coKSwgY2FsbER1cmF0aW9uOiAwIH0pKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NhbGxFbmRlZCc6XG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgZGlzcG9zaXRpb24gZm9ybSBpZjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFVzZXIgYWNjZXB0ZWQgdGhlIGNhbGwgKHdhc0FjY2VwdGVkID0gdHJ1ZSksIE9SXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBDYWxsIHdhcyBjb25uZWN0ZWQsIE9SXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiBDYWxsIGhhZCBzb21lIGR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBOT1Qgc2hvdyBpZiB1c2VyIGRlY2xpbmVkIGJlZm9yZSBhY2NlcHRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaG91bGRTaG93RGlzcG9zaXRpb24gPSBwcmV2Lndhc0FjY2VwdGVkIHx8IHByZXYucGhhc2UgPT09ICdjb25uZWN0ZWQnIHx8IHByZXYuY2FsbER1cmF0aW9uID4gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93RGlzcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcG9zaXRpb25EYXRhT2JqID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgZGF0YWJhc2UgY2FsbEFjdGl2aXR5SWQgZm9yIEFQSSBjYWxscywgZmFsbCBiYWNrIHRvIEV4b3RlbCBjYWxsSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbElkOiBwcmV2LmNhbGxBY3Rpdml0eUlkIHx8IGRhdGEuY2FsbElkIHx8ICgoX2EgPSBwcmV2LmNhbGxEYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbElkKSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhvdGVsQ2FsbElkOiBkYXRhLmNhbGxJZCB8fCAoKF9iID0gcHJldi5jYWxsRGF0YSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGxJZCkgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxEaXJlY3Rpb246IHByZXYuY2FsbERpcmVjdGlvbiB8fCAnb3V0Ym91bmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsRHVyYXRpb246IHByZXYuY2FsbER1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJOYW1lOiBwcmV2LmNhbGxlck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlck51bWJlcjogcHJldi5jYWxsZXJOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwb3NpdGlvbkRhdGEoZGlzcG9zaXRpb25EYXRhT2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaW5pdGlhbENhbGxTdGF0ZSksIHsgcGhhc2U6ICdlbmRlZCcsIGNhbGxEYXRhOiBkYXRhIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG9sZHRvZ2dsZSc6XG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBpc09uSG9sZDogIXByZXYuaXNPbkhvbGQsIGNhbGxEYXRhOiBkYXRhIH0pKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ211dGV0b2dnbGUnOlxuICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgaXNNdXRlZDogIXByZXYuaXNNdXRlZCwgY2FsbERhdGE6IGRhdGEgfSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHZhciBoYW5kbGVSZWdpc3RlckV2ZW50ID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgICAgICBzZXRJc0Nvbm5lY3RlZChzdGF0ZSA9PT0gJ3JlZ2lzdGVyZWQnKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGhhbmRsZVNlc3Npb25FdmVudCA9IGZ1bmN0aW9uIChzdGF0ZSwgZGF0YSkge1xuICAgICAgICAgICAgLy8gSGFuZGxlIHNlc3Npb24gZXZlbnRzIGlmIG5lZWRlZFxuICAgICAgICB9O1xuICAgICAgICBleG90ZWxTZXJ2aWNlLmFkZENhbGxMaXN0ZW5lcihoYW5kbGVDYWxsRXZlbnQpO1xuICAgICAgICBleG90ZWxTZXJ2aWNlLmFkZFJlZ2lzdGVyTGlzdGVuZXIoaGFuZGxlUmVnaXN0ZXJFdmVudCk7XG4gICAgICAgIGV4b3RlbFNlcnZpY2UuYWRkU2Vzc2lvbkxpc3RlbmVyKGhhbmRsZVNlc3Npb25FdmVudCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleG90ZWxTZXJ2aWNlLnJlbW92ZUNhbGxMaXN0ZW5lcihoYW5kbGVDYWxsRXZlbnQpO1xuICAgICAgICAgICAgZXhvdGVsU2VydmljZS5yZW1vdmVSZWdpc3Rlckxpc3RlbmVyKGhhbmRsZVJlZ2lzdGVyRXZlbnQpO1xuICAgICAgICAgICAgZXhvdGVsU2VydmljZS5yZW1vdmVTZXNzaW9uTGlzdGVuZXIoaGFuZGxlU2Vzc2lvbkV2ZW50KTtcbiAgICAgICAgfTtcbiAgICB9LCBbaXNJbml0aWFsaXplZF0pO1xuICAgIC8vIFVwZGF0ZSBwZXJtaXNzaW9uIHN0YXR1cyB3aGVuIGl0IGNoYW5nZXMgaW4gdGhlIHNlcnZpY2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNJbml0aWFsaXplZCkge1xuICAgICAgICAgICAgc2V0UGVybWlzc2lvblN0YXR1cyhleG90ZWxTZXJ2aWNlLmdldFBlcm1pc3Npb25TdGF0dXMoKSk7XG4gICAgICAgIH1cbiAgICB9LCBbaXNJbml0aWFsaXplZF0pO1xuICAgIHZhciBtYWtlQ2FsbCA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChwaG9uZU51bWJlciwgY2FsbGVyTmFtZSwgY2FsbEFjdGl2aXR5SWQsIG1hc2tlZE51bWJlcikgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlc3BvbnNlLCBlcnJvcl8yO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCBzdGF0ZSAtIHJlYWR5IHRvIGNhbGwgKGFnZW50IG5lZWRzIHRvIGFjY2VwdCBmaXJzdClcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIG1hc2tlZCBudW1iZXIgZm9yIGRpc3BsYXksIGFjdHVhbCBudW1iZXIgZm9yIHRoZSBjYWxsXG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBwaGFzZTogJ3JlYWR5X3RvX2NhbGwnLCBjYWxsRGlyZWN0aW9uOiAnb3V0Ym91bmQnLCBjYWxsZXJOYW1lOiBjYWxsZXJOYW1lIHx8IGRlZmF1bHRDYWxsZXJOYW1lIHx8IG51bGwsIGNhbGxlck51bWJlcjogbWFza2VkTnVtYmVyIHx8IHBob25lTnVtYmVyLCBjYWxsQWN0aXZpdHlJZDogY2FsbEFjdGl2aXR5SWQgfHwgbnVsbCwgaXNPbkhvbGQ6IGZhbHNlLCBpc011dGVkOiBmYWxzZSwgY2FsbFN0YXJ0VGltZTogbnVsbCwgY2FsbER1cmF0aW9uOiAwIH0pKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGV4b3RlbFNlcnZpY2UubWFrZUNhbGwocGhvbmVOdW1iZXIpXTsgLy8gVXNlIGFjdHVhbCBudW1iZXIgZm9yIGNhbGxpbmdcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpIC8vIFVzZSBhY3R1YWwgbnVtYmVyIGZvciBjYWxsaW5nXG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3BvbnNlXTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGVycm9yXzIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIFNESyBjYWxsIGZhaWxzICg0eHgvNXh4IGVycm9ycyBmcm9tIEV4b3RlbCBBUEkpLCByZXNldCBzdGF0ZSB0byBpZGxlXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIHJldHJ5IHRoZSBjYWxsXG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShpbml0aWFsQ2FsbFN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmUtdGhyb3cgdGhlIGVycm9yIHNvIENhbGxCdXR0b24gY2FuIGhhbmRsZSBpdFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl8yO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTsgfSwgW2RlZmF1bHRDYWxsZXJOYW1lXSk7XG4gICAgdmFyIGFjY2VwdENhbGwgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBleG90ZWxTZXJ2aWNlLmFjY2VwdENhbGwoKVxuICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb3V0Ym91bmQgY2FsbHMsIGFjY2VwdGluZyBtZWFucyB3ZSdyZSBub3cgY2FsbGluZyB0aGUgbGVhZFxuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHdhc0FjY2VwdGVkID0gdHJ1ZSBzbyB3ZSBrbm93IHRvIHNob3cgZGlzcG9zaXRpb24gZm9ybSBvbiBlbmRcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb3V0Ym91bmQgY2FsbHMsIGFjY2VwdGluZyBtZWFucyB3ZSdyZSBub3cgY2FsbGluZyB0aGUgbGVhZFxuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHdhc0FjY2VwdGVkID0gdHJ1ZSBzbyB3ZSBrbm93IHRvIHNob3cgZGlzcG9zaXRpb24gZm9ybSBvbiBlbmRcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5jYWxsRGlyZWN0aW9uID09PSAnb3V0Ym91bmQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBwaGFzZTogJ2NhbGxpbmcnLCB3YXNBY2NlcHRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBpbmJvdW5kIGNhbGxzLCBhbHNvIG1hcmsgYXMgYWNjZXB0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgd2FzQWNjZXB0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pOyB9LCBbXSk7XG4gICAgdmFyIGhhbmd1cENhbGwgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4b3RlbFNlcnZpY2UuaGFuZ3VwQ2FsbCgpO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgdG9nZ2xlU3BlYWtlciA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IGlzU3BlYWtlck9mZjogIXByZXYuaXNTcGVha2VyT2ZmIH0pKTsgfSk7XG4gICAgICAgIC8vIE5vdGU6IEFjdHVhbCBzcGVha2VyIHRvZ2dsZSB3b3VsZCBuZWVkIFdlYlJUQyBhdWRpbyBvdXRwdXQgZGV2aWNlIHN3aXRjaGluZ1xuICAgIH0sIFtdKTtcbiAgICB2YXIgY2xlYXJEaXNwb3NpdGlvbiA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0RGlzcG9zaXRpb25EYXRhKG51bGwpO1xuICAgICAgICBzZXRDYWxsU3RhdGUoaW5pdGlhbENhbGxTdGF0ZSk7XG4gICAgfSwgW10pO1xuICAgIC8vIFVwZGF0ZSBjYWxsQWN0aXZpdHlJZCBhZnRlciBjcmVhdGluZyB0aGUgcmVjb3JkIChmb3Igb3V0Ym91bmQgY2FsbHMpXG4gICAgdmFyIHNldENhbGxBY3Rpdml0eUlkRm4gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoY2FsbEFjdGl2aXR5SWQpIHtcbiAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IGNhbGxBY3Rpdml0eUlkOiBjYWxsQWN0aXZpdHlJZCB9KSk7IH0pO1xuICAgIH0sIFtdKTtcbiAgICAvLyBVcGRhdGUgZXhvdGVsQ2FsbFNpZCBmcm9tIFNESyByZXNwb25zZSAoZm9yIG91dGJvdW5kIGNhbGxzKVxuICAgIHZhciBzZXRFeG90ZWxDYWxsU2lkRm4gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoY2FsbFNpZCkge1xuICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgZXhvdGVsQ2FsbFNpZDogY2FsbFNpZCB9KSk7IH0pO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgdmFsdWUgPSB7XG4gICAgICAgIGlzSW5pdGlhbGl6ZWQ6IGlzSW5pdGlhbGl6ZWQsXG4gICAgICAgIGlzQ29ubmVjdGVkOiBpc0Nvbm5lY3RlZCxcbiAgICAgICAgY2FsbFN0YXRlOiBjYWxsU3RhdGUsXG4gICAgICAgIHBlcm1pc3Npb25TdGF0dXM6IHBlcm1pc3Npb25TdGF0dXMsXG4gICAgICAgIGRpc3Bvc2l0aW9uRGF0YTogZGlzcG9zaXRpb25EYXRhLFxuICAgICAgICBtYWtlQ2FsbDogbWFrZUNhbGwsXG4gICAgICAgIGFjY2VwdENhbGw6IGFjY2VwdENhbGwsXG4gICAgICAgIGhhbmd1cENhbGw6IGhhbmd1cENhbGwsXG4gICAgICAgIHJlamVjdENhbGw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV4b3RlbFNlcnZpY2UucmVqZWN0Q2FsbCgpOyB9LFxuICAgICAgICB0b2dnbGVIb2xkOiBmdW5jdGlvbiAoKSB7IHJldHVybiBleG90ZWxTZXJ2aWNlLnRvZ2dsZUhvbGQoKTsgfSxcbiAgICAgICAgdG9nZ2xlTXV0ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gZXhvdGVsU2VydmljZS50b2dnbGVNdXRlKCk7IH0sXG4gICAgICAgIHRvZ2dsZVNwZWFrZXI6IHRvZ2dsZVNwZWFrZXIsXG4gICAgICAgIHNlbmREVE1GOiBmdW5jdGlvbiAoZGlnaXQpIHsgcmV0dXJuIGV4b3RlbFNlcnZpY2Uuc2VuZERUTUYoZGlnaXQpOyB9LFxuICAgICAgICByZWdpc3RlckRldmljZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gZXhvdGVsU2VydmljZS5yZWdpc3RlckRldmljZSgpOyB9LFxuICAgICAgICB1bnJlZ2lzdGVyRGV2aWNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBleG90ZWxTZXJ2aWNlLnVucmVnaXN0ZXJEZXZpY2UoKTsgfSxcbiAgICAgICAgcmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3M6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV4b3RlbFNlcnZpY2UucmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MoKTsgfSxcbiAgICAgICAgY2xlYXJEaXNwb3NpdGlvbjogY2xlYXJEaXNwb3NpdGlvbixcbiAgICAgICAgc2V0Q2FsbEFjdGl2aXR5SWQ6IHNldENhbGxBY3Rpdml0eUlkRm4sXG4gICAgICAgIHNldEV4b3RlbENhbGxTaWQ6IHNldEV4b3RlbENhbGxTaWRGbixcbiAgICB9O1xuICAgIHJldHVybiAoX2pzeChFeG90ZWxDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiB2YWx1ZSwgY2hpbGRyZW46IGNoaWxkcmVuIH0pKTtcbn07XG5leHBvcnQgdmFyIHVzZUV4b3RlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoRXhvdGVsQ29udGV4dCk7XG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUV4b3RlbCBtdXN0IGJlIHVzZWQgd2l0aGluIGFuIEV4b3RlbFByb3ZpZGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xufTtcbi8qKlxuICogU2FmZSB2ZXJzaW9uIG9mIHVzZUV4b3RlbCB0aGF0IHJldHVybnMgbnVsbCB3aGVuIG91dHNpZGUgdGhlIHByb3ZpZGVyXG4gKiBVc2UgdGhpcyBpbiBjb21wb25lbnRzIHRoYXQgbWF5IHJlbmRlciBvdXRzaWRlIG9mIEV4b3RlbFByb3ZpZGVyXG4gKi9cbmV4cG9ydCB2YXIgdXNlRXhvdGVsU2FmZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoRXhvdGVsQ29udGV4dCk7XG4gICAgcmV0dXJuIGNvbnRleHQgIT09IG51bGwgJiYgY29udGV4dCAhPT0gdm9pZCAwID8gY29udGV4dCA6IG51bGw7XG59O1xuIiwiZXhwb3J0IHZhciBFWE9URUxfQ09OU1RBTlRTID0ge1xuICAgIE1PREFMX1pfSU5ERVg6IDk5OTk5OSxcbiAgICBNT0RBTF9CQUNLRFJPUF9aX0lOREVYOiA5OTk5OTgsXG4gICAgTU9EQUxfQk9SREVSX1JBRElVUzogJzE2cHgnLFxuICAgIERFQ0xJTkVfVElNRU9VVF9NUzogMjAwMCxcbiAgICBUSU1FUl9JTlRFUlZBTF9NUzogMTAwMCxcbn07XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgQnV0dG9uLCBEaWFsb2csIFJhZGlvR3JvdXAsIFNpbmdsZVNlbGVjdCwgVGV4dGFyZWEsIFR5cG9ncmFwaHksIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZU11dGF0aW9uLCB1c2VRdWVyeUNsaWVudCB9IGZyb20gJ3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uVmVyYm9zZSB9IGZyb20gJy4uLy4uL3V0aWxzL2V4b3RlbC9mb3JtYXR0ZXJzJztcbnZhciBDQUxMX1NUQVRVU19PUFRJT05TID0gW1xuICAgIHsgbGFiZWw6ICdDb25uZWN0ZWQnLCB2YWx1ZTogJ2Nvbm5lY3RlZCcgfSxcbiAgICB7IGxhYmVsOiAnTm90IENvbm5lY3RlZCcsIHZhbHVlOiAnbm90X2Nvbm5lY3RlZCcgfSxcbl07XG52YXIgQ09OTkVDVEVEX0RJU1BPU0lUSU9OUyA9IFtcbiAgICB7IGxhYmVsOiAnSW50ZXJlc3RlZCcsIHZhbHVlOiAnaW50ZXJlc3RlZCcgfSxcbiAgICB7IGxhYmVsOiAnTm90IEludGVyZXN0ZWQnLCB2YWx1ZTogJ25vdF9pbnRlcmVzdGVkJyB9LFxuICAgIHsgbGFiZWw6ICdOb3QgU3VyZScsIHZhbHVlOiAnbm90X3N1cmUnIH0sXG4gICAgeyBsYWJlbDogJ05vdCBFbGlnaWJsZScsIHZhbHVlOiAnbm90X2VsaWdpYmxlJyB9LFxuICAgIHsgbGFiZWw6ICdXcm9uZyBOdW1iZXInLCB2YWx1ZTogJ3dyb25nX251bWJlcicgfSxcbiAgICB7IGxhYmVsOiAnQ2FtcHVzIFZpc2l0JywgdmFsdWU6ICdjYW1wdXNfdmlzaXQnIH0sXG4gICAgeyBsYWJlbDogJ0NhbGwgQmFjaycsIHZhbHVlOiAnY2FsbF9iYWNrJyB9LFxuICAgIHsgbGFiZWw6ICdBZnRlciBKRUUgTWFpbnMnLCB2YWx1ZTogJ2FmdGVyX2plZV9tYWlucycgfSxcbiAgICB7IGxhYmVsOiAnQWZ0ZXIgSVBFJywgdmFsdWU6ICdhZnRlcl9pcGUnIH0sXG4gICAgeyBsYWJlbDogJ0FmdGVyIEVBUENFVCcsIHZhbHVlOiAnYWZ0ZXJfZWFwY2V0JyB9LFxuXTtcbnZhciBOT1RfQ09OTkVDVEVEX0RJU1BPU0lUSU9OUyA9IFtcbiAgICB7IGxhYmVsOiAnTm90IEFuc3dlcmluZycsIHZhbHVlOiAnbm90X2Fuc3dlcmluZycgfSxcbiAgICB7IGxhYmVsOiAnTm90IENvbm5lY3RlZCcsIHZhbHVlOiAnbm90X2Nvbm5lY3RlZCcgfSxcbiAgICB7IGxhYmVsOiAnRmFpbCB0byBDYWxsJywgdmFsdWU6ICdmYWlsX3RvX2NhbGwnIH0sXG4gICAgeyBsYWJlbDogJ1N3aXRjaGVkIE9mZicsIHZhbHVlOiAnc3dpdGNoZWRfb2ZmJyB9LFxuICAgIHsgbGFiZWw6ICdPdXQgb2YgU2VydmljZScsIHZhbHVlOiAnb3V0X29mX3NlcnZpY2UnIH0sXG4gICAgeyBsYWJlbDogJ0ludmFsaWQgTnVtYmVyJywgdmFsdWU6ICdpbnZhbGlkX251bWJlcicgfSxcbiAgICB7IGxhYmVsOiAnTnVtYmVyIEJ1c3knLCB2YWx1ZTogJ251bWJlcl9idXN5JyB9LFxuXTtcbnZhciBDYWxsRGlzcG9zaXRpb25Gb3JtID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGRpc3Bvc2l0aW9uRGF0YSA9IF9hLmRpc3Bvc2l0aW9uRGF0YSwgcHJvc3BlY3RJZCA9IF9hLnByb3NwZWN0SWQsIG9uQ2xvc2UgPSBfYS5vbkNsb3NlLCBvblNhdmUgPSBfYS5vblNhdmUsIGV4aXN0aW5nRGF0YSA9IF9hLmV4aXN0aW5nRGF0YTtcbiAgICB2YXIgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICAgIHZhciBpc0VkaXRNb2RlID0gISEoZXhpc3RpbmdEYXRhID09PSBudWxsIHx8IGV4aXN0aW5nRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhpc3RpbmdEYXRhLmRpc3Bvc2l0aW9uQ2F0ZWdvcnkpO1xuICAgIC8vIFNpbXBsZSBzdGF0ZSBtYW5hZ2VtZW50XG4gICAgdmFyIF9iID0gdXNlU3RhdGUoKGV4aXN0aW5nRGF0YSA9PT0gbnVsbCB8fCBleGlzdGluZ0RhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4aXN0aW5nRGF0YS5jYWxsU3RhdHVzRGlzcG9zaXRpb24pIHx8ICcnKSwgY2FsbFN0YXR1cyA9IF9iWzBdLCBzZXRDYWxsU3RhdHVzID0gX2JbMV07XG4gICAgdmFyIF9jID0gdXNlU3RhdGUoKGV4aXN0aW5nRGF0YSA9PT0gbnVsbCB8fCBleGlzdGluZ0RhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4aXN0aW5nRGF0YS5kaXNwb3NpdGlvbkNhdGVnb3J5KSB8fCAnJyksIGRpc3Bvc2l0aW9uQ2F0ZWdvcnkgPSBfY1swXSwgc2V0RGlzcG9zaXRpb25DYXRlZ29yeSA9IF9jWzFdO1xuICAgIHZhciBfZCA9IHVzZVN0YXRlKChleGlzdGluZ0RhdGEgPT09IG51bGwgfHwgZXhpc3RpbmdEYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleGlzdGluZ0RhdGEuZGlzcG9zaXRpb25Ob3RlcykgfHwgJycpLCByZW1hcmtzID0gX2RbMF0sIHNldFJlbWFya3MgPSBfZFsxXTtcbiAgICB2YXIgX2UgPSB1c2VNdXRhdGlvbihmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gb25TYXZlKGRhdGEpOyB9LCB7XG4gICAgICAgIG9uU3VjY2VzczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoJ2dldE9uZVByb3NwZWN0Jyk7XG4gICAgICAgICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcygnY2FsbEhpc3RvcnknKTtcbiAgICAgICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgICAgfSxcbiAgICB9KSwgbXV0YXRlID0gX2UubXV0YXRlLCBpc0xvYWRpbmcgPSBfZS5pc0xvYWRpbmc7XG4gICAgdmFyIGhhbmRsZUNhbGxTdGF0dXNDaGFuZ2UgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgc2V0Q2FsbFN0YXR1cyh2YWx1ZSk7XG4gICAgICAgIC8vIFJlc2V0IGRpc3Bvc2l0aW9uIHdoZW4gY2FsbCBzdGF0dXMgY2hhbmdlc1xuICAgICAgICBzZXREaXNwb3NpdGlvbkNhdGVnb3J5KCcnKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVEaXNwb3NpdGlvbkNoYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBzZXREaXNwb3NpdGlvbkNhdGVnb3J5KHZhbHVlKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVTdWJtaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghY2FsbFN0YXR1cyB8fCAhZGlzcG9zaXRpb25DYXRlZ29yeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdWJtaXREYXRhID0ge1xuICAgICAgICAgICAgcHJvc3BlY3RJZDogcHJvc3BlY3RJZCxcbiAgICAgICAgICAgIGNhbGxJZDogZGlzcG9zaXRpb25EYXRhLmNhbGxJZCxcbiAgICAgICAgICAgIGNoYW5uZWw6ICdwaG9uZScsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGRpc3Bvc2l0aW9uRGF0YS5jYWxsRGlyZWN0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb246IGRpc3Bvc2l0aW9uRGF0YS5jYWxsRHVyYXRpb24sXG4gICAgICAgICAgICBjYWxsU3RhdHVzRGlzcG9zaXRpb246IGNhbGxTdGF0dXMsXG4gICAgICAgICAgICBkaXNwb3NpdGlvbkNhdGVnb3J5OiBkaXNwb3NpdGlvbkNhdGVnb3J5LFxuICAgICAgICAgICAgcmVtYXJrczogcmVtYXJrcyB8fCAnJyxcbiAgICAgICAgICAgIGNhbGxlck5hbWU6IGRpc3Bvc2l0aW9uRGF0YS5jYWxsZXJOYW1lIHx8ICcnLFxuICAgICAgICAgICAgY2FsbGVyTnVtYmVyOiBkaXNwb3NpdGlvbkRhdGEuY2FsbGVyTnVtYmVyIHx8ICcnLFxuICAgICAgICB9O1xuICAgICAgICBtdXRhdGUoc3VibWl0RGF0YSk7XG4gICAgfTtcbiAgICB2YXIgZGlzcG9zaXRpb25PcHRpb25zID0gY2FsbFN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCdcbiAgICAgICAgPyBDT05ORUNURURfRElTUE9TSVRJT05TXG4gICAgICAgIDogY2FsbFN0YXR1cyA9PT0gJ25vdF9jb25uZWN0ZWQnXG4gICAgICAgICAgICA/IE5PVF9DT05ORUNURURfRElTUE9TSVRJT05TXG4gICAgICAgICAgICA6IFtdO1xuICAgIHJldHVybiAoX2pzeChEaWFsb2csIHsgb3BlbjogdHJ1ZSwgb25DbG9zZTogb25DbG9zZSwgdGl0bGU6IGlzRWRpdE1vZGUgPyAnRWRpdCBEaXNwb3NpdGlvbicgOiAnQ2FsbCBEaXNwb3NpdGlvbicsIG1heFdpZHRoOiBcIm1kXCIsIGNvbnRlbnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGZsZXgtY29sIGdhcC00IHAtNFwiLCBjaGlsZHJlbjogW19qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcIm11dGVkXCIsIGNoaWxkcmVuOiBpc0VkaXRNb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdVcGRhdGUgdGhlIGRpc3Bvc2l0aW9uIGRldGFpbHMnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiQWRkIGRldGFpbHMgYWJvdXQgeW91ciBjYWxsIHdpdGggXCIuY29uY2F0KGRpc3Bvc2l0aW9uRGF0YS5jYWxsZXJOYW1lIHx8ICdVbmtub3duJykgfSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwLTMgYmctZ3JheS0xMDAgcm91bmRlZC1sZ1wiLCBjaGlsZHJlbjogW19qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcInNtYWxsXCIsIGNsYXNzTmFtZTogXCJ0ZXh0LWdyYXktNjAwXCIsIGNoaWxkcmVuOiBcIkNhbGwgRHVyYXRpb25cIiB9KSwgX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwic21hbGxcIiwgY2xhc3NOYW1lOiBcImZvbnQtc2VtaWJvbGRcIiwgY2hpbGRyZW46IGZvcm1hdER1cmF0aW9uVmVyYm9zZShkaXNwb3NpdGlvbkRhdGEuY2FsbER1cmF0aW9uKSB9KV0gfSksIF9qc3goUmFkaW9Hcm91cCwgeyBuYW1lOiBcImNhbGxTdGF0dXNEaXNwb3NpdGlvblwiLCBsYWJlbDogXCJDYWxsIFN0YXR1c1wiLCByZXF1aXJlZDogdHJ1ZSwgb3B0aW9uczogQ0FMTF9TVEFUVVNfT1BUSU9OUywgZGlyZWN0aW9uOiBcInJvd1wiLCB2YWx1ZTogY2FsbFN0YXR1cywgb25DaGFuZ2U6IGhhbmRsZUNhbGxTdGF0dXNDaGFuZ2UgfSksIGNhbGxTdGF0dXMgJiYgKF9qc3goU2luZ2xlU2VsZWN0LCB7IG5hbWU6IFwiZGlzcG9zaXRpb25DYXRlZ29yeVwiLCBsYWJlbDogXCJDYWxsIERpc3Bvc2l0aW9uXCIsIHJlcXVpcmVkOiB0cnVlLCBmdWxsV2lkdGg6IHRydWUsIHBsYWNlaG9sZGVyOiBcIlNlYXJjaCBkaXNwb3NpdGlvbi4uLlwiLCBvcHRpb25zOiBkaXNwb3NpdGlvbk9wdGlvbnMsIHZhbHVlOiBkaXNwb3NpdGlvbkNhdGVnb3J5LCBvbkNoYW5nZTogaGFuZGxlRGlzcG9zaXRpb25DaGFuZ2UgfSwgY2FsbFN0YXR1cykpLCBfanN4KFRleHRhcmVhLCB7IG5hbWU6IFwicmVtYXJrc1wiLCBsYWJlbDogXCJSZW1hcmtzXCIsIHBsYWNlaG9sZGVyOiBcIkFkZCBhbnkgYWRkaXRpb25hbCBub3RlcyBhYm91dCB0aGlzIGNhbGwuLi5cIiwgcm93czogMywgZnVsbFdpZHRoOiB0cnVlLCB2YWx1ZTogcmVtYXJrcywgb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBzZXRSZW1hcmtzKGUudGFyZ2V0LnZhbHVlKTsgfSwgY2xhc3NOYW1lOiBcImJyZWFrLWFsbFwiIH0pLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGp1c3RpZnktc3RhcnQgZ2FwLTIgcHQtNCBib3JkZXItdFwiLCBjaGlsZHJlbjogW19qc3goQnV0dG9uLCB7IG9uQ2xpY2s6IGhhbmRsZVN1Ym1pdCwgZGlzYWJsZWQ6ICFjYWxsU3RhdHVzIHx8ICFkaXNwb3NpdGlvbkNhdGVnb3J5LCBsb2FkaW5nOiBpc0xvYWRpbmcsIGNoaWxkcmVuOiBpc0VkaXRNb2RlID8gJ1VwZGF0ZSBEaXNwb3NpdGlvbicgOiAnU2F2ZSBEaXNwb3NpdGlvbicgfSksIF9qc3goQnV0dG9uLCB7IHZhcmlhbnQ6IFwib3V0bGluZVwiLCBvbkNsaWNrOiBvbkNsb3NlLCBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KV0gfSldIH0pKTsgfSB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2FsbERpc3Bvc2l0aW9uRm9ybTtcbiIsIi8qKlxuICogRm9ybWF0IGR1cmF0aW9uIGluIE1NOlNTIGZvcm1hdCAoZS5nLiwgXCIwMjozMFwiKVxuICovXG5leHBvcnQgdmFyIGZvcm1hdER1cmF0aW9uVGltZXIgPSBmdW5jdGlvbiAoc2Vjb25kcykge1xuICAgIHZhciBtaW5zID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIHZhciBzZWNzID0gc2Vjb25kcyAlIDYwO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChtaW5zLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSwgXCI6XCIpLmNvbmNhdChzZWNzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSk7XG59O1xuLyoqXG4gKiBGb3JtYXQgZHVyYXRpb24gaW4gdmVyYm9zZSBmb3JtYXQgKGUuZy4sIFwiMm0gMzBzXCIpXG4gKi9cbmV4cG9ydCB2YXIgZm9ybWF0RHVyYXRpb25WZXJib3NlID0gZnVuY3Rpb24gKHNlY29uZHMpIHtcbiAgICB2YXIgbWlucyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICB2YXIgc2VjcyA9IHNlY29uZHMgJSA2MDtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQobWlucywgXCJtIFwiKS5jb25jYXQoc2VjcywgXCJzXCIpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cywgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBCdXR0b24sIFR5cG9ncmFwaHkgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IE1pYywgTWljT2ZmLCBQYXVzZSwgUGhvbmUsIFBob25lSW5jb21pbmcsIFBob25lT2ZmLCBQaG9uZU91dGdvaW5nLCBQbGF5LCBWb2x1bWUyLCBWb2x1bWVYLCBYIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBFWE9URUxfQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2V4b3RlbC5jb25zdGFudHMnO1xuaW1wb3J0IHsgdXNlRXhvdGVsIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL0V4b3RlbFByb3ZpZGVyJztcbmltcG9ydCB7IGNhbmNlbENhbGwsIHNhdmVDYWxsRGlzcG9zaXRpb24gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leG90ZWwvYXBpJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uVGltZXIgfSBmcm9tICcuLi8uLi91dGlscy9leG90ZWwvZm9ybWF0dGVycyc7XG5pbXBvcnQgQ2FsbERpc3Bvc2l0aW9uRm9ybSBmcm9tICcuL0NhbGxEaXNwb3NpdGlvbkZvcm0nO1xuLy8gQ1NTIGZvciBwdWxzaW5nIGFuaW1hdGlvblxudmFyIHB1bHNlQW5pbWF0aW9uU3R5bGUgPSBcIlxcbkBrZXlmcmFtZXMgcHVsc2UtcmluZyB7XFxuICAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgIG9wYWNpdHk6IDE7XFxuICB9XFxuICA1MCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMTUpO1xcbiAgICBvcGFjaXR5OiAwLjc7XFxuICB9XFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgb3BhY2l0eTogMTtcXG4gIH1cXG59XFxuXFxuQGtleWZyYW1lcyBwdWxzZS1kb3Qge1xcbiAgMCUsIDEwMCUge1xcbiAgICBib3gtc2hhZG93OiAwIDAgMCAwIHJnYmEoMjQ5LCAxMTUsIDIyLCAwLjcpO1xcbiAgfVxcbiAgNTAlIHtcXG4gICAgYm94LXNoYWRvdzogMCAwIDAgMjBweCByZ2JhKDI0OSwgMTE1LCAyMiwgMCk7XFxuICB9XFxufVxcblxcbi5hbmltYXRlLXB1bHNlLXJpbmcge1xcbiAgYW5pbWF0aW9uOiBwdWxzZS1yaW5nIDEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XFxufVxcblxcbi5hbmltYXRlLXB1bHNlLWRvdCB7XFxuICBhbmltYXRpb246IHB1bHNlLWRvdCAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xcbn1cXG5cIjtcbnZhciBFeG90ZWxQaG9uZSA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsIHByb3NwZWN0SWQgPSBfYS5wcm9zcGVjdElkLCBwcm9zcGVjdE5hbWUgPSBfYS5wcm9zcGVjdE5hbWUsIHByb3NwZWN0TnVtYmVyID0gX2EucHJvc3BlY3ROdW1iZXIsIG9uU2F2ZURpc3Bvc2l0aW9uID0gX2Eub25TYXZlRGlzcG9zaXRpb247XG4gICAgdmFyIF9iID0gdXNlRXhvdGVsKCksIGNhbGxTdGF0ZSA9IF9iLmNhbGxTdGF0ZSwgZGlzcG9zaXRpb25EYXRhID0gX2IuZGlzcG9zaXRpb25EYXRhLCBhY2NlcHRDYWxsID0gX2IuYWNjZXB0Q2FsbCwgaGFuZ3VwQ2FsbCA9IF9iLmhhbmd1cENhbGwsIHJlamVjdENhbGwgPSBfYi5yZWplY3RDYWxsLCB0b2dnbGVIb2xkID0gX2IudG9nZ2xlSG9sZCwgdG9nZ2xlTXV0ZSA9IF9iLnRvZ2dsZU11dGUsIHRvZ2dsZVNwZWFrZXIgPSBfYi50b2dnbGVTcGVha2VyLCBjbGVhckRpc3Bvc2l0aW9uID0gX2IuY2xlYXJEaXNwb3NpdGlvbjtcbiAgICB2YXIgX2MgPSB1c2VTdGF0ZShmYWxzZSksIGlzQWNjZXB0aW5nID0gX2NbMF0sIHNldElzQWNjZXB0aW5nID0gX2NbMV07XG4gICAgdmFyIF9kID0gdXNlU3RhdGUoZmFsc2UpLCBpc0RlY2xpbmluZyA9IF9kWzBdLCBzZXRJc0RlY2xpbmluZyA9IF9kWzFdO1xuICAgIHZhciBkZWNsaW5lVGltZW91dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgICAvLyBJbmplY3QgYW5pbWF0aW9uIHN0eWxlc1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdHlsZUlkID0gJ2V4b3RlbC1waG9uZS1hbmltYXRpb25zJztcbiAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdHlsZUlkKSkge1xuICAgICAgICAgICAgdmFyIHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgc3R5bGVFbC5pZCA9IHN0eWxlSWQ7XG4gICAgICAgICAgICBzdHlsZUVsLnRleHRDb250ZW50ID0gcHVsc2VBbmltYXRpb25TdHlsZTtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgdmFyIHBoYXNlID0gY2FsbFN0YXRlLnBoYXNlLCBjYWxsRGF0YSA9IGNhbGxTdGF0ZS5jYWxsRGF0YSwgaXNPbkhvbGQgPSBjYWxsU3RhdGUuaXNPbkhvbGQsIGlzTXV0ZWQgPSBjYWxsU3RhdGUuaXNNdXRlZCwgaXNTcGVha2VyT2ZmID0gY2FsbFN0YXRlLmlzU3BlYWtlck9mZiwgY2FsbERpcmVjdGlvbiA9IGNhbGxTdGF0ZS5jYWxsRGlyZWN0aW9uLCBjYWxsRHVyYXRpb24gPSBjYWxsU3RhdGUuY2FsbER1cmF0aW9uLCBzZGtDYWxsZXJOYW1lID0gY2FsbFN0YXRlLmNhbGxlck5hbWUsIHNka0NhbGxlck51bWJlciA9IGNhbGxTdGF0ZS5jYWxsZXJOdW1iZXIsIGNhbGxBY3Rpdml0eUlkID0gY2FsbFN0YXRlLmNhbGxBY3Rpdml0eUlkLCBleG90ZWxDYWxsU2lkID0gY2FsbFN0YXRlLmV4b3RlbENhbGxTaWQsIHByb3NwZWN0VW5pcXVlSWQgPSBjYWxsU3RhdGUucHJvc3BlY3RVbmlxdWVJZDtcbiAgICAvLyBVc2UgcHJvcHMgKGZyb20gUHJvc3BlY3QgdmlldykgYXMgcHJpbWFyeSwgZmFsbCBiYWNrIHRvIFNESyB2YWx1ZXMgKGZvciBpbmNvbWluZyBjYWxscylcbiAgICB2YXIgZGlzcGxheU5hbWUgPSBwcm9zcGVjdE5hbWUgfHwgc2RrQ2FsbGVyTmFtZSB8fCAnVW5rbm93bic7XG4gICAgdmFyIGRpc3BsYXlOdW1iZXIgPSBwcm9zcGVjdE51bWJlciB8fCBzZGtDYWxsZXJOdW1iZXIgfHwgJ05vIG51bWJlcic7XG4gICAgdmFyIGhhbmRsZUFjY2VwdENhbGwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZXJyb3JfMTtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNBY2NlcHRpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgNCwgNV0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBhY2NlcHRDYWxsKCldO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjY2VwdCBjYWxsIGVycm9yOicsIGVycm9yXzEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHNldElzQWNjZXB0aW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7IH07XG4gICAgdmFyIGhhbmRsZURlY2xpbmVDYWxsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbGxTaWRGb3JBcGksIHJlYXNvbiwgZXJyb3JfMjtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWNsaW5pbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSByZWplY3RDYWxsIGZvciBpbmNvbWluZy9yZWFkeV90b19jYWxsIChiZWZvcmUgYWNjZXB0aW5nKVxuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgaGFuZ3VwQ2FsbCBmb3IgY29ubmVjdGVkL2NhbGxpbmcgKGFmdGVyIGFjY2VwdGluZylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBoYXNlID09PSAnaW5jb21pbmcnIHx8IHBoYXNlID09PSAncmVhZHlfdG9fY2FsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdENhbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmd1cENhbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYWxsU2lkRm9yQXBpID0gZXhvdGVsQ2FsbFNpZCB8fCBjYWxsQWN0aXZpdHlJZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsU2lkRm9yQXBpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uID0gcGhhc2UgPT09ICdjb25uZWN0ZWQnID8gJ2VuZGVkJyA6ICdkZWNsaW5lZCc7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGNhbmNlbENhbGwoeyBjYWxsU2lkOiBjYWxsU2lkRm9yQXBpLCByZWFzb246IHJlYXNvbiB9KV07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JfMiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNhbmNlbCBjYWxsIGluIGJhY2tlbmQ6JywgZXJyb3JfMik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhbGwgd2Fzbid0IGNvbm5lY3RlZCB5ZXQsIFNESyBtaWdodCBub3QgZmlyZSAnY2FsbEVuZGVkJyBldmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYSB0aW1lb3V0IHRvIGZvcmNlIHJlc2V0IHRoZSBkZWNsaW5pbmcgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogRG9uJ3QgY2xlYXIgZGlzcG9zaXRpb24gaGVyZSAtIGxldCB0aGUgU0RLJ3MgY2FsbEVuZGVkIGV2ZW50IGhhbmRsZSBpdFxuICAgICAgICAgICAgICAgICAgICBkZWNsaW5lVGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlY2xpbmluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIEVYT1RFTF9DT05TVEFOVFMuREVDTElORV9USU1FT1VUX01TKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTsgfTtcbiAgICAvLyBDbGVhciBkZWNsaW5lIHRpbWVvdXQgd2hlbiBwaGFzZSBjaGFuZ2VzIChtZWFuaW5nIFNESyBoYW5kbGVkIGl0KVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChwaGFzZSA9PT0gJ2lkbGUnIHx8IHBoYXNlID09PSAnZW5kZWQnKSB7XG4gICAgICAgICAgICBpZiAoZGVjbGluZVRpbWVvdXRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWNsaW5lVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICBkZWNsaW5lVGltZW91dFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldElzRGVjbGluaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIC8vIE5vdGU6IERvbid0IGF1dG8tY2xlYXIgZGlzcG9zaXRpb24gaGVyZSAtIGxldCB1c2VyIHN1Ym1pdCBvciBjbG9zZSB0aGUgZm9ybSBtYW51YWxseVxuICAgICAgICB9XG4gICAgfSwgW3BoYXNlXSk7XG4gICAgLy8gSGFuZGxlIHNhdmluZyBkaXNwb3NpdGlvbiB0byBiYWNrZW5kXG4gICAgdmFyIGhhbmRsZVNhdmVEaXNwb3NpdGlvbiA9IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAvLyBJZiBjdXN0b20gaGFuZGxlciBpcyBwcm92aWRlZCwgdXNlIGl0XG4gICAgICAgICAgICBpZiAob25TYXZlRGlzcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgb25TYXZlRGlzcG9zaXRpb24oZGF0YSldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVXNlIHRoZSBjYWxsU3RhdHVzRGlzcG9zaXRpb24gZnJvbSB0aGUgZm9ybSAodXNlciBzZWxlY3RlZClcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBzYXZlQ2FsbERpc3Bvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbElkOiBkYXRhLmNhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvc3BlY3RJZDogZGF0YS5wcm9zcGVjdElkIHx8IHByb3NwZWN0SWQgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxTdGF0dXNEaXNwb3NpdGlvbjogZGF0YS5jYWxsU3RhdHVzRGlzcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uQ2F0ZWdvcnk6IGRhdGEuZGlzcG9zaXRpb25DYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb25Ob3RlczogZGF0YS5yZW1hcmtzIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgIH0pO1xuICAgIH0pOyB9O1xuICAgIC8vIENsZWFudXAgdGltZW91dCBvbiB1bm1vdW50XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChkZWNsaW5lVGltZW91dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlY2xpbmVUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sIFtdKTtcbiAgICAvLyBTaG93IGRpc3Bvc2l0aW9uIGZvcm0gYWZ0ZXIgY2FsbCBlbmRzXG4gICAgaWYgKGRpc3Bvc2l0aW9uRGF0YSkge1xuICAgICAgICAvLyBVc2UgcHJvc3BlY3QgbmFtZSBmcm9tIHByb3BzLCBvciBmcm9tIGRpc3Bvc2l0aW9uRGF0YSAocHJlc2VydmVkIGZyb20gY2FsbCksIG9yIGZhbGxiYWNrXG4gICAgICAgIHZhciBmaW5hbENhbGxlck5hbWUgPSBwcm9zcGVjdE5hbWUgfHwgZGlzcG9zaXRpb25EYXRhLmNhbGxlck5hbWUgfHwgc2RrQ2FsbGVyTmFtZSB8fCAnVW5rbm93bic7XG4gICAgICAgIC8vIE92ZXJyaWRlIGRpc3Bvc2l0aW9uIGRhdGEgd2l0aCBwcm9zcGVjdCBkZXRhaWxzXG4gICAgICAgIHZhciBlbnJpY2hlZERpc3Bvc2l0aW9uRGF0YSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBkaXNwb3NpdGlvbkRhdGEpLCB7IGNhbGxlck5hbWU6IGZpbmFsQ2FsbGVyTmFtZSwgY2FsbGVyTnVtYmVyOiBkaXNwbGF5TnVtYmVyIH0pO1xuICAgICAgICByZXR1cm4gKF9qc3goQ2FsbERpc3Bvc2l0aW9uRm9ybSwgeyBkaXNwb3NpdGlvbkRhdGE6IGVucmljaGVkRGlzcG9zaXRpb25EYXRhLCBwcm9zcGVjdElkOiBwcm9zcGVjdElkLCBvbkNsb3NlOiBjbGVhckRpc3Bvc2l0aW9uLCBvblNhdmU6IGhhbmRsZVNhdmVEaXNwb3NpdGlvbiwgZXhpc3RpbmdEYXRhOiB1bmRlZmluZWQgfSkpO1xuICAgIH1cbiAgICAvLyBEb24ndCBzaG93IGFueXRoaW5nIGlmIGlkbGUgb3IgZW5kZWRcbiAgICBpZiAocGhhc2UgPT09ICdpZGxlJyB8fCBwaGFzZSA9PT0gJ2VuZGVkJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGlzT3V0Ym91bmQgPSBjYWxsRGlyZWN0aW9uID09PSAnb3V0Ym91bmQnO1xuICAgIHZhciBpc0luYm91bmQgPSBjYWxsRGlyZWN0aW9uID09PSAnaW5ib3VuZCc7XG4gICAgLy8gR2V0IGF2YXRhciBjb2xvciBiYXNlZCBvbiBjYWxsIGRpcmVjdGlvblxuICAgIHZhciBhdmF0YXJCZ0NvbG9yID0gcGhhc2UgPT09ICdjb25uZWN0ZWQnXG4gICAgICAgID8gJ2JnLWdyZWVuLTUwMCdcbiAgICAgICAgOiBpc091dGJvdW5kXG4gICAgICAgICAgICA/ICdiZy1ibHVlLTUwMCdcbiAgICAgICAgICAgIDogJ2JnLW9yYW5nZS01MDAnO1xuICAgIC8vIEdldCBzdGF0dXMgdGV4dFxuICAgIHZhciBnZXRTdGF0dXNUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzd2l0Y2ggKHBoYXNlKSB7XG4gICAgICAgICAgICBjYXNlICdyZWFkeV90b19jYWxsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1JlYWR5IHRvIGNhbGwuLi4nO1xuICAgICAgICAgICAgY2FzZSAnY2FsbGluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdDYWxsaW5nLi4uJztcbiAgICAgICAgICAgIGNhc2UgJ2luY29taW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0luY29taW5nIGNhbGwuLi4nO1xuICAgICAgICAgICAgY2FzZSAnY29ubmVjdGVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gV2lsbCBzaG93IHRpbWVyIGluc3RlYWRcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEdldCBjb25uZWN0aW5nIHRleHQgZm9yIGNhbGxpbmcgc3RhdGVcbiAgICB2YXIgZ2V0Q29ubmVjdGluZ1RleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChwaGFzZSA9PT0gJ2NhbGxpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJDb25uZWN0aW5nIHRvIFwiLmNvbmNhdChkaXNwbGF5TmFtZSwgXCIuLi5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICB2YXIgbW9kYWxDb250ZW50ID0gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZml4ZWQgaW5zZXQtMCBiZy1ibGFjay81MFwiLCBzdHlsZTogeyB6SW5kZXg6IEVYT1RFTF9DT05TVEFOVFMuTU9EQUxfQkFDS0RST1BfWl9JTkRFWCB9LCBvbkNsaWNrOiBoYW5kbGVEZWNsaW5lQ2FsbCB9KSwgX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmaXhlZCBpbnNldC0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtNCBcIi5jb25jYXQoY2xhc3NOYW1lKSwgc3R5bGU6IHsgekluZGV4OiBFWE9URUxfQ09OU1RBTlRTLk1PREFMX1pfSU5ERVggfSwgY2hpbGRyZW46IF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInJlbGF0aXZlIHctZnVsbCBtYXgtdy1tZCBwLTYgYmctd2hpdGUgc2hhZG93LTJ4bFwiLCBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBFWE9URUxfQ09OU1RBTlRTLk1PREFMX0JPUkRFUl9SQURJVVMsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgI2U1ZTdlYicsXG4gICAgICAgICAgICAgICAgICAgIH0sIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpOyB9LCBjaGlsZHJlbjogW19qc3goXCJidXR0b25cIiwgeyBvbkNsaWNrOiBoYW5kbGVEZWNsaW5lQ2FsbCwgY2xhc3NOYW1lOiBcImFic29sdXRlIHAtMSB0cmFuc2l0aW9uLWNvbG9ycyByb3VuZGVkLWZ1bGwgdG9wLTQgcmlnaHQtNCBob3ZlcjpiZy1ncmF5LTEwMFwiLCBjaGlsZHJlbjogX2pzeChYLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS01MDBcIiB9KSB9KSwgX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGp1c3RpZnktY2VudGVyIG1iLTZcIiwgY2hpbGRyZW46IF9qc3hzKFwic3BhblwiLCB7IGNsYXNzTmFtZTogXCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSBweC0zIHB5LTEgcm91bmRlZC1mdWxsIHRleHQtc20gZm9udC1tZWRpdW0gYm9yZGVyIFwiLmNvbmNhdChpc091dGJvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICd0ZXh0LWJsdWUtNjAwIGJvcmRlci1ibHVlLTIwMCBiZy1ibHVlLTUwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGV4dC1ncmVlbi02MDAgYm9yZGVyLWdyZWVuLTIwMCBiZy1ncmVlbi01MCcpLCBjaGlsZHJlbjogW2lzT3V0Ym91bmQgPyAoX2pzeChQaG9uZU91dGdvaW5nLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSkpIDogKF9qc3goUGhvbmVJbmNvbWluZywgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pKSwgaXNPdXRib3VuZCA/ICdPdXRnb2luZyBDYWxsJyA6ICdJbmNvbWluZyBDYWxsJ10gfSkgfSksIF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBqdXN0aWZ5LWNlbnRlciBtYi00XCIsIGNoaWxkcmVuOiBfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInctMjQgaC0yNCByb3VuZGVkLWZ1bGwgXCIuY29uY2F0KGF2YXRhckJnQ29sb3IsIFwiIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIFwiKS5jb25jYXQocGhhc2UgPT09ICdpbmNvbWluZycgfHwgcGhhc2UgPT09ICdyZWFkeV90b19jYWxsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYW5pbWF0ZS1wdWxzZS1yaW5nIGFuaW1hdGUtcHVsc2UtZG90J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJyksIGNoaWxkcmVuOiBpc0luYm91bmQgJiYgcGhhc2UgPT09ICdpbmNvbWluZycgPyAoX2pzeChQaG9uZUluY29taW5nLCB7IGNsYXNzTmFtZTogXCJ3LTEwIGgtMTAgdGV4dC13aGl0ZVwiIH0pKSA6IChfanN4KFBob25lLCB7IGNsYXNzTmFtZTogXCJ3LTEwIGgtMTAgdGV4dC13aGl0ZVwiIH0pKSB9KSB9KSwgX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwibWItNCB0ZXh0LWNlbnRlclwiLCBjaGlsZHJlbjogW19qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcImgzXCIsIGNsYXNzTmFtZTogXCJ0ZXh0LXhsIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMFwiLCBjaGlsZHJlbjogZGlzcGxheU5hbWUgfSksIHByb3NwZWN0VW5pcXVlSWQgJiYgKF9qc3hzKFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJzbWFsbFwiLCBjbGFzc05hbWU6IFwiZm9udC1tZWRpdW0gdGV4dC1ibHVlLTYwMFwiLCBjaGlsZHJlbjogW1wiSUQ6IFwiLCBwcm9zcGVjdFVuaXF1ZUlkXSB9KSksIF9qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcIm11dGVkXCIsIGNoaWxkcmVuOiBkaXNwbGF5TnVtYmVyIH0pXSB9KSwgX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJtYi02IHRleHQtY2VudGVyXCIsIGNoaWxkcmVuOiBwaGFzZSA9PT0gJ2Nvbm5lY3RlZCcgPyAoX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwicFwiLCBjbGFzc05hbWU6IFwidGV4dC1sZyBmb250LW1lZGl1bSB0ZXh0LWdyZWVuLTUwMFwiLCBjaGlsZHJlbjogZm9ybWF0RHVyYXRpb25UaW1lcihjYWxsRHVyYXRpb24pIH0pKSA6IChfanN4KFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJtdXRlZFwiLCBjaGlsZHJlbjogZ2V0U3RhdHVzVGV4dCgpIH0pKSB9KSwgcGhhc2UgPT09ICdjb25uZWN0ZWQnICYmIChfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGp1c3RpZnktY2VudGVyIGdhcC02IG1iLTZcIiwgY2hpbGRyZW46IFtfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LWNlbnRlclwiLCBjaGlsZHJlbjogW19qc3goXCJidXR0b25cIiwgeyBvbkNsaWNrOiB0b2dnbGVNdXRlLCBjbGFzc05hbWU6IFwidy0xMiBoLTEyIHJvdW5kZWQtZnVsbCBib3JkZXItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0cmFuc2l0aW9uLWNvbG9ycyBcIi5jb25jYXQoaXNNdXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYmctZ3JheS0yMDAgYm9yZGVyLWdyYXktMzAwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnYmctd2hpdGUgYm9yZGVyLWdyYXktMjAwIGhvdmVyOmJnLWdyYXktNTAnKSwgY2hpbGRyZW46IGlzTXV0ZWQgPyAoX2pzeChNaWNPZmYsIHsgY2xhc3NOYW1lOiBcInctNSBoLTUgdGV4dC1ncmF5LTYwMFwiIH0pKSA6IChfanN4KE1pYywgeyBjbGFzc05hbWU6IFwidy01IGgtNSB0ZXh0LWdyYXktNjAwXCIgfSkpIH0pLCBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJtdC0xIHRleHQteHMgdGV4dC1ncmF5LTUwMFwiLCBjaGlsZHJlbjogaXNNdXRlZCA/ICdVbm11dGUnIDogJ011dGUnIH0pXSB9KSwgX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwidGV4dC1jZW50ZXJcIiwgY2hpbGRyZW46IFtfanN4KFwiYnV0dG9uXCIsIHsgb25DbGljazogdG9nZ2xlSG9sZCwgY2xhc3NOYW1lOiBcInctMTIgaC0xMiByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMgXCIuY29uY2F0KGlzT25Ib2xkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdiZy1ncmF5LTIwMCBib3JkZXItZ3JheS0zMDAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdiZy13aGl0ZSBib3JkZXItZ3JheS0yMDAgaG92ZXI6YmctZ3JheS01MCcpLCBjaGlsZHJlbjogaXNPbkhvbGQgPyAoX2pzeChQbGF5LCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS02MDBcIiB9KSkgOiAoX2pzeChQYXVzZSwgeyBjbGFzc05hbWU6IFwidy01IGgtNSB0ZXh0LWdyYXktNjAwXCIgfSkpIH0pLCBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJtdC0xIHRleHQteHMgdGV4dC1ncmF5LTUwMFwiLCBjaGlsZHJlbjogaXNPbkhvbGQgPyAnUmVzdW1lJyA6ICdIb2xkJyB9KV0gfSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInRleHQtY2VudGVyXCIsIGNoaWxkcmVuOiBbX2pzeChcImJ1dHRvblwiLCB7IG9uQ2xpY2s6IHRvZ2dsZVNwZWFrZXIsIGNsYXNzTmFtZTogXCJ3LTEyIGgtMTIgcm91bmRlZC1mdWxsIGJvcmRlci0yIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRyYW5zaXRpb24tY29sb3JzIFwiLmNvbmNhdChpc1NwZWFrZXJPZmZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JnLWdyYXktMjAwIGJvcmRlci1ncmF5LTMwMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JnLXdoaXRlIGJvcmRlci1ncmF5LTIwMCBob3ZlcjpiZy1ncmF5LTUwJyksIGNoaWxkcmVuOiBpc1NwZWFrZXJPZmYgPyAoX2pzeChWb2x1bWVYLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS02MDBcIiB9KSkgOiAoX2pzeChWb2x1bWUyLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS02MDBcIiB9KSkgfSksIF9qc3goXCJwXCIsIHsgY2xhc3NOYW1lOiBcIm10LTEgdGV4dC14cyB0ZXh0LWdyYXktNTAwXCIsIGNoaWxkcmVuOiBpc1NwZWFrZXJPZmYgPyAnU3BlYWtlciBPbicgOiAnU3BlYWtlciBPZmYnIH0pXSB9KV0gfSkpLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGp1c3RpZnktY2VudGVyIGdhcC00XCIsIGNoaWxkcmVuOiBbKHBoYXNlID09PSAncmVhZHlfdG9fY2FsbCcgfHwgcGhhc2UgPT09ICdpbmNvbWluZycpICYmIChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4cyhCdXR0b24sIHsgdmFyaWFudDogXCJkZXN0cnVjdGl2ZVwiLCBvbkNsaWNrOiBoYW5kbGVEZWNsaW5lQ2FsbCwgZGlzYWJsZWQ6IGlzRGVjbGluaW5nLCBjbGFzc05hbWU6IFwiZ2FwLTIgcHgtNlwiLCBjaGlsZHJlbjogW19qc3goUGhvbmVPZmYsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSwgaXNEZWNsaW5pbmcgPyAnRGVjbGluaW5nLi4uJyA6ICdEZWNsaW5lJ10gfSksIF9qc3hzKEJ1dHRvbiwgeyB2YXJpYW50OiBcImRlZmF1bHRcIiwgb25DbGljazogaGFuZGxlQWNjZXB0Q2FsbCwgZGlzYWJsZWQ6IGlzQWNjZXB0aW5nIHx8IGlzRGVjbGluaW5nLCBzdHlsZTogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjMjJjNTVlJyB9LCBjbGFzc05hbWU6IFwiZ2FwLTIgcHgtNiBob3ZlcjpiZy1ncmVlbi02MDBcIiwgY2hpbGRyZW46IFtfanN4KFBob25lLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSksIFwiQWNjZXB0XCJdIH0pXSB9KSksIHBoYXNlID09PSAnY2FsbGluZycgJiYgKF9qc3hzKEJ1dHRvbiwgeyB2YXJpYW50OiBcImRlc3RydWN0aXZlXCIsIG9uQ2xpY2s6IGhhbmRsZURlY2xpbmVDYWxsLCBkaXNhYmxlZDogaXNEZWNsaW5pbmcsIGNsYXNzTmFtZTogXCJnYXAtMiBweC02XCIsIGNoaWxkcmVuOiBbX2pzeChQaG9uZU9mZiwgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pLCBpc0RlY2xpbmluZyA/ICdFbmRpbmcuLi4nIDogJ0VuZCBDYWxsJ10gfSkpLCBwaGFzZSA9PT0gJ2Nvbm5lY3RlZCcgJiYgKF9qc3hzKEJ1dHRvbiwgeyB2YXJpYW50OiBcImRlc3RydWN0aXZlXCIsIG9uQ2xpY2s6IGhhbmRsZURlY2xpbmVDYWxsLCBkaXNhYmxlZDogaXNEZWNsaW5pbmcsIGNsYXNzTmFtZTogXCJnYXAtMiBweC04XCIsIGNoaWxkcmVuOiBbX2pzeChQaG9uZU9mZiwgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pLCBpc0RlY2xpbmluZyA/ICdFbmRpbmcuLi4nIDogJ0VuZCBDYWxsJ10gfSkpXSB9KSwgZ2V0Q29ubmVjdGluZ1RleHQoKSAmJiAoX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwic21hbGxcIiwgY2xhc3NOYW1lOiBcIm10LTQgdGV4dC1jZW50ZXIgdGV4dC1ncmF5LTUwMFwiLCBjaGlsZHJlbjogZ2V0Q29ubmVjdGluZ1RleHQoKSB9KSldIH0pIH0pXSB9KSk7XG4gICAgLy8gVXNlIHBvcnRhbCB0byByZW5kZXIgYXQgZG9jdW1lbnQgYm9keSBsZXZlbCB0byBlc2NhcGUgYW55IHBhcmVudCBzdGFja2luZyBjb250ZXh0c1xuICAgIHJldHVybiBjcmVhdGVQb3J0YWwobW9kYWxDb250ZW50LCBkb2N1bWVudC5ib2R5KTtcbn07XG5leHBvcnQgZGVmYXVsdCBFeG90ZWxQaG9uZTtcbiIsImltcG9ydCB7IHN5bmNTY3J5cHQgfSBmcm9tICdzY3J5cHQtanMnO1xudmFyIENyeXB0b1NlcnZpY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ3J5cHRvU2VydmljZSgpIHtcbiAgICAgICAgdGhpcy5hbGdvcml0aG0gPSAnYWVzLTI1Ni1jYmMnO1xuICAgICAgICB0aGlzLnNlY3JldEtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gTGF6eSBpbml0aWFsaXphdGlvbiAtIGRvbid0IHJ1biBoZWF2eSBjcnlwdG8gb3BlcmF0aW9ucyBhdCBtb2R1bGUgbG9hZCB0aW1lXG4gICAgfVxuICAgIENyeXB0b1NlcnZpY2UucHJvdG90eXBlLmVuc3VyZUluaXRpYWxpemVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBrZXkgPSAnNDMxZmVmOTktNDdkYy00ZDJhLTkxNzUtMmU4ZjE5YjIwMjI1JztcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBTYW1lIGFzIGJhY2tlbmQ6IGNyeXB0by5zY3J5cHRTeW5jKGtleSwgJ3NhbHQnLCAzMilcbiAgICAgICAgICAgICAgICAvLyBzY3J5cHQtanMgd2l0aCBOPTE2Mzg0LCByPTgsIHA9MSBtYXRjaGVzIE5vZGUuanMgZGVmYXVsdHNcbiAgICAgICAgICAgICAgICB2YXIga2V5QnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGtleSk7XG4gICAgICAgICAgICAgICAgdmFyIHNhbHRCdWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoJ3NhbHQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlY3JldEtleSA9IHN5bmNTY3J5cHQoa2V5QnVmZmVyLCBzYWx0QnVmZmVyLCAxNjM4NCwgOCwgMSwgMzIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcnlwdG9TZXJ2aWNlIGluaXRpYWxpemF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsgLy8gUHJldmVudCByZXBlYXRlZCBhdHRlbXB0c1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDcnlwdG9TZXJ2aWNlLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIUNyeXB0b1NlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIENyeXB0b1NlcnZpY2UuaW5zdGFuY2UgPSBuZXcgQ3J5cHRvU2VydmljZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDcnlwdG9TZXJ2aWNlLmluc3RhbmNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGVjcnlwdCBkYXRhIHVzaW5nIEFFUy0yNTYtQ0JDIChzYW1lIGFzIGJhY2tlbmQpXG4gICAgICogRm9ybWF0OiBcIml2X2hleDplbmNyeXB0ZWRfaGV4XCJcbiAgICAgKi9cbiAgICBDcnlwdG9TZXJ2aWNlLnByb3RvdHlwZS5kZWNyeXB0RGF0YSA9IGZ1bmN0aW9uIChlbmNyeXB0ZWREYXRhKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgaWYgKCFlbmNyeXB0ZWREYXRhIHx8ICF0aGlzLnNlY3JldEtleSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTWlzc2luZyBlbmNyeXB0ZWQgZGF0YSBvciBzZWNyZXQga2V5Jyk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVuY3J5cHRlZERhdGEuc3BsaXQoJzonKSwgaXZIZXggPSBfYVswXSwgZW5jcnlwdGVkID0gX2FbMV07XG4gICAgICAgICAgICBpZiAoIWl2SGV4IHx8ICFlbmNyeXB0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGVuY3J5cHRlZCBkYXRhIGZvcm1hdCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVzZSByZXF1aXJlIGZvciBjcnlwdG8gdG8gYXZvaWQgYnVuZGxlciBpc3N1ZXMgd2l0aCB0b3AtbGV2ZWwgaW1wb3J0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICAgICAgICAgIHZhciBjcnlwdG9fMSA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICAgICAgICAgICAgdmFyIGl2ID0gQnVmZmVyLmZyb20oaXZIZXgsICdoZXgnKTtcbiAgICAgICAgICAgIHZhciBkZWNpcGhlciA9IGNyeXB0b18xLmNyZWF0ZURlY2lwaGVyaXYodGhpcy5hbGdvcml0aG0sIEJ1ZmZlci5mcm9tKHRoaXMuc2VjcmV0S2V5KSwgaXYpO1xuICAgICAgICAgICAgdmFyIGRlY3J5cHRlZCA9IGRlY2lwaGVyLnVwZGF0ZShlbmNyeXB0ZWQsICdoZXgnLCAndXRmOCcpO1xuICAgICAgICAgICAgZGVjcnlwdGVkICs9IGRlY2lwaGVyLmZpbmFsKCd1dGY4Jyk7XG4gICAgICAgICAgICByZXR1cm4gZGVjcnlwdGVkO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRGVjcnlwdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYXNrIG1vYmlsZSBudW1iZXIgZm9yIGRpc3BsYXkgKGZpcnN0IDIgYW5kIGxhc3QgMiBvZiBhY3R1YWwgbnVtYmVyIHZpc2libGUpXG4gICAgICogSGFuZGxlcyBjb3VudHJ5IGNvZGUgcHJlZml4ICgrOTEpXG4gICAgICogZS5nLiwgXCIrOTE5ODc2NTQzMjEwXCIgLT4gXCIrOTE5OCoqKioqKjEwXCJcbiAgICAgKiBlLmcuLCBcIjk4NzY1NDMyMTBcIiAtPiBcIjk4KioqKioqMTBcIlxuICAgICAqL1xuICAgIENyeXB0b1NlcnZpY2UucHJvdG90eXBlLm1hc2tNb2JpbGUgPSBmdW5jdGlvbiAobW9iaWxlKSB7XG4gICAgICAgIGlmICghbW9iaWxlIHx8IG1vYmlsZS5sZW5ndGggPCA0KVxuICAgICAgICAgICAgcmV0dXJuICcqKioqKioqKioqJztcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGNvdW50cnkgY29kZSBwcmVmaXhcbiAgICAgICAgdmFyIHByZWZpeCA9ICcnO1xuICAgICAgICB2YXIgbnVtYmVyID0gbW9iaWxlO1xuICAgICAgICBpZiAobW9iaWxlLnN0YXJ0c1dpdGgoJys5MScpKSB7XG4gICAgICAgICAgICBwcmVmaXggPSAnKzkxJztcbiAgICAgICAgICAgIG51bWJlciA9IG1vYmlsZS5zdWJzdHJpbmcoMyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9iaWxlLnN0YXJ0c1dpdGgoJzkxJykgJiYgbW9iaWxlLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICBwcmVmaXggPSAnOTEnO1xuICAgICAgICAgICAgbnVtYmVyID0gbW9iaWxlLnN1YnN0cmluZygyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2xlYW5lZCA9IG51bWJlci5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICBpZiAoY2xlYW5lZC5sZW5ndGggPCA0KVxuICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArICcqKioqKioqKioqJztcbiAgICAgICAgcmV0dXJuIChwcmVmaXggK1xuICAgICAgICAgICAgY2xlYW5lZC5zdWJzdHJpbmcoMCwgMikgK1xuICAgICAgICAgICAgJyonLnJlcGVhdChjbGVhbmVkLmxlbmd0aCAtIDQpICtcbiAgICAgICAgICAgIGNsZWFuZWQuc3Vic3RyaW5nKGNsZWFuZWQubGVuZ3RoIC0gMikpO1xuICAgIH07XG4gICAgcmV0dXJuIENyeXB0b1NlcnZpY2U7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQ3J5cHRvU2VydmljZS5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBQaG9uZSwgTWljT2ZmIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IHVzZUV4b3RlbFNhZmUgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvRXhvdGVsUHJvdmlkZXInO1xuaW1wb3J0IEV4b3RlbFNlcnZpY2UgZnJvbSAnLi4vLi4vc2VydmljZXMvZXhvdGVsL0V4b3RlbFNlcnZpY2UnO1xuaW1wb3J0IHsgaW5pdGlhdGVDYWxsQWN0aXZpdHkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leG90ZWwvYXBpJztcbmltcG9ydCBDcnlwdG9TZXJ2aWNlIGZyb20gJy4uLy4uL3NlcnZpY2VzL2NyeXB0by9DcnlwdG9TZXJ2aWNlJztcbnZhciBDYWxsQnV0dG9uID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHBob25lTnVtYmVyID0gX2EucGhvbmVOdW1iZXIsIGVuY3J5cHRlZFBob25lTnVtYmVyID0gX2EuZW5jcnlwdGVkUGhvbmVOdW1iZXIsIGNhbGxlck5hbWUgPSBfYS5jYWxsZXJOYW1lLCBwcm9zcGVjdElkID0gX2EucHJvc3BlY3RJZCwgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBkaXNhYmxlZCA9IF9hLmRpc2FibGVkO1xuICAgIHZhciBleG90ZWwgPSB1c2VFeG90ZWxTYWZlKCk7XG4gICAgdmFyIF9iID0gdXNlU3RhdGUoZmFsc2UpLCBpc0RpYWxpbmcgPSBfYlswXSwgc2V0SXNEaWFsaW5nID0gX2JbMV07XG4gICAgdmFyIF9jID0gdXNlU3RhdGUobnVsbCksIGVycm9yID0gX2NbMF0sIHNldEVycm9yID0gX2NbMV07XG4gICAgLy8gSWYgRXhvdGVsIGlzIG5vdCBhdmFpbGFibGUgKG5vdCB3aXRoaW4gcHJvdmlkZXIpLCBkb24ndCByZW5kZXIgdGhlIGJ1dHRvblxuICAgIGlmICghZXhvdGVsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgbWFrZUNhbGwgPSBleG90ZWwubWFrZUNhbGwsIGlzQ29ubmVjdGVkID0gZXhvdGVsLmlzQ29ubmVjdGVkLCBjYWxsU3RhdGUgPSBleG90ZWwuY2FsbFN0YXRlLCBwZXJtaXNzaW9uU3RhdHVzID0gZXhvdGVsLnBlcm1pc3Npb25TdGF0dXMsIHJlcXVlc3RNaWNyb3Bob25lQWNjZXNzID0gZXhvdGVsLnJlcXVlc3RNaWNyb3Bob25lQWNjZXNzLCBzZXRDYWxsQWN0aXZpdHlJZCA9IGV4b3RlbC5zZXRDYWxsQWN0aXZpdHlJZCwgc2V0RXhvdGVsQ2FsbFNpZCA9IGV4b3RlbC5zZXRFeG90ZWxDYWxsU2lkO1xuICAgIHZhciBoYW5kbGVDYWxsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFjdHVhbFBob25lTnVtYmVyLCBtYXNrZWROdW1iZXIsIGhhc1Blcm1pc3Npb24sIGdyYW50ZWQsIHNka1Jlc3BvbnNlLCBleG90ZWxDYWxsU2lkLCByZXNwb25zZSwgY2FsbEFjdGl2aXR5SWQsIGFwaUVycm9yXzEsIGVycl8xLCBlcnJvck1lc3NhZ2UsIGNvZGUsIGVycm9yRGV0YWlscywgZGVzY3JpcHRpb247XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgc3dpdGNoIChfZS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgY2FsbGluZyBmcm9tICdpZGxlJyBvciAnZW5kZWQnIHN0YXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29ubmVjdGVkIHx8IChjYWxsU3RhdGUucGhhc2UgIT09ICdpZGxlJyAmJiBjYWxsU3RhdGUucGhhc2UgIT09ICdlbmRlZCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsUGhvbmVOdW1iZXIgPSBwaG9uZU51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuY3J5cHRlZFBob25lTnVtYmVyICYmICFhY3R1YWxQaG9uZU51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxQaG9uZU51bWJlciA9IENyeXB0b1NlcnZpY2UuZGVjcnlwdERhdGEoZW5jcnlwdGVkUGhvbmVOdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWN0dWFsUGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ0ZhaWxlZCB0byBkZWNyeXB0IHBob25lIG51bWJlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlY3J5cHRpb24gZXJyb3I6JywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignRmFpbGVkIHRvIGRlY3J5cHQgcGhvbmUgbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWN0dWFsUGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCdObyBwaG9uZSBudW1iZXIgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWFza2VkTnVtYmVyID0gQ3J5cHRvU2VydmljZS5tYXNrTW9iaWxlKGFjdHVhbFBob25lTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgRXhvdGVsU2VydmljZS5nZXRJbnN0YW5jZSgpLmNoZWNrQXVkaW9QZXJtaXNzaW9ucygpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb24gPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIWhhc1Blcm1pc3Npb24pIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZXF1ZXN0TWljcm9waG9uZUFjY2VzcygpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGdyYW50ZWQgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZ3JhbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ01pY3JvcGhvbmUgYWNjZXNzIGlzIHJlcXVpcmVkIHRvIG1ha2UgY2FsbHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBfZS50cnlzLnB1c2goWzMsIDksIDEwLCAxMV0pO1xuICAgICAgICAgICAgICAgICAgICBzZXRJc0RpYWxpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG1ha2VDYWxsKGFjdHVhbFBob25lTnVtYmVyLCBjYWxsZXJOYW1lLCB1bmRlZmluZWQsIG1hc2tlZE51bWJlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgMjogRXh0cmFjdCBDYWxsU2lkIGZyb20gU0RLIHJlc3BvbnNlIGFuZCBzdG9yZSBpdCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhbmNlbCBBUEkgaWYgdXNlciBkZWNsaW5lcyBiZWZvcmUgaW5pdGlhdGVDYWxsQWN0aXZpdHkgY29tcGxldGVzXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBzZGtSZXNwb25zZSA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhvdGVsQ2FsbFNpZCA9IChfYSA9IHNka1Jlc3BvbnNlID09PSBudWxsIHx8IHNka1Jlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZGtSZXNwb25zZS5EYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuQ2FsbFNpZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4b3RlbENhbGxTaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEV4b3RlbENhbGxTaWQoZXhvdGVsQ2FsbFNpZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocHJvc3BlY3RJZCAmJiBleG90ZWxDYWxsU2lkKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbNSwgNywgLCA4XSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGluaXRpYXRlQ2FsbEFjdGl2aXR5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9zcGVjdElkOiBwcm9zcGVjdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvTnVtYmVyOiBhY3R1YWxQaG9uZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU2lkOiBleG90ZWxDYWxsU2lkLCAvLyBQYXNzIENhbGxTaWQgd2hlbiBjcmVhdGluZyB0aGUgcmVjb3JkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNhbGwgc3RhdGUgd2l0aCB0aGUgZGF0YWJhc2UgSUQgZm9yIGRpc3Bvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbEFjdGl2aXR5SWQgPSAoX2IgPSByZXNwb25zZS5kYXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsQWN0aXZpdHlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbEFjdGl2aXR5SWQoY2FsbEFjdGl2aXR5SWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgYXBpRXJyb3JfMSA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW0NhbGxCdXR0b25dIEZhaWxlZCB0byBjcmVhdGUgY2FsbCBhY3Rpdml0eSByZWNvcmQ6JywgYXBpRXJyb3JfMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgZXJyXzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBtYWtlIGNhbGw6JywgZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnRmFpbGVkIHRvIG1ha2UgY2FsbCc7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZXJyXzEgPT09IG51bGwgfHwgZXJyXzEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycl8xLkNvZGUpIHx8IChlcnJfMSA9PT0gbnVsbCB8fCBlcnJfMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyXzEuU3RhdHVzKSA9PT0gJ0ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBlcnJfMS5Db2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXRhaWxzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJfMS5FcnJvciAmJiB0eXBlb2YgZXJyXzEuRXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXRhaWxzID0gSlNPTi5wYXJzZShlcnJfMS5FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChwYXJzZUVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgSlNPTiwgaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAoX2QgPSAoX2MgPSBlcnJvckRldGFpbHMgPT09IG51bGwgfHwgZXJyb3JEZXRhaWxzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvckRldGFpbHMucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5lcnJvcl9kYXRhKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGVzY3JpcHRpb24gfHwgJ1VzZXIgZGV2aWNlIGlzIGN1cnJlbnRseSBidXN5IG9yIHVuYXZhaWxhYmxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gNDAwICYmIGNvZGUgPCA1MDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkZXNjcmlwdGlvbiB8fCAnVW5hYmxlIHRvIGNvbXBsZXRlIGNhbGwuIFBsZWFzZSB0cnkgYWdhaW4uJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gNTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGVzY3JpcHRpb24gfHwgJ1NlcnZpY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRlc2NyaXB0aW9uIHx8ICdGYWlsZWQgdG8gbWFrZSBjYWxsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlcnJfMSA9PT0gbnVsbCB8fCBlcnJfMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyXzEubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyXzEubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNEaWFsaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDExOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pOyB9O1xuICAgIC8vICdpZGxlJyBhbmQgJ2VuZGVkJyBib3RoIG1lYW4gbm8gYWN0aXZlIGNhbGwgLSBidXR0b24gc2hvdWxkIGJlIGVuYWJsZWRcbiAgICB2YXIgaXNDYWxsSW5Qcm9ncmVzcyA9IGNhbGxTdGF0ZS5waGFzZSAhPT0gJ2lkbGUnICYmIGNhbGxTdGF0ZS5waGFzZSAhPT0gJ2VuZGVkJztcbiAgICB2YXIgaGFzUGhvbmVOdW1iZXIgPSBwaG9uZU51bWJlciB8fCBlbmNyeXB0ZWRQaG9uZU51bWJlcjtcbiAgICB2YXIgaXNEaXNhYmxlZCA9IGRpc2FibGVkIHx8ICFoYXNQaG9uZU51bWJlciB8fCAhaXNDb25uZWN0ZWQgfHwgaXNDYWxsSW5Qcm9ncmVzcyB8fCBpc0RpYWxpbmc7XG4gICAgdmFyIGdldEJ1dHRvblRpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzQ29ubmVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuICdWb0lQIG5vdCBjb25uZWN0ZWQnO1xuICAgICAgICBpZiAoaXNDYWxsSW5Qcm9ncmVzcylcbiAgICAgICAgICAgIHJldHVybiAnQ2FsbCBpbiBwcm9ncmVzcyc7XG4gICAgICAgIGlmICghaGFzUGhvbmVOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gJ05vIHBob25lIG51bWJlcic7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uU3RhdHVzID09PSAnZGVuaWVkJylcbiAgICAgICAgICAgIHJldHVybiAnTWljcm9waG9uZSBhY2Nlc3MgZGVuaWVkJztcbiAgICAgICAgcmV0dXJuIFwiQ2FsbCBcIi5jb25jYXQoY2FsbGVyTmFtZSB8fCAncHJvc3BlY3QnKTtcbiAgICB9O1xuICAgIHJldHVybiAoX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZSwgY2hpbGRyZW46IFtfanN4cyhCdXR0b24sIHsgdmFyaWFudDogXCJvdXRsaW5lXCIsIHNpemU6IFwic21cIiwgb25DbGljazogaGFuZGxlQ2FsbCwgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsIHRpdGxlOiBnZXRCdXR0b25UaXRsZSgpLCBjbGFzc05hbWU6IFwiZ2FwLTEuNVwiLCBjaGlsZHJlbjogW3Blcm1pc3Npb25TdGF0dXMgPT09ICdkZW5pZWQnID8gKF9qc3goTWljT2ZmLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSkpIDogKF9qc3goUGhvbmUsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSksIGlzRGlhbGluZyA/ICdDYWxsaW5nLi4uJyA6ICdDYWxsJ10gfSksIGVycm9yICYmIF9qc3goXCJwXCIsIHsgY2xhc3NOYW1lOiBcInRleHQtcmVkLTUwMCB0ZXh0LXhzIG10LTFcIiwgY2hpbGRyZW46IGVycm9yIH0pXSB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2FsbEJ1dHRvbjtcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgTWljLCBNaWNPZmYsIEFsZXJ0Q2lyY2xlIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IHVzZUV4b3RlbCB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9FeG90ZWxQcm92aWRlcic7XG52YXIgTWljcm9waG9uZVBlcm1pc3Npb24gPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgb25QZXJtaXNzaW9uR3JhbnRlZCA9IF9hLm9uUGVybWlzc2lvbkdyYW50ZWQsIG9uUGVybWlzc2lvbkRlbmllZCA9IF9hLm9uUGVybWlzc2lvbkRlbmllZDtcbiAgICB2YXIgX2IgPSB1c2VFeG90ZWwoKSwgcGVybWlzc2lvblN0YXR1cyA9IF9iLnBlcm1pc3Npb25TdGF0dXMsIHJlcXVlc3RNaWNyb3Bob25lQWNjZXNzID0gX2IucmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3M7XG4gICAgdmFyIF9jID0gdXNlU3RhdGUoZmFsc2UpLCBpc1JlcXVlc3RpbmcgPSBfY1swXSwgc2V0SXNSZXF1ZXN0aW5nID0gX2NbMV07XG4gICAgdmFyIF9kID0gdXNlU3RhdGUobnVsbCksIGVycm9yID0gX2RbMF0sIHNldEVycm9yID0gX2RbMV07XG4gICAgdmFyIGhhbmRsZVJlcXVlc3RQZXJtaXNzaW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdyYW50ZWQsIGVycl8xO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBzZXRJc1JlcXVlc3RpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHNldEVycm9yKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsIDQsIDVdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MoKV07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBncmFudGVkID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25QZXJtaXNzaW9uR3JhbnRlZCA9PT0gbnVsbCB8fCBvblBlcm1pc3Npb25HcmFudGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblBlcm1pc3Npb25HcmFudGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignTWljcm9waG9uZSBhY2Nlc3Mgd2FzIGRlbmllZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb25QZXJtaXNzaW9uRGVuaWVkID09PSBudWxsIHx8IG9uUGVybWlzc2lvbkRlbmllZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25QZXJtaXNzaW9uRGVuaWVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoZXJyXzEubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHJlcXVlc3QgbWljcm9waG9uZSBhY2Nlc3MnKTtcbiAgICAgICAgICAgICAgICAgICAgb25QZXJtaXNzaW9uRGVuaWVkID09PSBudWxsIHx8IG9uUGVybWlzc2lvbkRlbmllZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25QZXJtaXNzaW9uRGVuaWVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNSZXF1ZXN0aW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7IH07XG4gICAgaWYgKHBlcm1pc3Npb25TdGF0dXMgPT09ICdncmFudGVkJykge1xuICAgICAgICByZXR1cm4gKF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtZ3JlZW4tNjAwXCIsIGNoaWxkcmVuOiBbX2pzeChNaWMsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSwgX2pzeChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwidGV4dC1zbVwiLCBjaGlsZHJlbjogXCJNaWNyb3Bob25lIGFjY2VzcyBncmFudGVkXCIgfSldIH0pKTtcbiAgICB9XG4gICAgaWYgKHBlcm1pc3Npb25TdGF0dXMgPT09ICdkZW5pZWQnKSB7XG4gICAgICAgIHJldHVybiAoX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwicC00IGJnLXJlZC01MCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItcmVkLTIwMFwiLCBjaGlsZHJlbjogW19qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtcmVkLTYwMCBtYi0yXCIsIGNoaWxkcmVuOiBbX2pzeChNaWNPZmYsIHsgY2xhc3NOYW1lOiBcInctNSBoLTVcIiB9KSwgX2pzeChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwiZm9udC1tZWRpdW1cIiwgY2hpbGRyZW46IFwiTWljcm9waG9uZSBBY2Nlc3MgRGVuaWVkXCIgfSldIH0pLCBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LXNtIHRleHQtcmVkLTYwMCBtYi0zXCIsIGNoaWxkcmVuOiBcIlRvIHVzZSB0aGUgY2FsbGluZyBmZWF0dXJlLCB5b3UgbmVlZCB0byBlbmFibGUgbWljcm9waG9uZSBhY2Nlc3MgaW4geW91ciBicm93c2VyIHNldHRpbmdzLlwiIH0pLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LXhzIHRleHQtZ3JheS02MDBcIiwgY2hpbGRyZW46IFtfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJmb250LW1lZGl1bSBtYi0xXCIsIGNoaWxkcmVuOiBcIkhvdyB0byBlbmFibGU6XCIgfSksIF9qc3hzKFwib2xcIiwgeyBjbGFzc05hbWU6IFwibGlzdC1kZWNpbWFsIGxpc3QtaW5zaWRlIHNwYWNlLXktMVwiLCBjaGlsZHJlbjogW19qc3goXCJsaVwiLCB7IGNoaWxkcmVuOiBcIkNsaWNrIHRoZSBsb2NrL2luZm8gaWNvbiBpbiB5b3VyIGJyb3dzZXIncyBhZGRyZXNzIGJhclwiIH0pLCBfanN4KFwibGlcIiwgeyBjaGlsZHJlbjogXCJGaW5kIFxcXCJNaWNyb3Bob25lXFxcIiBpbiB0aGUgcGVybWlzc2lvbnMgbGlzdFwiIH0pLCBfanN4KFwibGlcIiwgeyBjaGlsZHJlbjogXCJDaGFuZ2UgdGhlIHNldHRpbmcgdG8gXFxcIkFsbG93XFxcIlwiIH0pLCBfanN4KFwibGlcIiwgeyBjaGlsZHJlbjogXCJSZWZyZXNoIHRoZSBwYWdlXCIgfSldIH0pXSB9KV0gfSkpO1xuICAgIH1cbiAgICByZXR1cm4gKF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInAtNCBiZy1ibHVlLTUwIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ibHVlLTIwMFwiLCBjaGlsZHJlbjogW19qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtYmx1ZS02MDAgbWItMlwiLCBjaGlsZHJlbjogW19qc3goQWxlcnRDaXJjbGUsIHsgY2xhc3NOYW1lOiBcInctNSBoLTVcIiB9KSwgX2pzeChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwiZm9udC1tZWRpdW1cIiwgY2hpbGRyZW46IFwiTWljcm9waG9uZSBQZXJtaXNzaW9uIFJlcXVpcmVkXCIgfSldIH0pLCBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LXNtIHRleHQtZ3JheS02MDAgbWItM1wiLCBjaGlsZHJlbjogXCJUbyBtYWtlIGFuZCByZWNlaXZlIGNhbGxzLCB3ZSBuZWVkIGFjY2VzcyB0byB5b3VyIG1pY3JvcGhvbmUuIENsaWNrIHRoZSBidXR0b24gYmVsb3cgdG8gZ3JhbnQgcGVybWlzc2lvbi5cIiB9KSwgX2pzeHMoQnV0dG9uLCB7IHZhcmlhbnQ6IFwiZGVmYXVsdFwiLCBzaXplOiBcInNtXCIsIG9uQ2xpY2s6IGhhbmRsZVJlcXVlc3RQZXJtaXNzaW9uLCBsb2FkaW5nOiBpc1JlcXVlc3RpbmcsIGNsYXNzTmFtZTogXCJnYXAtMS41XCIsIGNoaWxkcmVuOiBbX2pzeChNaWMsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSwgXCJBbGxvdyBNaWNyb3Bob25lIEFjY2Vzc1wiXSB9KSwgZXJyb3IgJiYgX2pzeChcInBcIiwgeyBjbGFzc05hbWU6IFwidGV4dC1yZWQtNTAwIHRleHQteHMgbXQtMlwiLCBjaGlsZHJlbjogZXJyb3IgfSldIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBNaWNyb3Bob25lUGVybWlzc2lvbjtcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBFeG90ZWxQcm92aWRlciB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9FeG90ZWxQcm92aWRlcic7XG5pbXBvcnQgeyBnZXRBY3RpdmVWb2ljZVRva2VuIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhvdGVsL2FwaSc7XG5pbXBvcnQgRXhvdGVsUGhvbmUgZnJvbSAnLi9FeG90ZWxQaG9uZSc7XG4vKipcbiAqIFdyYXBwZXIgY29tcG9uZW50IHRoYXQgaW5pdGlhbGl6ZXMgRXhvdGVsIFZvSVAgZnVuY3Rpb25hbGl0eVxuICogRmV0Y2hlcyB0aGUgYWNjZXNzIHRva2VuIGZyb20gYmFja2VuZCBhbmQgcHJvdmlkZXMgdGhlIEV4b3RlbCBjb250ZXh0IHRvIGNoaWxkcmVuXG4gKi9cbnZhciBFeG90ZWxXcmFwcGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIF9iID0gX2EuZW5hYmxlZCwgZW5hYmxlZCA9IF9iID09PSB2b2lkIDAgPyB0cnVlIDogX2IsIHByb3NwZWN0SWQgPSBfYS5wcm9zcGVjdElkLCBwcm9zcGVjdE5hbWUgPSBfYS5wcm9zcGVjdE5hbWUsIHByb3NwZWN0TnVtYmVyID0gX2EucHJvc3BlY3ROdW1iZXI7XG4gICAgdmFyIF9jID0gdXNlU3RhdGUobnVsbCksIGFjY2Vzc1Rva2VuID0gX2NbMF0sIHNldEFjY2Vzc1Rva2VuID0gX2NbMV07XG4gICAgdmFyIF9kID0gdXNlU3RhdGUodHJ1ZSksIGlzTG9hZGluZyA9IF9kWzBdLCBzZXRJc0xvYWRpbmcgPSBfZFsxXTtcbiAgICB2YXIgX2UgPSB1c2VTdGF0ZShudWxsKSwgZXJyb3IgPSBfZVswXSwgc2V0RXJyb3IgPSBfZVsxXTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZldGNoVG9rZW4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRva2VuRGF0YSwgZXJyXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDIsIDMsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGdldEFjdGl2ZVZvaWNlVG9rZW4oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuRGF0YSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbkRhdGEgPT09IG51bGwgfHwgdG9rZW5EYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b2tlbkRhdGEudG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBY2Nlc3NUb2tlbih0b2tlbkRhdGEudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gYWN0aXZlIHZvaWNlIGNvbmZpZyAtIEV4b3RlbCBub3QgY29uZmlndXJlZCBmb3IgdGhpcyB0ZW5hbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignVm9pY2UgY2FsbGluZyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIEV4b3RlbCB0b2tlbjonLCBlcnJfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihlcnJfMS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjYWxsaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTsgfTtcbiAgICAgICAgZmV0Y2hUb2tlbigpO1xuICAgIH0sIFtlbmFibGVkXSk7XG4gICAgLy8gSWYgRXhvdGVsIGlzIG5vdCBlbmFibGVkIG9yIGZhaWxlZCB0byBsb2FkLCBqdXN0IHJlbmRlciBjaGlsZHJlblxuICAgIGlmICghZW5hYmxlZCB8fCBlcnJvciB8fCAhYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIF9qc3goX0ZyYWdtZW50LCB7IGNoaWxkcmVuOiBjaGlsZHJlbiB9KTtcbiAgICB9XG4gICAgLy8gUmVuZGVyIHdpdGggRXhvdGVsIHByb3ZpZGVyIGFuZCBmbG9hdGluZyBwaG9uZSBVSVxuICAgIHJldHVybiAoX2pzeHMoRXhvdGVsUHJvdmlkZXIsIHsgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuLCBhZ2VudFVzZXJJZDogXCIwMDQ3XCIsIGF1dG9Db25uZWN0Vk9JUDogdHJ1ZSwgY2hpbGRyZW46IFtjaGlsZHJlbiwgX2pzeChFeG90ZWxQaG9uZSwgeyBwcm9zcGVjdElkOiBwcm9zcGVjdElkLCBwcm9zcGVjdE5hbWU6IHByb3NwZWN0TmFtZSwgcHJvc3BlY3ROdW1iZXI6IHByb3NwZWN0TnVtYmVyIH0pXSB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRXhvdGVsV3JhcHBlcjtcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRXhvdGVsUHJvdmlkZXIgfSBmcm9tICcuL0V4b3RlbFByb3ZpZGVyJztcbmltcG9ydCB7IEV4b3RlbFBob25lIH0gZnJvbSAnLi4vY29tcG9uZW50cy9FeG90ZWwnO1xuaW1wb3J0IHsgY2hlY2tWb0lQRW5hYmxlZCwgZ2V0QWN0aXZlVm9pY2VUb2tlbiwgc2F2ZUNhbGxEaXNwb3NpdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL2V4b3RlbCc7XG5pbXBvcnQgeyBpc1ZvSVBFbmFibGVkRm9yV29ya3NwYWNlIH0gZnJvbSAnLi4vY29uZmlnL3ZvaXAuY29uZmlnJztcbi8qKlxuICogVm9JUFByb3ZpZGVyIC0gV29ya3NwYWNlLWxldmVsIFZvSVAvRXhvdGVsIGludGVncmF0aW9uXG4gKlxuICogVGhpcyBwcm92aWRlciBjaGVja3MgaWYgVm9JUCBpcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCB3b3Jrc3BhY2UgQU5EIHRlbmFudFxuICogYW5kIGluaXRpYWxpemVzIHRoZSBFeG90ZWwgU0RLIGlmIGVuYWJsZWQuXG4gKlxuICogVm9JUCBpcyBlbmFibGVkIG9ubHkgd2hlbiBBTEwgY29uZGl0aW9ucyBhcmUgbWV0OlxuICogMS4gV29ya3NwYWNlIGlzIGluIFZPSVBfRU5BQkxFRF9XT1JLU1BBQ0VTIChjb21tb24td29ya3NwYWNlLCB0ZWxlLWNhbGxlci13b3Jrc3BhY2UpXG4gKiAyLiBUZW5hbnQgaGFzIGVuYWJsZVZvaWNlOiB0cnVlIGluIG5vdGlmaWNhdGlvbiBjb25maWdcbiAqIDMuIFRlbmFudCBoYXMgYXQgbGVhc3Qgb25lIGVuYWJsZWQgdm9pY2UgY29uZmlnICh2b2ljZUNvbmZpZ3NbXS5pc0VuYWJsZWQ6IHRydWUpXG4gKiA0LiBBY3RpdmUgdG9rZW4gaXMgYXZhaWxhYmxlXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIFdvcmtzcGFjZS1sZXZlbCBWb0lQIGVuYWJsZW1lbnRcbiAqIC0gVGVuYW50LWxldmVsIFZvSVAgY29uZmlndXJhdGlvbiBjaGVja1xuICogLSBBdXRvbWF0aWMgdG9rZW4gZmV0Y2hpbmcgZnJvbSBiYWNrZW5kXG4gKiAtIE1pY3JvcGhvbmUgcGVybWlzc2lvbiBoYW5kbGluZ1xuICogLSBGbG9hdGluZyBwaG9uZSBVSSBmb3IgYWN0aXZlIGNhbGxzXG4gKi9cbmV4cG9ydCB2YXIgVm9JUFByb3ZpZGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIHdvcmtzcGFjZSA9IF9hLndvcmtzcGFjZSwgYWdlbnRVc2VySWQgPSBfYS5hZ2VudFVzZXJJZCwgcHJvc3BlY3RJZCA9IF9hLnByb3NwZWN0SWQsIHByb3NwZWN0TmFtZSA9IF9hLnByb3NwZWN0TmFtZSwgcHJvc3BlY3ROdW1iZXIgPSBfYS5wcm9zcGVjdE51bWJlciwgb25TYXZlRGlzcG9zaXRpb24gPSBfYS5vblNhdmVEaXNwb3NpdGlvbjtcbiAgICB2YXIgX2IgPSB1c2VTdGF0ZShudWxsKSwgYWNjZXNzVG9rZW4gPSBfYlswXSwgc2V0QWNjZXNzVG9rZW4gPSBfYlsxXTtcbiAgICB2YXIgX2MgPSB1c2VTdGF0ZSh0cnVlKSwgaXNMb2FkaW5nID0gX2NbMF0sIHNldElzTG9hZGluZyA9IF9jWzFdO1xuICAgIHZhciBfZCA9IHVzZVN0YXRlKG51bGwpLCBlcnJvciA9IF9kWzBdLCBzZXRFcnJvciA9IF9kWzFdO1xuICAgIHZhciBpc1dvcmtzcGFjZVZvSVBFbmFibGVkID0gaXNWb0lQRW5hYmxlZEZvcldvcmtzcGFjZSh3b3Jrc3BhY2UpO1xuICAgIHZhciBoYXNBZ2VudFVzZXJJZCA9ICEhYWdlbnRVc2VySWQ7XG4gICAgLy8gRGVmYXVsdCBkaXNwb3NpdGlvbiBoYW5kbGVyIHRoYXQgY2FsbHMgdGhlIEFQSVxuICAgIHZhciBoYW5kbGVTYXZlRGlzcG9zaXRpb24gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgLy8gSWYgY3VzdG9tIGhhbmRsZXIgaXMgcHJvdmlkZWQsIHVzZSBpdFxuICAgICAgICAgICAgaWYgKG9uU2F2ZURpc3Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG9uU2F2ZURpc3Bvc2l0aW9uKGRhdGEpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERlZmF1bHQ6IGNhbGwgdGhlIHNhdmVDYWxsRGlzcG9zaXRpb24gQVBJXG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgc2F2ZUNhbGxEaXNwb3NpdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxJZDogZGF0YS5jYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgIHByb3NwZWN0SWQ6IGRhdGEucHJvc3BlY3RJZCxcbiAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uOiBkYXRhLmNhbGxTdGF0dXNEaXNwb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb25DYXRlZ29yeTogZGF0YS5kaXNwb3NpdGlvbkNhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvblJlYXNvbjogZGF0YS5kaXNwb3NpdGlvblJlYXNvbiB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uTm90ZXM6IGRhdGEucmVtYXJrcyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICB9KTtcbiAgICB9KTsgfSwgW29uU2F2ZURpc3Bvc2l0aW9uXSk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gU2tpcCBpZiB3b3Jrc3BhY2UgZG9lc24ndCBzdXBwb3J0IFZvSVAgb3IgdXNlciBkb2Vzbid0IGhhdmUgRXhvdGVsIEFwcCBVc2VyIElEXG4gICAgICAgIGlmICghaXNXb3Jrc3BhY2VWb0lQRW5hYmxlZCB8fCAhaGFzQWdlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluaXRpYWxpemVWb0lQID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB2b2lwU3RhdHVzLCB0b2tlbkRhdGEsIGVycl8xO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAzLCA0LCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGNoZWNrVm9JUEVuYWJsZWQoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvaXBTdGF0dXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZvaXBTdGF0dXMuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZvSVAgbm90IGVuYWJsZWQgZm9yIHRoaXMgdGVuYW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ1ZvaWNlIGNhbGxpbmcgbm90IGVuYWJsZWQgZm9yIHRoaXMgdGVuYW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRBY3RpdmVWb2ljZVRva2VuKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkRhdGEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5EYXRhID09PSBudWxsIHx8IHRva2VuRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9rZW5EYXRhLnRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWNjZXNzVG9rZW4odG9rZW5EYXRhLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGFjdGl2ZSB0b2tlbiBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignVm9pY2UgY2FsbGluZyB0b2tlbiBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBWb0lQOicsIGVycl8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKGVycl8xLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBpbml0aWFsaXplIGNhbGxpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyB9O1xuICAgICAgICBpbml0aWFsaXplVm9JUCgpO1xuICAgIH0sIFtpc1dvcmtzcGFjZVZvSVBFbmFibGVkLCBoYXNBZ2VudFVzZXJJZF0pO1xuICAgIC8vIElmIHdvcmtzcGFjZSBkb2Vzbid0IHN1cHBvcnQgVm9JUCBvciB1c2VyIGRvZXNuJ3QgaGF2ZSBFeG90ZWwgSUQsIGp1c3QgcmVuZGVyIGNoaWxkcmVuXG4gICAgaWYgKCFpc1dvcmtzcGFjZVZvSVBFbmFibGVkIHx8ICFoYXNBZ2VudFVzZXJJZCkge1xuICAgICAgICByZXR1cm4gX2pzeChfRnJhZ21lbnQsIHsgY2hpbGRyZW46IGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgICAvLyBJZiBsb2FkaW5nIG9yIGVycm9yIG9yIG5vIHRva2VuLCByZW5kZXIgY2hpbGRyZW4gd2l0aG91dCBWb0lQXG4gICAgaWYgKGlzTG9hZGluZyB8fCBlcnJvciB8fCAhYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIF9qc3goX0ZyYWdtZW50LCB7IGNoaWxkcmVuOiBjaGlsZHJlbiB9KTtcbiAgICB9XG4gICAgLy8gUmVuZGVyIHdpdGggRXhvdGVsIHByb3ZpZGVyIGFuZCBmbG9hdGluZyBwaG9uZSBVSVxuICAgIHJldHVybiAoX2pzeHMoRXhvdGVsUHJvdmlkZXIsIHsgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuLCBhZ2VudFVzZXJJZDogYWdlbnRVc2VySWQsIGF1dG9Db25uZWN0Vk9JUDogdHJ1ZSwgY2hpbGRyZW46IFtjaGlsZHJlbiwgX2pzeChFeG90ZWxQaG9uZSwgeyBwcm9zcGVjdElkOiBwcm9zcGVjdElkLCBwcm9zcGVjdE5hbWU6IHByb3NwZWN0TmFtZSwgcHJvc3BlY3ROdW1iZXI6IHByb3NwZWN0TnVtYmVyLCBvblNhdmVEaXNwb3NpdGlvbjogaGFuZGxlU2F2ZURpc3Bvc2l0aW9uIH0pXSB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVm9JUFByb3ZpZGVyO1xuIl0sIm5hbWVzIjpbIl9fYXNzaWduIiwiT2JqZWN0IiwiYXNzaWduIiwidCIsInMiLCJpIiwibiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInAiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJhcHBseSIsInRoaXMiLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInZhbHVlIiwic3RlcCIsIm5leHQiLCJlIiwicmVqZWN0ZWQiLCJyZXN1bHQiLCJkb25lIiwidGhlbiIsIl9fZ2VuZXJhdG9yIiwiYm9keSIsImYiLCJ5IiwiXyIsImxhYmVsIiwic2VudCIsInRyeXMiLCJvcHMiLCJnIiwiY3JlYXRlIiwiSXRlcmF0b3IiLCJ2ZXJiIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJ2Iiwib3AiLCJUeXBlRXJyb3IiLCJwb3AiLCJwdXNoIiwiU3VwcHJlc3NlZEVycm9yIiwiaW5pdGlhbEFwcGxpY2F0aW9uU3RhdGUiLCJpc0xvZ2luRGlhbG9nT3BlbiIsInNuYWNrYmFyIiwib3BlbiIsIm1lc3NhZ2UiLCJzZXZlcml0eSIsImNvbmZpcm1EaWFsb2ciLCJpc09wZW4iLCJ0aXRsZSIsIm9uQ29uZmlybSIsIm9uQ2FuY2VsIiwidHlwZSIsInVzZXIiLCJ1bmRlZmluZWQiLCJpbnN0aXR1dGlvbkluZm8iLCJhc3NldCIsIkFwcGxpY2F0aW9uU3RvcmUiLCJTdG9yZSIsImlzRGV2ZWxvcG1lbnQiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhvc3RuYW1lIiwiaW5jbHVkZXMiLCJ0ZW5hbnRDb2RlIiwic3BsaXQiLCJpbnN0aXR1dGlvbkNvZGUiLCJwYXRobmFtZSIsIndvcmtzcGFjZSIsIndvcmtzcGFjZUFwaU1hcHBpbmciLCJheGlvcyIsIkF4aW9zIiwiYmFzZVVSTCIsInByb2Nlc3MiLCJlbnYiLCJSRUFDVF9BUFBfQVBJX0hPU1QiLCJ3aXRoQ3JlZGVudGlhbHMiLCJoZWFkZXJzIiwiY3JlYXRlUnNidWlsZFNoYXJlZENvbmZpZyIsImRlcGVuZGVuY2llcyIsImFsd2F5c0VhZ2VyIiwic2hhcmVkRGVwZW5kZW5jaWVzTGlzdCIsInJlZHVjZSIsImFjYyIsInBrZyIsInZlcnNpb24iLCJzaW5nbGV0b24iLCJyZXF1aXJlZFZlcnNpb24iLCJyZXBsYWNlIiwiZWFnZXIiLCJpbnRlcmNlcHRvcnMiLCJyZXF1ZXN0IiwidXNlIiwiY29uZmlnIiwicGFyYW1zIiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwibWFwIiwiX2EiLCJrZXkiLCJmb3JtYXRQYXJhbXMiLCJ3b3Jrc3BhY2VQcmVmaXgiLCJ1cmwiLCJjb25jYXQiLCJzZXNzaW9uS2V5IiwiQ29va2llcyIsImdldCIsIm9wZW5QYXltZW50c0tleSIsInN0dWRlbnRTZXNzaW9uS2V5Iiwic2V0Iiwic2tpcEluc3RpdHV0aW9uQ29kZSIsImRlbGV0ZSIsImVycm9yIiwicmVzcG9uc2UiLCJkYXRhIiwiaGlkZVNuYWNrYmFyIiwibWV0aG9kIiwic3RhdHVzIiwidXBkYXRlIiwiZXJyIiwiX2IiLCJfYyIsIl9kIiwic2hvdWxkSGlkZVNuYWNrYmFyIiwibm9uV29ya3NwYWNlQXhpb3MiLCJWT0lQX0VOQUJMRURfV09SS1NQQUNFUyIsImlzVm9JUEVuYWJsZWRGb3JXb3Jrc3BhY2UiLCJ3b3Jrc3BhY2VOYW1lIiwiQ29uZmlybUNvbnRleHQiLCJjcmVhdGVDb250ZXh0Iiwic2hvd0NvbmZpcm1EaWFsb2ciLCJDb25maXJtRGlhbG9nUHJvdmlkZXIiLCJjaGlsZHJlbiIsInVzZVN0YXRlIiwiaGFuZGxlQ2xvc2VEaWFsb2ciLCJfanN4cyIsIlByb3ZpZGVyIiwiY29uZmlybVRleHQiLCJjYW5jZWxUZXh0IiwiY29uZmlybUJ1dHRvblRleHQiLCJjYW5jZWxCdXR0b25UZXh0IiwiX2pzeCIsIkNvbmZpcm1EaWFsb2ciLCJ2YXJpYW50Iiwib25DbG9zZSIsIl9zZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiYmluZCIsIl9fcHJvdG9fXyIsImluaXRpYWxTdGF0ZSIsIkVycm9yQm91bmRhcnkiLCJfUmVhY3QkQ29tcG9uZW50IiwiX3RoaXMiLCJfbGVuIiwiX2FyZ3MiLCJBcnJheSIsIl9rZXkiLCJzdGF0ZSIsInJlc2V0RXJyb3JCb3VuZGFyeSIsIl90aGlzJHByb3BzIiwiX2xlbjIiLCJhcmdzIiwiX2tleTIiLCJwcm9wcyIsIm9uUmVzZXQiLCJyZXNldCIsIm8iLCJjb25zdHJ1Y3RvciIsIl9pbmhlcml0c0xvb3NlIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIiwiX3Byb3RvIiwic2V0U3RhdGUiLCJjb21wb25lbnREaWRDYXRjaCIsImluZm8iLCJfdGhpcyRwcm9wcyRvbkVycm9yIiwiX3RoaXMkcHJvcHMyIiwib25FcnJvciIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsIl90aGlzJHByb3BzJG9uUmVzZXRLZSIsIl90aGlzJHByb3BzMyIsImEiLCJiIiwicmVzZXRLZXlzIiwic29tZSIsIml0ZW0iLCJpbmRleCIsImlzIiwib25SZXNldEtleXNDaGFuZ2UiLCJyZW5kZXIiLCJfdGhpcyRwcm9wczQiLCJmYWxsYmFja1JlbmRlciIsIkZhbGxiYWNrQ29tcG9uZW50IiwiZmFsbGJhY2siLCJfcHJvcHMiLCJSZWFjdCIsImlzVmFsaWRFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsIkVycm9yIiwiQ29tcG9uZW50IiwiYyIsInIiLCJ1IiwiY29udGV4dCIsIk5PREVfRU5WIiwibW9kZSIsImFib3J0RWFybHkiLCJzaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uIiwidmFsdWVzIiwicmF3VmFsdWVzIiwiZXJyb3JzIiwiaW5uZXIiLCJjcml0ZXJpYU1vZGUiLCJwYXRoIiwidHlwZXMiLCJwZXJmb3JtTG9naW4iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImZldGNoIiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbnNpZGVySXAiLCJqc29uIiwibGF0IiwibG5nIiwicG9zdCIsInJlcyIsInZhbGlkYXRpb25TY2hlbWEiLCJZdXAiLCJvYmplY3QiLCJzaGFwZSIsInVzZXJuYW1lIiwic3RyaW5nIiwicmVxdWlyZWQiLCJwYXNzd29yZCIsIkxvZ2luIiwiY2xvc2UiLCJkZXZpY2VJbmZvcm1hdGlvbiIsImRldmljZVR5cGUiLCJjbGllbnROYW1lIiwib3MiLCJvc1ZlcnNpb24iLCJ0b2tlblR5cGUiLCJpc0xvY2F0aW9uQWxsb3dlZCIsImRldmljZVN0YXRlIiwic2V0RGV2aWNlU3RhdGUiLCJuYXZpZ2F0ZSIsInVzZU5hdmlnYXRlIiwidXNlRWZmZWN0IiwibmF2aWdhdG9yIiwiZ2VvbG9jYXRpb24iLCJnZXRDdXJyZW50UG9zaXRpb24iLCJwb3NpdGlvbiIsImNvb3JkcyIsInBlcm1pc3Npb25zIiwicXVlcnkiLCJuYW1lIiwicGVybWlzc2lvblN0YXR1cyIsImRldmljZUluZm8iLCJEZXZpY2VEZXRlY3RvciIsInBhcnNlIiwidXNlckFnZW50IiwiY2xpZW50IiwidXNlRm9ybSIsInJlc29sdmVyIiwieXVwUmVzb2x2ZXIiLCJoYW5kbGVTdWJtaXQiLCJjb250cm9sIiwiZm9ybVN0YXRlIiwidXNlTXV0YXRpb24iLCJvblN1Y2Nlc3MiLCJyZW1vdmUiLCJzZXNzaW9uIiwidG9rZW4iLCJyZWxvYWQiLCJtdXRhdGUiLCJpc0xvYWRpbmciLCJjbGFzc05hbWUiLCJJY29ucyIsIkNhbXB4RnVsbExvZ29JY29uIiwiQ29udHJvbGxlciIsImZpZWxkIiwiVGV4dEZpZWxkIiwicGxhY2Vob2xkZXIiLCJvbkNoYW5nZSIsImZ1bGxXaWR0aCIsIlBhc3N3b3JkRmllbGQiLCJCdXR0b24iLCJjb2xvciIsIm9uQ2xpY2siLCJsb2dpbklkIiwibG9naW5UeXBlIiwiZGlzYWJsZWQiLCJsb2FkaW5nIiwidXNlTG9jYXRpb24iLCJRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSIsIlJlYWN0RXJyb3JCb3VuZGFyeSIsIkVycm9yRmFsbGJhY2siLCJfZSIsIl9mIiwiX2ciLCJfaCIsIlVuQXV0aCIsIkludGVybmFsU2VydmVyRXJyb3IiLCJyZXNldEJvdW5kYXJ5IiwiUmVzb3VyY2VOb3RGb3VuZCIsImNvZGUiLCJOb0ludGVybmVDb25uZWN0aW9uIiwic2l6ZSIsImlzTW9kYWxPcGVuIiwic2V0TW9kYWxPcGVuIiwic2Vzc2lvbkNvb2tpZSIsIlVuQXV0aG9yaXplZCIsImNvbXBvbmVudCIsIl9GcmFnbWVudCIsIkRpYWxvZyIsImNvbnRlbnQiLCJmb3JtYXRQcm9kRXJyb3JNZXNzYWdlIiwic3ltYm9sX29ic2VydmFibGVfZGVmYXVsdCIsIm9ic2VydmFibGUiLCJyYW5kb21TdHJpbmciLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJzdWJzdHJpbmciLCJqb2luIiwiYWN0aW9uVHlwZXNfZGVmYXVsdCIsIklOSVQiLCJSRVBMQUNFIiwiUFJPQkVfVU5LTk9XTl9BQ1RJT04iLCJpc1BsYWluT2JqZWN0Iiwib2JqIiwicHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIm1pbmlLaW5kT2YiLCJ2YWwiLCJpc0FycmF5IiwiRGF0ZSIsInRvRGF0ZVN0cmluZyIsImdldERhdGUiLCJzZXREYXRlIiwiaXNEYXRlIiwic3RhY2tUcmFjZUxpbWl0IiwiaXNFcnJvciIsImNvbnN0cnVjdG9yTmFtZSIsImN0b3JOYW1lIiwic2xpY2UiLCJ0b0xvd2VyQ2FzZSIsImtpbmRPZiIsInR5cGVPZlZhbCIsImNyZWF0ZVN0b3JlIiwicmVkdWNlciIsInByZWxvYWRlZFN0YXRlIiwiZW5oYW5jZXIiLCJjdXJyZW50UmVkdWNlciIsImN1cnJlbnRTdGF0ZSIsImN1cnJlbnRMaXN0ZW5lcnMiLCJNYXAiLCJuZXh0TGlzdGVuZXJzIiwibGlzdGVuZXJJZENvdW50ZXIiLCJpc0Rpc3BhdGNoaW5nIiwiZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycyIsImZvckVhY2giLCJsaXN0ZW5lciIsImdldFN0YXRlIiwic3Vic2NyaWJlIiwiaXNTdWJzY3JpYmVkIiwibGlzdGVuZXJJZCIsImRpc3BhdGNoIiwiYWN0aW9uIiwicmVwbGFjZVJlZHVjZXIiLCJuZXh0UmVkdWNlciIsIm91dGVyU3Vic2NyaWJlIiwib2JzZXJ2ZXIiLCJvYnNlcnZlU3RhdGUiLCJvYnNlcnZlckFzT2JzZXJ2ZXIiLCJ1bnN1YnNjcmliZSIsIndhcm5pbmciLCJjb25zb2xlIiwiY29tYmluZVJlZHVjZXJzIiwicmVkdWNlcnMiLCJyZWR1Y2VyS2V5cyIsImtleXMiLCJmaW5hbFJlZHVjZXJzIiwiZmluYWxSZWR1Y2VyS2V5cyIsInVuZXhwZWN0ZWRLZXlDYWNoZSIsInNoYXBlQXNzZXJ0aW9uRXJyb3IiLCJhc3NlcnRSZWR1Y2VyU2hhcGUiLCJ3YXJuaW5nTWVzc2FnZSIsImlucHV0U3RhdGUiLCJhcmd1bWVudE5hbWUiLCJ1bmV4cGVjdGVkS2V5cyIsImZpbHRlciIsImdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UiLCJoYXNDaGFuZ2VkIiwibmV4dFN0YXRlIiwicHJldmlvdXNTdGF0ZUZvcktleSIsIm5leHRTdGF0ZUZvcktleSIsImFjdGlvblR5cGUiLCJTdHJpbmciLCJjb21wb3NlIiwiZnVuY3MiLCJhcmciLCJOT1RISU5HIiwiZm9yIiwiRFJBRlRBQkxFIiwiRFJBRlRfU1RBVEUiLCJwbHVnaW4iLCJ0aGluZyIsImRpZSIsIm1zZyIsImlzRHJhZnQiLCJpc0RyYWZ0YWJsZSIsImlzTWFwIiwiaXNTZXQiLCJvYmplY3RDdG9yU3RyaW5nIiwiY2FjaGVkQ3RvclN0cmluZ3MiLCJXZWFrTWFwIiwiQ3RvciIsImN0b3JTdHJpbmciLCJGdW5jdGlvbiIsImVhY2giLCJpdGVyIiwic3RyaWN0IiwiZ2V0QXJjaHR5cGUiLCJSZWZsZWN0Iiwib3duS2V5cyIsImVudHJ5IiwidHlwZV8iLCJoYXMiLCJwcm9wIiwicHJvcE9yT2xkVmFsdWUiLCJhZGQiLCJ0YXJnZXQiLCJTZXQiLCJsYXRlc3QiLCJjb3B5XyIsImJhc2VfIiwic2hhbGxvd0NvcHkiLCJiYXNlIiwiaXNQbGFpbiIsImRlc2NyaXB0b3JzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlc2MiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJmcmVlemUiLCJkZWVwIiwiaXNGcm96ZW4iLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZG9udE11dGF0ZU1ldGhvZE92ZXJyaWRlIiwiY2xlYXIiLCJjdXJyZW50U2NvcGUiLCJwbHVnaW5zIiwiZ2V0UGx1Z2luIiwicGx1Z2luS2V5IiwiZ2V0Q3VycmVudFNjb3BlIiwidXNlUGF0Y2hlc0luU2NvcGUiLCJzY29wZSIsInBhdGNoTGlzdGVuZXIiLCJwYXRjaGVzXyIsImludmVyc2VQYXRjaGVzXyIsInBhdGNoTGlzdGVuZXJfIiwicmV2b2tlU2NvcGUiLCJsZWF2ZVNjb3BlIiwiZHJhZnRzXyIsInJldm9rZURyYWZ0IiwicGFyZW50XyIsImVudGVyU2NvcGUiLCJpbW1lcjIiLCJpbW1lcl8iLCJjYW5BdXRvRnJlZXplXyIsInVuZmluYWxpemVkRHJhZnRzXyIsImRyYWZ0IiwicmV2b2tlXyIsInJldm9rZWRfIiwicHJvY2Vzc1Jlc3VsdCIsImJhc2VEcmFmdCIsIm1vZGlmaWVkXyIsImZpbmFsaXplIiwibWF5YmVGcmVlemUiLCJnZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18iLCJyb290U2NvcGUiLCJ1c2VTdHJpY3RJdGVyYXRpb24iLCJzaG91bGRVc2VTdHJpY3RJdGVyYXRpb24iLCJjaGlsZFZhbHVlIiwiZmluYWxpemVQcm9wZXJ0eSIsInNjb3BlXyIsImZpbmFsaXplZF8iLCJyZXN1bHRFYWNoIiwiaXNTZXQyIiwiZ2VuZXJhdGVQYXRjaGVzXyIsInBhcmVudFN0YXRlIiwidGFyZ2V0T2JqZWN0Iiwicm9vdFBhdGgiLCJ0YXJnZXRJc1NldCIsImNoaWxkSXNGcm96ZW4iLCJhc3NpZ25lZF8iLCJhdXRvRnJlZXplXyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwib2JqZWN0VHJhcHMiLCJzb3VyY2UiLCJnZXREZXNjcmlwdG9yRnJvbVByb3RvIiwiZHJhZnRfIiwicmVhZFByb3BGcm9tUHJvdG8iLCJwZWVrIiwicHJlcGFyZUNvcHkiLCJjcmVhdGVQcm94eSIsImN1cnJlbnQyIiwieCIsIm1hcmtDaGFuZ2VkIiwiTnVtYmVyIiwiaXNOYU4iLCJkZWxldGVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bmVyIiwiZGVmaW5lUHJvcGVydHkiLCJhcnJheVRyYXBzIiwidXNlU3RyaWN0U2hhbGxvd0NvcHlfIiwiZm4iLCJwYXJzZUludCIsInBhcmVudCIsInByb3h5TWFwXyIsInByb3h5U2V0XyIsImlzTWFudWFsXyIsInRyYXBzIiwicmV2b2tlIiwicHJveHkiLCJQcm94eSIsInJldm9jYWJsZSIsImNyZWF0ZVByb3h5UHJveHkiLCJjdXJyZW50SW1wbCIsImNvcHkiLCJpbW1lciIsInVzZVN0cmljdEl0ZXJhdGlvbl8iLCJwcm9kdWNlIiwicmVjaXBlIiwiZGVmYXVsdEJhc2UiLCJzZWxmIiwiYmFzZTIiLCJoYXNFcnJvciIsImlwIiwicHJvZHVjZVdpdGhQYXRjaGVzIiwicGF0Y2hlcyIsImludmVyc2VQYXRjaGVzIiwiYXV0b0ZyZWV6ZSIsInNldEF1dG9GcmVlemUiLCJ1c2VTdHJpY3RTaGFsbG93Q29weSIsInNldFVzZVN0cmljdFNoYWxsb3dDb3B5Iiwic2V0VXNlU3RyaWN0SXRlcmF0aW9uIiwiY3JlYXRlRHJhZnQiLCJjdXJyZW50IiwiZmluaXNoRHJhZnQiLCJhcHBseVBhdGNoZXMiLCJwYXRjaCIsImFwcGx5UGF0Y2hlc0ltcGwiLCJhcHBseVBhdGNoZXNfIiwiY3JlYXRlVGh1bmtNaWRkbGV3YXJlIiwiZXh0cmFBcmd1bWVudCIsInRodW5rIiwid2l0aEV4dHJhQXJndW1lbnQiLCJjb21wb3NlV2l0aERldlRvb2xzIiwiX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fIiwiaXNBY3Rpb25DcmVhdG9yIiwibWF0Y2giLCJnZXRUaW1lTWVhc3VyZVV0aWxzIiwibWF4RGVsYXkiLCJmbk5hbWUiLCJlbGFwc2VkIiwibWVhc3VyZVRpbWUiLCJzdGFydGVkIiwibm93IiwiZmluaXNoZWQiLCJ3YXJuSWZFeGNlZWRlZCIsIlR1cGxlIiwiX1R1cGxlIiwiaXRlbXMiLCJzdXBlciIsInNwZWNpZXMiLCJhcnIiLCJwcmVwZW5kIiwiaXNJbW11dGFibGVEZWZhdWx0IiwidHJhY2tGb3JNdXRhdGlvbnMiLCJpc0ltbXV0YWJsZSIsImlnbm9yZVBhdGhzIiwidHJhY2tlZFByb3BlcnRpZXMiLCJ0cmFja1Byb3BlcnRpZXMiLCJkZXRlY3RNdXRhdGlvbnMiLCJjaGVja2VkT2JqZWN0cyIsInRyYWNrZWQiLCJjaGlsZFBhdGgiLCJpbmRleE9mIiwiaWdub3JlZFBhdGhzIiwidHJhY2tlZFByb3BlcnR5Iiwic2FtZVBhcmVudFJlZiIsInByZXZPYmoiLCJzYW1lUmVmIiwid2FzTXV0YXRlZCIsImtleXNUb0RldGVjdCIsImhhc0lnbm9yZWRQYXRocyIsIm5lc3RlZFBhdGgiLCJpZ25vcmVkIiwiUmVnRXhwIiwidGVzdCIsImZpbmROb25TZXJpYWxpemFibGVWYWx1ZSIsImlzU2VyaWFsaXphYmxlIiwiZ2V0RW50cmllcyIsImNhY2hlIiwiZm91bmROZXN0ZWRTZXJpYWxpemFibGUiLCJrZXlQYXRoIiwibmVzdGVkVmFsdWUiLCJpc05lc3RlZEZyb3plbiIsImNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSIsIm9wdGlvbnMiLCJpZ25vcmVkQWN0aW9ucyIsImlnbm9yZWRBY3Rpb25QYXRocyIsIndhcm5BZnRlciIsImlnbm9yZVN0YXRlIiwiaWdub3JlQWN0aW9ucyIsImRpc2FibGVDYWNoZSIsIldlYWtTZXQiLCJzdG9yZUFQSSIsImlzQWN0aW9uIiwibWVhc3VyZVV0aWxzIiwiZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSIsImZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSIsImlzQm9vbGVhbiIsImJ1aWxkR2V0RGVmYXVsdE1pZGRsZXdhcmUiLCJpbW11dGFibGVDaGVjayIsInNlcmlhbGl6YWJsZUNoZWNrIiwiYWN0aW9uQ3JlYXRvckNoZWNrIiwibWlkZGxld2FyZUFycmF5IiwidGh1bmtNaWRkbGV3YXJlIiwiaW1tdXRhYmxlT3B0aW9ucyIsInVuc2hpZnQiLCJzdHJpbmdpZnkyIiwic2VyaWFsaXplciIsImluZGVudCIsImRlY3ljbGVyIiwiZ2V0U2VyaWFsaXplMiIsInN0YWNrIiwidGhpc1BvcyIsInNwbGljZSIsIkluZmluaXR5IiwidHJhY2siLCJ0cmFja2VyIiwiZGlzcGF0Y2hlZEFjdGlvbiIsImNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSIsInNlcmlhbGl6YWJsZU9wdGlvbnMiLCJhY3Rpb25DcmVhdG9yT3B0aW9ucyIsImlzQWN0aW9uQ3JlYXRvcjIiLCJjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZSIsImNyZWF0ZVF1ZXVlV2l0aFRpbWVyIiwidGltZW91dCIsIm5vdGlmeSIsInNldFRpbWVvdXQiLCJidWlsZEdldERlZmF1bHRFbmhhbmNlcnMiLCJtaWRkbGV3YXJlRW5oYW5jZXIiLCJhdXRvQmF0Y2giLCJlbmhhbmNlckFycmF5Iiwic3RvcmUiLCJub3RpZnlpbmciLCJzaG91bGROb3RpZnlBdEVuZE9mVGljayIsIm5vdGlmaWNhdGlvblF1ZXVlZCIsImxpc3RlbmVycyIsInF1ZXVlQ2FsbGJhY2siLCJxdWV1ZU1pY3JvdGFzayIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInF1ZXVlTm90aWZpY2F0aW9uIiwibm90aWZ5TGlzdGVuZXJzIiwibCIsImxpc3RlbmVyMiIsIm1ldGEiLCJhdXRvQmF0Y2hFbmhhbmNlciIsImNvbmZpZ3VyZVN0b3JlIiwiZ2V0RGVmYXVsdE1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlIiwiZGV2VG9vbHMiLCJkdXBsaWNhdGVNaWRkbGV3YXJlQ2hlY2siLCJlbmhhbmNlcnMiLCJyb290UmVkdWNlciIsImZpbmFsTWlkZGxld2FyZSIsIm1pZGRsZXdhcmVSZWZlcmVuY2VzIiwibWlkZGxld2FyZTIiLCJmaW5hbENvbXBvc2UiLCJ0cmFjZSIsIm1pZGRsZXdhcmVzIiwiY3JlYXRlU3RvcmUyIiwibWlkZGxld2FyZUFQSSIsImNoYWluIiwiYXBwbHlNaWRkbGV3YXJlIiwiZ2V0RGVmYXVsdEVuaGFuY2VycyIsInN0b3JlRW5oYW5jZXJzIiwiU25hY2tiYXJDb250ZXh0IiwiU25hY2tiYXJQcm92aWRlciIsInNob3dTbmFja2JhciIsIlNuYWNrYmFyIiwiYXV0b0hpZGVEdXJhdGlvbiIsIlByb3ZpZGVycyIsImJhc2VuYW1lIiwicXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudCIsImRlZmF1bHRPcHRpb25zIiwicXVlcmllcyIsInJlZmV0Y2hPbldpbmRvd0ZvY3VzIiwicmV0cnkiLCJ1c2VFcnJvckJvdW5kYXJ5IiwiYmFzZU5hbWUiLCJvcmlnaW4iLCJCcm93c2VyUm91dGVyIiwiUXVlcnlDbGllbnRQcm92aWRlciIsImRlZmF1bHRDb25maXJtRGlhbG9nU3RhdGUiLCJ1c2VDb25maXJtIiwicmVzZXREaWFsb2ciLCJEZXBhcnRtZW50TW9uZ29NdWx0aVNlbGVjdG9yIiwiTXVsdGlTZWxlY3QiLCJkYkxhYmVsUHJvcHMiLCJsYWJlbEtleSIsInN1YkxhYmVsS2V5IiwidXNlU3ViTGFiZWxTdGFydENhc2UiLCJkYlZhbHVlUHJvcHMiLCJ2YWx1ZUtleSIsImlzT2JqZWN0SWQiLCJleHRlcm5hbEF4aW9zIiwib3B0aW9uc0FwaUVuZFBvaW50IiwiRGVwYXJ0bWVudFNxbE11bHRpU2VsZWN0b3IiLCJpc0ludCIsIkJhdGNoU2VsZWN0b3IiLCJTaW5nbGVTZWxlY3QiLCJDb3Vyc2VTZWxlY3RvciIsIkRlcGFydG1lbnRTZWxlY3RvciIsIkVtcGxveWVlc1NlbGVjdG9yIiwiRXhhbXNSZWd1bGF0aW9uU2VsZWN0b3IiLCJleGFtVHlwZU9wdGlvbnMiLCJFeGFtVHlwZVNlbGVjdG9yIiwiRmVlVHlwZXMiLCJ5ZWFycyIsImZyb20iLCJnZXRGdWxsWWVhciIsIkZlZVR5cGVTZWxlY3RvciIsIkhvc3RlbEJsb2NrU2VsZWN0b3IiLCJ1c2VMYWJlbFN0YXJ0Q2FzZSIsIkhvc3RlbEZsb29yU2VsZWN0b3IiLCJIb3N0ZWxSb29tU2VsZWN0b3IiLCJNb250aFllYXJTZWxlY3RvciIsIlByaW50Rm9ybWF0U2VsZWN0b3IiLCJQcm9ncmFtU2VsZWN0b3IiLCJSZWd1bGF0aW9uU2VsZWN0b3IiLCJSZXNlYXJjaEV4cGVydERlc2lnbmF0aW9uU2VsZWN0b3IiLCJSZXNlYXJjaEV4cGVydFNlbGVjdG9yIiwiUmVzZWFyY2hTdGFnZVNlbGVjdG9yIiwiU2VtZXN0ZXJTZWxlY3RvciIsIlN0dWRlbnRTZWxlY3RvciIsIlN0dWRlbnRTZXJ2aWNlc1NlbGVjdG9yIiwiWWVhclJhbmdlU2VsZWN0b3IiLCJzdWZmaXgiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJfX3Jlc3QiLCJ5ZWFyIiwib3BlbkluTmV3VGFiIiwicGF0aEFmdGVyQmFzZSIsImV4Y2x1ZGVJbnN0aXR1dGlvbiIsImV4Y2x1ZGVXb3Jrc3BhY2UiLCJzZWdtZW50cyIsImJhc2VQYXJ0cyIsImZ1bGxQYXRoIiwiRXhvdGVsU2VydmljZSIsImV4b3RlbFNESyIsIndlYlBob25lIiwiY2FsbExpc3RlbmVycyIsInJlZ2lzdGVyTGlzdGVuZXJzIiwic2Vzc2lvbkxpc3RlbmVycyIsImhhbmRsZUNhbGxFdmVudCIsImV2ZW50IiwiY2FsbERhdGEiLCJoYW5kbGVSZWdpc3RlckV2ZW50IiwiaGFuZGxlU2Vzc2lvbkV2ZW50IiwiZ2V0SW5zdGFuY2UiLCJpbnN0YW5jZSIsImluaXRpYWxpemUiLCJhY2Nlc3NUb2tlbl8xIiwiYWdlbnRVc2VySWRfMSIsImFjY2Vzc1Rva2VuIiwiYWdlbnRVc2VySWQiLCJhdXRvQ29ubmVjdFZPSVAiLCJwaG9uZSIsImNoZWNrQXVkaW9QZXJtaXNzaW9ucyIsIkV4b3RlbENSTVdlYlNESyIsIkluaXRpYWxpemUiLCJkZXZpY2VzIiwicGVybWlzc2lvblN0YXR1c18xIiwibWVkaWFEZXZpY2VzIiwiZW51bWVyYXRlRGV2aWNlcyIsImRldmljZSIsImtpbmQiLCJvbmNoYW5nZSIsInJlcXVlc3RNaWNyb3Bob25lQWNjZXNzIiwiZ2V0VXNlck1lZGlhIiwiYXVkaW8iLCJnZXRUcmFja3MiLCJzdG9wIiwibWFrZUNhbGwiLCJwaG9uZU51bWJlciIsIk1ha2VDYWxsIiwiYWNjZXB0Q2FsbCIsIkFjY2VwdENhbGwiLCJoYW5ndXBDYWxsIiwiSGFuZ3VwQ2FsbCIsInJlamVjdENhbGwiLCJ0b2dnbGVIb2xkIiwiVG9nZ2xlSG9sZCIsInRvZ2dsZU11dGUiLCJUb2dnbGVNdXRlIiwic2VuZERUTUYiLCJkaWdpdCIsIlNlbmREVE1GIiwicmVnaXN0ZXJEZXZpY2UiLCJSZWdpc3RlckRldmljZSIsInVucmVnaXN0ZXJEZXZpY2UiLCJVblJlZ2lzdGVyRGV2aWNlIiwiZ2V0UGVybWlzc2lvblN0YXR1cyIsImFkZENhbGxMaXN0ZW5lciIsInJlbW92ZUNhbGxMaXN0ZW5lciIsImFkZFJlZ2lzdGVyTGlzdGVuZXIiLCJyZW1vdmVSZWdpc3Rlckxpc3RlbmVyIiwiYWRkU2Vzc2lvbkxpc3RlbmVyIiwicmVtb3ZlU2Vzc2lvbkxpc3RlbmVyIiwiY2hlY2tWb0lQRW5hYmxlZCIsImVuYWJsZWRWb2ljZUNvbmZpZyIsImVuYWJsZVZvaWNlIiwidm9pY2VDb25maWdzIiwiZmluZCIsInZjIiwiaXNFbmFibGVkIiwiZW5hYmxlZCIsImhhc1ZhbGlkVG9rZW4iLCJFWE9URUwiLCJ0b2tlbkV4cGlyZXNBdCIsImdldEFjdGl2ZVZvaWNlVG9rZW4iLCJjcmVhdGVFeG90ZWxBcHBUb2tlbiIsInRva2VuRGF0YSIsIkRhdGEiLCJpbml0aWF0ZUNhbGxBY3Rpdml0eSIsImlucHV0IiwicmVnaXN0ZXJJbmNvbWluZ0NhbGwiLCJmZXRjaENhbGxIaXN0b3J5IiwicHJvc3BlY3RJZCIsImdldENhbGxBY3Rpdml0eUJ5SWQiLCJpZCIsImdldENhbGxBY3Rpdml0eUJ5Q2FsbFNpZCIsImNhbGxTaWQiLCJnZXRDYWxsQ291bnRCeVByb3NwZWN0IiwiY291bnQiLCJzYXZlQ2FsbERpc3Bvc2l0aW9uIiwicmVxdWVzdEJvZHkiLCJjYWxsU3RhdHVzRGlzcG9zaXRpb24iLCJkaXNwb3NpdGlvbkNhdGVnb3J5IiwicHJvc3BlY3RTdGF0dXMiLCJkaXNwb3NpdGlvbk5vdGVzIiwiY2FsbGJhY2tTY2hlZHVsZWRBdCIsImNhbGxJZCIsImNhbmNlbENhbGwiLCJFWE9URUxfQ09OVEVYVF9LRVkiLCJpbml0aWFsQ2FsbFN0YXRlIiwicGhhc2UiLCJpc09uSG9sZCIsImlzTXV0ZWQiLCJpc1NwZWFrZXJPZmYiLCJjYWxsRGlyZWN0aW9uIiwiY2FsbFN0YXJ0VGltZSIsImNhbGxEdXJhdGlvbiIsImNhbGxlck5hbWUiLCJjYWxsZXJOdW1iZXIiLCJjYWxsQWN0aXZpdHlJZCIsImV4b3RlbENhbGxTaWQiLCJwcm9zcGVjdFVuaXF1ZUlkIiwid2FzQWNjZXB0ZWQiLCJtYXNrTW9iaWxlIiwibW9iaWxlIiwicHJlZml4IiwibnVtYmVyIiwic3RhcnRzV2l0aCIsImNsZWFuZWQiLCJyZXBlYXQiLCJFeG90ZWxDb250ZXh0IiwiRXhvdGVsUHJvdmlkZXIiLCJkZWZhdWx0Q2FsbGVyTmFtZSIsImlzSW5pdGlhbGl6ZWQiLCJzZXRJc0luaXRpYWxpemVkIiwiaXNDb25uZWN0ZWQiLCJzZXRJc0Nvbm5lY3RlZCIsInNldFBlcm1pc3Npb25TdGF0dXMiLCJjYWxsU3RhdGUiLCJzZXRDYWxsU3RhdGUiLCJkaXNwb3NpdGlvbkRhdGEiLCJzZXREaXNwb3NpdGlvbkRhdGEiLCJ0aW1lclJlZiIsInVzZVJlZiIsImNhbGxTdGF0ZVJlZiIsImV4b3RlbFNlcnZpY2UiLCJzZXRJbnRlcnZhbCIsInByZXYiLCJmbG9vciIsImNsZWFySW50ZXJ2YWwiLCJyZXF1ZXN0UGVybWlzc2lvbiIsImNhdGNoIiwic3VjY2VzcyIsImluY29taW5nTnVtYmVyXzEiLCJjYWxsRnJvbU51bWJlciIsInJlbW90ZUlkIiwicmVtb3RlRGlzcGxheU5hbWUiLCJzZXNzaW9uSWQiLCJmcm9tTnVtYmVyIiwidG9OdW1iZXIiLCJwcm9zcGVjdE1vYmlsZSIsInByb3NwZWN0IiwidW5pcXVlSWQiLCJkaXNwb3NpdGlvbkRhdGFPYmoiLCJleG90ZWxDYWxsSWQiLCJ1c2VDYWxsYmFjayIsIm1hc2tlZE51bWJlciIsImVycm9yXzIiLCJ0b2dnbGVTcGVha2VyIiwiY2xlYXJEaXNwb3NpdGlvbiIsInNldENhbGxBY3Rpdml0eUlkRm4iLCJzZXRFeG90ZWxDYWxsU2lkRm4iLCJzZXRDYWxsQWN0aXZpdHlJZCIsInNldEV4b3RlbENhbGxTaWQiLCJ1c2VFeG90ZWwiLCJ1c2VDb250ZXh0IiwidXNlRXhvdGVsU2FmZSIsIkVYT1RFTF9DT05TVEFOVFMiLCJDQUxMX1NUQVRVU19PUFRJT05TIiwiQ09OTkVDVEVEX0RJU1BPU0lUSU9OUyIsIk5PVF9DT05ORUNURURfRElTUE9TSVRJT05TIiwiQ2FsbERpc3Bvc2l0aW9uRm9ybSIsIm9uU2F2ZSIsImV4aXN0aW5nRGF0YSIsInVzZVF1ZXJ5Q2xpZW50IiwiaXNFZGl0TW9kZSIsImNhbGxTdGF0dXMiLCJzZXRDYWxsU3RhdHVzIiwic2V0RGlzcG9zaXRpb25DYXRlZ29yeSIsInJlbWFya3MiLCJzZXRSZW1hcmtzIiwiaW52YWxpZGF0ZVF1ZXJpZXMiLCJoYW5kbGVDYWxsU3RhdHVzQ2hhbmdlIiwiaGFuZGxlRGlzcG9zaXRpb25DaGFuZ2UiLCJzdWJtaXREYXRhIiwiY2hhbm5lbCIsImRpcmVjdGlvbiIsImR1cmF0aW9uIiwiZGlzcG9zaXRpb25PcHRpb25zIiwibWF4V2lkdGgiLCJUeXBvZ3JhcGh5Iiwic2Vjb25kcyIsIm1pbnMiLCJzZWNzIiwiUmFkaW9Hcm91cCIsIlRleHRhcmVhIiwicm93cyIsIkV4b3RlbFBob25lIiwicHJvc3BlY3ROYW1lIiwicHJvc3BlY3ROdW1iZXIiLCJvblNhdmVEaXNwb3NpdGlvbiIsImlzQWNjZXB0aW5nIiwic2V0SXNBY2NlcHRpbmciLCJpc0RlY2xpbmluZyIsInNldElzRGVjbGluaW5nIiwiZGVjbGluZVRpbWVvdXRSZWYiLCJzdHlsZUlkIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInN0eWxlRWwiLCJ0ZXh0Q29udGVudCIsImhlYWQiLCJhcHBlbmRDaGlsZCIsInNka0NhbGxlck5hbWUiLCJzZGtDYWxsZXJOdW1iZXIiLCJkaXNwbGF5TmFtZSIsImRpc3BsYXlOdW1iZXIiLCJoYW5kbGVEZWNsaW5lQ2FsbCIsImNhbGxTaWRGb3JBcGkiLCJyZWFzb24iLCJjbGVhclRpbWVvdXQiLCJmaW5hbENhbGxlck5hbWUiLCJlbnJpY2hlZERpc3Bvc2l0aW9uRGF0YSIsImlzT3V0Ym91bmQiLCJpc0luYm91bmQiLCJhdmF0YXJCZ0NvbG9yIiwiZ2V0Q29ubmVjdGluZ1RleHQiLCJtb2RhbENvbnRlbnQiLCJzdHlsZSIsInpJbmRleCIsImJvcmRlclJhZGl1cyIsImJvcmRlciIsInN0b3BQcm9wYWdhdGlvbiIsIlgiLCJQaG9uZU91dGdvaW5nIiwiUGhvbmVJbmNvbWluZyIsIlBob25lIiwicGFkU3RhcnQiLCJnZXRTdGF0dXNUZXh0IiwiTWljT2ZmIiwiTWljIiwiUGxheSIsIlBhdXNlIiwiVm9sdW1lWCIsIlZvbHVtZTIiLCJQaG9uZU9mZiIsImJhY2tncm91bmRDb2xvciIsImNyZWF0ZVBvcnRhbCIsIkNyeXB0b1NlcnZpY2UiLCJhbGdvcml0aG0iLCJzZWNyZXRLZXkiLCJpbml0aWFsaXplZCIsImVuc3VyZUluaXRpYWxpemVkIiwia2V5QnVmZmVyIiwiVGV4dEVuY29kZXIiLCJlbmNvZGUiLCJzYWx0QnVmZmVyIiwic3luY1NjcnlwdCIsImRlY3J5cHREYXRhIiwiZW5jcnlwdGVkRGF0YSIsIml2SGV4IiwiZW5jcnlwdGVkIiwiY3J5cHRvXzEiLCJyZXF1aXJlIiwiaXYiLCJCdWZmZXIiLCJkZWNpcGhlciIsImNyZWF0ZURlY2lwaGVyaXYiLCJkZWNyeXB0ZWQiLCJmaW5hbCIsIkNhbGxCdXR0b24iLCJlbmNyeXB0ZWRQaG9uZU51bWJlciIsImV4b3RlbCIsImlzRGlhbGluZyIsInNldElzRGlhbGluZyIsInNldEVycm9yIiwiaXNDYWxsSW5Qcm9ncmVzcyIsImhhc1Bob25lTnVtYmVyIiwiYWN0dWFsUGhvbmVOdW1iZXIiLCJzZGtSZXNwb25zZSIsImVycl8xIiwiZXJyb3JNZXNzYWdlIiwiZXJyb3JEZXRhaWxzIiwiZGVzY3JpcHRpb24iLCJDYWxsU2lkIiwiQ29kZSIsIlN0YXR1cyIsInBhcnNlRXJyIiwiZXJyb3JfZGF0YSIsIk1pY3JvcGhvbmVQZXJtaXNzaW9uIiwib25QZXJtaXNzaW9uR3JhbnRlZCIsIm9uUGVybWlzc2lvbkRlbmllZCIsImlzUmVxdWVzdGluZyIsInNldElzUmVxdWVzdGluZyIsIkFsZXJ0Q2lyY2xlIiwiRXhvdGVsV3JhcHBlciIsInNldEFjY2Vzc1Rva2VuIiwic2V0SXNMb2FkaW5nIiwiVm9JUFByb3ZpZGVyIiwiaXNXb3Jrc3BhY2VWb0lQRW5hYmxlZCIsImhhc0FnZW50VXNlcklkIiwiaGFuZGxlU2F2ZURpc3Bvc2l0aW9uIiwiZGlzcG9zaXRpb25SZWFzb24iXSwibWFwcGluZ3MiOiJvNUNBK0JPLElBQUlBLEdBQVcsV0FRbEIsT0FQQUEsR0FBV0MsT0FBT0MsUUFBVSxTQUFrQkMsR0FDMUMsSUFBSyxJQUFJQyxFQUFHQyxFQUFJLEVBQUdDLEVBQUlDLFVBQVVDLE9BQVFILEVBQUlDLEVBQUdELElBRTVDLElBQUssSUFBSUksS0FEVEwsRUFBSUcsVUFBVUYsR0FDT0osT0FBT1MsVUFBVUMsZUFBZUMsS0FBS1IsRUFBR0ssS0FBSU4sRUFBRU0sR0FBS0wsRUFBRUssSUFFOUUsT0FBT04sQ0FDWCxFQUNPSCxHQUFTYSxNQUFNQyxLQUFNUCxVQUNoQyxFQTBFTyxTQUFTUSxHQUFVQyxFQUFTQyxFQUFZQyxFQUFHQyxHQUU5QyxPQUFPLElBQUtELElBQU1BLEVBQUlFLFVBQVUsU0FBVUMsRUFBU0MsR0FDL0MsU0FBU0MsRUFBVUMsR0FBUyxJQUFNQyxFQUFLTixFQUFVTyxLQUFLRixHQUFTLENBQUUsTUFBT0csR0FBS0wsRUFBT0ssRUFBSSxDQUFFLENBQzFGLFNBQVNDLEVBQVNKLEdBQVMsSUFBTUMsRUFBS04sRUFBaUIsTUFBRUssR0FBUyxDQUFFLE1BQU9HLEdBQUtMLEVBQU9LLEVBQUksQ0FBRSxDQUM3RixTQUFTRixFQUFLSSxHQUpsQixJQUFlTCxFQUlhSyxFQUFPQyxLQUFPVCxFQUFRUSxFQUFPTCxRQUoxQ0EsRUFJeURLLEVBQU9MLE1BSmhEQSxhQUFpQk4sRUFBSU0sRUFBUSxJQUFJTixFQUFFLFNBQVVHLEdBQVdBLEVBQVFHLEVBQVEsSUFJakJPLEtBQUtSLEVBQVdLLEVBQVcs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
|
|
1
|
+
import e from"axios";import t from"js-cookie";import{Store as n}from"pullstate";import r from"crypto-js";import{jsxs as o,jsx as i,Fragment as a}from"react/jsx-runtime";import{ConfirmDialog as s,Icons as c,TextField as l,PasswordField as u,Button as d,ResourceNotFound as p,InternalServerError as f,NoInterneConnection as h,UnAuthorized as m,Dialog as v,Snackbar as b,MultiSelect as y,SingleSelect as g,Typography as w,RadioGroup as _,Textarea as N}from"@campxdev/react-blueprint";import*as E from"react";import{createContext as x,useState as k,useEffect as S,useRef as O,useCallback as C,useContext as D}from"react";import{useMutation as P,QueryErrorResetBoundary as I,QueryClient as A,QueryClientProvider as j,useQueryClient as T}from"react-query";import{useNavigate as L,useLocation as V,BrowserRouter as M}from"react-router-dom";export{BrowserRouter}from"react-router-dom";import{validateFieldsNatively as R,toNestError as K}from"@hookform/resolvers";import{appendErrors as F,useForm as z,Controller as U}from"react-hook-form";import q from"device-detector-js";import*as $ from"yup";import{Provider as B}from"react-redux";import W from"@exotel-npm-dev/exotel-ip-calling-crm-websdk";import{X as H,PhoneOutgoing as Y,PhoneIncoming as X,Phone as J,MicOff as G,Mic as Q,Play as Z,Pause as ee,VolumeX as te,Volume2 as ne,PhoneOff as re,AlertCircle as oe}from"lucide-react";import{createPortal as ie}from"react-dom";import{syncScrypt as ae}from"scrypt-js";var se=function(){return se=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},se.apply(this,arguments)};function ce(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 le(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"==typeof SuppressedError&&SuppressedError;var ue={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},de=new n(ue);function pe(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function fe(e,t){var n={clientId:e,iat:Math.floor(Date.now()/1e3)},o=pe(btoa(JSON.stringify(n))),i=r.HmacSHA256(o,t),a=pe(r.enc.Base64.stringify(i));return"".concat(o,".").concat(a)}var he=window.location.hostname.includes("localhost"),me=window.location.hostname.split(".")[0],ve=window.location.pathname.split("/")[1],be=window.location.pathname.split("/")[2],ye={"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","external-expert-workspace":"external-expert-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","admissions-director-workspace":"/admissions-director-api"},ge=e.create({baseURL:process.env.REACT_APP_API_HOST||"",withCredentials:!0,headers:{"x-tenant-id":me,"x-institution-code":ve}});function we(e,t,n){return n.reduce(function(n,r){var o=e[r];return o&&(n[r]=se({singleton:!0,requiredVersion:o,version:o.replace(/^[\^~]/,"")},t.includes(r)?{eager:!0}:{})),n},{})}ge.interceptors.request.use(function(e){var n=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&&be&&ye[be]&&"common-workspace"!==be){var r=ye[be];e.url="".concat(r).concat(e.url)}var o=t.get("campx_session_key"),i=t.get("campx_open_payments_key"),a=t.get("campx_student_key");he&&o&&e.headers.set("campx_session_key",o),he&&a&&e.headers.set("campx_student_key",a),i&&e.headers.set("campx_open_payments_key",i);var s=process.env.REACT_APP_CLIENT_ID,c=process.env.REACT_APP_CAMPX_CLIENT_SECRET;return s&&c&&e.headers.set("x-campx-client",fe(s,c)),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),se(se({},e),{params:n})},function(e){return Promise.reject(e)}),ge.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)&&de.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)&&de.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)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var _e=e.create({baseURL:process.env.REACT_APP_API_HOST||"",withCredentials:!0,workspace:!1,headers:{"x-tenant-id":me,"x-institution-code":ve}});_e.interceptors.request.use(function(e){var n=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),r=t.get("campx_session_key"),o=t.get("campx_open_payments_key"),i=t.get("campx_student_key");he&&r&&e.headers.set("campx_session_key",r),he&&i&&e.headers.set("campx_student_key",i),o&&e.headers.set("campx_open_payments_key",o);var a=process.env.REACT_APP_CLIENT_ID,s=process.env.REACT_APP_CAMPX_CLIENT_SECRET;return a&&s&&e.headers.set("x-campx-client",fe(a,s)),e.skipInstitutionCode&&e.headers.delete("x-institution-code"),se(se({},e),{params:n})},function(e){return Promise.reject(e)}),_e.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)&&de.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)&&de.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)&&de.update(function(t){t.snackbar.open=!0,t.snackbar.message=e.response.data.message||"Not Found",t.snackbar.severity="error"}),Promise.reject(e)});var Ne=["admissions-director-workspace","admissions-counsellor-workspace","admissions-officer-workspace","tele-counsellor-workspace"];function Ee(e){return Ne.includes(e)}var xe=x({showConfirmDialog:function(){}}),ke=function(e){var t=e.children,n=de.useState(function(e){return e.confirmDialog}),r=function(){de.update(function(e){e.confirmDialog.isOpen=!1})};return o(xe.Provider,{value:{showConfirmDialog:function(e,t,n,r,o,i,a){void 0===o&&(o="confirm"),de.update(function(s){s.confirmDialog={isOpen:!0,title:e,message:t,onConfirm:n,onCancel:r,type:o,confirmButtonText:i,cancelButtonText:a}})}},children:[t,i(s,{open:n.isOpen,title:n.title,message:n.message,variant:n.type,confirmText:n.confirmButtonText,cancelText:n.cancelButtonText,onConfirm:function(){n.onConfirm(),r()},onClose:function(){n.onCancel(),r()}})]})};function Se(e,t){return Se=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Se(e,t)}var Oe={error:null},Ce=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=Oe,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,Se(e,t)}(t,e),t.getDerivedStateFromError=function(e){return{error:e}};var n=t.prototype;return n.reset=function(){this.setState(Oe)},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(E.isValidElement(o))return o;if("function"==typeof n)return n(i);if(r)return E.createElement(r,i);throw new Error("react-error-boundary requires either a fallback, fallbackRender, or FallbackComponent prop")}return this.props.children},t}(E.Component),De=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&&R({},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:K((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]=F(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)}}},Pe=function(e){return ce(void 0,void 0,void 0,function(){var t;return le(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,ge.post("/auth-server/auth-v2/login",e,{workspace:!1}).then(function(e){return e.data})]}})})},Ie=$.object().shape({username:$.string().required("Username is required"),password:$.string().required("Password is required")}),Ae=function(e){var n=e.close,r=k({deviceInformation:{deviceType:"browser",clientName:"unknown",os:"unknown",osVersion:"unknown",latitude:null,longitude:null,tokenType:"WEB"},isLocationAllowed:!0}),a=r[0],s=r[1],p=L();S(function(){navigator.geolocation.getCurrentPosition(function(e){s(function(t){return se(se({},t),{deviceInformation:se(se({},t.deviceInformation),{latitude:e.coords.latitude,longitude:e.coords.longitude})})})}),navigator.permissions.query({name:"geolocation"}).then(function(e){"denied"===e.state&&s(function(e){return se(se({},e),{isLocationAllowed:!1})})});var e=(new q).parse(navigator.userAgent);s(function(t){var n,r,o;return se(se({},t),{deviceInformation:se(se({},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 f=z({resolver:De(Ie)}),h=f.handleSubmit,m=f.control,v=f.formState.errors,b=P(Pe,{onSuccess:function(e){he&&(t.remove("campx_session_key"),t.set("campx_session_key",e.session.token),n(),p("/".concat(e.session.institutionCode,"/workspace")),window.location.reload())}}),y=b.mutate,g=b.isLoading;return o("div",{className:"flex flex-col gap-8 justify-center items-center p-8",children:[i("div",{className:"flex items-center justify-center h-9 w-48",children:i(c.CampxFullLogoIcon,{})}),o("div",{className:"flex flex-col gap-4 w-full max-w-[400px]",children:[i(U,{control:m,render:function(e){var t=e.field;return i(l,{name:"username",placeholder:"Enter Username or Email",onChange:t.onChange,label:"Username or Email",error:!!v.username,required:!0,fullWidth:!0})},name:"username"}),i(U,{control:m,render:function(e){var t=e.field;return i(u,{name:"password",placeholder:"Enter password",onChange:t.onChange,label:"Password",error:!!v.password,required:!0,fullWidth:!0})},name:"password"}),i(d,{type:"submit",color:"primary",variant:"default",onClick:h(function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){return y(se(se(se({},e),a.deviceInformation),{loginId:e.username,loginType:"USER"})),[2]})})}),disabled:g,loading:g,fullWidth:!0,children:"Login"})]})]})},je=function(e){var t=V();return i(I,{children:function(n){var r=n.reset;return i(Ce,{onReset:r,FallbackComponent:Te,children:e.children},null==t?void 0:t.pathname)}})},Te=function(e){var t,n,r,a,s,c,l,u=e.error,m=e.resetErrorBoundary;if(null===(t=null==u?void 0:u.response)||void 0===t?void 0:t.status)switch(null===(n=null==u?void 0:u.response)||void 0===n?void 0:n.status){case 401:return i(Le,{});case 500:return i(f,{resetBoundary:m});case 404:return i(p,{message:null===(a=null===(r=null==u?void 0:u.response)||void 0===r?void 0:r.data)||void 0===a?void 0:a.message})}return"ERR_NETWORK"===(null==u?void 0:u.code)?i(h,{resetBoundary:m}):i("div",{className:"mt-4 p-5",children:o("div",{className:"relative h-15 border border-red-200 bg-red-50 flex items-center rounded-md px-2",children:[i("div",{className:"flex-1 text-red-700 bg-transparent",children:null!==(l=null===(c=null===(s=null==u?void 0:u.response)||void 0===s?void 0:s.data)||void 0===c?void 0:c.message)&&void 0!==l?l:null==u?void 0:u.message}),i(d,{onClick:function(){return m()},size:"sm",variant:"link",className:"hover:no-underline text-destructive",children:"Try Again"})]})})},Le=function(){var e=L(),n=k(!1),r=n[0],s=n[1],c=t.get("campx_session_key");return i(m,{component:o(a,{children:[i(d,{className:"mt-5",variant:"default",onClick:function(){"localhost"===window.location.hostname.split(".")[1]?s(!0):c||e("prospect-workspace"===be?"".concat(ve,"/ats/login"):"/auth/login")},children:"Click Here To Login"}),i(v,{open:r,onClose:function(){return s(!1)},content:function(e){var t=e.close;return i(Ae,{close:t})}})]})})};function Ve(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 Me=(()=>"function"==typeof Symbol&&Symbol.observable||"@@observable")(),Re=()=>Math.random().toString(36).substring(7).split("").join("."),Ke={INIT:`@@redux/INIT${Re()}`,REPLACE:`@@redux/REPLACE${Re()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${Re()}`};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 ze(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 Ue(e){let t=typeof e;return"production"!==process.env.NODE_ENV&&(t=ze(e)),t}function qe(e,t,n){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?Ve(2):`Expected the root reducer to be a function. Instead, received: '${Ue(e)}'`);if("function"==typeof t&&"function"==typeof n||"function"==typeof n&&"function"==typeof arguments[3])throw new Error("production"===process.env.NODE_ENV?Ve(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?Ve(1):`Expected the enhancer to be a function. Instead, received: '${Ue(n)}'`);return n(qe)(e,t)}let r=e,o=t,i=new Map,a=i,s=0,c=!1;function l(){a===i&&(a=new Map,i.forEach((e,t)=>{a.set(t,e)}))}function u(){if(c)throw new Error("production"===process.env.NODE_ENV?Ve(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?Ve(4):`Expected the listener to be a function. Instead, received: '${Ue(e)}'`);if(c)throw new Error("production"===process.env.NODE_ENV?Ve(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;l();const n=s++;return a.set(n,e),function(){if(t){if(c)throw new Error("production"===process.env.NODE_ENV?Ve(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,l(),a.delete(n),i=null}}}function p(e){if(!Fe(e))throw new Error("production"===process.env.NODE_ENV?Ve(7):`Actions must be plain objects. Instead, the actual type was: '${Ue(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?Ve(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?Ve(17):`Action "type" property must be a string. Instead, the actual type was: '${Ue(e.type)}'. Value was: '${e.type}' (stringified)`);if(c)throw new Error("production"===process.env.NODE_ENV?Ve(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:Ke.INIT});return{dispatch:p,subscribe:d,getState:u,replaceReducer:function(e){if("function"!=typeof e)throw new Error("production"===process.env.NODE_ENV?Ve(10):`Expected the nextReducer to be a function. Instead, received: '${Ue(e)}`);r=e,p({type:Ke.REPLACE})},[Me]:function(){const e=d;return{subscribe(t){if("object"!=typeof t||null===t)throw new Error("production"===process.env.NODE_ENV?Ve(11):`Expected the observer to be an object. Instead, received: '${Ue(t)}'`);function n(){const e=t;e.next&&e.next(u())}n();return{unsubscribe:e(n)}},[Me](){return this}}}}}function $e(e){"undefined"!=typeof console&&console.error;try{throw new Error(e)}catch(e){}}function Be(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]&&$e(`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:Ke.INIT}))throw new Error("production"===process.env.NODE_ENV?Ve(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:Ke.PROBE_UNKNOWN_ACTION()}))throw new Error("production"===process.env.NODE_ENV?Ve(13):`The slice reducer for key "${t}" returned undefined when probed with a random type. Don't try to handle '${Ke.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===Ke.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 "${Ue(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===Ke.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&&$e(r)}let a=!1;const s={};for(let o=0;o<r.length;o++){const i=r[o],c=n[i],l=e[i],u=c(l,t);if(void 0===u){const e=t&&t.type;throw new Error("production"===process.env.NODE_ENV?Ve(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]=u,a=a||u!==l}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 He=Symbol.for("immer-nothing"),Ye=Symbol.for("immer-draftable"),Xe=Symbol.for("immer-state"),Je="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 Ge(e,...t){if("production"!==process.env.NODE_ENV){const n=Je[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 Qe=Object.getPrototypeOf;function Ze(e){return!!e&&!!e[Xe]}function et(e){return!!e&&(rt(e)||Array.isArray(e)||!!e[Ye]||!!e.constructor?.[Ye]||ct(e)||lt(e))}var tt=Object.prototype.constructor.toString(),nt=new WeakMap;function rt(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=nt.get(n);return void 0===r&&(r=Function.toString.call(n),nt.set(n,r)),r===tt}function ot(e,t,n=!0){if(0===it(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 it(e){const t=e[Xe];return t?t.type_:Array.isArray(e)?1:ct(e)?2:lt(e)?3:0}function at(e,t){return 2===it(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function st(e,t,n){const r=it(e);2===r?e.set(t,n):3===r?e.add(n):e[t]=n}function ct(e){return e instanceof Map}function lt(e){return e instanceof Set}function ut(e){return e.copy_||e.base_}function dt(e,t){if(ct(e))return new Map(e);if(lt(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const n=rt(e);if(!0===t||"class_only"===t&&!n){const t=Object.getOwnPropertyDescriptors(e);delete t[Xe];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(Qe(e),t)}{const t=Qe(e);if(null!==t&&n)return{...e};const r=Object.create(t);return Object.assign(r,e)}}function pt(e,t=!1){return ht(e)||Ze(e)||!et(e)||(it(e)>1&&Object.defineProperties(e,{set:ft,add:ft,clear:ft,delete:ft}),Object.freeze(e),t&&Object.values(e).forEach(e=>pt(e,!0))),e}var ft={value:function(){Ge(2)}};function ht(e){return null===e||"object"!=typeof e||Object.isFrozen(e)}var mt,vt={};function bt(e){const t=vt[e];return t||Ge(0,e),t}function yt(){return mt}function gt(e,t){t&&(bt("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function wt(e){_t(e),e.drafts_.forEach(Et),e.drafts_=null}function _t(e){e===mt&&(mt=e.parent_)}function Nt(e){return mt={drafts_:[],parent_:mt,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Et(e){const t=e[Xe];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function xt(e,t){t.unfinalizedDrafts_=t.drafts_.length;const n=t.drafts_[0];return void 0!==e&&e!==n?(n[Xe].modified_&&(wt(t),Ge(4)),et(e)&&(e=kt(t,e),t.parent_||Ot(t,e)),t.patches_&&bt("Patches").generateReplacementPatches_(n[Xe].base_,e,t.patches_,t.inversePatches_)):e=kt(t,n,[]),wt(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==He?e:void 0}function kt(e,t,n){if(ht(t))return t;const r=e.immer_.shouldUseStrictIteration(),o=t[Xe];if(!o)return ot(t,(r,i)=>St(e,o,t,r,i,n),r),t;if(o.scope_!==e)return t;if(!o.modified_)return Ot(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),ot(i,(r,i)=>St(e,o,t,r,i,n,a),r),Ot(e,t,!1),n&&e.patches_&&bt("Patches").generatePatches_(o,n,e.patches_,e.inversePatches_)}return o.copy_}function St(e,t,n,r,o,i,a){if(null==o)return;if("object"!=typeof o&&!a)return;const s=ht(o);if(!s||a){if("production"!==process.env.NODE_ENV&&o===n&&Ge(5),Ze(o)){const a=kt(e,o,i&&t&&3!==t.type_&&!at(t.assigned_,r)?i.concat(r):void 0);if(st(n,r,a),!Ze(a))return;e.canAutoFreeze_=!1}else a&&n.add(o);if(et(o)&&!s){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;if(t&&t.base_&&t.base_[r]===o&&s)return;kt(e,o),t&&t.scope_.parent_||"symbol"==typeof r||!(ct(n)?n.has(r):Object.prototype.propertyIsEnumerable.call(n,r))||Ot(e,o)}}}function Ot(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&pt(t,n)}var Ct={get(e,t){if(t===Xe)return e;const n=ut(e);if(!at(n,t))return function(e,t,n){const r=It(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_||!et(r)?r:r===Pt(e.base_,t)?(jt(e),e.copy_[t]=Tt(r,e)):r},has:(e,t)=>t in ut(e),ownKeys:e=>Reflect.ownKeys(ut(e)),set(e,t,n){const r=It(ut(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){const r=Pt(ut(e),t),a=r?.[Xe];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||at(e.base_,t)))return!0;jt(e),At(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!==Pt(e.base_,t)||t in e.base_?(e.assigned_[t]=!1,jt(e),At(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=ut(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{writable:!0,configurable:1!==e.type_||"length"!==t,enumerable:r.enumerable,value:n[t]}:r},defineProperty(){Ge(11)},getPrototypeOf:e=>Qe(e.base_),setPrototypeOf(){Ge(12)}},Dt={};function Pt(e,t){const n=e[Xe];return(n?ut(n):e)[t]}function It(e,t){if(!(t in e))return;let n=Qe(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=Qe(n)}}function At(e){e.modified_||(e.modified_=!0,e.parent_&&At(e.parent_))}function jt(e){e.copy_||(e.copy_=dt(e.base_,e.scope_.immer_.useStrictShallowCopy_))}ot(Ct,(e,t)=>{Dt[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}}),Dt.deleteProperty=function(e,t){return"production"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&Ge(13),Dt.set.call(this,e,t,void 0)},Dt.set=function(e,t,n){return"production"!==process.env.NODE_ENV&&"length"!==t&&isNaN(parseInt(t))&&Ge(14),Ct.set.call(this,e[0],t,n,e[0])};function Tt(e,t){const n=ct(e)?bt("MapSet").proxyMap_(e,t):lt(e)?bt("MapSet").proxySet_(e,t):function(e,t){const n=Array.isArray(e),r={type_:n?1:0,scope_:t?t.scope_:yt(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let o=r,i=Ct;n&&(o=[r],i=Dt);const{revoke:a,proxy:s}=Proxy.revocable(o,i);return r.draft_=s,r.revoke_=a,s}(e,t);return(t?t.scope_:yt()).drafts_.push(n),n}function Lt(e){if(!et(e)||ht(e))return e;const t=e[Xe];let n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=dt(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=dt(e,!0);return ot(n,(e,t)=>{st(n,e,Lt(t))},r),t&&(t.finalized_=!1),n}var Vt=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&&Ge(6),void 0!==n&&"function"!=typeof n&&Ge(7),et(e)){const o=Nt(this),i=Tt(e,void 0);let a=!0;try{r=t(i),a=!1}finally{a?wt(o):_t(o)}return gt(o,n),xt(r,o)}if(!e||"object"!=typeof e){if(r=t(e),void 0===r&&(r=e),r===He&&(r=void 0),this.autoFreeze_&&pt(r,!0),n){const t=[],o=[];bt("Patches").generateReplacementPatches_(e,r,t,o),n(t,o)}return r}Ge(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){et(e)||Ge(8),Ze(e)&&(e=function(e){Ze(e)||Ge(10,e);return Lt(e)}(e));const t=Nt(this),n=Tt(e,void 0);return n[Xe].isManual_=!0,_t(t),n}finishDraft(e,t){const n=e&&e[Xe];n&&n.isManual_||Ge(9);const{scope_:r}=n;return gt(r,t),xt(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=bt("Patches").applyPatches_;return Ze(e)?r(e,t):this.produce(e,e=>r(e,t))}};Vt.produce;var Mt=Vt.setUseStrictIteration.bind(Vt);function Rt(e){return({dispatch:t,getState:n})=>r=>o=>"function"==typeof o?o(t,n,e):r(o)}var Kt=Rt(),Ft=Rt,zt="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 Ut(e){return"function"==typeof e&&"type"in e&&((t=e)&&"function"==typeof t.match);var t}function qt(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 $t=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 Bt(e){return"object"!=typeof e||null==e||Object.isFrozen(e)}function Wt(e,t,n){const r=Ht(e,t,n);return{detectMutations:()=>Yt(e,t,r,n)}}function Ht(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]=Ht(e,t,n[o],a))}}return i}function Yt(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 l=t.length>0;for(let o in c){const a=i?i+"."+o:o;if(l){if(t.some(e=>e instanceof RegExp?e.test(a):a===e))continue}const c=Yt(e,t,n.children[o],r[o],s,a);if(c.wasMutated)return c}return{wasMutated:!1}}function Xt(e){const t=typeof e;return null==e||"string"===t||"boolean"===t||"number"===t||Array.isArray(e)||Fe(e)}function Jt(e,t="",n=Xt,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,l]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(l))return{keyPath:s,value:l};if("object"==typeof l&&(a=Jt(l,s,n,r,o,i),a))return a}return i&&Gt(e)&&i.add(e),!1}function Gt(e){if(!Object.isFrozen(e))return!1;for(const t of Object.values(e))if("object"==typeof t&&null!==t&&!Gt(t))return!1;return!0}function Qt(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);{const{isSerializable:t=Xt,getEntries:n,ignoredActions:r=[],ignoredActionPaths:o=["meta.arg","meta.baseQueryMeta"],ignoredPaths:i=[],warnAfter:a=32,ignoreState:s=!1,ignoreActions:c=!1,disableCache:l=!1}=e,u=!l&&WeakSet?new WeakSet:void 0;return e=>a=>l=>{if(!function(e){return Fe(e)&&"type"in e&&"string"==typeof e.type}(l))return a(l);const d=a(l),p=qt();return c||r.length&&-1!==r.indexOf(l.type)||p.measureTime(()=>{const e=Jt(l,"",t,n,o,u);if(e){const{keyPath:t,value:n}=e}}),s||(p.measureTime(()=>{const r=Jt(e.getState(),"",t,n,i,u);if(r){const{keyPath:e,value:t}=r}}),p.warnIfExceeded()),d}}}function Zt(e){return"boolean"==typeof e}var en=()=>function(e){const{thunk:t=!0,immutableCheck:n=!0,serializableCheck:r=!0,actionCreatorCheck:o=!0}=e??{};let i=new $t;if(t&&(Zt(t)?i.push(Kt):i.push(Ft(t.extraArgument))),"production"!==process.env.NODE_ENV){if(n){let e={};Zt(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=Bt,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=qt();c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?on(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 l=i(s);return c.measureTime(()=>{if(r=e(),n=o.detectMutations(),o=a(r),n.wasMutated)throw new Error("production"===process.env.NODE_ENV?on(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(),l}}}}(e))}if(r){let e={};Zt(r)||(e=r),i.push(Qt(e))}if(o){let e={};Zt(o)||(e=o),i.unshift(function(e={}){if("production"===process.env.NODE_ENV)return()=>e=>t=>e(t);const{isActionCreator:t=Ut}=e;return()=>e=>n=>(t(n),e(n))}(e))}}return i},tn=e=>t=>{setTimeout(t,e)},nn=e=>function(t){const{autoBatch:n=!0}=t??{};let r=new $t(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:tn(10):"callback"===e.type?e.queueNotification:tn(e.timeout),l=()=>{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(l))),r.dispatch(e)}finally{o=!0}}})})("object"==typeof n?n:void 0)),r};function rn(e){const t=en(),{reducer:n,middleware:r,devTools:o=!0,duplicateMiddlewareCheck:i=!0,preloadedState:a,enhancers:s}=e||{};let c,l;if("function"==typeof n)c=n;else{if(!Fe(n))throw new Error("production"===process.env.NODE_ENV?on(1):"`reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers");c=Be(n)}if("production"!==process.env.NODE_ENV&&r&&"function"!=typeof r)throw new Error("production"===process.env.NODE_ENV?on(2):"`middleware` field must be a callback");if("function"==typeof r){if(l=r(t),"production"!==process.env.NODE_ENV&&!Array.isArray(l))throw new Error("production"===process.env.NODE_ENV?on(3):"when using a middleware builder function, an array of middleware must be returned")}else l=t();if("production"!==process.env.NODE_ENV&&l.some(e=>"function"!=typeof e))throw new Error("production"===process.env.NODE_ENV?on(4):"each middleware provided to configureStore must be a function");if("production"!==process.env.NODE_ENV&&i){let e=new Set;l.forEach(t=>{if(e.has(t))throw new Error("production"===process.env.NODE_ENV?on(42):"Duplicate middleware references found when creating the store. Ensure that each middleware is only included once.");e.add(t)})}let u=We;o&&(u=zt({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?Ve(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}}}(...l),p=nn(d);if("production"!==process.env.NODE_ENV&&s&&"function"!=typeof s)throw new Error("production"===process.env.NODE_ENV?on(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?on(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?on(7):"each enhancer provided to configureStore must be a function");"production"!==process.env.NODE_ENV&&l.length&&f.includes(d);return qe(c,a,u(...f))}function on(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. `}Mt(!1);var an=x(void 0),sn=function(e){var t=e.children,n=de.useState(function(e){return e.snackbar});return o(an.Provider,{value:{showSnackbar:function(e,t){void 0===t&&(t="info"),de.update(function(n){n.snackbar.open=!0,n.snackbar.message=e,n.snackbar.severity=t})}},children:[t,i(b,{open:n.open,message:n.message,severity:n.severity,autoHideDuration:1500,onClose:function(){de.update(function(e){e.snackbar.open=!1})}})]})},cn=function(e){var t=e.children,n=e.basename,r=e.reducers,o=void 0===r?{}:r,a=new A({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:!1,useErrorBoundary:!0}}}),s=me&&ve&&be?"/".concat(ve,"/").concat(be):"/";S(function(){"/"===window.location.pathname&&ve&&be&&me&&window.location.replace(window.location.origin+"/".concat(ve,"/").concat(be))},[ve,me,be]);var c=rn({reducer:Be(o)});return i(B,{store:c,children:i(M,{basename:null!=n?n:s,children:i(j,{client:a,children:i(sn,{children:i(ke,{children:t})})})})})},ln={isOpen:!1,title:"",message:"",confirmButtonText:"",cancelButtonText:"",type:"confirm",onConfirm:function(){},onCancel:function(){}},un=function(){var e=function(){de.update(function(e){e.confirmDialog=ln})};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){de.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()}}})})}},dn=function(e){return i(y,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"_id",isObjectId:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/departments"}))},pn=function(e){return i(y,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"id",isInt:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/departments-sql"}))},fn=function(e){return i(g,se({label:"Batch"},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/batches"}))},hn=function(e){return i(g,se({dbLabelProps:{labelKey:"courseName",subLabelKey:"level"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/courses"}))},mn=function(e){return i(g,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0},dbValueProps:{valueKey:"_id",isObjectId:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/departments"}))},vn=function(e){return i(g,se({dbValueProps:{valueKey:"_id",isObjectId:!0},dbLabelProps:{labelKey:"fullName",subLabelKey:"employeeId"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/employees"}))},bn=function(e){return i(g,se({label:"Regulation"},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/exam-regulations",dbLabelProps:{labelKey:"r.name"},dbValueProps:{valueKey:"r.name"}}))},yn=[{label:"All",value:null},{label:"REGULAR",value:"R"},{label:"SUPPLEMENTARY",value:"S"}],gn=function(e){return i(g,se({label:"Exam Type",options:yn},e))},wn=[{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"}],_n=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 Nn=function(e){return i(g,se({label:"Fee Type",options:null==wn?void 0:wn.map(function(e){return{label:e.label,value:e.value}})},e))},En=function(e){return i(g,se({dbValueProps:{valueKey:"id",isInt:!0},dbLabelProps:{labelKey:"name",subLabelKey:"type",useLabelStartCase:!0,useSubLabelStartCase:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/hostel-blocks"}))},xn=function(e){return i(g,se({label:"Hostel Room No.",dbValueProps:{valueKey:"floor"},dbLabelProps:{labelKey:"floor"}},e,{externalAxios:_e,optionsApiEndPoint:"dropdowns/floors"}))},kn=function(e){return i(g,se({label:"Hostel Room",dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"room_number",useLabelStartCase:!0}},e,{optionsApiEndPoint:"dropdowns/hostel-rooms",externalAxios:_e}))},Sn=function(e){return i(g,se({label:"Month & Year"},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/month-years"}))},On=function(e){return i(g,se({dbLabelProps:{labelKey:"name",subLabelKey:"type",useSubLabelStartCase:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/print-formats"}))},Cn=function(e){return i(g,se({dbLabelProps:{labelKey:"branchCode",subLabelKey:"branchDisplay"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/programs"}))},Dn=function(e){return i(g,se({label:"Regulation",dbValueProps:{valueKey:"regulation_id"},dbLabelProps:{labelKey:"r.name"}},e,{optionsApiEndPoint:"dropdowns/regulations",externalAxios:_e}))},Pn=function(e){return i(g,se({dbLabelProps:{labelKey:"name"},dbValueProps:{valueKey:"id",isInt:!0}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/research-expert-designations"}))},In=function(e){return i(g,se({dbValueProps:{valueKey:"id"},dbLabelProps:{labelKey:"name",subLabelKey:"type"}},e,{optionsApiEndPoint:"dropdowns/research-experts",externalAxios:_e}))},An=function(e){return i(g,se({dbValueProps:{valueKey:"id",isInt:!0},dbLabelProps:{labelKey:"name",subLabelKey:"`order`"}},e,{optionsApiEndPoint:"dropdowns/research-stages",externalAxios:_e}))},jn=function(e){return i(g,se({dbLabelProps:{labelKey:"name",subLabelKey:"year"}},e,{optionsApiEndPoint:"/dropdowns/semesters",externalAxios:_e}))},Tn=function(e){return i(g,se({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/students"}))},Ln=function(e){return i(g,se({dbLabelProps:{labelKey:"slug",useLabelStartCase:!0},dbValueProps:{valueKey:"id"}},e,{externalAxios:_e,optionsApiEndPoint:"/dropdowns/student-services"}))},Vn=function(e){var t=e.suffix,n=void 0===t?null:t,r=e.valueKey,o=void 0===r?"yearRange":r,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 i(g,se({label:"Year Range",options:null==_n?void 0:_n.map(function(e){return{label:n?"".concat(n," ").concat(e," - ").concat(e+1):"".concat(e," - ").concat(e+1),value:"yearRange"===o?"".concat(e," - ").concat(e+1):e}})},a))},Mn=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")},Rn=function(){function e(){var e=this;this.exotelSDK=null,this.webPhone=null,this.callListeners=new Set,this.registerListeners=new Set,this.sessionListeners=new Set,this.permissionStatus="unknown",this.handleCallEvent=function(t,n){e.callListeners.forEach(function(e){return e(t,n)})},this.handleRegisterEvent=function(t){e.registerListeners.forEach(function(e){return e(t)})},this.handleSessionEvent=function(t,n){e.sessionListeners.forEach(function(e){return e(t,n)})}}return e.getInstance=function(){return e.instance||(e.instance=new e),e.instance},e.prototype.initialize=function(e,t){return ce(this,arguments,void 0,function(e,t,n){var r;return void 0===n&&(n=!0),le(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,this.checkAudioPermissions()];case 1:return o.sent(),this.exotelSDK=new W(e,t,n),[4,this.exotelSDK.Initialize(this.handleCallEvent,this.handleRegisterEvent,this.handleSessionEvent)];case 2:return r=o.sent(),this.webPhone=r||null,[2,!!this.webPhone];case 3:return o.sent(),[2,!1];case 4:return[2]}})})},e.prototype.checkAudioPermissions=function(){return ce(this,void 0,void 0,function(){var e,t,n=this;return le(this,function(r){switch(r.label){case 0:return r.trys.push([0,6,,7]),[4,navigator.mediaDevices.enumerateDevices()];case 1:if(e=r.sent(),!e.some(function(e){return"audioinput"===e.kind}))return this.permissionStatus="denied",[2,!1];if(!navigator.permissions||!navigator.permissions.query)return[3,5];r.label=2;case 2:return r.trys.push([2,4,,5]),[4,navigator.permissions.query({name:"microphone"})];case 3:return t=r.sent(),this.permissionStatus=t.state,t.onchange=function(){n.permissionStatus=t.state},[2,"granted"===t.state];case 4:return r.sent(),[3,5];case 5:return[2,!0];case 6:return r.sent(),[2,!1];case 7:return[2]}})})},e.prototype.requestMicrophoneAccess=function(){return ce(this,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,navigator.mediaDevices.getUserMedia({audio:!0})];case 1:return e.sent().getTracks().forEach(function(e){return e.stop()}),this.permissionStatus="granted",[2,!0];case 2:return e.sent(),this.permissionStatus="denied",[2,!1];case 3:return[2]}})})},e.prototype.makeCall=function(e){var t=this;return new Promise(function(n,r){t.webPhone?t.webPhone.MakeCall(e,function(e,t){"success"===e?n(t):r(t)}):r(new Error("Web phone not initialized"))})},e.prototype.acceptCall=function(){return ce(this,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:if(!this.webPhone)throw new Error("Web phone not initialized");return"granted"===this.permissionStatus?[3,2]:[4,this.requestMicrophoneAccess()];case 1:if(!e.sent())throw new Error("Microphone access denied");e.label=2;case 2:return this.webPhone.AcceptCall(),[2]}})})},e.prototype.hangupCall=function(){var e;null===(e=this.webPhone)||void 0===e||e.HangupCall()},e.prototype.rejectCall=function(){var e;null===(e=this.webPhone)||void 0===e||e.HangupCall()},e.prototype.toggleHold=function(){var e;null===(e=this.webPhone)||void 0===e||e.ToggleHold()},e.prototype.toggleMute=function(){var e;null===(e=this.webPhone)||void 0===e||e.ToggleMute()},e.prototype.sendDTMF=function(e){var t;null===(t=this.webPhone)||void 0===t||t.SendDTMF(e)},e.prototype.registerDevice=function(){return ce(this,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:return"granted"===this.permissionStatus?[3,2]:[4,this.requestMicrophoneAccess()];case 1:if(!t.sent())throw new Error("Microphone access denied");t.label=2;case 2:return null===(e=this.webPhone)||void 0===e||e.RegisterDevice(),[2]}})})},e.prototype.unregisterDevice=function(){var e;null===(e=this.webPhone)||void 0===e||e.UnRegisterDevice()},e.prototype.getPermissionStatus=function(){return this.permissionStatus},e.prototype.addCallListener=function(e){this.callListeners.add(e)},e.prototype.removeCallListener=function(e){this.callListeners.delete(e)},e.prototype.addRegisterListener=function(e){this.registerListeners.add(e)},e.prototype.removeRegisterListener=function(e){this.registerListeners.delete(e)},e.prototype.addSessionListener=function(e){this.sessionListeners.add(e)},e.prototype.removeSessionListener=function(e){this.sessionListeners.delete(e)},e}(),Kn=function(){return ce(void 0,void 0,void 0,function(){var e,t,n,r,o,i;return le(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,ge.get("/notifications/notification-configs")];case 1:return e=a.sent().data,(null==(t=null==e?void 0:e.config)?void 0:t.enableVoice)?(n=null===(r=t.voiceConfigs)||void 0===r?void 0:r.find(function(e){return!0===e.isEnabled}))?[2,{enabled:!0,hasValidToken:!!((null===(o=n.EXOTEL)||void 0===o?void 0:o.token)&&(null===(i=n.EXOTEL)||void 0===i?void 0:i.tokenExpiresAt)&&new Date(n.EXOTEL.tokenExpiresAt)>new Date)}]:[2,{enabled:!1,hasValidToken:!1}]:[2,{enabled:!1,hasValidToken:!1}];case 2:return a.sent(),[2,{enabled:!1,hasValidToken:!1}];case 3:return[2]}})})},Fn=function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,ge.get("/notifications/notification-configs/voice-config/active-token")];case 1:return[2,e.sent().data];case 2:return e.sent(),[2,null];case 3:return[2]}})})},zn=function(){return ce(void 0,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:return[4,Fn()];case 1:if(!(e=t.sent()))throw new Error("No active voice configuration found");return[2,{Data:e.token}]}})})},Un=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.post("/communication-activities/initiate",e)];case 1:return[2,t.sent().data]}})})},qn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.post("/communication-activities/register-incoming",e)];case 1:return[2,t.sent().data]}})})},$n=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.get("/communication-activities/by-prospect",{params:{prospectId:e}})];case 1:return[2,t.sent().data]}})})},Bn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.get("/communication-activities/".concat(e))];case 1:return[2,t.sent().data]}})})},Wn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.get("/communication-activities/by-call-sid",{params:{callSid:e}})];case 1:return[2,t.sent().data]}})})},Hn=function(e){return ce(void 0,void 0,void 0,function(){var t;return le(this,function(n){switch(n.label){case 0:return[4,ge.get("/communication-activities/count-by-prospect",{params:{prospectId:e}})];case 1:return[2,(null==(t=n.sent().data)?void 0:t.count)||0]}})})},Yn=function(e){return ce(void 0,void 0,void 0,function(){var t;return le(this,function(n){switch(n.label){case 0:return t={callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,prospectStatus:e.prospectStatus,dispositionNotes:e.dispositionNotes,callbackScheduledAt:e.callbackScheduledAt},[4,ge.post("/communication-activities/".concat(e.callId,"/disposition"),t)];case 1:return[2,n.sent().data]}})})},Xn=function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){switch(t.label){case 0:return[4,ge.post("/communication-activities/cancel",e)];case 1:return[2,t.sent().data]}})})},Jn="__EXOTEL_CONTEXT__",Gn={phase:"idle",callData:null,isOnHold:!1,isMuted:!1,isSpeakerOff:!1,callDirection:null,callStartTime:null,callDuration:0,callerName:null,callerNumber:null,callActivityId:null,exotelCallSid:null,prospectUniqueId:null,wasAccepted:!1},Qn=function(e){if(!e||e.length<4)return"**********";var t="",n=e;e.startsWith("+91")?(t="+91",n=e.substring(3)):e.startsWith("91")&&e.length>10&&(t="91",n=e.substring(2));var r=n.replace(/\D/g,"");return r.length<4?t+"**********":t+r.substring(0,2)+"*".repeat(r.length-4)+r.substring(r.length-2)},Zn=(window[Jn]||(window[Jn]=x(void 0)),window[Jn]),er=function(e){var t=e.children,n=e.accessToken,r=e.agentUserId,o=e.autoConnectVOIP,a=void 0===o||o,s=e.callerName;e.callerNumber;var c=k(!1),l=c[0],u=c[1],d=k(!1),p=d[0],f=d[1],h=k("unknown"),m=h[0],v=h[1],b=k(Gn),y=b[0],g=b[1],w=k(null),_=w[0],N=w[1],E=O(null),x=O(y),D=Rn.getInstance();S(function(){x.current=y},[y]),S(function(){return"connected"===y.phase&&y.callStartTime?E.current=setInterval(function(){g(function(e){return se(se({},e),{callDuration:Math.floor((Date.now()-e.callStartTime)/1e3)})})},1e3):E.current&&(clearInterval(E.current),E.current=null),function(){E.current&&clearInterval(E.current)}},[y.phase,y.callStartTime]),S(function(){var e=function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,navigator.mediaDevices.getUserMedia({audio:!0})];case 1:return e.sent().getTracks().forEach(function(e){return e.stop()}),v("granted"),[3,3];case 2:return e.sent(),v("denied"),[3,3];case 3:return[2]}})})};navigator.permissions&&navigator.permissions.query?navigator.permissions.query({name:"microphone"}).then(function(t){v(t.state),t.onchange=function(){v(t.state)},"prompt"===t.state&&e()}).catch(function(t){e()}):e()},[]),S(function(){if(n&&r&&!l){ce(void 0,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:return[4,D.initialize(n,r,a)];case 1:return e=t.sent(),u(e),[2]}})})}},[n,r,a]),S(function(){if(l){var e=function(e,t){switch(e){case"incoming":if("outbound"===x.current.callDirection)g(function(e){return se(se({},e),{callData:t,isOnHold:!1,isMuted:!1})});else{var n=t.callFromNumber||t.remoteId||null;g(function(e){return se(se({},e),{phase:"incoming",callData:t,callDirection:"inbound",callerName:t.remoteDisplayName||null,callerNumber:n?Qn(n):null,isOnHold:!1,isMuted:!1})}),(t.callId||t.sessionId)&&qn({callSid:t.callId||t.sessionId,fromNumber:t.callFromNumber||t.remoteId||"",toNumber:t.remoteDisplayName||""}).then(function(e){var t,n=null===(t=e.prospect)||void 0===t?void 0:t.mobile;g(function(t){var r,o,i;return se(se({},t),{callActivityId:(null===(r=e.data)||void 0===r?void 0:r.id)||t.callActivityId,callerName:(null===(o=e.prospect)||void 0===o?void 0:o.name)||t.callerName,callerNumber:n?Qn(n):t.callerNumber,prospectUniqueId:(null===(i=e.prospect)||void 0===i?void 0:i.uniqueId)||t.prospectUniqueId})})}).catch(function(e){})}break;case"connected":g(function(e){return se(se({},e),{phase:"connected",callData:t,callStartTime:Date.now(),callDuration:0})});break;case"callEnded":g(function(e){var n,r;if(e.wasAccepted||"connected"===e.phase||e.callDuration>0){var o={callId:e.callActivityId||t.callId||(null===(n=e.callData)||void 0===n?void 0:n.callId)||"",exotelCallId:t.callId||(null===(r=e.callData)||void 0===r?void 0:r.callId)||"",callDirection:e.callDirection||"outbound",callDuration:e.callDuration,callerName:e.callerName,callerNumber:e.callerNumber};N(o)}return se(se({},Gn),{phase:"ended",callData:t})});break;case"holdtoggle":g(function(e){return se(se({},e),{isOnHold:!e.isOnHold,callData:t})});break;case"mutetoggle":g(function(e){return se(se({},e),{isMuted:!e.isMuted,callData:t})})}},t=function(e){f("registered"===e)},n=function(e,t){};return D.addCallListener(e),D.addRegisterListener(t),D.addSessionListener(n),function(){D.removeCallListener(e),D.removeRegisterListener(t),D.removeSessionListener(n)}}},[l]),S(function(){l&&v(D.getPermissionStatus())},[l]);var P=C(function(e,t,n,r){return ce(void 0,void 0,void 0,function(){var o;return le(this,function(i){switch(i.label){case 0:g(function(o){return se(se({},o),{phase:"ready_to_call",callDirection:"outbound",callerName:t||s||null,callerNumber:r||e,callActivityId:n||null,isOnHold:!1,isMuted:!1,callStartTime:null,callDuration:0})}),i.label=1;case 1:return i.trys.push([1,3,,4]),[4,D.makeCall(e)];case 2:return[2,i.sent()];case 3:throw o=i.sent(),g(Gn),o;case 4:return[2]}})})},[s]),I=C(function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:return[4,D.acceptCall()];case 1:return e.sent(),g(function(e){return"outbound"===e.callDirection?se(se({},e),{phase:"calling",wasAccepted:!0}):se(se({},e),{wasAccepted:!0})}),[2]}})})},[]),A=C(function(){D.hangupCall()},[]),j=C(function(){g(function(e){return se(se({},e),{isSpeakerOff:!e.isSpeakerOff})})},[]),T=C(function(){N(null),g(Gn)},[]),L=C(function(e){g(function(t){return se(se({},t),{callActivityId:e})})},[]),V=C(function(e){g(function(t){return se(se({},t),{exotelCallSid:e})})},[]),M={isInitialized:l,isConnected:p,callState:y,permissionStatus:m,dispositionData:_,makeCall:P,acceptCall:I,hangupCall:A,rejectCall:function(){return D.rejectCall()},toggleHold:function(){return D.toggleHold()},toggleMute:function(){return D.toggleMute()},toggleSpeaker:j,sendDTMF:function(e){return D.sendDTMF(e)},registerDevice:function(){return D.registerDevice()},unregisterDevice:function(){return D.unregisterDevice()},requestMicrophoneAccess:function(){return D.requestMicrophoneAccess()},clearDisposition:T,setCallActivityId:L,setExotelCallSid:V};return i(Zn.Provider,{value:M,children:t})},tr=function(){var e=D(Zn);if(void 0===e)throw new Error("useExotel must be used within an ExotelProvider");return e},nr=function(){var e=D(Zn);return null!=e?e:null},rr=999999,or=999998,ir="16px",ar=2e3,sr=[{label:"Connected",value:"connected"},{label:"Not Connected",value:"not_connected"}],cr=[{label:"Interested",value:"interested"},{label:"Not Interested",value:"not_interested"},{label:"Not Sure",value:"not_sure"},{label:"Not Eligible",value:"not_eligible"},{label:"Wrong Number",value:"wrong_number"},{label:"Campus Visit",value:"campus_visit"},{label:"Call Back",value:"call_back"},{label:"After JEE Mains",value:"after_jee_mains"},{label:"After IPE",value:"after_ipe"},{label:"After EAPCET",value:"after_eapcet"}],lr=[{label:"Not Answering",value:"not_answering"},{label:"Not Connected",value:"not_connected"},{label:"Fail to Call",value:"fail_to_call"},{label:"Switched Off",value:"switched_off"},{label:"Out of Service",value:"out_of_service"},{label:"Invalid Number",value:"invalid_number"},{label:"Number Busy",value:"number_busy"}],ur=function(e){var t=e.dispositionData,n=e.prospectId,r=e.onClose,a=e.onSave,s=e.existingData,c=T(),l=!!(null==s?void 0:s.dispositionCategory),u=k((null==s?void 0:s.callStatusDisposition)||""),p=u[0],f=u[1],h=k((null==s?void 0:s.dispositionCategory)||""),m=h[0],b=h[1],y=k((null==s?void 0:s.dispositionNotes)||""),E=y[0],x=y[1],S=P(function(e){return a(e)},{onSuccess:function(){c.invalidateQueries("getOneProspect"),c.invalidateQueries("callHistory"),r()}}),O=S.mutate,C=S.isLoading,D=function(e){f(e),b("")},I=function(e){b(e)},A=function(){if(p&&m){var e={prospectId:n,callId:t.callId,channel:"phone",direction:t.callDirection,duration:t.callDuration,callStatusDisposition:p,dispositionCategory:m,remarks:E||"",callerName:t.callerName||"",callerNumber:t.callerNumber||""};O(e)}},j="connected"===p?cr:"not_connected"===p?lr:[];return i(v,{open:!0,onClose:r,title:l?"Edit Disposition":"Call Disposition",maxWidth:"md",content:function(){return o("div",{className:"flex flex-col gap-4 p-4",children:[i(w,{variant:"muted",children:l?"Update the disposition details":"Add details about your call with ".concat(t.callerName||"Unknown")}),o("div",{className:"flex items-center justify-between p-3 bg-gray-100 rounded-lg",children:[i(w,{variant:"small",className:"text-gray-600",children:"Call Duration"}),i(w,{variant:"small",className:"font-semibold",children:(e=t.callDuration,n=Math.floor(e/60),a=e%60,"".concat(n,"m ").concat(a,"s"))})]}),i(_,{name:"callStatusDisposition",label:"Call Status",required:!0,options:sr,direction:"row",value:p,onChange:D}),p&&i(g,{name:"dispositionCategory",label:"Call Disposition",required:!0,fullWidth:!0,placeholder:"Search disposition...",options:j,value:m,onChange:I},p),i(N,{name:"remarks",label:"Remarks",placeholder:"Add any additional notes about this call...",rows:3,fullWidth:!0,value:E,onChange:function(e){return x(e.target.value)},className:"break-all"}),o("div",{className:"flex justify-start gap-2 pt-4 border-t",children:[i(d,{onClick:A,disabled:!p||!m,loading:C,children:l?"Update Disposition":"Save Disposition"}),i(d,{variant:"outline",onClick:r,children:"Cancel"})]})]});var e,n,a}})},dr=function(e){var t=e.className,n=e.prospectId,r=e.prospectName,s=e.prospectNumber,c=e.onSaveDisposition,l=tr(),u=l.callState,p=l.dispositionData,f=l.acceptCall,h=l.hangupCall,m=l.rejectCall,v=l.toggleHold,b=l.toggleMute,y=l.toggleSpeaker,g=l.clearDisposition,_=k(!1),N=_[0],E=_[1],x=k(!1),C=x[0],D=x[1],P=O(null);S(function(){var e="exotel-phone-animations";if(!document.getElementById(e)){var t=document.createElement("style");t.id=e,t.textContent="\n@keyframes pulse-ring {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.15);\n opacity: 0.7;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes pulse-dot {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(249, 115, 22, 0.7);\n }\n 50% {\n box-shadow: 0 0 0 20px rgba(249, 115, 22, 0);\n }\n}\n\n.animate-pulse-ring {\n animation: pulse-ring 1.5s ease-in-out infinite;\n}\n\n.animate-pulse-dot {\n animation: pulse-dot 1.5s ease-in-out infinite;\n}\n",document.head.appendChild(t)}},[]);var I=u.phase;u.callData;var A=u.isOnHold,j=u.isMuted,T=u.isSpeakerOff,L=u.callDirection,V=u.callDuration,M=u.callerName,R=u.callerNumber,K=u.callActivityId,F=u.exotelCallSid,z=u.prospectUniqueId,U=r||M||"Unknown",q=s||R||"No number",$=function(){return ce(void 0,void 0,void 0,function(){var e;return le(this,function(t){switch(t.label){case 0:if(D(!0),"incoming"===I||"ready_to_call"===I?m():h(),!(e=F||K))return[3,4];t.label=1;case 1:return t.trys.push([1,3,,4]),[4,Xn({callSid:e,reason:"connected"===I?"ended":"declined"})];case 2:return t.sent(),[3,4];case 3:return t.sent(),[3,4];case 4:return P.current=setTimeout(function(){D(!1)},ar),[2]}})})};S(function(){"idle"!==I&&"ended"!==I||(P.current&&(clearTimeout(P.current),P.current=null),D(!1))},[I]);if(S(function(){return function(){P.current&&clearTimeout(P.current)}},[]),p){var B=r||p.callerName||M||"Unknown",W=se(se({},p),{callerName:B,callerNumber:q});return i(ur,{dispositionData:W,prospectId:n,onClose:g,onSave:function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){return c?[2,c(e)]:[2,Yn({callId:e.callId,prospectId:e.prospectId||n||"",callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,dispositionNotes:e.remarks||void 0})]})})},existingData:void 0})}if("idle"===I||"ended"===I)return null;var oe,ae,ue,de="outbound"===L,pe="inbound"===L,fe="connected"===I?"bg-green-500":de?"bg-blue-500":"bg-orange-500",he=function(){return"calling"===I?"Connecting to ".concat(U,"..."):null},me=o(a,{children:[i("div",{className:"fixed inset-0 bg-black/50",style:{zIndex:or},onClick:$}),i("div",{className:"fixed inset-0 flex items-center justify-center p-4 ".concat(t),style:{zIndex:rr},children:o("div",{className:"relative w-full max-w-md p-6 bg-white shadow-2xl",style:{borderRadius:ir,border:"1px solid #e5e7eb"},onClick:function(e){return e.stopPropagation()},children:[i("button",{onClick:$,className:"absolute p-1 transition-colors rounded-full top-4 right-4 hover:bg-gray-100",children:i(H,{className:"w-5 h-5 text-gray-500"})}),i("div",{className:"flex justify-center mb-6",children:o("span",{className:"inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-sm font-medium border ".concat(de?"text-blue-600 border-blue-200 bg-blue-50":"text-green-600 border-green-200 bg-green-50"),children:[i(de?Y:X,{className:"w-4 h-4"}),de?"Outgoing Call":"Incoming Call"]})}),i("div",{className:"flex justify-center mb-4",children:i("div",{className:"w-24 h-24 rounded-full ".concat(fe," flex items-center justify-center ").concat("incoming"===I||"ready_to_call"===I?"animate-pulse-ring animate-pulse-dot":""),children:i(pe&&"incoming"===I?X:J,{className:"w-10 h-10 text-white"})})}),o("div",{className:"mb-4 text-center",children:[i(w,{variant:"h3",className:"text-xl font-semibold text-gray-900",children:U}),z&&o(w,{variant:"small",className:"font-medium text-blue-600",children:["ID: ",z]}),i(w,{variant:"muted",children:q})]}),i("div",{className:"mb-6 text-center",children:i(w,"connected"===I?{variant:"p",className:"text-lg font-medium text-green-500",children:(oe=V,ae=Math.floor(oe/60),ue=oe%60,"".concat(ae.toString().padStart(2,"0"),":").concat(ue.toString().padStart(2,"0")))}:{variant:"muted",children:function(){switch(I){case"ready_to_call":return"Ready to call...";case"calling":return"Calling...";case"incoming":return"Incoming call...";default:return null}}()})}),"connected"===I&&o("div",{className:"flex justify-center gap-6 mb-6",children:[o("div",{className:"text-center",children:[i("button",{onClick:b,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(j?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:i(j?G:Q,{className:"w-5 h-5 text-gray-600"})}),i("p",{className:"mt-1 text-xs text-gray-500",children:j?"Unmute":"Mute"})]}),o("div",{className:"text-center",children:[i("button",{onClick:v,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(A?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:i(A?Z:ee,{className:"w-5 h-5 text-gray-600"})}),i("p",{className:"mt-1 text-xs text-gray-500",children:A?"Resume":"Hold"})]}),o("div",{className:"text-center",children:[i("button",{onClick:y,className:"w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ".concat(T?"bg-gray-200 border-gray-300":"bg-white border-gray-200 hover:bg-gray-50"),children:i(T?te:ne,{className:"w-5 h-5 text-gray-600"})}),i("p",{className:"mt-1 text-xs text-gray-500",children:T?"Speaker On":"Speaker Off"})]})]}),o("div",{className:"flex justify-center gap-4",children:[("ready_to_call"===I||"incoming"===I)&&o(a,{children:[o(d,{variant:"destructive",onClick:$,disabled:C,className:"gap-2 px-6",children:[i(re,{className:"w-4 h-4"}),C?"Declining...":"Decline"]}),o(d,{variant:"default",onClick:function(){return ce(void 0,void 0,void 0,function(){return le(this,function(e){switch(e.label){case 0:E(!0),e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,f()];case 2:return e.sent(),[3,5];case 3:return e.sent(),[3,5];case 4:return E(!1),[7];case 5:return[2]}})})},disabled:N||C,style:{backgroundColor:"#22c55e"},className:"gap-2 px-6 hover:bg-green-600",children:[i(J,{className:"w-4 h-4"}),"Accept"]})]}),"calling"===I&&o(d,{variant:"destructive",onClick:$,disabled:C,className:"gap-2 px-6",children:[i(re,{className:"w-4 h-4"}),C?"Ending...":"End Call"]}),"connected"===I&&o(d,{variant:"destructive",onClick:$,disabled:C,className:"gap-2 px-8",children:[i(re,{className:"w-4 h-4"}),C?"Ending...":"End Call"]})]}),he()&&i(w,{variant:"small",className:"mt-4 text-center text-gray-500",children:he()})]})})]});return ie(me,document.body)},pr=function(){function e(){this.algorithm="aes-256-cbc",this.secretKey=null,this.initialized=!1}return e.prototype.ensureInitialized=function(){if(!this.initialized)try{var e="431fef99-47dc-4d2a-9175-2e8f19b20225";if(e){var t=(new TextEncoder).encode(e),n=(new TextEncoder).encode("salt");this.secretKey=ae(t,n,16384,8,1,32)}this.initialized=!0}catch(e){this.initialized=!0}},e.getInstance=function(){return e.instance||(e.instance=new e),e.instance},e.prototype.decryptData=function(e){if(this.ensureInitialized(),!e||!this.secretKey)return"";try{var t=e.split(":"),n=t[0],r=t[1];if(!n||!r)return"";var o=require("crypto"),i=Buffer.from(n,"hex"),a=o.createDecipheriv(this.algorithm,Buffer.from(this.secretKey),i),s=a.update(r,"hex","utf8");return s+=a.final("utf8")}catch(e){return""}},e.prototype.maskMobile=function(e){if(!e||e.length<4)return"**********";var t="",n=e;e.startsWith("+91")?(t="+91",n=e.substring(3)):e.startsWith("91")&&e.length>10&&(t="91",n=e.substring(2));var r=n.replace(/\D/g,"");return r.length<4?t+"**********":t+r.substring(0,2)+"*".repeat(r.length-4)+r.substring(r.length-2)},e}(),fr=pr.getInstance(),hr=function(e){var t=e.phoneNumber,n=e.encryptedPhoneNumber,r=e.callerName,a=e.prospectId,s=e.className,c=e.disabled,l=nr(),u=k(!1),p=u[0],f=u[1],h=k(null),m=h[0],v=h[1];if(!l)return null;var b=l.makeCall,y=l.isConnected,g=l.callState,w=l.permissionStatus,_=l.requestMicrophoneAccess,N=l.setCallActivityId,E=l.setExotelCallSid,x="idle"!==g.phase&&"ended"!==g.phase,S=t||n;return o("div",{className:s,children:[o(d,{variant:"outline",size:"sm",onClick:function(){return ce(void 0,void 0,void 0,function(){var e,o,i,s,c,l,u,d,p,h,m,w,x,k,S;return le(this,function(O){switch(O.label){case 0:if(!y||"idle"!==g.phase&&"ended"!==g.phase)return[2];if(v(null),e=t,n&&!e)try{if(!(e=fr.decryptData(n)))return v("Failed to decrypt phone number"),[2]}catch(e){return v("Failed to decrypt phone number"),[2]}return e?(o=fr.maskMobile(e),[4,Rn.getInstance().checkAudioPermissions()]):(v("No phone number available"),[2]);case 1:return O.sent()?[3,3]:[4,_()];case 2:if(!O.sent())return v("Microphone access is required to make calls"),[2];O.label=3;case 3:return O.trys.push([3,9,10,11]),f(!0),[4,b(e,r,void 0,o)];case 4:if(i=O.sent(),(s=null===(w=null==i?void 0:i.Data)||void 0===w?void 0:w.CallSid)&&E(s),!a||!s)return[3,8];O.label=5;case 5:return O.trys.push([5,7,,8]),[4,Un({prospectId:a,toNumber:e,callSid:s})];case 6:return c=O.sent(),(l=null===(x=c.data)||void 0===x?void 0:x.id)&&N(l),[3,8];case 7:return O.sent(),[3,8];case 8:return[3,11];case 9:if(u=O.sent(),d="Failed to make call",(null==u?void 0:u.Code)||"Failed"===(null==u?void 0:u.Status)){if(p=u.Code,h=null,u.Error&&"string"==typeof u.Error)try{h=JSON.parse(u.Error)}catch(e){}m=null===(S=null===(k=null==h?void 0:h.response)||void 0===k?void 0:k.error_data)||void 0===S?void 0:S.description,d=404===p?m||"User device is currently busy or unavailable":p>=400&&p<500?m||"Unable to complete call. Please try again.":p>=500?m||"Service temporarily unavailable. Please try again later.":m||"Failed to make call"}else(null==u?void 0:u.message)&&(d=u.message);return v(d),[3,11];case 10:return f(!1),[7];case 11:return[2]}})})},disabled:c||!S||!y||x||p,title:y?x?"Call in progress":S?"denied"===w?"Microphone access denied":"Call ".concat(r||"prospect"):"No phone number":"VoIP not connected",className:"gap-1.5",children:[i("denied"===w?G:J,{className:"w-4 h-4"}),p?"Calling...":"Call"]}),m&&i("p",{className:"text-red-500 text-xs mt-1",children:m})]})},mr=function(e){var t=e.onPermissionGranted,n=e.onPermissionDenied,r=tr(),a=r.permissionStatus,s=r.requestMicrophoneAccess,c=k(!1),l=c[0],u=c[1],p=k(null),f=p[0],h=p[1];return o("div","granted"===a?{className:"flex items-center gap-2 text-green-600",children:[i(Q,{className:"w-4 h-4"}),i("span",{className:"text-sm",children:"Microphone access granted"})]}:"denied"===a?{className:"p-4 bg-red-50 rounded-lg border border-red-200",children:[o("div",{className:"flex items-center gap-2 text-red-600 mb-2",children:[i(G,{className:"w-5 h-5"}),i("span",{className:"font-medium",children:"Microphone Access Denied"})]}),i("p",{className:"text-sm text-red-600 mb-3",children:"To use the calling feature, you need to enable microphone access in your browser settings."}),o("div",{className:"text-xs text-gray-600",children:[i("p",{className:"font-medium mb-1",children:"How to enable:"}),o("ol",{className:"list-decimal list-inside space-y-1",children:[i("li",{children:"Click the lock/info icon in your browser's address bar"}),i("li",{children:'Find "Microphone" in the permissions list'}),i("li",{children:'Change the setting to "Allow"'}),i("li",{children:"Refresh the page"})]})]})]}:{className:"p-4 bg-blue-50 rounded-lg border border-blue-200",children:[o("div",{className:"flex items-center gap-2 text-blue-600 mb-2",children:[i(oe,{className:"w-5 h-5"}),i("span",{className:"font-medium",children:"Microphone Permission Required"})]}),i("p",{className:"text-sm text-gray-600 mb-3",children:"To make and receive calls, we need access to your microphone. Click the button below to grant permission."}),o(d,{variant:"default",size:"sm",onClick:function(){return ce(void 0,void 0,void 0,function(){var e;return le(this,function(r){switch(r.label){case 0:u(!0),h(null),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,s()];case 2:return r.sent()?null==t||t():(h("Microphone access was denied"),null==n||n()),[3,5];case 3:return e=r.sent(),h(e.message||"Failed to request microphone access"),null==n||n(),[3,5];case 4:return u(!1),[7];case 5:return[2]}})})},loading:l,className:"gap-1.5",children:[i(Q,{className:"w-4 h-4"}),"Allow Microphone Access"]}),f&&i("p",{className:"text-red-500 text-xs mt-2",children:f})]})},vr=function(e){var t=e.children,n=e.enabled,r=void 0===n||n,s=e.prospectId,c=e.prospectName,l=e.prospectNumber,u=k(null),d=u[0],p=u[1],f=k(!0);f[0];var h=f[1],m=k(null),v=m[0],b=m[1];return S(function(){if(r){ce(void 0,void 0,void 0,function(){var e,t;return le(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,3,4]),h(!0),[4,Fn()];case 1:return(null==(e=n.sent())?void 0:e.token)?p(e.token):b("Voice calling not configured"),[3,4];case 2:return t=n.sent(),b(t.message||"Failed to initialize calling"),[3,4];case 3:return h(!1),[7];case 4:return[2]}})})}else h(!1)},[r]),r&&!v&&d?o(er,{accessToken:d,agentUserId:"0047",autoConnectVOIP:!0,children:[t,i(dr,{prospectId:s,prospectName:c,prospectNumber:l})]}):i(a,{children:t})},br=function(e){var t=e.children,n=e.workspace,r=e.agentUserId,s=e.prospectId,c=e.prospectName,l=e.prospectNumber,u=e.onSaveDisposition,d=k(null),p=d[0],f=d[1],h=k(!0),m=h[0],v=h[1],b=k(null),y=b[0],g=b[1],w=Ee(n),_=!!r,N=C(function(e){return ce(void 0,void 0,void 0,function(){return le(this,function(t){return u?[2,u(e)]:[2,Yn({callId:e.callId,prospectId:e.prospectId,callStatusDisposition:e.callStatusDisposition,dispositionCategory:e.dispositionCategory,dispositionReason:e.dispositionReason||void 0,dispositionNotes:e.remarks||void 0})]})})},[u]);return S(function(){if(w&&_){ce(void 0,void 0,void 0,function(){var e,t;return le(this,function(n){switch(n.label){case 0:return n.trys.push([0,3,4,5]),v(!0),g(null),[4,Kn()];case 1:return n.sent().enabled?[4,Fn()]:(g("Voice calling not enabled for this tenant"),v(!1),[2]);case 2:return(null==(e=n.sent())?void 0:e.token)?f(e.token):g("Voice calling token not available"),[3,5];case 3:return t=n.sent(),g(t.message||"Failed to initialize calling"),[3,5];case 4:return v(!1),[7];case 5:return[2]}})})}else v(!1)},[w,_]),w&&_?m||y||!p?i(a,{children:t}):o(er,{accessToken:p,agentUserId:r,autoConnectVOIP:!0,children:[t,i(dr,{prospectId:s,prospectName:c,prospectNumber:l,onSaveDisposition:N})]}):i(a,{children:t})};export{de as ApplicationStore,fn as BatchSelector,hr as CallButton,ur as CallDispositionForm,ke as ConfirmDialogProvider,hn as CourseSelector,dn as DepartmentMongoMultiSelector,mn as DepartmentSelector,pn as DepartmentSqlMultiSelector,vn as EmployeesSelector,je as ErrorBoundary,gn as ExamTypeSelector,bn as ExamsRegulationSelector,dr as ExotelPhone,er as ExotelProvider,vr as ExotelWrapper,Nn as FeeTypeSelector,En as HostelBlockSelector,xn as HostelFloorSelector,kn as HostelRoomSelector,mr as MicrophonePermission,Sn as MonthYearSelector,On as PrintFormatSelector,Cn as ProgramSelector,cn as Providers,Dn as RegulationSelector,Pn as ResearchExpertDesignationSelector,In as ResearchExpertSelector,An as ResearchStageSelector,jn as SemesterSelector,sn as SnackbarProvider,Tn as StudentSelector,Ln as StudentServicesSelector,Ne as VOIP_ENABLED_WORKSPACES,br as VoIPProvider,Vn as YearRangeSelector,ge as axios,Xn as cancelCall,Kn as checkVoIPEnabled,zn as createExotelAppToken,we as createRsbuildSharedConfig,$n as fetchCallHistory,Fn as getActiveVoiceToken,Wn as getCallActivityByCallSid,Bn as getCallActivityById,Hn as getCallCountByProspect,ue as initialApplicationState,Un as initiateCallActivity,ve as institutionCode,he as isDevelopment,Ee as isVoIPEnabledForWorkspace,_e as nonWorkspaceAxios,Mn as openInNewTab,qn as registerIncomingCall,Yn as saveCallDisposition,me as tenantCode,un as useConfirm,tr as useExotel,nr as useExotelSafe,be as workspace,ye as workspaceApiMapping};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi8uLi9zcmMvY29udGV4dC9hcHBsaWNhdGlvbi1zdG9yZS50cyIsIi4uLy4uL3NyYy91dGlscy9jbGllbnQtYXV0aC10b2tlbi50cyIsIi4uLy4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi8uLi9zcmMvY29uZmlnL2F4aW9zLnRzIiwiLi4vLi4vc3JjL2NvbmZpZy9jcmVhdGVSc2J1aWxkU2hhcmVkQ29uZmlnLnRzIiwiLi4vLi4vc3JjL2NvbmZpZy9ub25Xb3Jrc3BhY2VBeGlvcy50cyIsIi4uLy4uL3NyYy9jb25maWcvdm9pcC5jb25maWcudHMiLCIuLi8uLi9zcmMvY29udGV4dC9Db25maXJtRGlhbG9nUHJvdmlkZXIudHN4IiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWVycm9yLWJvdW5kYXJ5L2Rpc3QvcmVhY3QtZXJyb3ItYm91bmRhcnkuZXNtLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGhvb2tmb3JtL3Jlc29sdmVycy95dXAvZGlzdC95dXAubWpzIiwiLi4vLi4vc3JjL2NvbnRleHQvRXJyb3JCb3VuZGFyeS9Mb2dpbi50c3giLCIuLi8uLi9zcmMvY29udGV4dC9FcnJvckJvdW5kYXJ5L0Vycm9yQm91bmRhcnkudHN4IiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlZHV4L2Rpc3QvcmVkdXgubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQvbm9kZV9tb2R1bGVzL2ltbWVyL2Rpc3QvaW1tZXIubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2Rpc3QvcmVkdXgtdGh1bmsubWpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQvZGlzdC9yZWR1eC10b29sa2l0Lm1vZGVybi5tanMiLCIuLi8uLi9zcmMvY29udGV4dC9TbmFja2JhclByb3ZpZGVyLnRzeCIsIi4uLy4uL3NyYy9jb250ZXh0L1Byb3ZpZGVycy50c3giLCIuLi8uLi9zcmMvaG9va3MvdXNlQ29uZmlybS50cyIsIi4uLy4uL3NyYy9tdWx0aS1zZWxlY3RvcnMvRGVwYXJ0bWVudE1vbmdvTXVsdGlTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvbXVsdGktc2VsZWN0b3JzL0RlcGFydG1lbnRTcWxNdWx0aVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvQmF0Y2hTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0NvdXJzZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRGVwYXJ0bWVudFNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRW1wbG95ZWVzU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9FeGFtUmVndWxhdGlvblNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRXhhbVR5cGVTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL3V0aWxzLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvRmVlVHlwZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvSG9zdGVsQmxvY2tTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL0hvc3RlbEZsb29yU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Ib3N0ZWxSb29tU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Nb250aFllYXJTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1ByaW50Rm9ybWF0U2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9Qcm9ncmFtU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZWd1bGF0aW9uU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZXNlYXJjaEV4cGVydERlc2lnbmF0aW9uU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3NlbGVjdG9ycy9SZXNlYXJjaEV4cGVydFNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvUmVzZWFyY2hTdGFnZVNlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvU2VtZXN0ZXJTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1N0dWRlbnRTZWxlY3Rvci50c3giLCIuLi8uLi9zcmMvc2VsZWN0b3JzL1N0dWRlbnRTZXJ2aWNlc1NlbGVjdG9yLnRzeCIsIi4uLy4uL3NyYy9zZWxlY3RvcnMvWWVhclJhbmdlU2VsZWN0b3IudHN4IiwiLi4vLi4vc3JjL3V0aWxzL29wZW5Jbk5ld1RhYi50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9leG90ZWwvRXhvdGVsU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2aWNlcy9leG90ZWwvYXBpLnRzIiwiLi4vLi4vc3JjL3Byb3ZpZGVycy9FeG90ZWxQcm92aWRlci50c3giLCIuLi8uLi9zcmMvY29uc3RhbnRzL2V4b3RlbC5jb25zdGFudHMudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9FeG90ZWwvQ2FsbERpc3Bvc2l0aW9uRm9ybS50c3giLCIuLi8uLi9zcmMvdXRpbHMvZXhvdGVsL2Zvcm1hdHRlcnMudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9FeG90ZWwvRXhvdGVsUGhvbmUudHN4IiwiLi4vLi4vc3JjL3NlcnZpY2VzL2NyeXB0by9DcnlwdG9TZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvRXhvdGVsL0NhbGxCdXR0b24udHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvRXhvdGVsL01pY3JvcGhvbmVQZXJtaXNzaW9uLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL0V4b3RlbC9FeG90ZWxXcmFwcGVyLnRzeCIsIi4uLy4uL3NyYy9wcm92aWRlcnMvVm9JUFByb3ZpZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XHJcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XHJcbiAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICB2YXIgYXIgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb3duS2V5cyhvKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xyXG4gICAgICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhc3luYykge1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcblxyXG59XHJcblxyXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcclxuICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xyXG4gICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcclxuICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdmFyIHIsIHMgPSAwO1xyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoci5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHMgfD0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgZmFpbChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dCgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcclxuICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIF9fZXh0ZW5kczogX19leHRlbmRzLFxyXG4gICAgX19hc3NpZ246IF9fYXNzaWduLFxyXG4gICAgX19yZXN0OiBfX3Jlc3QsXHJcbiAgICBfX2RlY29yYXRlOiBfX2RlY29yYXRlLFxyXG4gICAgX19wYXJhbTogX19wYXJhbSxcclxuICAgIF9fZXNEZWNvcmF0ZTogX19lc0RlY29yYXRlLFxyXG4gICAgX19ydW5Jbml0aWFsaXplcnM6IF9fcnVuSW5pdGlhbGl6ZXJzLFxyXG4gICAgX19wcm9wS2V5OiBfX3Byb3BLZXksXHJcbiAgICBfX3NldEZ1bmN0aW9uTmFtZTogX19zZXRGdW5jdGlvbk5hbWUsXHJcbiAgICBfX21ldGFkYXRhOiBfX21ldGFkYXRhLFxyXG4gICAgX19hd2FpdGVyOiBfX2F3YWl0ZXIsXHJcbiAgICBfX2dlbmVyYXRvcjogX19nZW5lcmF0b3IsXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmc6IF9fY3JlYXRlQmluZGluZyxcclxuICAgIF9fZXhwb3J0U3RhcjogX19leHBvcnRTdGFyLFxyXG4gICAgX192YWx1ZXM6IF9fdmFsdWVzLFxyXG4gICAgX19yZWFkOiBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZDogX19zcHJlYWQsXHJcbiAgICBfX3NwcmVhZEFycmF5czogX19zcHJlYWRBcnJheXMsXHJcbiAgICBfX3NwcmVhZEFycmF5OiBfX3NwcmVhZEFycmF5LFxyXG4gICAgX19hd2FpdDogX19hd2FpdCxcclxuICAgIF9fYXN5bmNHZW5lcmF0b3I6IF9fYXN5bmNHZW5lcmF0b3IsXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yOiBfX2FzeW5jRGVsZWdhdG9yLFxyXG4gICAgX19hc3luY1ZhbHVlczogX19hc3luY1ZhbHVlcyxcclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0OiBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcjogX19pbXBvcnRTdGFyLFxyXG4gICAgX19pbXBvcnREZWZhdWx0OiBfX2ltcG9ydERlZmF1bHQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldDogX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbjogX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG4gICAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2U6IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxyXG4gICAgX19kaXNwb3NlUmVzb3VyY2VzOiBfX2Rpc3Bvc2VSZXNvdXJjZXMsXHJcbiAgICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbjogX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXHJcbn07XHJcbiIsImltcG9ydCB7IFN0b3JlIH0gZnJvbSAncHVsbHN0YXRlJztcbmV4cG9ydCB2YXIgaW5pdGlhbEFwcGxpY2F0aW9uU3RhdGUgPSB7XG4gICAgaXNMb2dpbkRpYWxvZ09wZW46IGZhbHNlLFxuICAgIHNuYWNrYmFyOiB7XG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdzdWNjZXNzJyxcbiAgICB9LFxuICAgIGNvbmZpcm1EaWFsb2c6IHtcbiAgICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uQ2FuY2VsOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIHR5cGU6ICdjb25maXJtJyxcbiAgICB9LFxuICAgIHVzZXI6IHVuZGVmaW5lZCxcbiAgICBpbnN0aXR1dGlvbkluZm86IHVuZGVmaW5lZCxcbiAgICBhc3NldDogdW5kZWZpbmVkLFxufTtcbmV4cG9ydCB2YXIgQXBwbGljYXRpb25TdG9yZSA9IG5ldyBTdG9yZShpbml0aWFsQXBwbGljYXRpb25TdGF0ZSk7XG4iLCJpbXBvcnQgQ3J5cHRvSlMgZnJvbSAnY3J5cHRvLWpzJztcbmZ1bmN0aW9uIHRvQmFzZTY0VXJsKGJhc2U2NCkge1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPS9nLCAnJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDbGllbnRUb2tlbihjbGllbnRJZCwgc2VjcmV0KSB7XG4gICAgdmFyIHBheWxvYWQgPSB7IGNsaWVudElkOiBjbGllbnRJZCwgaWF0OiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSB9O1xuICAgIHZhciBwYXlsb2FkQmFzZTY0dXJsID0gdG9CYXNlNjRVcmwoYnRvYShKU09OLnN0cmluZ2lmeShwYXlsb2FkKSkpO1xuICAgIHZhciBzaWduYXR1cmVXb3JkQXJyYXkgPSBDcnlwdG9KUy5IbWFjU0hBMjU2KHBheWxvYWRCYXNlNjR1cmwsIHNlY3JldCk7XG4gICAgdmFyIHNpZ25hdHVyZUJhc2U2NHVybCA9IHRvQmFzZTY0VXJsKENyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KHNpZ25hdHVyZVdvcmRBcnJheSkpO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChwYXlsb2FkQmFzZTY0dXJsLCBcIi5cIikuY29uY2F0KHNpZ25hdHVyZUJhc2U2NHVybCk7XG59XG4iLCJleHBvcnQgdmFyIGlzRGV2ZWxvcG1lbnQgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5jbHVkZXMoJ2xvY2FsaG9zdCcpO1xuZXhwb3J0IHZhciB0ZW5hbnRDb2RlID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNwbGl0KCcuJylbMF07XG4vLyBpZiB1cmwgc2VhcmNoZWQgaXMgYXVwdWxzZS5jYW1weC5pbiB0aGVuIHJlZGlyZWN0IHRvIGF1cHVsc2UuY2FtcHguaW4vYXVwdWxzZVxuZXhwb3J0IHZhciBpbnN0aXR1dGlvbkNvZGUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoJy8nKVsxXTtcbmV4cG9ydCB2YXIgd29ya3NwYWNlID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCcvJylbMl07XG4vLyBXb3Jrc3BhY2UgdG8gQVBJIGVuZHBvaW50IHByZWZpeCBtYXBwaW5nXG5leHBvcnQgdmFyIHdvcmtzcGFjZUFwaU1hcHBpbmcgPSB7XG4gICAgJ3N0dWRlbnQtd29ya3NwYWNlJzogJy9zdHVkZW50LWFwaScsXG4gICAgJ2ZhY3VsdHktd29ya3NwYWNlJzogJy9mYWN1bHR5LWFwaScsXG4gICAgJ2RlcGFydG1lbnQtd29ya3NwYWNlJzogJy9kZXBhcnRtZW50LWFwaScsXG4gICAgJ2FjYWRlbWljLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvYWNhZGVtaWMtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnZmVlZGJhY2stY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy9mZWVkYmFjay1jb29yZGluYXRvci1hcGknLFxuICAgICdjb3Vyc2UtY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy9jb3Vyc2UtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnY2xhc3Nyb29tLWNvb3JkaW5hdG9yLXdvcmtzcGFjZSc6ICcvY2xhc3Nyb29tLWNvb3JkaW5hdG9yLWFwaScsXG4gICAgJ2NvZS13b3Jrc3BhY2UnOiAnL2NvZS1hcGknLFxuICAgICdhY2FkZW1pYy1hZG1pbi13b3Jrc3BhY2UnOiAnL2FjYWRlbWljLWFkbWluLWFwaScsXG4gICAgJ2hvc3RlbC1hZG1pbi13b3Jrc3BhY2UnOiAnL2hvc3RlbC1hZG1pbi1hcGknLFxuICAgICd0cmFuc3BvcnQtY29vcmRpbmF0b3Itd29ya3NwYWNlJzogJy90cmFuc3BvcnQtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAnZW1wbG95ZWUtd29ya3NwYWNlJzogJy9lbXBsb3llZS1hcGknLFxuICAgICdsaWJyYXJpYW4td29ya3NwYWNlJzogJy9saWJyYXJpYW4tYXBpJyxcbiAgICAnZmVlLXRlcm1pbmFsJzogJy9mZWUtdGVybWluYWwtYXBpJyxcbiAgICAnYWNjb3VudHMtb2ZmaWNlci13b3Jrc3BhY2UnOiAnYWNjb3VudHMtb2ZmaWNlci1hcGknLFxuICAgICdmaW5hbmNlLW9mZmljZXItd29ya3NwYWNlJzogJy9maW5hbmNlLW9mZmljZXItYXBpJyxcbiAgICAnb3V0cmVhY2gtYWdlbnQtd29ya3NwYWNlJzogJ291dHJlYWNoLWFnZW50LWFwaScsXG4gICAgJ3Byb3NwZWN0LXdvcmtzcGFjZSc6ICdwcm9zcGVjdC1hcGknLFxuICAgICdleHRlcm5hbC1leHBlcnQtd29ya3NwYWNlJzogJ2V4dGVybmFsLWV4cGVydC1hcGknLFxuICAgICdyZXNlYXJjaC1jb29yZGluYXRvci13b3Jrc3BhY2UnOiAncmVzZWFyY2gtY29vcmRpbmF0b3ItYXBpJyxcbiAgICAndGVsZS1jb3Vuc2VsbG9yLXdvcmtzcGFjZSc6ICd0ZWxlLWNvdW5zZWxsb3ItYXBpJyxcbiAgICAndGVhbS1vd25lci13b3Jrc3BhY2UnOiAnL3RlYW0tb3duZXItYXBpJyxcbiAgICAnYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLXdvcmtzcGFjZSc6ICcvYWRtaXNzaW9ucy1jb3Vuc2VsbG9yLWFwaScsXG4gICAgJ2FkbWlzc2lvbnMtb2ZmaWNlci13b3Jrc3BhY2UnOiAnL2FkbWlzc2lvbnMtb2ZmaWNlci1hcGknLFxuICAgICdhZG1pc3Npb25zLWRpcmVjdG9yLXdvcmtzcGFjZSc6ICcvYWRtaXNzaW9ucy1kaXJlY3Rvci1hcGknLFxufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L2FwcGxpY2F0aW9uLXN0b3JlJztcbmltcG9ydCB7IGdlbmVyYXRlQ2xpZW50VG9rZW4gfSBmcm9tICcuLi91dGlscy9jbGllbnQtYXV0aC10b2tlbic7XG5pbXBvcnQgeyBpbnN0aXR1dGlvbkNvZGUsIGlzRGV2ZWxvcG1lbnQsIHRlbmFudENvZGUsIHdvcmtzcGFjZSwgd29ya3NwYWNlQXBpTWFwcGluZywgfSBmcm9tICcuLi91dGlscy9jb25zdGFudHMnO1xuLy8gR2V0IGJhc2UgVVJMIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG52YXIgZ2V0QmFzZVVybCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBGb3IgQ3JlYXRlIFJlYWN0IEFwcFxuICAgIHJldHVybiBwcm9jZXNzLmVudi5SRUFDVF9BUFBfQVBJX0hPU1QgfHwgJyc7XG59O1xuLy8gRm9ybWF0IHF1ZXJ5IHBhcmFtZXRlcnNcbnZhciBmb3JtYXRQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXJhbXMgIT09IG51bGwgJiYgcGFyYW1zICE9PSB2b2lkIDAgPyBwYXJhbXMgOiB7fSkubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSA9PT0gJ19fZW1wdHlfXycgPyAnJyA6IHZhbHVlLFxuICAgICAgICBdO1xuICAgIH0pKTtcbn07XG4vLyBDcmVhdGUgYXhpb3MgaW5zdGFuY2VcbmV4cG9ydCB2YXIgYXhpb3MgPSBBeGlvcy5jcmVhdGUoe1xuICAgIGJhc2VVUkw6IGdldEJhc2VVcmwoKSxcbiAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgaGVhZGVyczoge1xuICAgICAgICAneC10ZW5hbnQtaWQnOiB0ZW5hbnRDb2RlLFxuICAgICAgICAneC1pbnN0aXR1dGlvbi1jb2RlJzogaW5zdGl0dXRpb25Db2RlLFxuICAgIH0sXG59KTtcbi8vIFJlcXVlc3QgaW50ZXJjZXB0b3JcbmF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgLy8gRm9ybWF0IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICB2YXIgcGFyYW1zID0gZm9ybWF0UGFyYW1zKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5wYXJhbXMpO1xuICAgIC8vIEhhbmRsZSB3b3Jrc3BhY2Ugcm91dGluZyAoZGVmYXVsdDogdHJ1ZSlcbiAgICBpZiAoY29uZmlnLndvcmtzcGFjZSAhPT0gZmFsc2UgJiZcbiAgICAgICAgd29ya3NwYWNlICYmXG4gICAgICAgIHdvcmtzcGFjZUFwaU1hcHBpbmdbd29ya3NwYWNlXSAmJlxuICAgICAgICB3b3Jrc3BhY2UgIT09ICdjb21tb24td29ya3NwYWNlJykge1xuICAgICAgICB2YXIgd29ya3NwYWNlUHJlZml4ID0gd29ya3NwYWNlQXBpTWFwcGluZ1t3b3Jrc3BhY2VdO1xuICAgICAgICBjb25maWcudXJsID0gXCJcIi5jb25jYXQod29ya3NwYWNlUHJlZml4KS5jb25jYXQoY29uZmlnLnVybCk7XG4gICAgfVxuICAgIC8vIEFkZCBzZXNzaW9uIHRva2VucyBmcm9tIGNvb2tpZXMgaWYgaW4gZGV2ZWxvcG1lbnRcbiAgICB2YXIgc2Vzc2lvbktleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zZXNzaW9uX2tleScpO1xuICAgIHZhciBvcGVuUGF5bWVudHNLZXkgPSBDb29raWVzLmdldCgnY2FtcHhfb3Blbl9wYXltZW50c19rZXknKTtcbiAgICB2YXIgc3R1ZGVudFNlc3Npb25LZXkgPSBDb29raWVzLmdldCgnY2FtcHhfc3R1ZGVudF9rZXknKTtcbiAgICBpZiAoaXNEZXZlbG9wbWVudCAmJiBzZXNzaW9uS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfc2Vzc2lvbl9rZXknLCBzZXNzaW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKGlzRGV2ZWxvcG1lbnQgJiYgc3R1ZGVudFNlc3Npb25LZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9zdHVkZW50X2tleScsIHN0dWRlbnRTZXNzaW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKG9wZW5QYXltZW50c0tleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X29wZW5fcGF5bWVudHNfa2V5Jywgb3BlblBheW1lbnRzS2V5KTtcbiAgICB9XG4gICAgLy8gSW5qZWN0IGNsaWVudCBhdXRoZW50aWNhdGlvbiB0b2tlblxuICAgIHZhciBjYW1weENsaWVudElkID0gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0NMSUVOVF9JRDtcbiAgICB2YXIgY2FtcHhDbGllbnRTZWNyZXQgPSBwcm9jZXNzLmVudi5SRUFDVF9BUFBfQ0FNUFhfQ0xJRU5UX1NFQ1JFVDtcbiAgICBpZiAoY2FtcHhDbGllbnRJZCAmJiBjYW1weENsaWVudFNlY3JldCkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ3gtY2FtcHgtY2xpZW50JywgZ2VuZXJhdGVDbGllbnRUb2tlbihjYW1weENsaWVudElkLCBjYW1weENsaWVudFNlY3JldCkpO1xuICAgIH1cbiAgICAvLyBTa2lwIHNlbmRpbmcgWC1pbnN0aXR1dGlvbi1jb2RlIGlmIHRoZSBmbGFnIGlzIHNldFxuICAgIGlmIChjb25maWcuc2tpcEluc3RpdHV0aW9uQ29kZSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5kZWxldGUoJ3gtaW5zdGl0dXRpb24tY29kZScpO1xuICAgIH1cbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbmZpZyksIHsgcGFyYW1zOiBwYXJhbXMgfSk7XG59LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xufSk7XG4vLyBSZXNwb25zZSBpbnRlcmNlcHRvclxuYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBoaWRlU25hY2tiYXIgcHJvcGVydHlcbiAgICB2YXIgc2hvdWxkSGlkZVNuYWNrYmFyID0gKChfYSA9IHJlc3BvbnNlLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oaWRlU25hY2tiYXIpID09PSB0cnVlO1xuICAgIC8vIEhhbmRsZSBzdWNjZXNzZnVsIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmXG4gICAgICAgIHJlc3BvbnNlLmNvbmZpZy5tZXRob2QgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhyZXNwb25zZS5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbMjAwLCAyMDEsIDIwMl0uaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSByZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ09wZXJhdGlvbiBzdWNjZXNzZnVsJztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnc3VjY2Vzcyc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIC8vIENoZWNrIGlmIHRoZSBlcnJvciByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2IgPSAoX2EgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kYXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgZXJyb3IgcmVzcG9uc2VzXG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiYgWzQwMCwgNDIyLCA0MTNdLmluY2x1ZGVzKChfYyA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIGVycm9yIHNuYWNrYmFyXG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5tZXNzYWdlID0gZXJyLnJlc3BvbnNlLmRhdGEubWVzc2FnZSB8fCAnQmFkIFJlcXVlc3QnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdlcnJvcic7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXNob3VsZEhpZGVTbmFja2JhciAmJlxuICAgICAgICAoKF9kID0gZXJyLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhlcnIucmVzcG9uc2UuY29uZmlnLm1ldGhvZCkgJiZcbiAgICAgICAgWzQwNF0uaW5jbHVkZXMoZXJyLnJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgLy8gVXNlIEFwcGxpY2F0aW9uU3RvcmUgZm9yIG5vdCBmb3VuZCBlcnJvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IGVyci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ05vdCBGb3VuZCc7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLnNldmVyaXR5ID0gJ2Vycm9yJztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBheGlvcztcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnNidWlsZFNoYXJlZENvbmZpZyhkZXBlbmRlbmNpZXMsIGFsd2F5c0VhZ2VyLCBzaGFyZWREZXBlbmRlbmNpZXNMaXN0KSB7XG4gICAgcmV0dXJuIHNoYXJlZERlcGVuZGVuY2llc0xpc3QucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBrZykge1xuICAgICAgICB2YXIgdmVyc2lvbiA9IGRlcGVuZGVuY2llc1twa2ddO1xuICAgICAgICBpZiAodmVyc2lvbikge1xuICAgICAgICAgICAgYWNjW3BrZ10gPSBfX2Fzc2lnbih7IHNpbmdsZXRvbjogdHJ1ZSwgcmVxdWlyZWRWZXJzaW9uOiB2ZXJzaW9uLCB2ZXJzaW9uOiB2ZXJzaW9uLnJlcGxhY2UoL15bXFxefl0vLCAnJykgfSwgKGFsd2F5c0VhZ2VyLmluY2x1ZGVzKHBrZykgPyB7IGVhZ2VyOiB0cnVlIH0gOiB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xufVxuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBBeGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvYXBwbGljYXRpb24tc3RvcmUnO1xuaW1wb3J0IHsgZ2VuZXJhdGVDbGllbnRUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2NsaWVudC1hdXRoLXRva2VuJztcbmltcG9ydCB7IGluc3RpdHV0aW9uQ29kZSwgaXNEZXZlbG9wbWVudCwgdGVuYW50Q29kZSB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG4vLyBHZXQgYmFzZSBVUkwgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbnZhciBnZXRCYXNlVXJsID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIEZvciBDcmVhdGUgUmVhY3QgQXBwXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUElfSE9TVCB8fCAnJztcbn07XG4vLyBGb3JtYXQgcXVlcnkgcGFyYW1ldGVyc1xudmFyIGZvcm1hdFBhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHBhcmFtcyAhPT0gbnVsbCAmJiBwYXJhbXMgIT09IHZvaWQgMCA/IHBhcmFtcyA6IHt9KS5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlID09PSAnX19lbXB0eV9fJyA/ICcnIDogdmFsdWUsXG4gICAgICAgIF07XG4gICAgfSkpO1xufTtcbi8vIENyZWF0ZSBheGlvcyBpbnN0YW5jZSBmb3Igc2VsZWN0b3JzIHdpdGggd29ya3NwYWNlOiBmYWxzZVxuZXhwb3J0IHZhciBub25Xb3Jrc3BhY2VBeGlvcyA9IEF4aW9zLmNyZWF0ZSh7XG4gICAgYmFzZVVSTDogZ2V0QmFzZVVybCgpLFxuICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICB3b3Jrc3BhY2U6IGZhbHNlLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ3gtdGVuYW50LWlkJzogdGVuYW50Q29kZSxcbiAgICAgICAgJ3gtaW5zdGl0dXRpb24tY29kZSc6IGluc3RpdHV0aW9uQ29kZSxcbiAgICB9LFxufSk7XG4vLyBSZXF1ZXN0IGludGVyY2VwdG9yXG5ub25Xb3Jrc3BhY2VBeGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIC8vIEZvcm1hdCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgdmFyIHBhcmFtcyA9IGZvcm1hdFBhcmFtcyhjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcucGFyYW1zKTtcbiAgICAvLyBTa2lwIHdvcmtzcGFjZSByb3V0aW5nIHNpbmNlIHdvcmtzcGFjZSBpcyBzZXQgdG8gZmFsc2VcbiAgICAvLyBObyB3b3Jrc3BhY2Ugcm91dGluZyBsb2dpYyBuZWVkZWQgaGVyZVxuICAgIC8vIEFkZCBzZXNzaW9uIHRva2VucyBmcm9tIGNvb2tpZXMgaWYgaW4gZGV2ZWxvcG1lbnRcbiAgICB2YXIgc2Vzc2lvbktleSA9IENvb2tpZXMuZ2V0KCdjYW1weF9zZXNzaW9uX2tleScpO1xuICAgIHZhciBvcGVuUGF5bWVudHNLZXkgPSBDb29raWVzLmdldCgnY2FtcHhfb3Blbl9wYXltZW50c19rZXknKTtcbiAgICB2YXIgc3R1ZGVudFNlc3Npb25LZXkgPSBDb29raWVzLmdldCgnY2FtcHhfc3R1ZGVudF9rZXknKTtcbiAgICBpZiAoaXNEZXZlbG9wbWVudCAmJiBzZXNzaW9uS2V5KSB7XG4gICAgICAgIGNvbmZpZy5oZWFkZXJzLnNldCgnY2FtcHhfc2Vzc2lvbl9rZXknLCBzZXNzaW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKGlzRGV2ZWxvcG1lbnQgJiYgc3R1ZGVudFNlc3Npb25LZXkpIHtcbiAgICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KCdjYW1weF9zdHVkZW50X2tleScsIHN0dWRlbnRTZXNzaW9uS2V5KTtcbiAgICB9XG4gICAgaWYgKG9wZW5QYXltZW50c0tleSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ2NhbXB4X29wZW5fcGF5bWVudHNfa2V5Jywgb3BlblBheW1lbnRzS2V5KTtcbiAgICB9XG4gICAgLy8gSW5qZWN0IGNsaWVudCBhdXRoZW50aWNhdGlvbiB0b2tlblxuICAgIHZhciBjYW1weENsaWVudElkID0gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0NMSUVOVF9JRDtcbiAgICB2YXIgY2FtcHhDbGllbnRTZWNyZXQgPSBwcm9jZXNzLmVudi5SRUFDVF9BUFBfQ0FNUFhfQ0xJRU5UX1NFQ1JFVDtcbiAgICBpZiAoY2FtcHhDbGllbnRJZCAmJiBjYW1weENsaWVudFNlY3JldCkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5zZXQoJ3gtY2FtcHgtY2xpZW50JywgZ2VuZXJhdGVDbGllbnRUb2tlbihjYW1weENsaWVudElkLCBjYW1weENsaWVudFNlY3JldCkpO1xuICAgIH1cbiAgICAvLyBTa2lwIHNlbmRpbmcgWC1pbnN0aXR1dGlvbi1jb2RlIGlmIHRoZSBmbGFnIGlzIHNldFxuICAgIGlmIChjb25maWcuc2tpcEluc3RpdHV0aW9uQ29kZSkge1xuICAgICAgICBjb25maWcuaGVhZGVycy5kZWxldGUoJ3gtaW5zdGl0dXRpb24tY29kZScpO1xuICAgIH1cbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbmZpZyksIHsgcGFyYW1zOiBwYXJhbXMgfSk7XG59LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xufSk7XG4vLyBSZXNwb25zZSBpbnRlcmNlcHRvclxubm9uV29ya3NwYWNlQXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBoaWRlU25hY2tiYXIgcHJvcGVydHlcbiAgICB2YXIgc2hvdWxkSGlkZVNuYWNrYmFyID0gKChfYSA9IHJlc3BvbnNlLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oaWRlU25hY2tiYXIpID09PSB0cnVlO1xuICAgIC8vIEhhbmRsZSBzdWNjZXNzZnVsIHJlc3BvbnNlc1xuICAgIGlmICghc2hvdWxkSGlkZVNuYWNrYmFyICYmXG4gICAgICAgIHJlc3BvbnNlLmNvbmZpZy5tZXRob2QgJiZcbiAgICAgICAgWydwdXQnLCAncG9zdCcsICdkZWxldGUnLCAncGF0Y2gnXS5pbmNsdWRlcyhyZXNwb25zZS5jb25maWcubWV0aG9kKSAmJlxuICAgICAgICBbMjAwLCAyMDEsIDIwMl0uaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAvLyBVc2UgQXBwbGljYXRpb25TdG9yZSBmb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSByZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ09wZXJhdGlvbiBzdWNjZXNzZnVsJztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnc3VjY2Vzcyc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIC8vIENoZWNrIGlmIHRoZSBlcnJvciByZXNwb25zZSBoYXMgaGlkZVNuYWNrYmFyIHByb3BlcnR5XG4gICAgdmFyIHNob3VsZEhpZGVTbmFja2JhciA9ICgoX2IgPSAoX2EgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kYXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGlkZVNuYWNrYmFyKSA9PT0gdHJ1ZTtcbiAgICAvLyBIYW5kbGUgZXJyb3IgcmVzcG9uc2VzXG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiYgWzQwMCwgNDIyXS5pbmNsdWRlcygoX2MgPSBlcnIucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBlcnJvciBzbmFja2JhclxuICAgICAgICBBcHBsaWNhdGlvblN0b3JlLnVwZGF0ZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcy5zbmFja2Jhci5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc25hY2tiYXIubWVzc2FnZSA9IGVyci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ0JhZCBSZXF1ZXN0JztcbiAgICAgICAgICAgIHMuc25hY2tiYXIuc2V2ZXJpdHkgPSAnZXJyb3InO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFzaG91bGRIaWRlU25hY2tiYXIgJiZcbiAgICAgICAgKChfZCA9IGVyci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFsncHV0JywgJ3Bvc3QnLCAnZGVsZXRlJywgJ3BhdGNoJ10uaW5jbHVkZXMoZXJyLnJlc3BvbnNlLmNvbmZpZy5tZXRob2QpICYmXG4gICAgICAgIFs0MDRdLmluY2x1ZGVzKGVyci5yZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgIC8vIFVzZSBBcHBsaWNhdGlvblN0b3JlIGZvciBub3QgZm91bmQgZXJyb3Igc25hY2tiYXJcbiAgICAgICAgQXBwbGljYXRpb25TdG9yZS51cGRhdGUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHMuc25hY2tiYXIub3BlbiA9IHRydWU7XG4gICAgICAgICAgICBzLnNuYWNrYmFyLm1lc3NhZ2UgPSBlcnIucmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICdOb3QgRm91bmQnO1xuICAgICAgICAgICAgcy5zbmFja2Jhci5zZXZlcml0eSA9ICdlcnJvcic7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbm9uV29ya3NwYWNlQXhpb3M7XG4iLCIvKipcbiAqIFZvSVAgQ29uZmlndXJhdGlvbiBNb2R1bGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBtYW5hZ2VzIFZvSVAvRXhvdGVsIGNvbmZpZ3VyYXRpb24gZm9yIHdvcmtzcGFjZXMuXG4gKiBPbmx5IHdvcmtzcGFjZXMgbGlzdGVkIGluIFZPSVBfRU5BQkxFRF9XT1JLU1BBQ0VTIHdpbGwgaGF2ZSBWb0lQIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbi8qKlxuICogTGlzdCBvZiB3b3Jrc3BhY2VzIHRoYXQgaGF2ZSBWb0lQL0V4b3RlbCBjYWxsaW5nIGVuYWJsZWQuXG4gKiBBZGQgd29ya3NwYWNlIG5hbWVzIGhlcmUgdG8gZW5hYmxlIFZvSVAgZm9yIHRoYXQgd29ya3NwYWNlLlxuICovXG5leHBvcnQgdmFyIFZPSVBfRU5BQkxFRF9XT1JLU1BBQ0VTID0gW1xuICAgICdhZG1pc3Npb25zLWRpcmVjdG9yLXdvcmtzcGFjZScsXG4gICAgJ2FkbWlzc2lvbnMtY291bnNlbGxvci13b3Jrc3BhY2UnLFxuICAgICdhZG1pc3Npb25zLW9mZmljZXItd29ya3NwYWNlJyxcbiAgICAndGVsZS1jb3Vuc2VsbG9yLXdvcmtzcGFjZScsXG5dO1xuLyoqXG4gKiBDaGVjayBpZiBWb0lQIGlzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gd29ya3NwYWNlXG4gKlxuICogQHBhcmFtIHdvcmtzcGFjZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgd29ya3NwYWNlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgaWYgVm9JUCBpcyBlbmFibGVkIGZvciB0aGUgd29ya3NwYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZvSVBFbmFibGVkRm9yV29ya3NwYWNlKHdvcmtzcGFjZU5hbWUpIHtcbiAgICByZXR1cm4gVk9JUF9FTkFCTEVEX1dPUktTUEFDRVMuaW5jbHVkZXMod29ya3NwYWNlTmFtZSk7XG59XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZyB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU3RvcmUgfSBmcm9tICcuL2FwcGxpY2F0aW9uLXN0b3JlJztcbnZhciBDb25maXJtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe1xuICAgIHNob3dDb25maXJtRGlhbG9nOiBmdW5jdGlvbiAoKSB7IH0sXG59KTtcbmV4cG9ydCB2YXIgQ29uZmlybURpYWxvZ1Byb3ZpZGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW47XG4gICAgdmFyIGNvbmZpcm1EaWFsb2cgPSBBcHBsaWNhdGlvblN0b3JlLnVzZVN0YXRlKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLmNvbmZpcm1EaWFsb2c7IH0pO1xuICAgIHZhciBzaG93Q29uZmlybURpYWxvZyA9IGZ1bmN0aW9uICh0aXRsZSwgbWVzc2FnZSwgb25Db25maXJtLCBvbkNhbmNlbCwgdHlwZSwgY29uZmlybVRleHQsIGNhbmNlbFRleHQpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gJ2NvbmZpcm0nOyB9XG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLmNvbmZpcm1EaWFsb2cgPSB7XG4gICAgICAgICAgICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIG9uQ29uZmlybTogb25Db25maXJtLFxuICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiBvbkNhbmNlbCxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBjb25maXJtVGV4dCxcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiBjYW5jZWxUZXh0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlQ2xvc2VEaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLmNvbmZpcm1EaWFsb2cuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIChfanN4cyhDb25maXJtQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogeyBzaG93Q29uZmlybURpYWxvZzogc2hvd0NvbmZpcm1EaWFsb2cgfSwgY2hpbGRyZW46IFtjaGlsZHJlbiwgX2pzeChDb25maXJtRGlhbG9nLCB7IG9wZW46IGNvbmZpcm1EaWFsb2cuaXNPcGVuLCB0aXRsZTogY29uZmlybURpYWxvZy50aXRsZSwgbWVzc2FnZTogY29uZmlybURpYWxvZy5tZXNzYWdlLCB2YXJpYW50OiBjb25maXJtRGlhbG9nLnR5cGUsIGNvbmZpcm1UZXh0OiBjb25maXJtRGlhbG9nLmNvbmZpcm1CdXR0b25UZXh0LCBjYW5jZWxUZXh0OiBjb25maXJtRGlhbG9nLmNhbmNlbEJ1dHRvblRleHQsIG9uQ29uZmlybTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25maXJtRGlhbG9nLm9uQ29uZmlybSgpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZURpYWxvZygpO1xuICAgICAgICAgICAgICAgIH0sIG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybURpYWxvZy5vbkNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZURpYWxvZygpO1xuICAgICAgICAgICAgICAgIH0gfSldIH0pKTtcbn07XG4iLCJmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCwgZSkge1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fID0gZSwgdDtcbiAgfSwgX3NldFByb3RvdHlwZU9mKHQsIGUpO1xufVxuZXhwb3J0IHsgX3NldFByb3RvdHlwZU9mIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZSc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbnZhciBjaGFuZ2VkQXJyYXkgPSBmdW5jdGlvbiBjaGFuZ2VkQXJyYXkoYSwgYikge1xuICBpZiAoYSA9PT0gdm9pZCAwKSB7XG4gICAgYSA9IFtdO1xuICB9XG5cbiAgaWYgKGIgPT09IHZvaWQgMCkge1xuICAgIGIgPSBbXTtcbiAgfVxuXG4gIHJldHVybiBhLmxlbmd0aCAhPT0gYi5sZW5ndGggfHwgYS5zb21lKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgIHJldHVybiAhT2JqZWN0LmlzKGl0ZW0sIGJbaW5kZXhdKTtcbiAgfSk7XG59O1xuXG52YXIgaW5pdGlhbFN0YXRlID0ge1xuICBlcnJvcjogbnVsbFxufTtcblxudmFyIEVycm9yQm91bmRhcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoRXJyb3JCb3VuZGFyeSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRXJyb3JCb3VuZGFyeSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgX2FyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBfYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KF9hcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcblxuICAgIF90aGlzLnJlc2V0RXJyb3JCb3VuZGFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcztcblxuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMucHJvcHMub25SZXNldCA9PSBudWxsID8gdm9pZCAwIDogKF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMpLm9uUmVzZXQuYXBwbHkoX3RoaXMkcHJvcHMsIGFyZ3MpO1xuXG4gICAgICBfdGhpcy5yZXNldCgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBFcnJvckJvdW5kYXJ5LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogZXJyb3JcbiAgICB9O1xuICB9O1xuXG4gIHZhciBfcHJvdG8gPSBFcnJvckJvdW5kYXJ5LnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHtcbiAgICB0aGlzLnNldFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZENhdGNoID0gZnVuY3Rpb24gY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGluZm8pIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMkb25FcnJvciwgX3RoaXMkcHJvcHMyO1xuXG4gICAgKF90aGlzJHByb3BzJG9uRXJyb3IgPSAoX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcykub25FcnJvcikgPT0gbnVsbCA/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/ICdjb25maXJtJyA6IF9iO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgcy5jb25maXJtRGlhbG9nID0ge1xuICAgICAgICAgICAgICAgICAgICBpc09wZW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IGNvbmZpcm1CdXR0b25UZXh0LFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiBjYW5jZWxCdXR0b25UZXh0LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldERpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldERpYWxvZygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgcmVzZXREaWFsb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFwcGxpY2F0aW9uU3RvcmUudXBkYXRlKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICBzLmNvbmZpcm1EaWFsb2cgPSBkZWZhdWx0Q29uZmlybURpYWxvZ1N0YXRlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBpc0NvbmZpcm1lZDtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IE11bHRpU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIERlcGFydG1lbnRNb25nb011bHRpU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goTXVsdGlTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICd0eXBlJyxcbiAgICAgICAgICAgIHVzZVN1YkxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnX2lkJyxcbiAgICAgICAgICAgIGlzT2JqZWN0SWQ6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogbm9uV29ya3NwYWNlQXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2RlcGFydG1lbnRzXCIgfSkpKTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IE11bHRpU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIERlcGFydG1lbnRTcWxNdWx0aVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KE11bHRpU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAndHlwZScsXG4gICAgICAgICAgICB1c2VTdWJMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgICAgIGlzSW50OiB0cnVlLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IG5vbldvcmtzcGFjZUF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9kZXBhcnRtZW50cy1zcWxcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEJhdGNoU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIkJhdGNoXCIgfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2JhdGNoZXNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIENvdXJzZVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnY291cnNlTmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ2xldmVsJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvY291cnNlc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgRGVwYXJ0bWVudFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnbmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ3R5cGUnLFxuICAgICAgICAgICAgdXNlU3ViTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0sIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdfaWQnLFxuICAgICAgICAgICAgaXNPYmplY3RJZDogdHJ1ZSxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBub25Xb3Jrc3BhY2VBeGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvZGVwYXJ0bWVudHNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEVtcGxveWVlc1NlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnX2lkJyxcbiAgICAgICAgICAgIGlzT2JqZWN0SWQ6IHRydWUsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICdmdWxsTmFtZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ2VtcGxveWVlSWQnLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9lbXBsb3llZXNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEV4YW1zUmVndWxhdGlvblNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7IHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiUmVndWxhdGlvblwiIH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9leGFtLXJlZ3VsYXRpb25zXCIsIGRiTGFiZWxQcm9wczoge1xuICAgICAgICBsYWJlbEtleTogJ3IubmFtZScsXG4gICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgIHZhbHVlS2V5OiAnci5uYW1lJyxcbiAgICB9IH0pKSk7IH07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xudmFyIGV4YW1UeXBlT3B0aW9ucyA9IFtcbiAgICB7IGxhYmVsOiAnQWxsJywgdmFsdWU6IG51bGwgfSxcbiAgICB7IGxhYmVsOiAnUkVHVUxBUicsIHZhbHVlOiAnUicgfSxcbiAgICB7IGxhYmVsOiAnU1VQUExFTUVOVEFSWScsIHZhbHVlOiAnUycgfSxcbl07XG5leHBvcnQgdmFyIEV4YW1UeXBlU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHsgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJFeGFtIFR5cGVcIiwgb3B0aW9uczogZXhhbVR5cGVPcHRpb25zIH0sIHByb3BzKSkpOyB9O1xuIiwiZXhwb3J0IHZhciBGZWVUeXBlcyA9IFtcbiAgICB7XG4gICAgICAgIGxhYmVsOiAnVHVpdGlvbiBGZWUnLFxuICAgICAgICB2YWx1ZTogJ3R1aXRpb25fZmVlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbGFiZWw6ICdBZG1pc3Npb24gRmVlJyxcbiAgICAgICAgdmFsdWU6ICdhZG1pc3Npb25fZmVlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbGFiZWw6ICdIb3N0ZWwgRmVlJyxcbiAgICAgICAgdmFsdWU6ICdob3N0ZWxfZmVlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbGFiZWw6ICdUcmFuc3BvcnQgRmVlJyxcbiAgICAgICAgdmFsdWU6ICd0cmFuc3BvcnRfZmVlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbGFiZWw6ICdFeGFtIEZlZScsXG4gICAgICAgIHZhbHVlOiAnZXhhbV9mZWUnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBsYWJlbDogJ090aGVyIEZlZScsXG4gICAgICAgIHZhbHVlOiAnb3RoZXJfZmVlJyxcbiAgICB9LFxuXTtcbmV4cG9ydCB2YXIgeWVhcnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiA2IH0sIGZ1bmN0aW9uIChfLCBpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIGk7XG59KTtcbmV4cG9ydCB2YXIgYmF0Y2hPcHRpb25zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgZnVuY3Rpb24gKF8sIGkpIHsgcmV0dXJuICh7XG4gICAgbGFiZWw6IFwiXCIuY29uY2F0KG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIGksIFwiIC0gXCIpLmNvbmNhdChuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBpICsgMSksXG4gICAgdmFsdWU6IFwiXCIuY29uY2F0KG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIGksIFwiIC0gXCIpLmNvbmNhdChuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBpICsgMSksXG59KTsgfSk7XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgRmVlVHlwZXMgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB2YXIgRmVlVHlwZVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJGZWUgVHlwZVwiLCBvcHRpb25zOiBGZWVUeXBlcyA9PT0gbnVsbCB8fCBGZWVUeXBlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogRmVlVHlwZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgfSk7IH0pIH0sIHByb3BzKSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEhvc3RlbEJsb2NrU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgICAgICBpc0ludDogdHJ1ZSxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICd0eXBlJyxcbiAgICAgICAgICAgIHVzZUxhYmVsU3RhcnRDYXNlOiB0cnVlLFxuICAgICAgICAgICAgdXNlU3ViTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL2hvc3RlbC1ibG9ja3NcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIEhvc3RlbEZsb29yU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGxhYmVsOiBcIkhvc3RlbCBSb29tIE5vLlwiLCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnZmxvb3InLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnZmxvb3InLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiZHJvcGRvd25zL2Zsb29yc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgSG9zdGVsUm9vbVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJIb3N0ZWwgUm9vbVwiLCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICB9LCBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAncm9vbV9udW1iZXInLFxuICAgICAgICAgICAgdXNlTGFiZWxTdGFydENhc2U6IHRydWUsXG4gICAgICAgICAgICAvLyBzdWJMYWJlbEtleTogJ2Zsb29yJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiZHJvcGRvd25zL2hvc3RlbC1yb29tc1wiLCBleHRlcm5hbEF4aW9zOiBheGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIE1vbnRoWWVhclNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7IHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgbGFiZWw6IFwiTW9udGggJiBZZWFyXCIgfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogYXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL21vbnRoLXllYXJzXCIgfSkpKTsgfTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFByaW50Rm9ybWF0U2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAndHlwZScsXG4gICAgICAgICAgICB1c2VTdWJMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvcHJpbnQtZm9ybWF0c1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUHJvZ3JhbVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnYnJhbmNoQ29kZScsXG4gICAgICAgICAgICBzdWJMYWJlbEtleTogJ2JyYW5jaERpc3BsYXknLFxuICAgICAgICB9IH0sIHByb3BzLCB7IGV4dGVybmFsQXhpb3M6IGF4aW9zLCBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiL2Ryb3Bkb3ducy9wcm9ncmFtc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUmVndWxhdGlvblNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJSZWd1bGF0aW9uXCIsIGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdyZWd1bGF0aW9uX2lkJyxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ3IubmFtZScsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9yZWd1bGF0aW9uc1wiLCBleHRlcm5hbEF4aW9zOiBheGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFJlc2VhcmNoRXhwZXJ0RGVzaWduYXRpb25TZWxlY3RvciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiAoX2pzeChTaW5nbGVTZWxlY3QsIF9fYXNzaWduKHsgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICB9LCBkYlZhbHVlUHJvcHM6IHtcbiAgICAgICAgICAgIHZhbHVlS2V5OiAnaWQnLFxuICAgICAgICAgICAgaXNJbnQ6IHRydWUsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgZXh0ZXJuYWxBeGlvczogbm9uV29ya3NwYWNlQXhpb3MsIG9wdGlvbnNBcGlFbmRQb2ludDogXCIvZHJvcGRvd25zL3Jlc2VhcmNoLWV4cGVydC1kZXNpZ25hdGlvbnNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFJlc2VhcmNoRXhwZXJ0U2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAvLyBkYkxWYWx1ZVByb3BzIGFyZSBub3QgYmVpbmcgdXNlZCBpbiBiYWNrZW5kLlxuICAgIC8vIGRiTGFiZWxQcm9wcy5zZWFyY2gsIGxpbWl0LCBvZmZzZXQgYXJlIGJlaW5nIHVzZWQgaW4gYmFja2VuZC5cbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgIH0sIGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAndHlwZScsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcImRyb3Bkb3ducy9yZXNlYXJjaC1leHBlcnRzXCIsIGV4dGVybmFsQXhpb3M6IG5vbldvcmtzcGFjZUF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgUmVzZWFyY2hTdGFnZVNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgLy8gRXNjYXBlICdvcmRlcicgY29sdW1uIG5hbWUgYXMgaXQncyBhIHJlc2VydmVkIGtleXdvcmQgaW4gTXlTUUxcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiVmFsdWVQcm9wczoge1xuICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcsXG4gICAgICAgICAgICBpc0ludDogdHJ1ZSxcbiAgICAgICAgfSwgZGJMYWJlbFByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbEtleTogJ25hbWUnLFxuICAgICAgICAgICAgc3ViTGFiZWxLZXk6ICdgb3JkZXJgJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBvcHRpb25zQXBpRW5kUG9pbnQ6IFwiZHJvcGRvd25zL3Jlc2VhcmNoLXN0YWdlc1wiLCBleHRlcm5hbEF4aW9zOiBub25Xb3Jrc3BhY2VBeGlvcyB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFNlbWVzdGVyU2VsZWN0b3IgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gKF9qc3goU2luZ2xlU2VsZWN0LCBfX2Fzc2lnbih7IGRiTGFiZWxQcm9wczoge1xuICAgICAgICAgICAgbGFiZWxLZXk6ICduYW1lJyxcbiAgICAgICAgICAgIHN1YkxhYmVsS2V5OiAneWVhcicsXG4gICAgICAgIH0gfSwgcHJvcHMsIHsgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvc2VtZXN0ZXJzXCIsIGV4dGVybmFsQXhpb3M6IGF4aW9zIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBTaW5nbGVTZWxlY3QgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IG5vbldvcmtzcGFjZUF4aW9zIGFzIGF4aW9zIH0gZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCB2YXIgU3R1ZGVudFNlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnc2x1ZycsXG4gICAgICAgICAgICB1c2VMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvc3R1ZGVudHNcIiB9KSkpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0IH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBub25Xb3Jrc3BhY2VBeGlvcyBhcyBheGlvcyB9IGZyb20gJy4uL2NvbmZpZyc7XG5leHBvcnQgdmFyIFN0dWRlbnRTZXJ2aWNlc1NlbGVjdG9yID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBkYkxhYmVsUHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsS2V5OiAnc2x1ZycsXG4gICAgICAgICAgICB1c2VMYWJlbFN0YXJ0Q2FzZTogdHJ1ZSxcbiAgICAgICAgfSwgZGJWYWx1ZVByb3BzOiB7XG4gICAgICAgICAgICB2YWx1ZUtleTogJ2lkJyxcbiAgICAgICAgfSB9LCBwcm9wcywgeyBleHRlcm5hbEF4aW9zOiBheGlvcywgb3B0aW9uc0FwaUVuZFBvaW50OiBcIi9kcm9wZG93bnMvc3R1ZGVudC1zZXJ2aWNlc1wiIH0pKSk7XG59O1xuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IFNpbmdsZVNlbGVjdCB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgeWVhcnMgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB2YXIgWWVhclJhbmdlU2VsZWN0b3IgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgX2IgPSBfYS5zdWZmaXgsIHN1ZmZpeCA9IF9iID09PSB2b2lkIDAgPyBudWxsIDogX2IsIF9jID0gX2EudmFsdWVLZXksIHZhbHVlS2V5ID0gX2MgPT09IHZvaWQgMCA/ICd5ZWFyUmFuZ2UnIDogX2MsIHByb3BzID0gX19yZXN0KF9hLCBbXCJzdWZmaXhcIiwgXCJ2YWx1ZUtleVwiXSk7XG4gICAgcmV0dXJuIChfanN4KFNpbmdsZVNlbGVjdCwgX19hc3NpZ24oeyBsYWJlbDogXCJZZWFyIFJhbmdlXCIsIG9wdGlvbnM6IHllYXJzID09PSBudWxsIHx8IHllYXJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB5ZWFycy5tYXAoZnVuY3Rpb24gKHllYXIpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICBsYWJlbDogc3VmZml4XG4gICAgICAgICAgICAgICAgPyBcIlwiLmNvbmNhdChzdWZmaXgsIFwiIFwiKS5jb25jYXQoeWVhciwgXCIgLSBcIikuY29uY2F0KHllYXIgKyAxKVxuICAgICAgICAgICAgICAgIDogXCJcIi5jb25jYXQoeWVhciwgXCIgLSBcIikuY29uY2F0KHllYXIgKyAxKSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZUtleSA9PT0gJ3llYXJSYW5nZScgPyBcIlwiLmNvbmNhdCh5ZWFyLCBcIiAtIFwiKS5jb25jYXQoeWVhciArIDEpIDogeWVhcixcbiAgICAgICAgfSk7IH0pIH0sIHByb3BzKSkpO1xufTtcbiIsImV4cG9ydCB2YXIgb3BlbkluTmV3VGFiID0gZnVuY3Rpb24gKHBhdGhBZnRlckJhc2UsIGV4Y2x1ZGVJbnN0aXR1dGlvbiwgZXhjbHVkZVdvcmtzcGFjZSkge1xuICAgIGlmIChleGNsdWRlSW5zdGl0dXRpb24gPT09IHZvaWQgMCkgeyBleGNsdWRlSW5zdGl0dXRpb24gPSBmYWxzZTsgfVxuICAgIGlmIChleGNsdWRlV29ya3NwYWNlID09PSB2b2lkIDApIHsgZXhjbHVkZVdvcmtzcGFjZSA9IGZhbHNlOyB9XG4gICAgdmFyIGN1cnJlbnRQYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIHZhciBzZWdtZW50cyA9IGN1cnJlbnRQYXRoLnNwbGl0KCcvJyk7XG4gICAgLy8gQnVpbGQgYmFzZSBwYXRoIGJhc2VkIG9uIGV4Y2x1c2lvbiBmbGFnc1xuICAgIHZhciBiYXNlUGFydHMgPSBbXTtcbiAgICAvLyBBZGQgc2VnbWVudCAxIChpbnN0aXR1dGlvbikgdW5sZXNzIGV4Y2x1ZGVkXG4gICAgaWYgKCFleGNsdWRlSW5zdGl0dXRpb24gJiYgc2VnbWVudHNbMV0pIHtcbiAgICAgICAgYmFzZVBhcnRzLnB1c2goc2VnbWVudHNbMV0pO1xuICAgIH1cbiAgICAvLyBBZGQgc2VnbWVudCAyICh3b3Jrc3BhY2UpIHVubGVzcyBleGNsdWRlZFxuICAgIGlmICghZXhjbHVkZVdvcmtzcGFjZSAmJiBzZWdtZW50c1syXSkge1xuICAgICAgICBiYXNlUGFydHMucHVzaChzZWdtZW50c1syXSk7XG4gICAgfVxuICAgIHZhciBiYXNlID0gYmFzZVBhcnRzLmxlbmd0aCA+IDAgPyAnLycgKyBiYXNlUGFydHMuam9pbignLycpIDogJyc7XG4gICAgLy8gQ29uc3RydWN0IGZ1bGwgVVJMIGFuZCBvcGVuIGluIG5ldyB0YWJcbiAgICB2YXIgZnVsbFBhdGggPSBcIlwiLmNvbmNhdCh3aW5kb3cubG9jYXRpb24ub3JpZ2luKS5jb25jYXQoYmFzZSwgXCIvXCIpLmNvbmNhdChwYXRoQWZ0ZXJCYXNlKTtcbiAgICB3aW5kb3cub3BlbihmdWxsUGF0aCwgJ19ibGFuaycpO1xufTtcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBFeG90ZWxDUk1XZWJTREsgZnJvbSAnQGV4b3RlbC1ucG0tZGV2L2V4b3RlbC1pcC1jYWxsaW5nLWNybS13ZWJzZGsnO1xudmFyIEV4b3RlbFNlcnZpY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXhvdGVsU2VydmljZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5leG90ZWxTREsgPSBudWxsO1xuICAgICAgICB0aGlzLndlYlBob25lID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLnNlc3Npb25MaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMucGVybWlzc2lvblN0YXR1cyA9ICd1bmtub3duJztcbiAgICAgICAgdGhpcy5oYW5kbGVDYWxsRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxEYXRhKSB7XG4gICAgICAgICAgICBfdGhpcy5jYWxsTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBsaXN0ZW5lcihldmVudCwgY2FsbERhdGEpOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVSZWdpc3RlckV2ZW50ID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgICAgICBfdGhpcy5yZWdpc3Rlckxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gbGlzdGVuZXIoc3RhdGUpOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVTZXNzaW9uRXZlbnQgPSBmdW5jdGlvbiAoc3RhdGUsIGRhdGEpIHtcbiAgICAgICAgICAgIF90aGlzLnNlc3Npb25MaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyKHN0YXRlLCBkYXRhKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIEV4b3RlbFNlcnZpY2UuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghRXhvdGVsU2VydmljZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgRXhvdGVsU2VydmljZS5pbnN0YW5jZSA9IG5ldyBFeG90ZWxTZXJ2aWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEV4b3RlbFNlcnZpY2UuaW5zdGFuY2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBFeG90ZWwgU0RLXG4gICAgICogQHBhcmFtIGFjY2Vzc1Rva2VuIC0gVGhlIGFjY2VzcyB0b2tlbiBmb3IgYXV0aGVudGljYXRpb25cbiAgICAgKiBAcGFyYW0gYWdlbnRVc2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgYWdlbnRcbiAgICAgKiBAcGFyYW0gYXV0b0Nvbm5lY3RWT0lQIC0gV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGNvbm5lY3QgVk9JUCAoZGVmYXVsdDogdHJ1ZSlcbiAgICAgKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzc1xuICAgICAqL1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiAoYWNjZXNzVG9rZW5fMSwgYWdlbnRVc2VySWRfMSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiAoYWNjZXNzVG9rZW4sIGFnZW50VXNlcklkLCBhdXRvQ29ubmVjdFZPSVApIHtcbiAgICAgICAgICAgIHZhciBwaG9uZSwgZXJyb3JfMTtcbiAgICAgICAgICAgIGlmIChhdXRvQ29ubmVjdFZPSVAgPT09IHZvaWQgMCkgeyBhdXRvQ29ubmVjdFZPSVAgPSB0cnVlOyB9XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jaGVja0F1ZGlvUGVybWlzc2lvbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhvdGVsU0RLID0gbmV3IEV4b3RlbENSTVdlYlNESyhhY2Nlc3NUb2tlbiwgYWdlbnRVc2VySWQsIGF1dG9Db25uZWN0Vk9JUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4b3RlbFNESy5Jbml0aWFsaXplKHRoaXMuaGFuZGxlQ2FsbEV2ZW50LCB0aGlzLmhhbmRsZVJlZ2lzdGVyRXZlbnQsIHRoaXMuaGFuZGxlU2Vzc2lvbkV2ZW50KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBob25lID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJQaG9uZSA9IHBob25lIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgISF0aGlzLndlYlBob25lXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIEV4b3RlbCBTREs6JywgZXJyb3JfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZmFsc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5jaGVja0F1ZGlvUGVybWlzc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkZXZpY2VzLCBoYXNBdWRpb0RldmljZSwgcGVybWlzc2lvblN0YXR1c18xLCBlcnJvcl8yLCBlcnJvcl8zO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgNiwgLCA3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNBdWRpb0RldmljZSA9IGRldmljZXMuc29tZShmdW5jdGlvbiAoZGV2aWNlKSB7IHJldHVybiBkZXZpY2Uua2luZCA9PT0gJ2F1ZGlvaW5wdXQnOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQXVkaW9EZXZpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBhdWRpbyBpbnB1dCBkZXZpY2VzIGZvdW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uU3RhdHVzID0gJ2RlbmllZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGZhbHNlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG5hdmlnYXRvci5wZXJtaXNzaW9ucyAmJiBuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsyLCA0LCAsIDVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtaWNyb3Bob25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25TdGF0dXNfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblN0YXR1cyA9IHBlcm1pc3Npb25TdGF0dXNfMS5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25TdGF0dXNfMS5vbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5wZXJtaXNzaW9uU3RhdHVzID0gcGVybWlzc2lvblN0YXR1c18xLnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBwZXJtaXNzaW9uU3RhdHVzXzEuc3RhdGUgPT09ICdncmFudGVkJ107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBxdWVyeSBwZXJtaXNzaW9uIHN0YXR1czonLCBlcnJvcl8yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovLCB0cnVlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNoZWNraW5nIGF1ZGlvIHBlcm1pc3Npb25zOicsIGVycm9yXzMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGZhbHNlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUucmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdHJlYW0sIGVycm9yXzQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDIsICwgM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykgeyByZXR1cm4gdHJhY2suc3RvcCgpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblN0YXR1cyA9ICdncmFudGVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0cnVlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfNCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgbWljcm9waG9uZSBhY2Nlc3M6JywgZXJyb3JfNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25TdGF0dXMgPSAnZGVuaWVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmYWxzZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLm1ha2VDYWxsID0gZnVuY3Rpb24gKHBob25lTnVtYmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLndlYlBob25lKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignV2ViIHBob25lIG5vdCBpbml0aWFsaXplZCcpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy53ZWJQaG9uZS5NYWtlQ2FsbChwaG9uZU51bWJlciwgZnVuY3Rpb24gKHN0YXR1cywgZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmFjY2VwdENhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBncmFudGVkO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLndlYlBob25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWIgcGhvbmUgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnBlcm1pc3Npb25TdGF0dXMgIT09ICdncmFudGVkJykpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZXF1ZXN0TWljcm9waG9uZUFjY2VzcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JhbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWljcm9waG9uZSBhY2Nlc3MgZGVuaWVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUGhvbmUuQWNjZXB0Q2FsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmhhbmd1cENhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLkhhbmd1cENhbGwoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlamVjdCBhbiBpbmNvbWluZyBjYWxsIGJlZm9yZSBhY2NlcHRpbmcgaXQuXG4gICAgICogTm90ZTogRXhvdGVsIFNESyBvbmx5IGhhcyBIYW5ndXBDYWxsIC0gbm8gc2VwYXJhdGUgUmVqZWN0Q2FsbCBtZXRob2QuXG4gICAgICogSGFuZ3VwQ2FsbCBpbnRlcm5hbGx5IGNhbGxzIHdlYnJ0Y1NJUFBob25lLnJlamVjdENhbGwoKSAtPiBwaG9uZS5zaXBIYW5nVXAoKVxuICAgICAqL1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnJlamVjdENhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLkhhbmd1cENhbGwoKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnRvZ2dsZUhvbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLlRvZ2dsZUhvbGQoKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnRvZ2dsZU11dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLlRvZ2dsZU11dGUoKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnNlbmREVE1GID0gZnVuY3Rpb24gKGRpZ2l0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLlNlbmREVE1GKGRpZ2l0KTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnJlZ2lzdGVyRGV2aWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZ3JhbnRlZDtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMucGVybWlzc2lvblN0YXR1cyAhPT0gJ2dyYW50ZWQnKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlcXVlc3RNaWNyb3Bob25lQWNjZXNzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBncmFudGVkID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmFudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaWNyb3Bob25lIGFjY2VzcyBkZW5pZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgKF9hID0gdGhpcy53ZWJQaG9uZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLlJlZ2lzdGVyRGV2aWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUudW5yZWdpc3RlckRldmljZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLndlYlBob25lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuVW5SZWdpc3RlckRldmljZSgpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUuZ2V0UGVybWlzc2lvblN0YXR1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvblN0YXR1cztcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmFkZENhbGxMaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLnJlbW92ZUNhbGxMaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIEV4b3RlbFNlcnZpY2UucHJvdG90eXBlLmFkZFJlZ2lzdGVyTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5yZWdpc3Rlckxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIH07XG4gICAgRXhvdGVsU2VydmljZS5wcm90b3R5cGUucmVtb3ZlUmVnaXN0ZXJMaXN0ZW5lciA9IGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5hZGRTZXNzaW9uTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgfTtcbiAgICBFeG90ZWxTZXJ2aWNlLnByb3RvdHlwZS5yZW1vdmVTZXNzaW9uTGlzdGVuZXIgPSBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgICByZXR1cm4gRXhvdGVsU2VydmljZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBFeG90ZWxTZXJ2aWNlO1xuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYXhpb3MgfSBmcm9tICcuLi8uLi9jb25maWcvYXhpb3MnO1xuLyoqXG4gKiBDaGVjayBpZiBWb0lQIGlzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IHRlbmFudCBieSBmZXRjaGluZyBub3RpZmljYXRpb24gY29uZmlnLlxuICogUmV0dXJucyB0cnVlIG9ubHkgaWY6XG4gKiAtIGVuYWJsZVZvaWNlIGlzIHRydWVcbiAqIC0gdm9pY2VDb25maWdzIGhhcyBhdCBsZWFzdCBvbmUgZW5hYmxlZCBjb25maWdcbiAqL1xuZXhwb3J0IHZhciBjaGVja1ZvSVBFbmFibGVkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YSwgY29uZmlnLCBlbmFibGVkVm9pY2VDb25maWcsIGhhc1ZhbGlkVG9rZW4sIGVycm9yXzE7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFswLCAyLCAsIDNdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5nZXQoJy9ub3RpZmljYXRpb25zL25vdGlmaWNhdGlvbi1jb25maWdzJyldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Quc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIGNvbmZpZyA9IGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS5jb25maWc7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdm9pY2UgaXMgZW5hYmxlZCBhdCB0ZW5hbnQgbGV2ZWxcbiAgICAgICAgICAgICAgICBpZiAoIShjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuZW5hYmxlVm9pY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IGVuYWJsZWQ6IGZhbHNlLCBoYXNWYWxpZFRva2VuOiBmYWxzZSB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW5hYmxlZFZvaWNlQ29uZmlnID0gKF9hID0gY29uZmlnLnZvaWNlQ29uZmlncykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbmQoZnVuY3Rpb24gKHZjKSB7IHJldHVybiB2Yy5pc0VuYWJsZWQgPT09IHRydWU7IH0pO1xuICAgICAgICAgICAgICAgIGlmICghZW5hYmxlZFZvaWNlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IGVuYWJsZWQ6IGZhbHNlLCBoYXNWYWxpZFRva2VuOiBmYWxzZSB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFzVmFsaWRUb2tlbiA9ICEhKCgoX2IgPSBlbmFibGVkVm9pY2VDb25maWcuRVhPVEVMKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IudG9rZW4pICYmXG4gICAgICAgICAgICAgICAgICAgICgoX2MgPSBlbmFibGVkVm9pY2VDb25maWcuRVhPVEVMKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudG9rZW5FeHBpcmVzQXQpICYmXG4gICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGVuYWJsZWRWb2ljZUNvbmZpZy5FWE9URUwudG9rZW5FeHBpcmVzQXQpID4gbmV3IERhdGUoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgZW5hYmxlZDogdHJ1ZSwgaGFzVmFsaWRUb2tlbjogaGFzVmFsaWRUb2tlbiB9XTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjaGVjayBWb0lQIGNvbmZpZzonLCBlcnJvcl8xKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBlbmFibGVkOiBmYWxzZSwgaGFzVmFsaWRUb2tlbjogZmFsc2UgfV07XG4gICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEdldCB0aGUgYWN0aXZlIEV4b3RlbCB2b2ljZSB0b2tlbiBmcm9tIHRoZSBiYWNrZW5kLlxuICogVGhlIGJhY2tlbmQgbWFuYWdlcyBjcmVkZW50aWFscyBzZWN1cmVseSBhbmQgYXV0by1yZWZyZXNoZXMgdG9rZW5zLlxuICovXG5leHBvcnQgdmFyIGdldEFjdGl2ZVZvaWNlVG9rZW4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhLCBlcnJvcl8yO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgMiwgLCAzXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MuZ2V0KCcvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb24tY29uZmlncy92b2ljZS1jb25maWcvYWN0aXZlLXRva2VuJyldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBlcnJvcl8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBFeG90ZWwgdG9rZW46JywgZXJyb3JfMik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG51bGxdO1xuICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0QWN0aXZlVm9pY2VUb2tlbiBpbnN0ZWFkLlxuICogVGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBidXQgd2lsbCBiZSByZW1vdmVkLlxuICovXG5leHBvcnQgdmFyIGNyZWF0ZUV4b3RlbEFwcFRva2VuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdG9rZW5EYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRBY3RpdmVWb2ljZVRva2VuKCldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHRva2VuRGF0YSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRva2VuRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGFjdGl2ZSB2b2ljZSBjb25maWd1cmF0aW9uIGZvdW5kJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IERhdGE6IHRva2VuRGF0YS50b2tlbiB9XTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEluaXRpYXRlIGFuIG91dGJvdW5kIGNhbGwgLSBjcmVhdGVzIGNhbGwgYWN0aXZpdHkgcmVjb3JkXG4gKi9cbmV4cG9ydCB2YXIgaW5pdGlhdGVDYWxsQWN0aXZpdHkgPSBmdW5jdGlvbiAoaW5wdXQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLnBvc3QoXCIvY29tbXVuaWNhdGlvbi1hY3Rpdml0aWVzL2luaXRpYXRlXCIsIGlucHV0KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogUmVnaXN0ZXIgYW4gaW5jb21pbmcgY2FsbCAtIGNyZWF0ZXMgY2FsbCBhY3Rpdml0eSByZWNvcmRcbiAqL1xuZXhwb3J0IHZhciByZWdpc3RlckluY29taW5nQ2FsbCA9IGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MucG9zdChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvcmVnaXN0ZXItaW5jb21pbmdcIiwgaW5wdXQpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBGZXRjaCBjYWxsIGhpc3RvcnkgZm9yIGEgcHJvc3BlY3RcbiAqL1xuZXhwb3J0IHZhciBmZXRjaENhbGxIaXN0b3J5ID0gZnVuY3Rpb24gKHByb3NwZWN0SWQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLmdldChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvYnktcHJvc3BlY3RcIiwge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgcHJvc3BlY3RJZDogcHJvc3BlY3RJZCB9LFxuICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBHZXQgY2FsbCBhY3Rpdml0eSBieSBJRFxuICovXG5leHBvcnQgdmFyIGdldENhbGxBY3Rpdml0eUJ5SWQgPSBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zLmdldChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvXCIuY29uY2F0KGlkKSldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEdldCBjYWxsIGFjdGl2aXR5IGJ5IENhbGxTaWRcbiAqL1xuZXhwb3J0IHZhciBnZXRDYWxsQWN0aXZpdHlCeUNhbGxTaWQgPSBmdW5jdGlvbiAoY2FsbFNpZCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MuZ2V0KFwiL2NvbW11bmljYXRpb24tYWN0aXZpdGllcy9ieS1jYWxsLXNpZFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBjYWxsU2lkOiBjYWxsU2lkIH0sXG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGRhdGEgPSAoX2Euc2VudCgpKS5kYXRhO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEdldCBjYWxsIGNvdW50IGZvciBhIHByb3NwZWN0XG4gKi9cbmV4cG9ydCB2YXIgZ2V0Q2FsbENvdW50QnlQcm9zcGVjdCA9IGZ1bmN0aW9uIChwcm9zcGVjdElkKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5nZXQoXCIvY29tbXVuaWNhdGlvbi1hY3Rpdml0aWVzL2NvdW50LWJ5LXByb3NwZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IHByb3NwZWN0SWQ6IHByb3NwZWN0SWQgfSxcbiAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEuY291bnQpIHx8IDBdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogU2F2ZSBjYWxsIGRpc3Bvc2l0aW9uXG4gKi9cbmV4cG9ydCB2YXIgc2F2ZUNhbGxEaXNwb3NpdGlvbiA9IGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVxdWVzdEJvZHksIGRhdGE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxTdGF0dXNEaXNwb3NpdGlvbjogaW5wdXQuY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvbkNhdGVnb3J5OiBpbnB1dC5kaXNwb3NpdGlvbkNhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICBwcm9zcGVjdFN0YXR1czogaW5wdXQucHJvc3BlY3RTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uTm90ZXM6IGlucHV0LmRpc3Bvc2l0aW9uTm90ZXMsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrU2NoZWR1bGVkQXQ6IGlucHV0LmNhbGxiYWNrU2NoZWR1bGVkQXQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvcy5wb3N0KFwiL2NvbW11bmljYXRpb24tYWN0aXZpdGllcy9cIi5jb25jYXQoaW5wdXQuY2FsbElkLCBcIi9kaXNwb3NpdGlvblwiKSwgcmVxdWVzdEJvZHkpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBkYXRhID0gKF9hLnNlbnQoKSkuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBDYW5jZWwvZGVjbGluZSBhIGNhbGwgYmVmb3JlIGl0IHdhcyBjb25uZWN0ZWRcbiAqIFVwZGF0ZXMgdGhlIGNhbGwgYWN0aXZpdHkgc3RhdHVzIHRvIENBTkNFTEVEXG4gKi9cbmV4cG9ydCB2YXIgY2FuY2VsQ2FsbCA9IGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3MucG9zdChcIi9jb21tdW5pY2F0aW9uLWFjdGl2aXRpZXMvY2FuY2VsXCIsIGlucHV0KV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgZGF0YSA9IChfYS5zZW50KCkpLmRhdGE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSwgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXhvdGVsU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9leG90ZWwvRXhvdGVsU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckluY29taW5nQ2FsbCB9IGZyb20gJy4uL3NlcnZpY2VzL2V4b3RlbC9hcGknO1xuLy8gR2xvYmFsIGNvbnRleHQga2V5IGZvciBjcm9zcy1tb2R1bGUtZmVkZXJhdGlvbiBzaGFyaW5nXG52YXIgRVhPVEVMX0NPTlRFWFRfS0VZID0gJ19fRVhPVEVMX0NPTlRFWFRfXyc7XG4vLyBHZXQgb3IgY3JlYXRlIGEgc2hhcmVkIGNvbnRleHQgYWNyb3NzIG1vZHVsZSBmZWRlcmF0aW9uIGJvdW5kYXJpZXNcbnZhciBnZXRTaGFyZWRDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghd2luZG93W0VYT1RFTF9DT05URVhUX0tFWV0pIHtcbiAgICAgICAgO1xuICAgICAgICB3aW5kb3dbRVhPVEVMX0NPTlRFWFRfS0VZXSA9IGNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHdpbmRvd1tFWE9URUxfQ09OVEVYVF9LRVldO1xufTtcbnZhciBpbml0aWFsQ2FsbFN0YXRlID0ge1xuICAgIHBoYXNlOiAnaWRsZScsXG4gICAgY2FsbERhdGE6IG51bGwsXG4gICAgaXNPbkhvbGQ6IGZhbHNlLFxuICAgIGlzTXV0ZWQ6IGZhbHNlLFxuICAgIGlzU3BlYWtlck9mZjogZmFsc2UsXG4gICAgY2FsbERpcmVjdGlvbjogbnVsbCxcbiAgICBjYWxsU3RhcnRUaW1lOiBudWxsLFxuICAgIGNhbGxEdXJhdGlvbjogMCxcbiAgICBjYWxsZXJOYW1lOiBudWxsLFxuICAgIGNhbGxlck51bWJlcjogbnVsbCxcbiAgICBjYWxsQWN0aXZpdHlJZDogbnVsbCxcbiAgICBleG90ZWxDYWxsU2lkOiBudWxsLFxuICAgIHByb3NwZWN0VW5pcXVlSWQ6IG51bGwsXG4gICAgd2FzQWNjZXB0ZWQ6IGZhbHNlLFxufTtcbi8qKlxuICogTWFzayBtb2JpbGUgbnVtYmVyIGZvciBkaXNwbGF5IChmaXJzdCAyIGFuZCBsYXN0IDIgb2YgYWN0dWFsIG51bWJlciB2aXNpYmxlKVxuICogSGFuZGxlcyBjb3VudHJ5IGNvZGUgcHJlZml4ICgrOTEpXG4gKiBlLmcuLCBcIis5MTk4NzY1NDMyMTBcIiAtPiBcIis5MTk4KioqKioqMTBcIlxuICogZS5nLiwgXCI5ODc2NTQzMjEwXCIgLT4gXCI5OCoqKioqKjEwXCJcbiAqL1xudmFyIG1hc2tNb2JpbGUgPSBmdW5jdGlvbiAobW9iaWxlKSB7XG4gICAgaWYgKCFtb2JpbGUgfHwgbW9iaWxlLmxlbmd0aCA8IDQpXG4gICAgICAgIHJldHVybiAnKioqKioqKioqKic7XG4gICAgLy8gQ2hlY2sgZm9yIGNvdW50cnkgY29kZSBwcmVmaXhcbiAgICB2YXIgcHJlZml4ID0gJyc7XG4gICAgdmFyIG51bWJlciA9IG1vYmlsZTtcbiAgICBpZiAobW9iaWxlLnN0YXJ0c1dpdGgoJys5MScpKSB7XG4gICAgICAgIHByZWZpeCA9ICcrOTEnO1xuICAgICAgICBudW1iZXIgPSBtb2JpbGUuc3Vic3RyaW5nKDMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChtb2JpbGUuc3RhcnRzV2l0aCgnOTEnKSAmJiBtb2JpbGUubGVuZ3RoID4gMTApIHtcbiAgICAgICAgcHJlZml4ID0gJzkxJztcbiAgICAgICAgbnVtYmVyID0gbW9iaWxlLnN1YnN0cmluZygyKTtcbiAgICB9XG4gICAgdmFyIGNsZWFuZWQgPSBudW1iZXIucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICBpZiAoY2xlYW5lZC5sZW5ndGggPCA0KVxuICAgICAgICByZXR1cm4gcHJlZml4ICsgJyoqKioqKioqKionO1xuICAgIHJldHVybiBwcmVmaXggKyBjbGVhbmVkLnN1YnN0cmluZygwLCAyKSArICcqJy5yZXBlYXQoY2xlYW5lZC5sZW5ndGggLSA0KSArIGNsZWFuZWQuc3Vic3RyaW5nKGNsZWFuZWQubGVuZ3RoIC0gMik7XG59O1xuLy8gVXNlIHNoYXJlZCBjb250ZXh0IGZvciBjcm9zcy1tb2R1bGUtZmVkZXJhdGlvbiBjb21wYXRpYmlsaXR5XG52YXIgRXhvdGVsQ29udGV4dCA9IGdldFNoYXJlZENvbnRleHQoKTtcbmV4cG9ydCB2YXIgRXhvdGVsUHJvdmlkZXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgYWNjZXNzVG9rZW4gPSBfYS5hY2Nlc3NUb2tlbiwgYWdlbnRVc2VySWQgPSBfYS5hZ2VudFVzZXJJZCwgX2IgPSBfYS5hdXRvQ29ubmVjdFZPSVAsIGF1dG9Db25uZWN0Vk9JUCA9IF9iID09PSB2b2lkIDAgPyB0cnVlIDogX2IsIGRlZmF1bHRDYWxsZXJOYW1lID0gX2EuY2FsbGVyTmFtZSwgZGVmYXVsdENhbGxlck51bWJlciA9IF9hLmNhbGxlck51bWJlcjtcbiAgICB2YXIgX2MgPSB1c2VTdGF0ZShmYWxzZSksIGlzSW5pdGlhbGl6ZWQgPSBfY1swXSwgc2V0SXNJbml0aWFsaXplZCA9IF9jWzFdO1xuICAgIHZhciBfZCA9IHVzZVN0YXRlKGZhbHNlKSwgaXNDb25uZWN0ZWQgPSBfZFswXSwgc2V0SXNDb25uZWN0ZWQgPSBfZFsxXTtcbiAgICB2YXIgX2UgPSB1c2VTdGF0ZSgndW5rbm93bicpLCBwZXJtaXNzaW9uU3RhdHVzID0gX2VbMF0sIHNldFBlcm1pc3Npb25TdGF0dXMgPSBfZVsxXTtcbiAgICB2YXIgX2YgPSB1c2VTdGF0ZShpbml0aWFsQ2FsbFN0YXRlKSwgY2FsbFN0YXRlID0gX2ZbMF0sIHNldENhbGxTdGF0ZSA9IF9mWzFdO1xuICAgIHZhciBfZyA9IHVzZVN0YXRlKG51bGwpLCBkaXNwb3NpdGlvbkRhdGEgPSBfZ1swXSwgc2V0RGlzcG9zaXRpb25EYXRhID0gX2dbMV07XG4gICAgdmFyIHRpbWVyUmVmID0gdXNlUmVmKG51bGwpO1xuICAgIHZhciBjYWxsU3RhdGVSZWYgPSB1c2VSZWYoY2FsbFN0YXRlKTtcbiAgICB2YXIgZXhvdGVsU2VydmljZSA9IEV4b3RlbFNlcnZpY2UuZ2V0SW5zdGFuY2UoKTtcbiAgICAvLyBLZWVwIHJlZiBpbiBzeW5jIHdpdGggc3RhdGUgZm9yIHVzZSBpbiBldmVudCBoYW5kbGVyc1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxTdGF0ZVJlZi5jdXJyZW50ID0gY2FsbFN0YXRlO1xuICAgIH0sIFtjYWxsU3RhdGVdKTtcbiAgICAvLyBUaW1lciBmb3IgY2FsbCBkdXJhdGlvblxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjYWxsU3RhdGUucGhhc2UgPT09ICdjb25uZWN0ZWQnICYmIGNhbGxTdGF0ZS5jYWxsU3RhcnRUaW1lKSB7XG4gICAgICAgICAgICB0aW1lclJlZi5jdXJyZW50ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBjYWxsRHVyYXRpb246IE1hdGguZmxvb3IoKERhdGUubm93KCkgLSBwcmV2LmNhbGxTdGFydFRpbWUpIC8gMTAwMCkgfSkpOyB9KTtcbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRpbWVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIHRpbWVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGltZXJSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJSZWYuY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSwgW2NhbGxTdGF0ZS5waGFzZSwgY2FsbFN0YXRlLmNhbGxTdGFydFRpbWVdKTtcbiAgICAvLyBSZXF1ZXN0IG1pY3JvcGhvbmUgcGVybWlzc2lvbiBiZWZvcmUgaW5pdGlhbGl6aW5nXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlcXVlc3RQZXJtaXNzaW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdHJlYW0sIGVycm9yXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDIsICwgM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykgeyByZXR1cm4gdHJhY2suc3RvcCgpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFBlcm1pc3Npb25TdGF0dXMoJ2dyYW50ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaWNyb3Bob25lIHBlcm1pc3Npb24gZGVuaWVkOicsIGVycm9yXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGVybWlzc2lvblN0YXR1cygnZGVuaWVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyB9O1xuICAgICAgICBpZiAobmF2aWdhdG9yLnBlcm1pc3Npb25zICYmIG5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSkge1xuICAgICAgICAgICAgbmF2aWdhdG9yLnBlcm1pc3Npb25zXG4gICAgICAgICAgICAgICAgLnF1ZXJ5KHsgbmFtZTogJ21pY3JvcGhvbmUnIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHNldFBlcm1pc3Npb25TdGF0dXMoc3RhdHVzLnN0YXRlKTtcbiAgICAgICAgICAgICAgICBzdGF0dXMub25jaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFBlcm1pc3Npb25TdGF0dXMoc3RhdHVzLnN0YXRlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMuc3RhdGUgPT09ICdwcm9tcHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQZXJtaXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgcXVlcnkgcGVybWlzc2lvbiBzdGF0dXM6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RQZXJtaXNzaW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcXVlc3RQZXJtaXNzaW9uKCk7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgU0RLXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFhY2Nlc3NUb2tlbiB8fCAhYWdlbnRVc2VySWQgfHwgaXNJbml0aWFsaXplZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGluaXRpYWxpemVFeG90ZWwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHN1Y2Nlc3M7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGV4b3RlbFNlcnZpY2UuaW5pdGlhbGl6ZShhY2Nlc3NUb2tlbiwgYWdlbnRVc2VySWQsIGF1dG9Db25uZWN0Vk9JUCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsaXplZChzdWNjZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7IH07XG4gICAgICAgIGluaXRpYWxpemVFeG90ZWwoKTtcbiAgICB9LCBbYWNjZXNzVG9rZW4sIGFnZW50VXNlcklkLCBhdXRvQ29ubmVjdFZPSVBdKTtcbiAgICAvLyBTZXR1cCBldmVudCBsaXN0ZW5lcnNcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBoYW5kbGVDYWxsRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdpbmNvbWluZyc6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgY3VycmVudCBzdGF0ZSB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGdlbnVpbmUgaW5jb21pbmcgY2FsbFxuICAgICAgICAgICAgICAgICAgICAvLyBvciBqdXN0IHRoZSBhZ2VudCBjYWxsYmFjayBmb3IgYW4gb3V0Ym91bmQgY2xpY2stdG8tY2FsbFxuICAgICAgICAgICAgICAgICAgICB2YXIgaXNPdXRib3VuZENhbGwgPSBjYWxsU3RhdGVSZWYuY3VycmVudC5jYWxsRGlyZWN0aW9uID09PSAnb3V0Ym91bmQnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNPdXRib3VuZENhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBvdXRib3VuZCBjYWxscyAoY2xpY2stdG8tY2FsbCksIEV4b3RlbCBmaXJzdCBjYWxscyB0aGUgYWdlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdHJpZ2dlcnMgJ2luY29taW5nJyBldmVudCBidXQgd2Ugc2hvdWxkIE5PVCBvdmVyd3JpdGUgdGhlIG91dGJvdW5kIGNhbGwgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBjYWxsRGF0YTogZGF0YSwgaXNPbkhvbGQ6IGZhbHNlLCBpc011dGVkOiBmYWxzZSB9KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGdlbnVpbmUgaW5jb21pbmcgY2FsbCAtIHVwZGF0ZSBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluY29taW5nTnVtYmVyXzEgPSBkYXRhLmNhbGxGcm9tTnVtYmVyIHx8IGRhdGEucmVtb3RlSWQgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBwaGFzZTogJ2luY29taW5nJywgY2FsbERhdGE6IGRhdGEsIGNhbGxEaXJlY3Rpb246ICdpbmJvdW5kJywgY2FsbGVyTmFtZTogZGF0YS5yZW1vdGVEaXNwbGF5TmFtZSB8fCBudWxsLCBjYWxsZXJOdW1iZXI6IGluY29taW5nTnVtYmVyXzEgPyBtYXNrTW9iaWxlKGluY29taW5nTnVtYmVyXzEpIDogbnVsbCwgaXNPbkhvbGQ6IGZhbHNlLCBpc011dGVkOiBmYWxzZSB9KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgaW5jb21pbmcgY2FsbCBpbiB0aGUgYmFja2VuZCBhbmQgZ2V0IHByb3NwZWN0IGRldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmNhbGxJZCB8fCBkYXRhLnNlc3Npb25JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVySW5jb21pbmdDYWxsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFNpZDogZGF0YS5jYWxsSWQgfHwgZGF0YS5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21OdW1iZXI6IGRhdGEuY2FsbEZyb21OdW1iZXIgfHwgZGF0YS5yZW1vdGVJZCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9OdW1iZXI6IGRhdGEucmVtb3RlRGlzcGxheU5hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNhbGwgc3RhdGUgd2l0aCBwcm9zcGVjdCBkZXRhaWxzIGFuZCBjYWxsIGFjdGl2aXR5IElEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9zcGVjdE1vYmlsZSA9IChfYSA9IHJlc3BvbnNlLnByb3NwZWN0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgY2FsbEFjdGl2aXR5SWQ6ICgoX2EgPSByZXNwb25zZS5kYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaWQpIHx8IHByZXYuY2FsbEFjdGl2aXR5SWQsIGNhbGxlck5hbWU6ICgoX2IgPSByZXNwb25zZS5wcm9zcGVjdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm5hbWUpIHx8IHByZXYuY2FsbGVyTmFtZSwgY2FsbGVyTnVtYmVyOiBwcm9zcGVjdE1vYmlsZSA/IG1hc2tNb2JpbGUocHJvc3BlY3RNb2JpbGUpIDogcHJldi5jYWxsZXJOdW1iZXIsIHByb3NwZWN0VW5pcXVlSWQ6ICgoX2MgPSByZXNwb25zZS5wcm9zcGVjdCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnVuaXF1ZUlkKSB8fCBwcmV2LnByb3NwZWN0VW5pcXVlSWQgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVnaXN0ZXIgaW5jb21pbmcgY2FsbDonLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdjb25uZWN0ZWQnOlxuICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgcGhhc2U6ICdjb25uZWN0ZWQnLCBjYWxsRGF0YTogZGF0YSwgY2FsbFN0YXJ0VGltZTogRGF0ZS5ub3coKSwgY2FsbER1cmF0aW9uOiAwIH0pKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NhbGxFbmRlZCc6XG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgZGlzcG9zaXRpb24gZm9ybSBpZjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFVzZXIgYWNjZXB0ZWQgdGhlIGNhbGwgKHdhc0FjY2VwdGVkID0gdHJ1ZSksIE9SXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBDYWxsIHdhcyBjb25uZWN0ZWQsIE9SXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiBDYWxsIGhhZCBzb21lIGR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBOT1Qgc2hvdyBpZiB1c2VyIGRlY2xpbmVkIGJlZm9yZSBhY2NlcHRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaG91bGRTaG93RGlzcG9zaXRpb24gPSBwcmV2Lndhc0FjY2VwdGVkIHx8IHByZXYucGhhc2UgPT09ICdjb25uZWN0ZWQnIHx8IHByZXYuY2FsbER1cmF0aW9uID4gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93RGlzcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcG9zaXRpb25EYXRhT2JqID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgZGF0YWJhc2UgY2FsbEFjdGl2aXR5SWQgZm9yIEFQSSBjYWxscywgZmFsbCBiYWNrIHRvIEV4b3RlbCBjYWxsSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbElkOiBwcmV2LmNhbGxBY3Rpdml0eUlkIHx8IGRhdGEuY2FsbElkIHx8ICgoX2EgPSBwcmV2LmNhbGxEYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbElkKSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhvdGVsQ2FsbElkOiBkYXRhLmNhbGxJZCB8fCAoKF9iID0gcHJldi5jYWxsRGF0YSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGxJZCkgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxEaXJlY3Rpb246IHByZXYuY2FsbERpcmVjdGlvbiB8fCAnb3V0Ym91bmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsRHVyYXRpb246IHByZXYuY2FsbER1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJOYW1lOiBwcmV2LmNhbGxlck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlck51bWJlcjogcHJldi5jYWxsZXJOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwb3NpdGlvbkRhdGEoZGlzcG9zaXRpb25EYXRhT2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaW5pdGlhbENhbGxTdGF0ZSksIHsgcGhhc2U6ICdlbmRlZCcsIGNhbGxEYXRhOiBkYXRhIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG9sZHRvZ2dsZSc6XG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBpc09uSG9sZDogIXByZXYuaXNPbkhvbGQsIGNhbGxEYXRhOiBkYXRhIH0pKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ211dGV0b2dnbGUnOlxuICAgICAgICAgICAgICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgaXNNdXRlZDogIXByZXYuaXNNdXRlZCwgY2FsbERhdGE6IGRhdGEgfSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHZhciBoYW5kbGVSZWdpc3RlckV2ZW50ID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgICAgICBzZXRJc0Nvbm5lY3RlZChzdGF0ZSA9PT0gJ3JlZ2lzdGVyZWQnKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGhhbmRsZVNlc3Npb25FdmVudCA9IGZ1bmN0aW9uIChzdGF0ZSwgZGF0YSkge1xuICAgICAgICAgICAgLy8gSGFuZGxlIHNlc3Npb24gZXZlbnRzIGlmIG5lZWRlZFxuICAgICAgICB9O1xuICAgICAgICBleG90ZWxTZXJ2aWNlLmFkZENhbGxMaXN0ZW5lcihoYW5kbGVDYWxsRXZlbnQpO1xuICAgICAgICBleG90ZWxTZXJ2aWNlLmFkZFJlZ2lzdGVyTGlzdGVuZXIoaGFuZGxlUmVnaXN0ZXJFdmVudCk7XG4gICAgICAgIGV4b3RlbFNlcnZpY2UuYWRkU2Vzc2lvbkxpc3RlbmVyKGhhbmRsZVNlc3Npb25FdmVudCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleG90ZWxTZXJ2aWNlLnJlbW92ZUNhbGxMaXN0ZW5lcihoYW5kbGVDYWxsRXZlbnQpO1xuICAgICAgICAgICAgZXhvdGVsU2VydmljZS5yZW1vdmVSZWdpc3Rlckxpc3RlbmVyKGhhbmRsZVJlZ2lzdGVyRXZlbnQpO1xuICAgICAgICAgICAgZXhvdGVsU2VydmljZS5yZW1vdmVTZXNzaW9uTGlzdGVuZXIoaGFuZGxlU2Vzc2lvbkV2ZW50KTtcbiAgICAgICAgfTtcbiAgICB9LCBbaXNJbml0aWFsaXplZF0pO1xuICAgIC8vIFVwZGF0ZSBwZXJtaXNzaW9uIHN0YXR1cyB3aGVuIGl0IGNoYW5nZXMgaW4gdGhlIHNlcnZpY2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNJbml0aWFsaXplZCkge1xuICAgICAgICAgICAgc2V0UGVybWlzc2lvblN0YXR1cyhleG90ZWxTZXJ2aWNlLmdldFBlcm1pc3Npb25TdGF0dXMoKSk7XG4gICAgICAgIH1cbiAgICB9LCBbaXNJbml0aWFsaXplZF0pO1xuICAgIHZhciBtYWtlQ2FsbCA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChwaG9uZU51bWJlciwgY2FsbGVyTmFtZSwgY2FsbEFjdGl2aXR5SWQsIG1hc2tlZE51bWJlcikgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlc3BvbnNlLCBlcnJvcl8yO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCBzdGF0ZSAtIHJlYWR5IHRvIGNhbGwgKGFnZW50IG5lZWRzIHRvIGFjY2VwdCBmaXJzdClcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIG1hc2tlZCBudW1iZXIgZm9yIGRpc3BsYXksIGFjdHVhbCBudW1iZXIgZm9yIHRoZSBjYWxsXG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShmdW5jdGlvbiAocHJldikgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBwaGFzZTogJ3JlYWR5X3RvX2NhbGwnLCBjYWxsRGlyZWN0aW9uOiAnb3V0Ym91bmQnLCBjYWxsZXJOYW1lOiBjYWxsZXJOYW1lIHx8IGRlZmF1bHRDYWxsZXJOYW1lIHx8IG51bGwsIGNhbGxlck51bWJlcjogbWFza2VkTnVtYmVyIHx8IHBob25lTnVtYmVyLCBjYWxsQWN0aXZpdHlJZDogY2FsbEFjdGl2aXR5SWQgfHwgbnVsbCwgaXNPbkhvbGQ6IGZhbHNlLCBpc011dGVkOiBmYWxzZSwgY2FsbFN0YXJ0VGltZTogbnVsbCwgY2FsbER1cmF0aW9uOiAwIH0pKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGV4b3RlbFNlcnZpY2UubWFrZUNhbGwocGhvbmVOdW1iZXIpXTsgLy8gVXNlIGFjdHVhbCBudW1iZXIgZm9yIGNhbGxpbmdcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpIC8vIFVzZSBhY3R1YWwgbnVtYmVyIGZvciBjYWxsaW5nXG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3BvbnNlXTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGVycm9yXzIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIFNESyBjYWxsIGZhaWxzICg0eHgvNXh4IGVycm9ycyBmcm9tIEV4b3RlbCBBUEkpLCByZXNldCBzdGF0ZSB0byBpZGxlXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIHJldHJ5IHRoZSBjYWxsXG4gICAgICAgICAgICAgICAgICAgIHNldENhbGxTdGF0ZShpbml0aWFsQ2FsbFN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmUtdGhyb3cgdGhlIGVycm9yIHNvIENhbGxCdXR0b24gY2FuIGhhbmRsZSBpdFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl8yO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTsgfSwgW2RlZmF1bHRDYWxsZXJOYW1lXSk7XG4gICAgdmFyIGFjY2VwdENhbGwgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBleG90ZWxTZXJ2aWNlLmFjY2VwdENhbGwoKVxuICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb3V0Ym91bmQgY2FsbHMsIGFjY2VwdGluZyBtZWFucyB3ZSdyZSBub3cgY2FsbGluZyB0aGUgbGVhZFxuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHdhc0FjY2VwdGVkID0gdHJ1ZSBzbyB3ZSBrbm93IHRvIHNob3cgZGlzcG9zaXRpb24gZm9ybSBvbiBlbmRcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb3V0Ym91bmQgY2FsbHMsIGFjY2VwdGluZyBtZWFucyB3ZSdyZSBub3cgY2FsbGluZyB0aGUgbGVhZFxuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHdhc0FjY2VwdGVkID0gdHJ1ZSBzbyB3ZSBrbm93IHRvIHNob3cgZGlzcG9zaXRpb24gZm9ybSBvbiBlbmRcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5jYWxsRGlyZWN0aW9uID09PSAnb3V0Ym91bmQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcmV2KSwgeyBwaGFzZTogJ2NhbGxpbmcnLCB3YXNBY2NlcHRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBpbmJvdW5kIGNhbGxzLCBhbHNvIG1hcmsgYXMgYWNjZXB0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgd2FzQWNjZXB0ZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pOyB9LCBbXSk7XG4gICAgdmFyIGhhbmd1cENhbGwgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4b3RlbFNlcnZpY2UuaGFuZ3VwQ2FsbCgpO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgdG9nZ2xlU3BlYWtlciA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IGlzU3BlYWtlck9mZjogIXByZXYuaXNTcGVha2VyT2ZmIH0pKTsgfSk7XG4gICAgICAgIC8vIE5vdGU6IEFjdHVhbCBzcGVha2VyIHRvZ2dsZSB3b3VsZCBuZWVkIFdlYlJUQyBhdWRpbyBvdXRwdXQgZGV2aWNlIHN3aXRjaGluZ1xuICAgIH0sIFtdKTtcbiAgICB2YXIgY2xlYXJEaXNwb3NpdGlvbiA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0RGlzcG9zaXRpb25EYXRhKG51bGwpO1xuICAgICAgICBzZXRDYWxsU3RhdGUoaW5pdGlhbENhbGxTdGF0ZSk7XG4gICAgfSwgW10pO1xuICAgIC8vIFVwZGF0ZSBjYWxsQWN0aXZpdHlJZCBhZnRlciBjcmVhdGluZyB0aGUgcmVjb3JkIChmb3Igb3V0Ym91bmQgY2FsbHMpXG4gICAgdmFyIHNldENhbGxBY3Rpdml0eUlkRm4gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoY2FsbEFjdGl2aXR5SWQpIHtcbiAgICAgICAgc2V0Q2FsbFN0YXRlKGZ1bmN0aW9uIChwcmV2KSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIHByZXYpLCB7IGNhbGxBY3Rpdml0eUlkOiBjYWxsQWN0aXZpdHlJZCB9KSk7IH0pO1xuICAgIH0sIFtdKTtcbiAgICAvLyBVcGRhdGUgZXhvdGVsQ2FsbFNpZCBmcm9tIFNESyByZXNwb25zZSAoZm9yIG91dGJvdW5kIGNhbGxzKVxuICAgIHZhciBzZXRFeG90ZWxDYWxsU2lkRm4gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoY2FsbFNpZCkge1xuICAgICAgICBzZXRDYWxsU3RhdGUoZnVuY3Rpb24gKHByZXYpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJldiksIHsgZXhvdGVsQ2FsbFNpZDogY2FsbFNpZCB9KSk7IH0pO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgdmFsdWUgPSB7XG4gICAgICAgIGlzSW5pdGlhbGl6ZWQ6IGlzSW5pdGlhbGl6ZWQsXG4gICAgICAgIGlzQ29ubmVjdGVkOiBpc0Nvbm5lY3RlZCxcbiAgICAgICAgY2FsbFN0YXRlOiBjYWxsU3RhdGUsXG4gICAgICAgIHBlcm1pc3Npb25TdGF0dXM6IHBlcm1pc3Npb25TdGF0dXMsXG4gICAgICAgIGRpc3Bvc2l0aW9uRGF0YTogZGlzcG9zaXRpb25EYXRhLFxuICAgICAgICBtYWtlQ2FsbDogbWFrZUNhbGwsXG4gICAgICAgIGFjY2VwdENhbGw6IGFjY2VwdENhbGwsXG4gICAgICAgIGhhbmd1cENhbGw6IGhhbmd1cENhbGwsXG4gICAgICAgIHJlamVjdENhbGw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV4b3RlbFNlcnZpY2UucmVqZWN0Q2FsbCgpOyB9LFxuICAgICAgICB0b2dnbGVIb2xkOiBmdW5jdGlvbiAoKSB7IHJldHVybiBleG90ZWxTZXJ2aWNlLnRvZ2dsZUhvbGQoKTsgfSxcbiAgICAgICAgdG9nZ2xlTXV0ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gZXhvdGVsU2VydmljZS50b2dnbGVNdXRlKCk7IH0sXG4gICAgICAgIHRvZ2dsZVNwZWFrZXI6IHRvZ2dsZVNwZWFrZXIsXG4gICAgICAgIHNlbmREVE1GOiBmdW5jdGlvbiAoZGlnaXQpIHsgcmV0dXJuIGV4b3RlbFNlcnZpY2Uuc2VuZERUTUYoZGlnaXQpOyB9LFxuICAgICAgICByZWdpc3RlckRldmljZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gZXhvdGVsU2VydmljZS5yZWdpc3RlckRldmljZSgpOyB9LFxuICAgICAgICB1bnJlZ2lzdGVyRGV2aWNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBleG90ZWxTZXJ2aWNlLnVucmVnaXN0ZXJEZXZpY2UoKTsgfSxcbiAgICAgICAgcmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3M6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV4b3RlbFNlcnZpY2UucmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MoKTsgfSxcbiAgICAgICAgY2xlYXJEaXNwb3NpdGlvbjogY2xlYXJEaXNwb3NpdGlvbixcbiAgICAgICAgc2V0Q2FsbEFjdGl2aXR5SWQ6IHNldENhbGxBY3Rpdml0eUlkRm4sXG4gICAgICAgIHNldEV4b3RlbENhbGxTaWQ6IHNldEV4b3RlbENhbGxTaWRGbixcbiAgICB9O1xuICAgIHJldHVybiAoX2pzeChFeG90ZWxDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiB2YWx1ZSwgY2hpbGRyZW46IGNoaWxkcmVuIH0pKTtcbn07XG5leHBvcnQgdmFyIHVzZUV4b3RlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoRXhvdGVsQ29udGV4dCk7XG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUV4b3RlbCBtdXN0IGJlIHVzZWQgd2l0aGluIGFuIEV4b3RlbFByb3ZpZGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xufTtcbi8qKlxuICogU2FmZSB2ZXJzaW9uIG9mIHVzZUV4b3RlbCB0aGF0IHJldHVybnMgbnVsbCB3aGVuIG91dHNpZGUgdGhlIHByb3ZpZGVyXG4gKiBVc2UgdGhpcyBpbiBjb21wb25lbnRzIHRoYXQgbWF5IHJlbmRlciBvdXRzaWRlIG9mIEV4b3RlbFByb3ZpZGVyXG4gKi9cbmV4cG9ydCB2YXIgdXNlRXhvdGVsU2FmZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udGV4dCA9IHVzZUNvbnRleHQoRXhvdGVsQ29udGV4dCk7XG4gICAgcmV0dXJuIGNvbnRleHQgIT09IG51bGwgJiYgY29udGV4dCAhPT0gdm9pZCAwID8gY29udGV4dCA6IG51bGw7XG59O1xuIiwiZXhwb3J0IHZhciBFWE9URUxfQ09OU1RBTlRTID0ge1xuICAgIE1PREFMX1pfSU5ERVg6IDk5OTk5OSxcbiAgICBNT0RBTF9CQUNLRFJPUF9aX0lOREVYOiA5OTk5OTgsXG4gICAgTU9EQUxfQk9SREVSX1JBRElVUzogJzE2cHgnLFxuICAgIERFQ0xJTkVfVElNRU9VVF9NUzogMjAwMCxcbiAgICBUSU1FUl9JTlRFUlZBTF9NUzogMTAwMCxcbn07XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgQnV0dG9uLCBEaWFsb2csIFJhZGlvR3JvdXAsIFNpbmdsZVNlbGVjdCwgVGV4dGFyZWEsIFR5cG9ncmFwaHksIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZU11dGF0aW9uLCB1c2VRdWVyeUNsaWVudCB9IGZyb20gJ3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uVmVyYm9zZSB9IGZyb20gJy4uLy4uL3V0aWxzL2V4b3RlbC9mb3JtYXR0ZXJzJztcbnZhciBDQUxMX1NUQVRVU19PUFRJT05TID0gW1xuICAgIHsgbGFiZWw6ICdDb25uZWN0ZWQnLCB2YWx1ZTogJ2Nvbm5lY3RlZCcgfSxcbiAgICB7IGxhYmVsOiAnTm90IENvbm5lY3RlZCcsIHZhbHVlOiAnbm90X2Nvbm5lY3RlZCcgfSxcbl07XG52YXIgQ09OTkVDVEVEX0RJU1BPU0lUSU9OUyA9IFtcbiAgICB7IGxhYmVsOiAnSW50ZXJlc3RlZCcsIHZhbHVlOiAnaW50ZXJlc3RlZCcgfSxcbiAgICB7IGxhYmVsOiAnTm90IEludGVyZXN0ZWQnLCB2YWx1ZTogJ25vdF9pbnRlcmVzdGVkJyB9LFxuICAgIHsgbGFiZWw6ICdOb3QgU3VyZScsIHZhbHVlOiAnbm90X3N1cmUnIH0sXG4gICAgeyBsYWJlbDogJ05vdCBFbGlnaWJsZScsIHZhbHVlOiAnbm90X2VsaWdpYmxlJyB9LFxuICAgIHsgbGFiZWw6ICdXcm9uZyBOdW1iZXInLCB2YWx1ZTogJ3dyb25nX251bWJlcicgfSxcbiAgICB7IGxhYmVsOiAnQ2FtcHVzIFZpc2l0JywgdmFsdWU6ICdjYW1wdXNfdmlzaXQnIH0sXG4gICAgeyBsYWJlbDogJ0NhbGwgQmFjaycsIHZhbHVlOiAnY2FsbF9iYWNrJyB9LFxuICAgIHsgbGFiZWw6ICdBZnRlciBKRUUgTWFpbnMnLCB2YWx1ZTogJ2FmdGVyX2plZV9tYWlucycgfSxcbiAgICB7IGxhYmVsOiAnQWZ0ZXIgSVBFJywgdmFsdWU6ICdhZnRlcl9pcGUnIH0sXG4gICAgeyBsYWJlbDogJ0FmdGVyIEVBUENFVCcsIHZhbHVlOiAnYWZ0ZXJfZWFwY2V0JyB9LFxuXTtcbnZhciBOT1RfQ09OTkVDVEVEX0RJU1BPU0lUSU9OUyA9IFtcbiAgICB7IGxhYmVsOiAnTm90IEFuc3dlcmluZycsIHZhbHVlOiAnbm90X2Fuc3dlcmluZycgfSxcbiAgICB7IGxhYmVsOiAnTm90IENvbm5lY3RlZCcsIHZhbHVlOiAnbm90X2Nvbm5lY3RlZCcgfSxcbiAgICB7IGxhYmVsOiAnRmFpbCB0byBDYWxsJywgdmFsdWU6ICdmYWlsX3RvX2NhbGwnIH0sXG4gICAgeyBsYWJlbDogJ1N3aXRjaGVkIE9mZicsIHZhbHVlOiAnc3dpdGNoZWRfb2ZmJyB9LFxuICAgIHsgbGFiZWw6ICdPdXQgb2YgU2VydmljZScsIHZhbHVlOiAnb3V0X29mX3NlcnZpY2UnIH0sXG4gICAgeyBsYWJlbDogJ0ludmFsaWQgTnVtYmVyJywgdmFsdWU6ICdpbnZhbGlkX251bWJlcicgfSxcbiAgICB7IGxhYmVsOiAnTnVtYmVyIEJ1c3knLCB2YWx1ZTogJ251bWJlcl9idXN5JyB9LFxuXTtcbnZhciBDYWxsRGlzcG9zaXRpb25Gb3JtID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGRpc3Bvc2l0aW9uRGF0YSA9IF9hLmRpc3Bvc2l0aW9uRGF0YSwgcHJvc3BlY3RJZCA9IF9hLnByb3NwZWN0SWQsIG9uQ2xvc2UgPSBfYS5vbkNsb3NlLCBvblNhdmUgPSBfYS5vblNhdmUsIGV4aXN0aW5nRGF0YSA9IF9hLmV4aXN0aW5nRGF0YTtcbiAgICB2YXIgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuICAgIHZhciBpc0VkaXRNb2RlID0gISEoZXhpc3RpbmdEYXRhID09PSBudWxsIHx8IGV4aXN0aW5nRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhpc3RpbmdEYXRhLmRpc3Bvc2l0aW9uQ2F0ZWdvcnkpO1xuICAgIC8vIFNpbXBsZSBzdGF0ZSBtYW5hZ2VtZW50XG4gICAgdmFyIF9iID0gdXNlU3RhdGUoKGV4aXN0aW5nRGF0YSA9PT0gbnVsbCB8fCBleGlzdGluZ0RhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4aXN0aW5nRGF0YS5jYWxsU3RhdHVzRGlzcG9zaXRpb24pIHx8ICcnKSwgY2FsbFN0YXR1cyA9IF9iWzBdLCBzZXRDYWxsU3RhdHVzID0gX2JbMV07XG4gICAgdmFyIF9jID0gdXNlU3RhdGUoKGV4aXN0aW5nRGF0YSA9PT0gbnVsbCB8fCBleGlzdGluZ0RhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4aXN0aW5nRGF0YS5kaXNwb3NpdGlvbkNhdGVnb3J5KSB8fCAnJyksIGRpc3Bvc2l0aW9uQ2F0ZWdvcnkgPSBfY1swXSwgc2V0RGlzcG9zaXRpb25DYXRlZ29yeSA9IF9jWzFdO1xuICAgIHZhciBfZCA9IHVzZVN0YXRlKChleGlzdGluZ0RhdGEgPT09IG51bGwgfHwgZXhpc3RpbmdEYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleGlzdGluZ0RhdGEuZGlzcG9zaXRpb25Ob3RlcykgfHwgJycpLCByZW1hcmtzID0gX2RbMF0sIHNldFJlbWFya3MgPSBfZFsxXTtcbiAgICB2YXIgX2UgPSB1c2VNdXRhdGlvbihmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gb25TYXZlKGRhdGEpOyB9LCB7XG4gICAgICAgIG9uU3VjY2VzczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoJ2dldE9uZVByb3NwZWN0Jyk7XG4gICAgICAgICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcygnY2FsbEhpc3RvcnknKTtcbiAgICAgICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgICAgfSxcbiAgICB9KSwgbXV0YXRlID0gX2UubXV0YXRlLCBpc0xvYWRpbmcgPSBfZS5pc0xvYWRpbmc7XG4gICAgdmFyIGhhbmRsZUNhbGxTdGF0dXNDaGFuZ2UgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgc2V0Q2FsbFN0YXR1cyh2YWx1ZSk7XG4gICAgICAgIC8vIFJlc2V0IGRpc3Bvc2l0aW9uIHdoZW4gY2FsbCBzdGF0dXMgY2hhbmdlc1xuICAgICAgICBzZXREaXNwb3NpdGlvbkNhdGVnb3J5KCcnKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVEaXNwb3NpdGlvbkNoYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBzZXREaXNwb3NpdGlvbkNhdGVnb3J5KHZhbHVlKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVTdWJtaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghY2FsbFN0YXR1cyB8fCAhZGlzcG9zaXRpb25DYXRlZ29yeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdWJtaXREYXRhID0ge1xuICAgICAgICAgICAgcHJvc3BlY3RJZDogcHJvc3BlY3RJZCxcbiAgICAgICAgICAgIGNhbGxJZDogZGlzcG9zaXRpb25EYXRhLmNhbGxJZCxcbiAgICAgICAgICAgIGNoYW5uZWw6ICdwaG9uZScsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGRpc3Bvc2l0aW9uRGF0YS5jYWxsRGlyZWN0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb246IGRpc3Bvc2l0aW9uRGF0YS5jYWxsRHVyYXRpb24sXG4gICAgICAgICAgICBjYWxsU3RhdHVzRGlzcG9zaXRpb246IGNhbGxTdGF0dXMsXG4gICAgICAgICAgICBkaXNwb3NpdGlvbkNhdGVnb3J5OiBkaXNwb3NpdGlvbkNhdGVnb3J5LFxuICAgICAgICAgICAgcmVtYXJrczogcmVtYXJrcyB8fCAnJyxcbiAgICAgICAgICAgIGNhbGxlck5hbWU6IGRpc3Bvc2l0aW9uRGF0YS5jYWxsZXJOYW1lIHx8ICcnLFxuICAgICAgICAgICAgY2FsbGVyTnVtYmVyOiBkaXNwb3NpdGlvbkRhdGEuY2FsbGVyTnVtYmVyIHx8ICcnLFxuICAgICAgICB9O1xuICAgICAgICBtdXRhdGUoc3VibWl0RGF0YSk7XG4gICAgfTtcbiAgICB2YXIgZGlzcG9zaXRpb25PcHRpb25zID0gY2FsbFN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCdcbiAgICAgICAgPyBDT05ORUNURURfRElTUE9TSVRJT05TXG4gICAgICAgIDogY2FsbFN0YXR1cyA9PT0gJ25vdF9jb25uZWN0ZWQnXG4gICAgICAgICAgICA/IE5PVF9DT05ORUNURURfRElTUE9TSVRJT05TXG4gICAgICAgICAgICA6IFtdO1xuICAgIHJldHVybiAoX2pzeChEaWFsb2csIHsgb3BlbjogdHJ1ZSwgb25DbG9zZTogb25DbG9zZSwgdGl0bGU6IGlzRWRpdE1vZGUgPyAnRWRpdCBEaXNwb3NpdGlvbicgOiAnQ2FsbCBEaXNwb3NpdGlvbicsIG1heFdpZHRoOiBcIm1kXCIsIGNvbnRlbnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGZsZXgtY29sIGdhcC00IHAtNFwiLCBjaGlsZHJlbjogW19qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcIm11dGVkXCIsIGNoaWxkcmVuOiBpc0VkaXRNb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdVcGRhdGUgdGhlIGRpc3Bvc2l0aW9uIGRldGFpbHMnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiQWRkIGRldGFpbHMgYWJvdXQgeW91ciBjYWxsIHdpdGggXCIuY29uY2F0KGRpc3Bvc2l0aW9uRGF0YS5jYWxsZXJOYW1lIHx8ICdVbmtub3duJykgfSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwLTMgYmctZ3JheS0xMDAgcm91bmRlZC1sZ1wiLCBjaGlsZHJlbjogW19qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcInNtYWxsXCIsIGNsYXNzTmFtZTogXCJ0ZXh0LWdyYXktNjAwXCIsIGNoaWxkcmVuOiBcIkNhbGwgRHVyYXRpb25cIiB9KSwgX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwic21hbGxcIiwgY2xhc3NOYW1lOiBcImZvbnQtc2VtaWJvbGRcIiwgY2hpbGRyZW46IGZvcm1hdER1cmF0aW9uVmVyYm9zZShkaXNwb3NpdGlvbkRhdGEuY2FsbER1cmF0aW9uKSB9KV0gfSksIF9qc3goUmFkaW9Hcm91cCwgeyBuYW1lOiBcImNhbGxTdGF0dXNEaXNwb3NpdGlvblwiLCBsYWJlbDogXCJDYWxsIFN0YXR1c1wiLCByZXF1aXJlZDogdHJ1ZSwgb3B0aW9uczogQ0FMTF9TVEFUVVNfT1BUSU9OUywgZGlyZWN0aW9uOiBcInJvd1wiLCB2YWx1ZTogY2FsbFN0YXR1cywgb25DaGFuZ2U6IGhhbmRsZUNhbGxTdGF0dXNDaGFuZ2UgfSksIGNhbGxTdGF0dXMgJiYgKF9qc3goU2luZ2xlU2VsZWN0LCB7IG5hbWU6IFwiZGlzcG9zaXRpb25DYXRlZ29yeVwiLCBsYWJlbDogXCJDYWxsIERpc3Bvc2l0aW9uXCIsIHJlcXVpcmVkOiB0cnVlLCBmdWxsV2lkdGg6IHRydWUsIHBsYWNlaG9sZGVyOiBcIlNlYXJjaCBkaXNwb3NpdGlvbi4uLlwiLCBvcHRpb25zOiBkaXNwb3NpdGlvbk9wdGlvbnMsIHZhbHVlOiBkaXNwb3NpdGlvbkNhdGVnb3J5LCBvbkNoYW5nZTogaGFuZGxlRGlzcG9zaXRpb25DaGFuZ2UgfSwgY2FsbFN0YXR1cykpLCBfanN4KFRleHRhcmVhLCB7IG5hbWU6IFwicmVtYXJrc1wiLCBsYWJlbDogXCJSZW1hcmtzXCIsIHBsYWNlaG9sZGVyOiBcIkFkZCBhbnkgYWRkaXRpb25hbCBub3RlcyBhYm91dCB0aGlzIGNhbGwuLi5cIiwgcm93czogMywgZnVsbFdpZHRoOiB0cnVlLCB2YWx1ZTogcmVtYXJrcywgb25DaGFuZ2U6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBzZXRSZW1hcmtzKGUudGFyZ2V0LnZhbHVlKTsgfSwgY2xhc3NOYW1lOiBcImJyZWFrLWFsbFwiIH0pLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGp1c3RpZnktc3RhcnQgZ2FwLTIgcHQtNCBib3JkZXItdFwiLCBjaGlsZHJlbjogW19qc3goQnV0dG9uLCB7IG9uQ2xpY2s6IGhhbmRsZVN1Ym1pdCwgZGlzYWJsZWQ6ICFjYWxsU3RhdHVzIHx8ICFkaXNwb3NpdGlvbkNhdGVnb3J5LCBsb2FkaW5nOiBpc0xvYWRpbmcsIGNoaWxkcmVuOiBpc0VkaXRNb2RlID8gJ1VwZGF0ZSBEaXNwb3NpdGlvbicgOiAnU2F2ZSBEaXNwb3NpdGlvbicgfSksIF9qc3goQnV0dG9uLCB7IHZhcmlhbnQ6IFwib3V0bGluZVwiLCBvbkNsaWNrOiBvbkNsb3NlLCBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KV0gfSldIH0pKTsgfSB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2FsbERpc3Bvc2l0aW9uRm9ybTtcbiIsIi8qKlxuICogRm9ybWF0IGR1cmF0aW9uIGluIE1NOlNTIGZvcm1hdCAoZS5nLiwgXCIwMjozMFwiKVxuICovXG5leHBvcnQgdmFyIGZvcm1hdER1cmF0aW9uVGltZXIgPSBmdW5jdGlvbiAoc2Vjb25kcykge1xuICAgIHZhciBtaW5zID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIHZhciBzZWNzID0gc2Vjb25kcyAlIDYwO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChtaW5zLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSwgXCI6XCIpLmNvbmNhdChzZWNzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSk7XG59O1xuLyoqXG4gKiBGb3JtYXQgZHVyYXRpb24gaW4gdmVyYm9zZSBmb3JtYXQgKGUuZy4sIFwiMm0gMzBzXCIpXG4gKi9cbmV4cG9ydCB2YXIgZm9ybWF0RHVyYXRpb25WZXJib3NlID0gZnVuY3Rpb24gKHNlY29uZHMpIHtcbiAgICB2YXIgbWlucyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICB2YXIgc2VjcyA9IHNlY29uZHMgJSA2MDtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQobWlucywgXCJtIFwiKS5jb25jYXQoc2VjcywgXCJzXCIpO1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cywgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBCdXR0b24sIFR5cG9ncmFwaHkgfSBmcm9tICdAY2FtcHhkZXYvcmVhY3QtYmx1ZXByaW50JztcbmltcG9ydCB7IE1pYywgTWljT2ZmLCBQYXVzZSwgUGhvbmUsIFBob25lSW5jb21pbmcsIFBob25lT2ZmLCBQaG9uZU91dGdvaW5nLCBQbGF5LCBWb2x1bWUyLCBWb2x1bWVYLCBYIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBFWE9URUxfQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2V4b3RlbC5jb25zdGFudHMnO1xuaW1wb3J0IHsgdXNlRXhvdGVsIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL0V4b3RlbFByb3ZpZGVyJztcbmltcG9ydCB7IGNhbmNlbENhbGwsIHNhdmVDYWxsRGlzcG9zaXRpb24gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leG90ZWwvYXBpJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uVGltZXIgfSBmcm9tICcuLi8uLi91dGlscy9leG90ZWwvZm9ybWF0dGVycyc7XG5pbXBvcnQgQ2FsbERpc3Bvc2l0aW9uRm9ybSBmcm9tICcuL0NhbGxEaXNwb3NpdGlvbkZvcm0nO1xuLy8gQ1NTIGZvciBwdWxzaW5nIGFuaW1hdGlvblxudmFyIHB1bHNlQW5pbWF0aW9uU3R5bGUgPSBcIlxcbkBrZXlmcmFtZXMgcHVsc2UtcmluZyB7XFxuICAwJSB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgIG9wYWNpdHk6IDE7XFxuICB9XFxuICA1MCUge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMTUpO1xcbiAgICBvcGFjaXR5OiAwLjc7XFxuICB9XFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgb3BhY2l0eTogMTtcXG4gIH1cXG59XFxuXFxuQGtleWZyYW1lcyBwdWxzZS1kb3Qge1xcbiAgMCUsIDEwMCUge1xcbiAgICBib3gtc2hhZG93OiAwIDAgMCAwIHJnYmEoMjQ5LCAxMTUsIDIyLCAwLjcpO1xcbiAgfVxcbiAgNTAlIHtcXG4gICAgYm94LXNoYWRvdzogMCAwIDAgMjBweCByZ2JhKDI0OSwgMTE1LCAyMiwgMCk7XFxuICB9XFxufVxcblxcbi5hbmltYXRlLXB1bHNlLXJpbmcge1xcbiAgYW5pbWF0aW9uOiBwdWxzZS1yaW5nIDEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XFxufVxcblxcbi5hbmltYXRlLXB1bHNlLWRvdCB7XFxuICBhbmltYXRpb246IHB1bHNlLWRvdCAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xcbn1cXG5cIjtcbnZhciBFeG90ZWxQaG9uZSA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsIHByb3NwZWN0SWQgPSBfYS5wcm9zcGVjdElkLCBwcm9zcGVjdE5hbWUgPSBfYS5wcm9zcGVjdE5hbWUsIHByb3NwZWN0TnVtYmVyID0gX2EucHJvc3BlY3ROdW1iZXIsIG9uU2F2ZURpc3Bvc2l0aW9uID0gX2Eub25TYXZlRGlzcG9zaXRpb247XG4gICAgdmFyIF9iID0gdXNlRXhvdGVsKCksIGNhbGxTdGF0ZSA9IF9iLmNhbGxTdGF0ZSwgZGlzcG9zaXRpb25EYXRhID0gX2IuZGlzcG9zaXRpb25EYXRhLCBhY2NlcHRDYWxsID0gX2IuYWNjZXB0Q2FsbCwgaGFuZ3VwQ2FsbCA9IF9iLmhhbmd1cENhbGwsIHJlamVjdENhbGwgPSBfYi5yZWplY3RDYWxsLCB0b2dnbGVIb2xkID0gX2IudG9nZ2xlSG9sZCwgdG9nZ2xlTXV0ZSA9IF9iLnRvZ2dsZU11dGUsIHRvZ2dsZVNwZWFrZXIgPSBfYi50b2dnbGVTcGVha2VyLCBjbGVhckRpc3Bvc2l0aW9uID0gX2IuY2xlYXJEaXNwb3NpdGlvbjtcbiAgICB2YXIgX2MgPSB1c2VTdGF0ZShmYWxzZSksIGlzQWNjZXB0aW5nID0gX2NbMF0sIHNldElzQWNjZXB0aW5nID0gX2NbMV07XG4gICAgdmFyIF9kID0gdXNlU3RhdGUoZmFsc2UpLCBpc0RlY2xpbmluZyA9IF9kWzBdLCBzZXRJc0RlY2xpbmluZyA9IF9kWzFdO1xuICAgIHZhciBkZWNsaW5lVGltZW91dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgICAvLyBJbmplY3QgYW5pbWF0aW9uIHN0eWxlc1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdHlsZUlkID0gJ2V4b3RlbC1waG9uZS1hbmltYXRpb25zJztcbiAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdHlsZUlkKSkge1xuICAgICAgICAgICAgdmFyIHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgc3R5bGVFbC5pZCA9IHN0eWxlSWQ7XG4gICAgICAgICAgICBzdHlsZUVsLnRleHRDb250ZW50ID0gcHVsc2VBbmltYXRpb25TdHlsZTtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgdmFyIHBoYXNlID0gY2FsbFN0YXRlLnBoYXNlLCBjYWxsRGF0YSA9IGNhbGxTdGF0ZS5jYWxsRGF0YSwgaXNPbkhvbGQgPSBjYWxsU3RhdGUuaXNPbkhvbGQsIGlzTXV0ZWQgPSBjYWxsU3RhdGUuaXNNdXRlZCwgaXNTcGVha2VyT2ZmID0gY2FsbFN0YXRlLmlzU3BlYWtlck9mZiwgY2FsbERpcmVjdGlvbiA9IGNhbGxTdGF0ZS5jYWxsRGlyZWN0aW9uLCBjYWxsRHVyYXRpb24gPSBjYWxsU3RhdGUuY2FsbER1cmF0aW9uLCBzZGtDYWxsZXJOYW1lID0gY2FsbFN0YXRlLmNhbGxlck5hbWUsIHNka0NhbGxlck51bWJlciA9IGNhbGxTdGF0ZS5jYWxsZXJOdW1iZXIsIGNhbGxBY3Rpdml0eUlkID0gY2FsbFN0YXRlLmNhbGxBY3Rpdml0eUlkLCBleG90ZWxDYWxsU2lkID0gY2FsbFN0YXRlLmV4b3RlbENhbGxTaWQsIHByb3NwZWN0VW5pcXVlSWQgPSBjYWxsU3RhdGUucHJvc3BlY3RVbmlxdWVJZDtcbiAgICAvLyBVc2UgcHJvcHMgKGZyb20gUHJvc3BlY3QgdmlldykgYXMgcHJpbWFyeSwgZmFsbCBiYWNrIHRvIFNESyB2YWx1ZXMgKGZvciBpbmNvbWluZyBjYWxscylcbiAgICB2YXIgZGlzcGxheU5hbWUgPSBwcm9zcGVjdE5hbWUgfHwgc2RrQ2FsbGVyTmFtZSB8fCAnVW5rbm93bic7XG4gICAgdmFyIGRpc3BsYXlOdW1iZXIgPSBwcm9zcGVjdE51bWJlciB8fCBzZGtDYWxsZXJOdW1iZXIgfHwgJ05vIG51bWJlcic7XG4gICAgdmFyIGhhbmRsZUFjY2VwdENhbGwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZXJyb3JfMTtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNBY2NlcHRpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgNCwgNV0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBhY2NlcHRDYWxsKCldO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjY2VwdCBjYWxsIGVycm9yOicsIGVycm9yXzEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHNldElzQWNjZXB0aW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7IH07XG4gICAgdmFyIGhhbmRsZURlY2xpbmVDYWxsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbGxTaWRGb3JBcGksIHJlYXNvbiwgZXJyb3JfMjtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWNsaW5pbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSByZWplY3RDYWxsIGZvciBpbmNvbWluZy9yZWFkeV90b19jYWxsIChiZWZvcmUgYWNjZXB0aW5nKVxuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgaGFuZ3VwQ2FsbCBmb3IgY29ubmVjdGVkL2NhbGxpbmcgKGFmdGVyIGFjY2VwdGluZylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBoYXNlID09PSAnaW5jb21pbmcnIHx8IHBoYXNlID09PSAncmVhZHlfdG9fY2FsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdENhbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmd1cENhbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYWxsU2lkRm9yQXBpID0gZXhvdGVsQ2FsbFNpZCB8fCBjYWxsQWN0aXZpdHlJZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsU2lkRm9yQXBpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uID0gcGhhc2UgPT09ICdjb25uZWN0ZWQnID8gJ2VuZGVkJyA6ICdkZWNsaW5lZCc7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGNhbmNlbENhbGwoeyBjYWxsU2lkOiBjYWxsU2lkRm9yQXBpLCByZWFzb246IHJlYXNvbiB9KV07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JfMiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNhbmNlbCBjYWxsIGluIGJhY2tlbmQ6JywgZXJyb3JfMik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhbGwgd2Fzbid0IGNvbm5lY3RlZCB5ZXQsIFNESyBtaWdodCBub3QgZmlyZSAnY2FsbEVuZGVkJyBldmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYSB0aW1lb3V0IHRvIGZvcmNlIHJlc2V0IHRoZSBkZWNsaW5pbmcgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogRG9uJ3QgY2xlYXIgZGlzcG9zaXRpb24gaGVyZSAtIGxldCB0aGUgU0RLJ3MgY2FsbEVuZGVkIGV2ZW50IGhhbmRsZSBpdFxuICAgICAgICAgICAgICAgICAgICBkZWNsaW5lVGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlY2xpbmluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIEVYT1RFTF9DT05TVEFOVFMuREVDTElORV9USU1FT1VUX01TKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTsgfTtcbiAgICAvLyBDbGVhciBkZWNsaW5lIHRpbWVvdXQgd2hlbiBwaGFzZSBjaGFuZ2VzIChtZWFuaW5nIFNESyBoYW5kbGVkIGl0KVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChwaGFzZSA9PT0gJ2lkbGUnIHx8IHBoYXNlID09PSAnZW5kZWQnKSB7XG4gICAgICAgICAgICBpZiAoZGVjbGluZVRpbWVvdXRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWNsaW5lVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICBkZWNsaW5lVGltZW91dFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldElzRGVjbGluaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIC8vIE5vdGU6IERvbid0IGF1dG8tY2xlYXIgZGlzcG9zaXRpb24gaGVyZSAtIGxldCB1c2VyIHN1Ym1pdCBvciBjbG9zZSB0aGUgZm9ybSBtYW51YWxseVxuICAgICAgICB9XG4gICAgfSwgW3BoYXNlXSk7XG4gICAgLy8gSGFuZGxlIHNhdmluZyBkaXNwb3NpdGlvbiB0byBiYWNrZW5kXG4gICAgdmFyIGhhbmRsZVNhdmVEaXNwb3NpdGlvbiA9IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAvLyBJZiBjdXN0b20gaGFuZGxlciBpcyBwcm92aWRlZCwgdXNlIGl0XG4gICAgICAgICAgICBpZiAob25TYXZlRGlzcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgb25TYXZlRGlzcG9zaXRpb24oZGF0YSldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVXNlIHRoZSBjYWxsU3RhdHVzRGlzcG9zaXRpb24gZnJvbSB0aGUgZm9ybSAodXNlciBzZWxlY3RlZClcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBzYXZlQ2FsbERpc3Bvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbElkOiBkYXRhLmNhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvc3BlY3RJZDogZGF0YS5wcm9zcGVjdElkIHx8IHByb3NwZWN0SWQgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxTdGF0dXNEaXNwb3NpdGlvbjogZGF0YS5jYWxsU3RhdHVzRGlzcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uQ2F0ZWdvcnk6IGRhdGEuZGlzcG9zaXRpb25DYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb25Ob3RlczogZGF0YS5yZW1hcmtzIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgIH0pO1xuICAgIH0pOyB9O1xuICAgIC8vIENsZWFudXAgdGltZW91dCBvbiB1bm1vdW50XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChkZWNsaW5lVGltZW91dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlY2xpbmVUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sIFtdKTtcbiAgICAvLyBTaG93IGRpc3Bvc2l0aW9uIGZvcm0gYWZ0ZXIgY2FsbCBlbmRzXG4gICAgaWYgKGRpc3Bvc2l0aW9uRGF0YSkge1xuICAgICAgICAvLyBVc2UgcHJvc3BlY3QgbmFtZSBmcm9tIHByb3BzLCBvciBmcm9tIGRpc3Bvc2l0aW9uRGF0YSAocHJlc2VydmVkIGZyb20gY2FsbCksIG9yIGZhbGxiYWNrXG4gICAgICAgIHZhciBmaW5hbENhbGxlck5hbWUgPSBwcm9zcGVjdE5hbWUgfHwgZGlzcG9zaXRpb25EYXRhLmNhbGxlck5hbWUgfHwgc2RrQ2FsbGVyTmFtZSB8fCAnVW5rbm93bic7XG4gICAgICAgIC8vIE92ZXJyaWRlIGRpc3Bvc2l0aW9uIGRhdGEgd2l0aCBwcm9zcGVjdCBkZXRhaWxzXG4gICAgICAgIHZhciBlbnJpY2hlZERpc3Bvc2l0aW9uRGF0YSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBkaXNwb3NpdGlvbkRhdGEpLCB7IGNhbGxlck5hbWU6IGZpbmFsQ2FsbGVyTmFtZSwgY2FsbGVyTnVtYmVyOiBkaXNwbGF5TnVtYmVyIH0pO1xuICAgICAgICByZXR1cm4gKF9qc3goQ2FsbERpc3Bvc2l0aW9uRm9ybSwgeyBkaXNwb3NpdGlvbkRhdGE6IGVucmljaGVkRGlzcG9zaXRpb25EYXRhLCBwcm9zcGVjdElkOiBwcm9zcGVjdElkLCBvbkNsb3NlOiBjbGVhckRpc3Bvc2l0aW9uLCBvblNhdmU6IGhhbmRsZVNhdmVEaXNwb3NpdGlvbiwgZXhpc3RpbmdEYXRhOiB1bmRlZmluZWQgfSkpO1xuICAgIH1cbiAgICAvLyBEb24ndCBzaG93IGFueXRoaW5nIGlmIGlkbGUgb3IgZW5kZWRcbiAgICBpZiAocGhhc2UgPT09ICdpZGxlJyB8fCBwaGFzZSA9PT0gJ2VuZGVkJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGlzT3V0Ym91bmQgPSBjYWxsRGlyZWN0aW9uID09PSAnb3V0Ym91bmQnO1xuICAgIHZhciBpc0luYm91bmQgPSBjYWxsRGlyZWN0aW9uID09PSAnaW5ib3VuZCc7XG4gICAgLy8gR2V0IGF2YXRhciBjb2xvciBiYXNlZCBvbiBjYWxsIGRpcmVjdGlvblxuICAgIHZhciBhdmF0YXJCZ0NvbG9yID0gcGhhc2UgPT09ICdjb25uZWN0ZWQnXG4gICAgICAgID8gJ2JnLWdyZWVuLTUwMCdcbiAgICAgICAgOiBpc091dGJvdW5kXG4gICAgICAgICAgICA/ICdiZy1ibHVlLTUwMCdcbiAgICAgICAgICAgIDogJ2JnLW9yYW5nZS01MDAnO1xuICAgIC8vIEdldCBzdGF0dXMgdGV4dFxuICAgIHZhciBnZXRTdGF0dXNUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzd2l0Y2ggKHBoYXNlKSB7XG4gICAgICAgICAgICBjYXNlICdyZWFkeV90b19jYWxsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1JlYWR5IHRvIGNhbGwuLi4nO1xuICAgICAgICAgICAgY2FzZSAnY2FsbGluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdDYWxsaW5nLi4uJztcbiAgICAgICAgICAgIGNhc2UgJ2luY29taW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0luY29taW5nIGNhbGwuLi4nO1xuICAgICAgICAgICAgY2FzZSAnY29ubmVjdGVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gV2lsbCBzaG93IHRpbWVyIGluc3RlYWRcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEdldCBjb25uZWN0aW5nIHRleHQgZm9yIGNhbGxpbmcgc3RhdGVcbiAgICB2YXIgZ2V0Q29ubmVjdGluZ1RleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChwaGFzZSA9PT0gJ2NhbGxpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJDb25uZWN0aW5nIHRvIFwiLmNvbmNhdChkaXNwbGF5TmFtZSwgXCIuLi5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICB2YXIgbW9kYWxDb250ZW50ID0gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZml4ZWQgaW5zZXQtMCBiZy1ibGFjay81MFwiLCBzdHlsZTogeyB6SW5kZXg6IEVYT1RFTF9DT05TVEFOVFMuTU9EQUxfQkFDS0RST1BfWl9JTkRFWCB9LCBvbkNsaWNrOiBoYW5kbGVEZWNsaW5lQ2FsbCB9KSwgX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmaXhlZCBpbnNldC0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtNCBcIi5jb25jYXQoY2xhc3NOYW1lKSwgc3R5bGU6IHsgekluZGV4OiBFWE9URUxfQ09OU1RBTlRTLk1PREFMX1pfSU5ERVggfSwgY2hpbGRyZW46IF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInJlbGF0aXZlIHctZnVsbCBtYXgtdy1tZCBwLTYgYmctd2hpdGUgc2hhZG93LTJ4bFwiLCBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBFWE9URUxfQ09OU1RBTlRTLk1PREFMX0JPUkRFUl9SQURJVVMsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgI2U1ZTdlYicsXG4gICAgICAgICAgICAgICAgICAgIH0sIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpOyB9LCBjaGlsZHJlbjogW19qc3goXCJidXR0b25cIiwgeyBvbkNsaWNrOiBoYW5kbGVEZWNsaW5lQ2FsbCwgY2xhc3NOYW1lOiBcImFic29sdXRlIHAtMSB0cmFuc2l0aW9uLWNvbG9ycyByb3VuZGVkLWZ1bGwgdG9wLTQgcmlnaHQtNCBob3ZlcjpiZy1ncmF5LTEwMFwiLCBjaGlsZHJlbjogX2pzeChYLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS01MDBcIiB9KSB9KSwgX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGp1c3RpZnktY2VudGVyIG1iLTZcIiwgY2hpbGRyZW46IF9qc3hzKFwic3BhblwiLCB7IGNsYXNzTmFtZTogXCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSBweC0zIHB5LTEgcm91bmRlZC1mdWxsIHRleHQtc20gZm9udC1tZWRpdW0gYm9yZGVyIFwiLmNvbmNhdChpc091dGJvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICd0ZXh0LWJsdWUtNjAwIGJvcmRlci1ibHVlLTIwMCBiZy1ibHVlLTUwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGV4dC1ncmVlbi02MDAgYm9yZGVyLWdyZWVuLTIwMCBiZy1ncmVlbi01MCcpLCBjaGlsZHJlbjogW2lzT3V0Ym91bmQgPyAoX2pzeChQaG9uZU91dGdvaW5nLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSkpIDogKF9qc3goUGhvbmVJbmNvbWluZywgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pKSwgaXNPdXRib3VuZCA/ICdPdXRnb2luZyBDYWxsJyA6ICdJbmNvbWluZyBDYWxsJ10gfSkgfSksIF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmxleCBqdXN0aWZ5LWNlbnRlciBtYi00XCIsIGNoaWxkcmVuOiBfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInctMjQgaC0yNCByb3VuZGVkLWZ1bGwgXCIuY29uY2F0KGF2YXRhckJnQ29sb3IsIFwiIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIFwiKS5jb25jYXQocGhhc2UgPT09ICdpbmNvbWluZycgfHwgcGhhc2UgPT09ICdyZWFkeV90b19jYWxsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYW5pbWF0ZS1wdWxzZS1yaW5nIGFuaW1hdGUtcHVsc2UtZG90J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJyksIGNoaWxkcmVuOiBpc0luYm91bmQgJiYgcGhhc2UgPT09ICdpbmNvbWluZycgPyAoX2pzeChQaG9uZUluY29taW5nLCB7IGNsYXNzTmFtZTogXCJ3LTEwIGgtMTAgdGV4dC13aGl0ZVwiIH0pKSA6IChfanN4KFBob25lLCB7IGNsYXNzTmFtZTogXCJ3LTEwIGgtMTAgdGV4dC13aGl0ZVwiIH0pKSB9KSB9KSwgX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwibWItNCB0ZXh0LWNlbnRlclwiLCBjaGlsZHJlbjogW19qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcImgzXCIsIGNsYXNzTmFtZTogXCJ0ZXh0LXhsIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMFwiLCBjaGlsZHJlbjogZGlzcGxheU5hbWUgfSksIHByb3NwZWN0VW5pcXVlSWQgJiYgKF9qc3hzKFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJzbWFsbFwiLCBjbGFzc05hbWU6IFwiZm9udC1tZWRpdW0gdGV4dC1ibHVlLTYwMFwiLCBjaGlsZHJlbjogW1wiSUQ6IFwiLCBwcm9zcGVjdFVuaXF1ZUlkXSB9KSksIF9qc3goVHlwb2dyYXBoeSwgeyB2YXJpYW50OiBcIm11dGVkXCIsIGNoaWxkcmVuOiBkaXNwbGF5TnVtYmVyIH0pXSB9KSwgX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJtYi02IHRleHQtY2VudGVyXCIsIGNoaWxkcmVuOiBwaGFzZSA9PT0gJ2Nvbm5lY3RlZCcgPyAoX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwicFwiLCBjbGFzc05hbWU6IFwidGV4dC1sZyBmb250LW1lZGl1bSB0ZXh0LWdyZWVuLTUwMFwiLCBjaGlsZHJlbjogZm9ybWF0RHVyYXRpb25UaW1lcihjYWxsRHVyYXRpb24pIH0pKSA6IChfanN4KFR5cG9ncmFwaHksIHsgdmFyaWFudDogXCJtdXRlZFwiLCBjaGlsZHJlbjogZ2V0U3RhdHVzVGV4dCgpIH0pKSB9KSwgcGhhc2UgPT09ICdjb25uZWN0ZWQnICYmIChfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGp1c3RpZnktY2VudGVyIGdhcC02IG1iLTZcIiwgY2hpbGRyZW46IFtfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LWNlbnRlclwiLCBjaGlsZHJlbjogW19qc3goXCJidXR0b25cIiwgeyBvbkNsaWNrOiB0b2dnbGVNdXRlLCBjbGFzc05hbWU6IFwidy0xMiBoLTEyIHJvdW5kZWQtZnVsbCBib3JkZXItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0cmFuc2l0aW9uLWNvbG9ycyBcIi5jb25jYXQoaXNNdXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYmctZ3JheS0yMDAgYm9yZGVyLWdyYXktMzAwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnYmctd2hpdGUgYm9yZGVyLWdyYXktMjAwIGhvdmVyOmJnLWdyYXktNTAnKSwgY2hpbGRyZW46IGlzTXV0ZWQgPyAoX2pzeChNaWNPZmYsIHsgY2xhc3NOYW1lOiBcInctNSBoLTUgdGV4dC1ncmF5LTYwMFwiIH0pKSA6IChfanN4KE1pYywgeyBjbGFzc05hbWU6IFwidy01IGgtNSB0ZXh0LWdyYXktNjAwXCIgfSkpIH0pLCBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJtdC0xIHRleHQteHMgdGV4dC1ncmF5LTUwMFwiLCBjaGlsZHJlbjogaXNNdXRlZCA/ICdVbm11dGUnIDogJ011dGUnIH0pXSB9KSwgX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwidGV4dC1jZW50ZXJcIiwgY2hpbGRyZW46IFtfanN4KFwiYnV0dG9uXCIsIHsgb25DbGljazogdG9nZ2xlSG9sZCwgY2xhc3NOYW1lOiBcInctMTIgaC0xMiByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMgXCIuY29uY2F0KGlzT25Ib2xkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdiZy1ncmF5LTIwMCBib3JkZXItZ3JheS0zMDAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdiZy13aGl0ZSBib3JkZXItZ3JheS0yMDAgaG92ZXI6YmctZ3JheS01MCcpLCBjaGlsZHJlbjogaXNPbkhvbGQgPyAoX2pzeChQbGF5LCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS02MDBcIiB9KSkgOiAoX2pzeChQYXVzZSwgeyBjbGFzc05hbWU6IFwidy01IGgtNSB0ZXh0LWdyYXktNjAwXCIgfSkpIH0pLCBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJtdC0xIHRleHQteHMgdGV4dC1ncmF5LTUwMFwiLCBjaGlsZHJlbjogaXNPbkhvbGQgPyAnUmVzdW1lJyA6ICdIb2xkJyB9KV0gfSksIF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInRleHQtY2VudGVyXCIsIGNoaWxkcmVuOiBbX2pzeChcImJ1dHRvblwiLCB7IG9uQ2xpY2s6IHRvZ2dsZVNwZWFrZXIsIGNsYXNzTmFtZTogXCJ3LTEyIGgtMTIgcm91bmRlZC1mdWxsIGJvcmRlci0yIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRyYW5zaXRpb24tY29sb3JzIFwiLmNvbmNhdChpc1NwZWFrZXJPZmZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JnLWdyYXktMjAwIGJvcmRlci1ncmF5LTMwMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JnLXdoaXRlIGJvcmRlci1ncmF5LTIwMCBob3ZlcjpiZy1ncmF5LTUwJyksIGNoaWxkcmVuOiBpc1NwZWFrZXJPZmYgPyAoX2pzeChWb2x1bWVYLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS02MDBcIiB9KSkgOiAoX2pzeChWb2x1bWUyLCB7IGNsYXNzTmFtZTogXCJ3LTUgaC01IHRleHQtZ3JheS02MDBcIiB9KSkgfSksIF9qc3goXCJwXCIsIHsgY2xhc3NOYW1lOiBcIm10LTEgdGV4dC14cyB0ZXh0LWdyYXktNTAwXCIsIGNoaWxkcmVuOiBpc1NwZWFrZXJPZmYgPyAnU3BlYWtlciBPbicgOiAnU3BlYWtlciBPZmYnIH0pXSB9KV0gfSkpLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmbGV4IGp1c3RpZnktY2VudGVyIGdhcC00XCIsIGNoaWxkcmVuOiBbKHBoYXNlID09PSAncmVhZHlfdG9fY2FsbCcgfHwgcGhhc2UgPT09ICdpbmNvbWluZycpICYmIChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4cyhCdXR0b24sIHsgdmFyaWFudDogXCJkZXN0cnVjdGl2ZVwiLCBvbkNsaWNrOiBoYW5kbGVEZWNsaW5lQ2FsbCwgZGlzYWJsZWQ6IGlzRGVjbGluaW5nLCBjbGFzc05hbWU6IFwiZ2FwLTIgcHgtNlwiLCBjaGlsZHJlbjogW19qc3goUGhvbmVPZmYsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSwgaXNEZWNsaW5pbmcgPyAnRGVjbGluaW5nLi4uJyA6ICdEZWNsaW5lJ10gfSksIF9qc3hzKEJ1dHRvbiwgeyB2YXJpYW50OiBcImRlZmF1bHRcIiwgb25DbGljazogaGFuZGxlQWNjZXB0Q2FsbCwgZGlzYWJsZWQ6IGlzQWNjZXB0aW5nIHx8IGlzRGVjbGluaW5nLCBzdHlsZTogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjMjJjNTVlJyB9LCBjbGFzc05hbWU6IFwiZ2FwLTIgcHgtNiBob3ZlcjpiZy1ncmVlbi02MDBcIiwgY2hpbGRyZW46IFtfanN4KFBob25lLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSksIFwiQWNjZXB0XCJdIH0pXSB9KSksIHBoYXNlID09PSAnY2FsbGluZycgJiYgKF9qc3hzKEJ1dHRvbiwgeyB2YXJpYW50OiBcImRlc3RydWN0aXZlXCIsIG9uQ2xpY2s6IGhhbmRsZURlY2xpbmVDYWxsLCBkaXNhYmxlZDogaXNEZWNsaW5pbmcsIGNsYXNzTmFtZTogXCJnYXAtMiBweC02XCIsIGNoaWxkcmVuOiBbX2pzeChQaG9uZU9mZiwgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pLCBpc0RlY2xpbmluZyA/ICdFbmRpbmcuLi4nIDogJ0VuZCBDYWxsJ10gfSkpLCBwaGFzZSA9PT0gJ2Nvbm5lY3RlZCcgJiYgKF9qc3hzKEJ1dHRvbiwgeyB2YXJpYW50OiBcImRlc3RydWN0aXZlXCIsIG9uQ2xpY2s6IGhhbmRsZURlY2xpbmVDYWxsLCBkaXNhYmxlZDogaXNEZWNsaW5pbmcsIGNsYXNzTmFtZTogXCJnYXAtMiBweC04XCIsIGNoaWxkcmVuOiBbX2pzeChQaG9uZU9mZiwgeyBjbGFzc05hbWU6IFwidy00IGgtNFwiIH0pLCBpc0RlY2xpbmluZyA/ICdFbmRpbmcuLi4nIDogJ0VuZCBDYWxsJ10gfSkpXSB9KSwgZ2V0Q29ubmVjdGluZ1RleHQoKSAmJiAoX2pzeChUeXBvZ3JhcGh5LCB7IHZhcmlhbnQ6IFwic21hbGxcIiwgY2xhc3NOYW1lOiBcIm10LTQgdGV4dC1jZW50ZXIgdGV4dC1ncmF5LTUwMFwiLCBjaGlsZHJlbjogZ2V0Q29ubmVjdGluZ1RleHQoKSB9KSldIH0pIH0pXSB9KSk7XG4gICAgLy8gVXNlIHBvcnRhbCB0byByZW5kZXIgYXQgZG9jdW1lbnQgYm9keSBsZXZlbCB0byBlc2NhcGUgYW55IHBhcmVudCBzdGFja2luZyBjb250ZXh0c1xuICAgIHJldHVybiBjcmVhdGVQb3J0YWwobW9kYWxDb250ZW50LCBkb2N1bWVudC5ib2R5KTtcbn07XG5leHBvcnQgZGVmYXVsdCBFeG90ZWxQaG9uZTtcbiIsImltcG9ydCB7IHN5bmNTY3J5cHQgfSBmcm9tICdzY3J5cHQtanMnO1xudmFyIENyeXB0b1NlcnZpY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ3J5cHRvU2VydmljZSgpIHtcbiAgICAgICAgdGhpcy5hbGdvcml0aG0gPSAnYWVzLTI1Ni1jYmMnO1xuICAgICAgICB0aGlzLnNlY3JldEtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gTGF6eSBpbml0aWFsaXphdGlvbiAtIGRvbid0IHJ1biBoZWF2eSBjcnlwdG8gb3BlcmF0aW9ucyBhdCBtb2R1bGUgbG9hZCB0aW1lXG4gICAgfVxuICAgIENyeXB0b1NlcnZpY2UucHJvdG90eXBlLmVuc3VyZUluaXRpYWxpemVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBrZXkgPSAnNDMxZmVmOTktNDdkYy00ZDJhLTkxNzUtMmU4ZjE5YjIwMjI1JztcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBTYW1lIGFzIGJhY2tlbmQ6IGNyeXB0by5zY3J5cHRTeW5jKGtleSwgJ3NhbHQnLCAzMilcbiAgICAgICAgICAgICAgICAvLyBzY3J5cHQtanMgd2l0aCBOPTE2Mzg0LCByPTgsIHA9MSBtYXRjaGVzIE5vZGUuanMgZGVmYXVsdHNcbiAgICAgICAgICAgICAgICB2YXIga2V5QnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGtleSk7XG4gICAgICAgICAgICAgICAgdmFyIHNhbHRCdWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoJ3NhbHQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlY3JldEtleSA9IHN5bmNTY3J5cHQoa2V5QnVmZmVyLCBzYWx0QnVmZmVyLCAxNjM4NCwgOCwgMSwgMzIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcnlwdG9TZXJ2aWNlIGluaXRpYWxpemF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsgLy8gUHJldmVudCByZXBlYXRlZCBhdHRlbXB0c1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDcnlwdG9TZXJ2aWNlLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIUNyeXB0b1NlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIENyeXB0b1NlcnZpY2UuaW5zdGFuY2UgPSBuZXcgQ3J5cHRvU2VydmljZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDcnlwdG9TZXJ2aWNlLmluc3RhbmNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGVjcnlwdCBkYXRhIHVzaW5nIEFFUy0yNTYtQ0JDIChzYW1lIGFzIGJhY2tlbmQpXG4gICAgICogRm9ybWF0OiBcIml2X2hleDplbmNyeXB0ZWRfaGV4XCJcbiAgICAgKi9cbiAgICBDcnlwdG9TZXJ2aWNlLnByb3RvdHlwZS5kZWNyeXB0RGF0YSA9IGZ1bmN0aW9uIChlbmNyeXB0ZWREYXRhKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgaWYgKCFlbmNyeXB0ZWREYXRhIHx8ICF0aGlzLnNlY3JldEtleSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTWlzc2luZyBlbmNyeXB0ZWQgZGF0YSBvciBzZWNyZXQga2V5Jyk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVuY3J5cHRlZERhdGEuc3BsaXQoJzonKSwgaXZIZXggPSBfYVswXSwgZW5jcnlwdGVkID0gX2FbMV07XG4gICAgICAgICAgICBpZiAoIWl2SGV4IHx8ICFlbmNyeXB0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGVuY3J5cHRlZCBkYXRhIGZvcm1hdCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVzZSByZXF1aXJlIGZvciBjcnlwdG8gdG8gYXZvaWQgYnVuZGxlciBpc3N1ZXMgd2l0aCB0b3AtbGV2ZWwgaW1wb3J0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICAgICAgICAgIHZhciBjcnlwdG9fMSA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICAgICAgICAgICAgdmFyIGl2ID0gQnVmZmVyLmZyb20oaXZIZXgsICdoZXgnKTtcbiAgICAgICAgICAgIHZhciBkZWNpcGhlciA9IGNyeXB0b18xLmNyZWF0ZURlY2lwaGVyaXYodGhpcy5hbGdvcml0aG0sIEJ1ZmZlci5mcm9tKHRoaXMuc2VjcmV0S2V5KSwgaXYpO1xuICAgICAgICAgICAgdmFyIGRlY3J5cHRlZCA9IGRlY2lwaGVyLnVwZGF0ZShlbmNyeXB0ZWQsICdoZXgnLCAndXRmOCcpO1xuICAgICAgICAgICAgZGVjcnlwdGVkICs9IGRlY2lwaGVyLmZpbmFsKCd1dGY4Jyk7XG4gICAgICAgICAgICByZXR1cm4gZGVjcnlwdGVkO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRGVjcnlwdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYXNrIG1vYmlsZSBudW1iZXIgZm9yIGRpc3BsYXkgKGZpcnN0IDIgYW5kIGxhc3QgMiBvZiBhY3R1YWwgbnVtYmVyIHZpc2libGUpXG4gICAgICogSGFuZGxlcyBjb3VudHJ5IGNvZGUgcHJlZml4ICgrOTEpXG4gICAgICogZS5nLiwgXCIrOTE5ODc2NTQzMjEwXCIgLT4gXCIrOTE5OCoqKioqKjEwXCJcbiAgICAgKiBlLmcuLCBcIjk4NzY1NDMyMTBcIiAtPiBcIjk4KioqKioqMTBcIlxuICAgICAqL1xuICAgIENyeXB0b1NlcnZpY2UucHJvdG90eXBlLm1hc2tNb2JpbGUgPSBmdW5jdGlvbiAobW9iaWxlKSB7XG4gICAgICAgIGlmICghbW9iaWxlIHx8IG1vYmlsZS5sZW5ndGggPCA0KVxuICAgICAgICAgICAgcmV0dXJuICcqKioqKioqKioqJztcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGNvdW50cnkgY29kZSBwcmVmaXhcbiAgICAgICAgdmFyIHByZWZpeCA9ICcnO1xuICAgICAgICB2YXIgbnVtYmVyID0gbW9iaWxlO1xuICAgICAgICBpZiAobW9iaWxlLnN0YXJ0c1dpdGgoJys5MScpKSB7XG4gICAgICAgICAgICBwcmVmaXggPSAnKzkxJztcbiAgICAgICAgICAgIG51bWJlciA9IG1vYmlsZS5zdWJzdHJpbmcoMyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9iaWxlLnN0YXJ0c1dpdGgoJzkxJykgJiYgbW9iaWxlLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICBwcmVmaXggPSAnOTEnO1xuICAgICAgICAgICAgbnVtYmVyID0gbW9iaWxlLnN1YnN0cmluZygyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2xlYW5lZCA9IG51bWJlci5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICBpZiAoY2xlYW5lZC5sZW5ndGggPCA0KVxuICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArICcqKioqKioqKioqJztcbiAgICAgICAgcmV0dXJuIChwcmVmaXggK1xuICAgICAgICAgICAgY2xlYW5lZC5zdWJzdHJpbmcoMCwgMikgK1xuICAgICAgICAgICAgJyonLnJlcGVhdChjbGVhbmVkLmxlbmd0aCAtIDQpICtcbiAgICAgICAgICAgIGNsZWFuZWQuc3Vic3RyaW5nKGNsZWFuZWQubGVuZ3RoIC0gMikpO1xuICAgIH07XG4gICAgcmV0dXJuIENyeXB0b1NlcnZpY2U7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQ3J5cHRvU2VydmljZS5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnQGNhbXB4ZGV2L3JlYWN0LWJsdWVwcmludCc7XG5pbXBvcnQgeyBQaG9uZSwgTWljT2ZmIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IHVzZUV4b3RlbFNhZmUgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvRXhvdGVsUHJvdmlkZXInO1xuaW1wb3J0IEV4b3RlbFNlcnZpY2UgZnJvbSAnLi4vLi4vc2VydmljZXMvZXhvdGVsL0V4b3RlbFNlcnZpY2UnO1xuaW1wb3J0IHsgaW5pdGlhdGVDYWxsQWN0aXZpdHkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leG90ZWwvYXBpJztcbmltcG9ydCBDcnlwdG9TZXJ2aWNlIGZyb20gJy4uLy4uL3NlcnZpY2VzL2NyeXB0by9DcnlwdG9TZXJ2aWNlJztcbnZhciBDYWxsQnV0dG9uID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHBob25lTnVtYmVyID0gX2EucGhvbmVOdW1iZXIsIGVuY3J5cHRlZFBob25lTnVtYmVyID0gX2EuZW5jcnlwdGVkUGhvbmVOdW1iZXIsIGNhbGxlck5hbWUgPSBfYS5jYWxsZXJOYW1lLCBwcm9zcGVjdElkID0gX2EucHJvc3BlY3RJZCwgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBkaXNhYmxlZCA9IF9hLmRpc2FibGVkO1xuICAgIHZhciBleG90ZWwgPSB1c2VFeG90ZWxTYWZlKCk7XG4gICAgdmFyIF9iID0gdXNlU3RhdGUoZmFsc2UpLCBpc0RpYWxpbmcgPSBfYlswXSwgc2V0SXNEaWFsaW5nID0gX2JbMV07XG4gICAgdmFyIF9jID0gdXNlU3RhdGUobnVsbCksIGVycm9yID0gX2NbMF0sIHNldEVycm9yID0gX2NbMV07XG4gICAgLy8gSWYgRXhvdGVsIGlzIG5vdCBhdmFpbGFibGUgKG5vdCB3aXRoaW4gcHJvdmlkZXIpLCBkb24ndCByZW5kZXIgdGhlIGJ1dHRvblxuICAgIGlmICghZXhvdGVsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgbWFrZUNhbGwgPSBleG90ZWwubWFrZUNhbGwsIGlzQ29ubmVjdGVkID0gZXhvdGVsLmlzQ29ubmVjdGVkLCBjYWxsU3RhdGUgPSBleG90ZWwuY2FsbFN0YXRlLCBwZXJtaXNzaW9uU3RhdHVzID0gZXhvdGVsLnBlcm1pc3Npb25TdGF0dXMsIHJlcXVlc3RNaWNyb3Bob25lQWNjZXNzID0gZXhvdGVsLnJlcXVlc3RNaWNyb3Bob25lQWNjZXNzLCBzZXRDYWxsQWN0aXZpdHlJZCA9IGV4b3RlbC5zZXRDYWxsQWN0aXZpdHlJZCwgc2V0RXhvdGVsQ2FsbFNpZCA9IGV4b3RlbC5zZXRFeG90ZWxDYWxsU2lkO1xuICAgIHZhciBoYW5kbGVDYWxsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFjdHVhbFBob25lTnVtYmVyLCBtYXNrZWROdW1iZXIsIGhhc1Blcm1pc3Npb24sIGdyYW50ZWQsIHNka1Jlc3BvbnNlLCBleG90ZWxDYWxsU2lkLCByZXNwb25zZSwgY2FsbEFjdGl2aXR5SWQsIGFwaUVycm9yXzEsIGVycl8xLCBlcnJvck1lc3NhZ2UsIGNvZGUsIGVycm9yRGV0YWlscywgZGVzY3JpcHRpb247XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgc3dpdGNoIChfZS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgY2FsbGluZyBmcm9tICdpZGxlJyBvciAnZW5kZWQnIHN0YXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29ubmVjdGVkIHx8IChjYWxsU3RhdGUucGhhc2UgIT09ICdpZGxlJyAmJiBjYWxsU3RhdGUucGhhc2UgIT09ICdlbmRlZCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsUGhvbmVOdW1iZXIgPSBwaG9uZU51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuY3J5cHRlZFBob25lTnVtYmVyICYmICFhY3R1YWxQaG9uZU51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxQaG9uZU51bWJlciA9IENyeXB0b1NlcnZpY2UuZGVjcnlwdERhdGEoZW5jcnlwdGVkUGhvbmVOdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWN0dWFsUGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ0ZhaWxlZCB0byBkZWNyeXB0IHBob25lIG51bWJlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlY3J5cHRpb24gZXJyb3I6JywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignRmFpbGVkIHRvIGRlY3J5cHQgcGhvbmUgbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWN0dWFsUGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCdObyBwaG9uZSBudW1iZXIgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWFza2VkTnVtYmVyID0gQ3J5cHRvU2VydmljZS5tYXNrTW9iaWxlKGFjdHVhbFBob25lTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgRXhvdGVsU2VydmljZS5nZXRJbnN0YW5jZSgpLmNoZWNrQXVkaW9QZXJtaXNzaW9ucygpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb24gPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIWhhc1Blcm1pc3Npb24pIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZXF1ZXN0TWljcm9waG9uZUFjY2VzcygpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGdyYW50ZWQgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZ3JhbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ01pY3JvcGhvbmUgYWNjZXNzIGlzIHJlcXVpcmVkIHRvIG1ha2UgY2FsbHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBfZS50cnlzLnB1c2goWzMsIDksIDEwLCAxMV0pO1xuICAgICAgICAgICAgICAgICAgICBzZXRJc0RpYWxpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG1ha2VDYWxsKGFjdHVhbFBob25lTnVtYmVyLCBjYWxsZXJOYW1lLCB1bmRlZmluZWQsIG1hc2tlZE51bWJlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgMjogRXh0cmFjdCBDYWxsU2lkIGZyb20gU0RLIHJlc3BvbnNlIGFuZCBzdG9yZSBpdCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhbmNlbCBBUEkgaWYgdXNlciBkZWNsaW5lcyBiZWZvcmUgaW5pdGlhdGVDYWxsQWN0aXZpdHkgY29tcGxldGVzXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBzZGtSZXNwb25zZSA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhvdGVsQ2FsbFNpZCA9IChfYSA9IHNka1Jlc3BvbnNlID09PSBudWxsIHx8IHNka1Jlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZGtSZXNwb25zZS5EYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuQ2FsbFNpZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4b3RlbENhbGxTaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEV4b3RlbENhbGxTaWQoZXhvdGVsQ2FsbFNpZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocHJvc3BlY3RJZCAmJiBleG90ZWxDYWxsU2lkKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbNSwgNywgLCA4XSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGluaXRpYXRlQ2FsbEFjdGl2aXR5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9zcGVjdElkOiBwcm9zcGVjdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvTnVtYmVyOiBhY3R1YWxQaG9uZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU2lkOiBleG90ZWxDYWxsU2lkLCAvLyBQYXNzIENhbGxTaWQgd2hlbiBjcmVhdGluZyB0aGUgcmVjb3JkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNhbGwgc3RhdGUgd2l0aCB0aGUgZGF0YWJhc2UgSUQgZm9yIGRpc3Bvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbEFjdGl2aXR5SWQgPSAoX2IgPSByZXNwb25zZS5kYXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsQWN0aXZpdHlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FsbEFjdGl2aXR5SWQoY2FsbEFjdGl2aXR5SWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgYXBpRXJyb3JfMSA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW0NhbGxCdXR0b25dIEZhaWxlZCB0byBjcmVhdGUgY2FsbCBhY3Rpdml0eSByZWNvcmQ6JywgYXBpRXJyb3JfMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgZXJyXzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBtYWtlIGNhbGw6JywgZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnRmFpbGVkIHRvIG1ha2UgY2FsbCc7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZXJyXzEgPT09IG51bGwgfHwgZXJyXzEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycl8xLkNvZGUpIHx8IChlcnJfMSA9PT0gbnVsbCB8fCBlcnJfMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyXzEuU3RhdHVzKSA9PT0gJ0ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBlcnJfMS5Db2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXRhaWxzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJfMS5FcnJvciAmJiB0eXBlb2YgZXJyXzEuRXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXRhaWxzID0gSlNPTi5wYXJzZShlcnJfMS5FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChwYXJzZUVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgSlNPTiwgaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAoX2QgPSAoX2MgPSBlcnJvckRldGFpbHMgPT09IG51bGwgfHwgZXJyb3JEZXRhaWxzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvckRldGFpbHMucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5lcnJvcl9kYXRhKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGVzY3JpcHRpb24gfHwgJ1VzZXIgZGV2aWNlIGlzIGN1cnJlbnRseSBidXN5IG9yIHVuYXZhaWxhYmxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gNDAwICYmIGNvZGUgPCA1MDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkZXNjcmlwdGlvbiB8fCAnVW5hYmxlIHRvIGNvbXBsZXRlIGNhbGwuIFBsZWFzZSB0cnkgYWdhaW4uJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gNTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGVzY3JpcHRpb24gfHwgJ1NlcnZpY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRlc2NyaXB0aW9uIHx8ICdGYWlsZWQgdG8gbWFrZSBjYWxsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlcnJfMSA9PT0gbnVsbCB8fCBlcnJfMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyXzEubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyXzEubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNEaWFsaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDExOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pOyB9O1xuICAgIC8vICdpZGxlJyBhbmQgJ2VuZGVkJyBib3RoIG1lYW4gbm8gYWN0aXZlIGNhbGwgLSBidXR0b24gc2hvdWxkIGJlIGVuYWJsZWRcbiAgICB2YXIgaXNDYWxsSW5Qcm9ncmVzcyA9IGNhbGxTdGF0ZS5waGFzZSAhPT0gJ2lkbGUnICYmIGNhbGxTdGF0ZS5waGFzZSAhPT0gJ2VuZGVkJztcbiAgICB2YXIgaGFzUGhvbmVOdW1iZXIgPSBwaG9uZU51bWJlciB8fCBlbmNyeXB0ZWRQaG9uZU51bWJlcjtcbiAgICB2YXIgaXNEaXNhYmxlZCA9IGRpc2FibGVkIHx8ICFoYXNQaG9uZU51bWJlciB8fCAhaXNDb25uZWN0ZWQgfHwgaXNDYWxsSW5Qcm9ncmVzcyB8fCBpc0RpYWxpbmc7XG4gICAgdmFyIGdldEJ1dHRvblRpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzQ29ubmVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuICdWb0lQIG5vdCBjb25uZWN0ZWQnO1xuICAgICAgICBpZiAoaXNDYWxsSW5Qcm9ncmVzcylcbiAgICAgICAgICAgIHJldHVybiAnQ2FsbCBpbiBwcm9ncmVzcyc7XG4gICAgICAgIGlmICghaGFzUGhvbmVOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gJ05vIHBob25lIG51bWJlcic7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uU3RhdHVzID09PSAnZGVuaWVkJylcbiAgICAgICAgICAgIHJldHVybiAnTWljcm9waG9uZSBhY2Nlc3MgZGVuaWVkJztcbiAgICAgICAgcmV0dXJuIFwiQ2FsbCBcIi5jb25jYXQoY2FsbGVyTmFtZSB8fCAncHJvc3BlY3QnKTtcbiAgICB9O1xuICAgIHJldHVybiAoX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZSwgY2hpbGRyZW46IFtfanN4cyhCdXR0b24sIHsgdmFyaWFudDogXCJvdXRsaW5lXCIsIHNpemU6IFwic21cIiwgb25DbGljazogaGFuZGxlQ2FsbCwgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsIHRpdGxlOiBnZXRCdXR0b25UaXRsZSgpLCBjbGFzc05hbWU6IFwiZ2FwLTEuNVwiLCBjaGlsZHJlbjogW3Blcm1pc3Npb25TdGF0dXMgPT09ICdkZW5pZWQnID8gKF9qc3goTWljT2ZmLCB7IGNsYXNzTmFtZTogXCJ3LTQgaC00XCIgfSkpIDogKF9qc3goUGhvbmUsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSksIGlzRGlhbGluZyA/ICdDYWxsaW5nLi4uJyA6ICdDYWxsJ10gfSksIGVycm9yICYmIF9qc3goXCJwXCIsIHsgY2xhc3NOYW1lOiBcInRleHQtcmVkLTUwMCB0ZXh0LXhzIG10LTFcIiwgY2hpbGRyZW46IGVycm9yIH0pXSB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2FsbEJ1dHRvbjtcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJ0BjYW1weGRldi9yZWFjdC1ibHVlcHJpbnQnO1xuaW1wb3J0IHsgTWljLCBNaWNPZmYsIEFsZXJ0Q2lyY2xlIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IHVzZUV4b3RlbCB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9FeG90ZWxQcm92aWRlcic7XG52YXIgTWljcm9waG9uZVBlcm1pc3Npb24gPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgb25QZXJtaXNzaW9uR3JhbnRlZCA9IF9hLm9uUGVybWlzc2lvbkdyYW50ZWQsIG9uUGVybWlzc2lvbkRlbmllZCA9IF9hLm9uUGVybWlzc2lvbkRlbmllZDtcbiAgICB2YXIgX2IgPSB1c2VFeG90ZWwoKSwgcGVybWlzc2lvblN0YXR1cyA9IF9iLnBlcm1pc3Npb25TdGF0dXMsIHJlcXVlc3RNaWNyb3Bob25lQWNjZXNzID0gX2IucmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3M7XG4gICAgdmFyIF9jID0gdXNlU3RhdGUoZmFsc2UpLCBpc1JlcXVlc3RpbmcgPSBfY1swXSwgc2V0SXNSZXF1ZXN0aW5nID0gX2NbMV07XG4gICAgdmFyIF9kID0gdXNlU3RhdGUobnVsbCksIGVycm9yID0gX2RbMF0sIHNldEVycm9yID0gX2RbMV07XG4gICAgdmFyIGhhbmRsZVJlcXVlc3RQZXJtaXNzaW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdyYW50ZWQsIGVycl8xO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBzZXRJc1JlcXVlc3RpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHNldEVycm9yKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsIDQsIDVdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmVxdWVzdE1pY3JvcGhvbmVBY2Nlc3MoKV07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBncmFudGVkID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25QZXJtaXNzaW9uR3JhbnRlZCA9PT0gbnVsbCB8fCBvblBlcm1pc3Npb25HcmFudGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblBlcm1pc3Npb25HcmFudGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignTWljcm9waG9uZSBhY2Nlc3Mgd2FzIGRlbmllZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb25QZXJtaXNzaW9uRGVuaWVkID09PSBudWxsIHx8IG9uUGVybWlzc2lvbkRlbmllZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25QZXJtaXNzaW9uRGVuaWVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoZXJyXzEubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHJlcXVlc3QgbWljcm9waG9uZSBhY2Nlc3MnKTtcbiAgICAgICAgICAgICAgICAgICAgb25QZXJtaXNzaW9uRGVuaWVkID09PSBudWxsIHx8IG9uUGVybWlzc2lvbkRlbmllZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25QZXJtaXNzaW9uRGVuaWVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNSZXF1ZXN0aW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7IH07XG4gICAgaWYgKHBlcm1pc3Npb25TdGF0dXMgPT09ICdncmFudGVkJykge1xuICAgICAgICByZXR1cm4gKF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtZ3JlZW4tNjAwXCIsIGNoaWxkcmVuOiBbX2pzeChNaWMsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSwgX2pzeChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwidGV4dC1zbVwiLCBjaGlsZHJlbjogXCJNaWNyb3Bob25lIGFjY2VzcyBncmFudGVkXCIgfSldIH0pKTtcbiAgICB9XG4gICAgaWYgKHBlcm1pc3Npb25TdGF0dXMgPT09ICdkZW5pZWQnKSB7XG4gICAgICAgIHJldHVybiAoX2pzeHMoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwicC00IGJnLXJlZC01MCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItcmVkLTIwMFwiLCBjaGlsZHJlbjogW19qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtcmVkLTYwMCBtYi0yXCIsIGNoaWxkcmVuOiBbX2pzeChNaWNPZmYsIHsgY2xhc3NOYW1lOiBcInctNSBoLTVcIiB9KSwgX2pzeChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwiZm9udC1tZWRpdW1cIiwgY2hpbGRyZW46IFwiTWljcm9waG9uZSBBY2Nlc3MgRGVuaWVkXCIgfSldIH0pLCBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LXNtIHRleHQtcmVkLTYwMCBtYi0zXCIsIGNoaWxkcmVuOiBcIlRvIHVzZSB0aGUgY2FsbGluZyBmZWF0dXJlLCB5b3UgbmVlZCB0byBlbmFibGUgbWljcm9waG9uZSBhY2Nlc3MgaW4geW91ciBicm93c2VyIHNldHRpbmdzLlwiIH0pLCBfanN4cyhcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LXhzIHRleHQtZ3JheS02MDBcIiwgY2hpbGRyZW46IFtfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJmb250LW1lZGl1bSBtYi0xXCIsIGNoaWxkcmVuOiBcIkhvdyB0byBlbmFibGU6XCIgfSksIF9qc3hzKFwib2xcIiwgeyBjbGFzc05hbWU6IFwibGlzdC1kZWNpbWFsIGxpc3QtaW5zaWRlIHNwYWNlLXktMVwiLCBjaGlsZHJlbjogW19qc3goXCJsaVwiLCB7IGNoaWxkcmVuOiBcIkNsaWNrIHRoZSBsb2NrL2luZm8gaWNvbiBpbiB5b3VyIGJyb3dzZXIncyBhZGRyZXNzIGJhclwiIH0pLCBfanN4KFwibGlcIiwgeyBjaGlsZHJlbjogXCJGaW5kIFxcXCJNaWNyb3Bob25lXFxcIiBpbiB0aGUgcGVybWlzc2lvbnMgbGlzdFwiIH0pLCBfanN4KFwibGlcIiwgeyBjaGlsZHJlbjogXCJDaGFuZ2UgdGhlIHNldHRpbmcgdG8gXFxcIkFsbG93XFxcIlwiIH0pLCBfanN4KFwibGlcIiwgeyBjaGlsZHJlbjogXCJSZWZyZXNoIHRoZSBwYWdlXCIgfSldIH0pXSB9KV0gfSkpO1xuICAgIH1cbiAgICByZXR1cm4gKF9qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInAtNCBiZy1ibHVlLTUwIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ibHVlLTIwMFwiLCBjaGlsZHJlbjogW19qc3hzKFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtYmx1ZS02MDAgbWItMlwiLCBjaGlsZHJlbjogW19qc3goQWxlcnRDaXJjbGUsIHsgY2xhc3NOYW1lOiBcInctNSBoLTVcIiB9KSwgX2pzeChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwiZm9udC1tZWRpdW1cIiwgY2hpbGRyZW46IFwiTWljcm9waG9uZSBQZXJtaXNzaW9uIFJlcXVpcmVkXCIgfSldIH0pLCBfanN4KFwicFwiLCB7IGNsYXNzTmFtZTogXCJ0ZXh0LXNtIHRleHQtZ3JheS02MDAgbWItM1wiLCBjaGlsZHJlbjogXCJUbyBtYWtlIGFuZCByZWNlaXZlIGNhbGxzLCB3ZSBuZWVkIGFjY2VzcyB0byB5b3VyIG1pY3JvcGhvbmUuIENsaWNrIHRoZSBidXR0b24gYmVsb3cgdG8gZ3JhbnQgcGVybWlzc2lvbi5cIiB9KSwgX2pzeHMoQnV0dG9uLCB7IHZhcmlhbnQ6IFwiZGVmYXVsdFwiLCBzaXplOiBcInNtXCIsIG9uQ2xpY2s6IGhhbmRsZVJlcXVlc3RQZXJtaXNzaW9uLCBsb2FkaW5nOiBpc1JlcXVlc3RpbmcsIGNsYXNzTmFtZTogXCJnYXAtMS41XCIsIGNoaWxkcmVuOiBbX2pzeChNaWMsIHsgY2xhc3NOYW1lOiBcInctNCBoLTRcIiB9KSwgXCJBbGxvdyBNaWNyb3Bob25lIEFjY2Vzc1wiXSB9KSwgZXJyb3IgJiYgX2pzeChcInBcIiwgeyBjbGFzc05hbWU6IFwidGV4dC1yZWQtNTAwIHRleHQteHMgbXQtMlwiLCBjaGlsZHJlbjogZXJyb3IgfSldIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBNaWNyb3Bob25lUGVybWlzc2lvbjtcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBFeG90ZWxQcm92aWRlciB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9FeG90ZWxQcm92aWRlcic7XG5pbXBvcnQgeyBnZXRBY3RpdmVWb2ljZVRva2VuIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhvdGVsL2FwaSc7XG5pbXBvcnQgRXhvdGVsUGhvbmUgZnJvbSAnLi9FeG90ZWxQaG9uZSc7XG4vKipcbiAqIFdyYXBwZXIgY29tcG9uZW50IHRoYXQgaW5pdGlhbGl6ZXMgRXhvdGVsIFZvSVAgZnVuY3Rpb25hbGl0eVxuICogRmV0Y2hlcyB0aGUgYWNjZXNzIHRva2VuIGZyb20gYmFja2VuZCBhbmQgcHJvdmlkZXMgdGhlIEV4b3RlbCBjb250ZXh0IHRvIGNoaWxkcmVuXG4gKi9cbnZhciBFeG90ZWxXcmFwcGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIF9iID0gX2EuZW5hYmxlZCwgZW5hYmxlZCA9IF9iID09PSB2b2lkIDAgPyB0cnVlIDogX2IsIHByb3NwZWN0SWQgPSBfYS5wcm9zcGVjdElkLCBwcm9zcGVjdE5hbWUgPSBfYS5wcm9zcGVjdE5hbWUsIHByb3NwZWN0TnVtYmVyID0gX2EucHJvc3BlY3ROdW1iZXI7XG4gICAgdmFyIF9jID0gdXNlU3RhdGUobnVsbCksIGFjY2Vzc1Rva2VuID0gX2NbMF0sIHNldEFjY2Vzc1Rva2VuID0gX2NbMV07XG4gICAgdmFyIF9kID0gdXNlU3RhdGUodHJ1ZSksIGlzTG9hZGluZyA9IF9kWzBdLCBzZXRJc0xvYWRpbmcgPSBfZFsxXTtcbiAgICB2YXIgX2UgPSB1c2VTdGF0ZShudWxsKSwgZXJyb3IgPSBfZVswXSwgc2V0RXJyb3IgPSBfZVsxXTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZldGNoVG9rZW4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRva2VuRGF0YSwgZXJyXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDIsIDMsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGdldEFjdGl2ZVZvaWNlVG9rZW4oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuRGF0YSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbkRhdGEgPT09IG51bGwgfHwgdG9rZW5EYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b2tlbkRhdGEudG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBY2Nlc3NUb2tlbih0b2tlbkRhdGEudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gYWN0aXZlIHZvaWNlIGNvbmZpZyAtIEV4b3RlbCBub3QgY29uZmlndXJlZCBmb3IgdGhpcyB0ZW5hbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignVm9pY2UgY2FsbGluZyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIEV4b3RlbCB0b2tlbjonLCBlcnJfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihlcnJfMS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjYWxsaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTsgfTtcbiAgICAgICAgZmV0Y2hUb2tlbigpO1xuICAgIH0sIFtlbmFibGVkXSk7XG4gICAgLy8gSWYgRXhvdGVsIGlzIG5vdCBlbmFibGVkIG9yIGZhaWxlZCB0byBsb2FkLCBqdXN0IHJlbmRlciBjaGlsZHJlblxuICAgIGlmICghZW5hYmxlZCB8fCBlcnJvciB8fCAhYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIF9qc3goX0ZyYWdtZW50LCB7IGNoaWxkcmVuOiBjaGlsZHJlbiB9KTtcbiAgICB9XG4gICAgLy8gUmVuZGVyIHdpdGggRXhvdGVsIHByb3ZpZGVyIGFuZCBmbG9hdGluZyBwaG9uZSBVSVxuICAgIHJldHVybiAoX2pzeHMoRXhvdGVsUHJvdmlkZXIsIHsgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuLCBhZ2VudFVzZXJJZDogXCIwMDQ3XCIsIGF1dG9Db25uZWN0Vk9JUDogdHJ1ZSwgY2hpbGRyZW46IFtjaGlsZHJlbiwgX2pzeChFeG90ZWxQaG9uZSwgeyBwcm9zcGVjdElkOiBwcm9zcGVjdElkLCBwcm9zcGVjdE5hbWU6IHByb3NwZWN0TmFtZSwgcHJvc3BlY3ROdW1iZXI6IHByb3NwZWN0TnVtYmVyIH0pXSB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRXhvdGVsV3JhcHBlcjtcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRXhvdGVsUHJvdmlkZXIgfSBmcm9tICcuL0V4b3RlbFByb3ZpZGVyJztcbmltcG9ydCB7IEV4b3RlbFBob25lIH0gZnJvbSAnLi4vY29tcG9uZW50cy9FeG90ZWwnO1xuaW1wb3J0IHsgY2hlY2tWb0lQRW5hYmxlZCwgZ2V0QWN0aXZlVm9pY2VUb2tlbiwgc2F2ZUNhbGxEaXNwb3NpdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL2V4b3RlbCc7XG5pbXBvcnQgeyBpc1ZvSVBFbmFibGVkRm9yV29ya3NwYWNlIH0gZnJvbSAnLi4vY29uZmlnL3ZvaXAuY29uZmlnJztcbi8qKlxuICogVm9JUFByb3ZpZGVyIC0gV29ya3NwYWNlLWxldmVsIFZvSVAvRXhvdGVsIGludGVncmF0aW9uXG4gKlxuICogVGhpcyBwcm92aWRlciBjaGVja3MgaWYgVm9JUCBpcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCB3b3Jrc3BhY2UgQU5EIHRlbmFudFxuICogYW5kIGluaXRpYWxpemVzIHRoZSBFeG90ZWwgU0RLIGlmIGVuYWJsZWQuXG4gKlxuICogVm9JUCBpcyBlbmFibGVkIG9ubHkgd2hlbiBBTEwgY29uZGl0aW9ucyBhcmUgbWV0OlxuICogMS4gV29ya3NwYWNlIGlzIGluIFZPSVBfRU5BQkxFRF9XT1JLU1BBQ0VTIChjb21tb24td29ya3NwYWNlLCB0ZWxlLWNhbGxlci13b3Jrc3BhY2UpXG4gKiAyLiBUZW5hbnQgaGFzIGVuYWJsZVZvaWNlOiB0cnVlIGluIG5vdGlmaWNhdGlvbiBjb25maWdcbiAqIDMuIFRlbmFudCBoYXMgYXQgbGVhc3Qgb25lIGVuYWJsZWQgdm9pY2UgY29uZmlnICh2b2ljZUNvbmZpZ3NbXS5pc0VuYWJsZWQ6IHRydWUpXG4gKiA0LiBBY3RpdmUgdG9rZW4gaXMgYXZhaWxhYmxlXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIFdvcmtzcGFjZS1sZXZlbCBWb0lQIGVuYWJsZW1lbnRcbiAqIC0gVGVuYW50LWxldmVsIFZvSVAgY29uZmlndXJhdGlvbiBjaGVja1xuICogLSBBdXRvbWF0aWMgdG9rZW4gZmV0Y2hpbmcgZnJvbSBiYWNrZW5kXG4gKiAtIE1pY3JvcGhvbmUgcGVybWlzc2lvbiBoYW5kbGluZ1xuICogLSBGbG9hdGluZyBwaG9uZSBVSSBmb3IgYWN0aXZlIGNhbGxzXG4gKi9cbmV4cG9ydCB2YXIgVm9JUFByb3ZpZGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIHdvcmtzcGFjZSA9IF9hLndvcmtzcGFjZSwgYWdlbnRVc2VySWQgPSBfYS5hZ2VudFVzZXJJZCwgcHJvc3BlY3RJZCA9IF9hLnByb3NwZWN0SWQsIHByb3NwZWN0TmFtZSA9IF9hLnByb3NwZWN0TmFtZSwgcHJvc3BlY3ROdW1iZXIgPSBfYS5wcm9zcGVjdE51bWJlciwgb25TYXZlRGlzcG9zaXRpb24gPSBfYS5vblNhdmVEaXNwb3NpdGlvbjtcbiAgICB2YXIgX2IgPSB1c2VTdGF0ZShudWxsKSwgYWNjZXNzVG9rZW4gPSBfYlswXSwgc2V0QWNjZXNzVG9rZW4gPSBfYlsxXTtcbiAgICB2YXIgX2MgPSB1c2VTdGF0ZSh0cnVlKSwgaXNMb2FkaW5nID0gX2NbMF0sIHNldElzTG9hZGluZyA9IF9jWzFdO1xuICAgIHZhciBfZCA9IHVzZVN0YXRlKG51bGwpLCBlcnJvciA9IF9kWzBdLCBzZXRFcnJvciA9IF9kWzFdO1xuICAgIHZhciBpc1dvcmtzcGFjZVZvSVBFbmFibGVkID0gaXNWb0lQRW5hYmxlZEZvcldvcmtzcGFjZSh3b3Jrc3BhY2UpO1xuICAgIHZhciBoYXNBZ2VudFVzZXJJZCA9ICEhYWdlbnRVc2VySWQ7XG4gICAgLy8gRGVmYXVsdCBkaXNwb3NpdGlvbiBoYW5kbGVyIHRoYXQgY2FsbHMgdGhlIEFQSVxuICAgIHZhciBoYW5kbGVTYXZlRGlzcG9zaXRpb24gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgLy8gSWYgY3VzdG9tIGhhbmRsZXIgaXMgcHJvdmlkZWQsIHVzZSBpdFxuICAgICAgICAgICAgaWYgKG9uU2F2ZURpc3Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG9uU2F2ZURpc3Bvc2l0aW9uKGRhdGEpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERlZmF1bHQ6IGNhbGwgdGhlIHNhdmVDYWxsRGlzcG9zaXRpb24gQVBJXG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgc2F2ZUNhbGxEaXNwb3NpdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxJZDogZGF0YS5jYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgIHByb3NwZWN0SWQ6IGRhdGEucHJvc3BlY3RJZCxcbiAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uOiBkYXRhLmNhbGxTdGF0dXNEaXNwb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zaXRpb25DYXRlZ29yeTogZGF0YS5kaXNwb3NpdGlvbkNhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICBkaXNwb3NpdGlvblJlYXNvbjogZGF0YS5kaXNwb3NpdGlvblJlYXNvbiB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uTm90ZXM6IGRhdGEucmVtYXJrcyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICB9KTtcbiAgICB9KTsgfSwgW29uU2F2ZURpc3Bvc2l0aW9uXSk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gU2tpcCBpZiB3b3Jrc3BhY2UgZG9lc24ndCBzdXBwb3J0IFZvSVAgb3IgdXNlciBkb2Vzbid0IGhhdmUgRXhvdGVsIEFwcCBVc2VyIElEXG4gICAgICAgIGlmICghaXNXb3Jrc3BhY2VWb0lQRW5hYmxlZCB8fCAhaGFzQWdlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluaXRpYWxpemVWb0lQID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB2b2lwU3RhdHVzLCB0b2tlbkRhdGEsIGVycl8xO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAzLCA0LCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcihudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGNoZWNrVm9JUEVuYWJsZWQoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvaXBTdGF0dXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZvaXBTdGF0dXMuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZvSVAgbm90IGVuYWJsZWQgZm9yIHRoaXMgdGVuYW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoJ1ZvaWNlIGNhbGxpbmcgbm90IGVuYWJsZWQgZm9yIHRoaXMgdGVuYW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRBY3RpdmVWb2ljZVRva2VuKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkRhdGEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5EYXRhID09PSBudWxsIHx8IHRva2VuRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9rZW5EYXRhLnRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWNjZXNzVG9rZW4odG9rZW5EYXRhLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGFjdGl2ZSB0b2tlbiBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcignVm9pY2UgY2FsbGluZyB0b2tlbiBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBWb0lQOicsIGVycl8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKGVycl8xLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBpbml0aWFsaXplIGNhbGxpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyB9O1xuICAgICAgICBpbml0aWFsaXplVm9JUCgpO1xuICAgIH0sIFtpc1dvcmtzcGFjZVZvSVBFbmFibGVkLCBoYXNBZ2VudFVzZXJJZF0pO1xuICAgIC8vIElmIHdvcmtzcGFjZSBkb2Vzbid0IHN1cHBvcnQgVm9JUCBvciB1c2VyIGRvZXNuJ3QgaGF2ZSBFeG90ZWwgSUQsIGp1c3QgcmVuZGVyIGNoaWxkcmVuXG4gICAgaWYgKCFpc1dvcmtzcGFjZVZvSVBFbmFibGVkIHx8ICFoYXNBZ2VudFVzZXJJZCkge1xuICAgICAgICByZXR1cm4gX2pzeChfRnJhZ21lbnQsIHsgY2hpbGRyZW46IGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgICAvLyBJZiBsb2FkaW5nIG9yIGVycm9yIG9yIG5vIHRva2VuLCByZW5kZXIgY2hpbGRyZW4gd2l0aG91dCBWb0lQXG4gICAgaWYgKGlzTG9hZGluZyB8fCBlcnJvciB8fCAhYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIF9qc3goX0ZyYWdtZW50LCB7IGNoaWxkcmVuOiBjaGlsZHJlbiB9KTtcbiAgICB9XG4gICAgLy8gUmVuZGVyIHdpdGggRXhvdGVsIHByb3ZpZGVyIGFuZCBmbG9hdGluZyBwaG9uZSBVSVxuICAgIHJldHVybiAoX2pzeHMoRXhvdGVsUHJvdmlkZXIsIHsgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuLCBhZ2VudFVzZXJJZDogYWdlbnRVc2VySWQsIGF1dG9Db25uZWN0Vk9JUDogdHJ1ZSwgY2hpbGRyZW46IFtjaGlsZHJlbiwgX2pzeChFeG90ZWxQaG9uZSwgeyBwcm9zcGVjdElkOiBwcm9zcGVjdElkLCBwcm9zcGVjdE5hbWU6IHByb3NwZWN0TmFtZSwgcHJvc3BlY3ROdW1iZXI6IHByb3NwZWN0TnVtYmVyLCBvblNhdmVEaXNwb3NpdGlvbjogaGFuZGxlU2F2ZURpc3Bvc2l0aW9uIH0pXSB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVm9JUFByb3ZpZGVyO1xuIl0sIm5hbWVzIjpbIl9fYXNzaWduIiwiT2JqZWN0IiwiYXNzaWduIiwidCIsInMiLCJpIiwibiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInAiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJhcHBseSIsInRoaXMiLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInZhbHVlIiwic3RlcCIsIm5leHQiLCJlIiwicmVqZWN0ZWQiLCJyZXN1bHQiLCJkb25lIiwidGhlbiIsIl9fZ2VuZXJhdG9yIiwiYm9keSIsImYiLCJ5IiwiXyIsImxhYmVsIiwic2VudCIsInRyeXMiLCJvcHMiLCJnIiwiY3JlYXRlIiwiSXRlcmF0b3IiLCJ2ZXJiIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJ2Iiwib3AiLCJUeXBlRXJyb3IiLCJwb3AiLCJwdXNoIiwiU3VwcHJlc3NlZEVycm9yIiwiaW5pdGlhbEFwcGxpY2F0aW9uU3RhdGUiLCJpc0xvZ2luRGlhbG9nT3BlbiIsInNuYWNrYmFyIiwib3BlbiIsIm1lc3NhZ2UiLCJzZXZlcml0eSIsImNvbmZpcm1EaWFsb2ciLCJpc09wZW4iLCJ0aXRsZSIsIm9uQ29uZmlybSIsIm9uQ2FuY2VsIiwidHlwZSIsInVzZXIiLCJ1bmRlZmluZWQiLCJpbnN0aXR1dGlvbkluZm8iLCJhc3NldCIsIkFwcGxpY2F0aW9uU3RvcmUiLCJTdG9yZSIsInRvQmFzZTY0VXJsIiwiYmFzZTY0IiwicmVwbGFjZSIsImdlbmVyYXRlQ2xpZW50VG9rZW4iLCJjbGllbnRJZCIsInNlY3JldCIsInBheWxvYWQiLCJpYXQiLCJNYXRoIiwiZmxvb3IiLCJEYXRlIiwibm93IiwicGF5bG9hZEJhc2U2NHVybCIsImJ0b2EiLCJKU09OIiwic3RyaW5naWZ5Iiwic2lnbmF0dXJlV29yZEFycmF5IiwiQ3J5cHRvSlMiLCJIbWFjU0hBMjU2Iiwic2lnbmF0dXJlQmFzZTY0dXJsIiwiZW5jIiwiQmFzZTY0IiwiY29uY2F0IiwiaXNEZXZlbG9wbWVudCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaG9zdG5hbWUiLCJpbmNsdWRlcyIsInRlbmFudENvZGUiLCJzcGxpdCIsImluc3RpdHV0aW9uQ29kZSIsInBhdGhuYW1lIiwid29ya3NwYWNlIiwid29ya3NwYWNlQXBpTWFwcGluZyIsImF4aW9zIiwiQXhpb3MiLCJiYXNlVVJMIiwicHJvY2VzcyIsImVudiIsIlJFQUNUX0FQUF9BUElfSE9TVCIsIndpdGhDcmVkZW50aWFscyIsImhlYWRlcnMiLCJjcmVhdGVSc2J1aWxkU2hhcmVkQ29uZmlnIiwiZGVwZW5kZW5jaWVzIiwiYWx3YXlzRWFnZXIiLCJzaGFyZWREZXBlbmRlbmNpZXNMaXN0IiwicmVkdWNlIiwiYWNjIiwicGtnIiwidmVyc2lvbiIsInNpbmdsZXRvbiIsInJlcXVpcmVkVmVyc2lvbiIsImVhZ2VyIiwiaW50ZXJjZXB0b3JzIiwicmVxdWVzdCIsInVzZSIsImNvbmZpZyIsInBhcmFtcyIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsIm1hcCIsIl9hIiwia2V5IiwiZm9ybWF0UGFyYW1zIiwid29ya3NwYWNlUHJlZml4IiwidXJsIiwic2Vzc2lvbktleSIsIkNvb2tpZXMiLCJnZXQiLCJvcGVuUGF5bWVudHNLZXkiLCJzdHVkZW50U2Vzc2lvbktleSIsInNldCIsImNhbXB4Q2xpZW50SWQiLCJSRUFDVF9BUFBfQ0xJRU5UX0lEIiwiY2FtcHhDbGllbnRTZWNyZXQiLCJSRUFDVF9BUFBfQ0FNUFhfQ0xJRU5UX1NFQ1JFVCIsInNraXBJbnN0aXR1dGlvbkNvZGUiLCJkZWxldGUiLCJlcnJvciIsInJlc3BvbnNlIiwiZGF0YSIsImhpZGVTbmFja2JhciIsIm1ldGhvZCIsInN0YXR1cyIsInVwZGF0ZSIsImVyciIsIl9iIiwiX2MiLCJfZCIsInNob3VsZEhpZGVTbmFja2JhciIsIm5vbldvcmtzcGFjZUF4aW9zIiwiVk9JUF9FTkFCTEVEX1dPUktTUEFDRVMiLCJpc1ZvSVBFbmFibGVkRm9yV29ya3NwYWNlIiwid29ya3NwYWNlTmFtZSIsIkNvbmZpcm1Db250ZXh0IiwiY3JlYXRlQ29udGV4dCIsInNob3dDb25maXJtRGlhbG9nIiwiQ29uZmlybURpYWxvZ1Byb3ZpZGVyIiwiY2hpbGRyZW4iLCJ1c2VTdGF0ZSIsImhhbmRsZUNsb3NlRGlhbG9nIiwiX2pzeHMiLCJQcm92aWRlciIsImNvbmZpcm1UZXh0IiwiY2FuY2VsVGV4dCIsImNvbmZpcm1CdXR0b25UZXh0IiwiY2FuY2VsQnV0dG9uVGV4dCIsIl9qc3giLCJDb25maXJtRGlhbG9nIiwidmFyaWFudCIsIm9uQ2xvc2UiLCJfc2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsImJpbmQiLCJfX3Byb3RvX18iLCJpbml0aWFsU3RhdGUiLCJFcnJvckJvdW5kYXJ5IiwiX1JlYWN0JENvbXBvbmVudCIsIl90aGlzIiwiX2xlbiIsIl9hcmdzIiwiQXJyYXkiLCJfa2V5Iiwic3RhdGUiLCJyZXNldEVycm9yQm91bmRhcnkiLCJfdGhpcyRwcm9wcyIsIl9sZW4yIiwiYXJncyIsIl9rZXkyIiwicHJvcHMiLCJvblJlc2V0IiwicmVzZXQiLCJvIiwiY29uc3RydWN0b3IiLCJfaW5oZXJpdHNMb29zZSIsImdldERlcml2ZWRTdGF0ZUZyb21FcnJvciIsIl9wcm90byIsInNldFN0YXRlIiwiY29tcG9uZW50RGlkQ2F0Y2giLCJpbmZvIiwiX3RoaXMkcHJvcHMkb25FcnJvciIsIl90aGlzJHByb3BzMiIsIm9uRXJyb3IiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJfdGhpcyRwcm9wcyRvblJlc2V0S2UiLCJfdGhpcyRwcm9wczMiLCJhIiwiYiIsInJlc2V0S2V5cyIsInNvbWUiLCJpdGVtIiwiaW5kZXgiLCJpcyIsIm9uUmVzZXRLZXlzQ2hhbmdlIiwicmVuZGVyIiwiX3RoaXMkcHJvcHM0IiwiZmFsbGJhY2tSZW5kZXIiLCJGYWxsYmFja0NvbXBvbmVudCIsImZhbGxiYWNrIiwiX3Byb3BzIiwiUmVhY3QiLCJpc1ZhbGlkRWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJFcnJvciIsIkNvbXBvbmVudCIsImMiLCJyIiwidSIsImNvbnRleHQiLCJOT0RFX0VOViIsIm1vZGUiLCJhYm9ydEVhcmx5Iiwic2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbiIsInZhbHVlcyIsInJhd1ZhbHVlcyIsImVycm9ycyIsImlubmVyIiwiY3JpdGVyaWFNb2RlIiwicGF0aCIsInR5cGVzIiwicGVyZm9ybUxvZ2luIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJmZXRjaCIsImNvbnNpZGVySXAiLCJqc29uIiwibGF0IiwibG5nIiwicG9zdCIsInJlcyIsInZhbGlkYXRpb25TY2hlbWEiLCJZdXAiLCJvYmplY3QiLCJzaGFwZSIsInVzZXJuYW1lIiwic3RyaW5nIiwicmVxdWlyZWQiLCJwYXNzd29yZCIsIkxvZ2luIiwiY2xvc2UiLCJkZXZpY2VJbmZvcm1hdGlvbiIsImRldmljZVR5cGUiLCJjbGllbnROYW1lIiwib3MiLCJvc1ZlcnNpb24iLCJ0b2tlblR5cGUiLCJpc0xvY2F0aW9uQWxsb3dlZCIsImRldmljZVN0YXRlIiwic2V0RGV2aWNlU3RhdGUiLCJuYXZpZ2F0ZSIsInVzZU5hdmlnYXRlIiwidXNlRWZmZWN0IiwibmF2aWdhdG9yIiwiZ2VvbG9jYXRpb24iLCJnZXRDdXJyZW50UG9zaXRpb24iLCJwb3NpdGlvbiIsImNvb3JkcyIsInBlcm1pc3Npb25zIiwicXVlcnkiLCJuYW1lIiwicGVybWlzc2lvblN0YXR1cyIsImRldmljZUluZm8iLCJEZXZpY2VEZXRlY3RvciIsInBhcnNlIiwidXNlckFnZW50IiwiY2xpZW50IiwidXNlRm9ybSIsInJlc29sdmVyIiwieXVwUmVzb2x2ZXIiLCJoYW5kbGVTdWJtaXQiLCJjb250cm9sIiwiZm9ybVN0YXRlIiwidXNlTXV0YXRpb24iLCJvblN1Y2Nlc3MiLCJyZW1vdmUiLCJzZXNzaW9uIiwidG9rZW4iLCJyZWxvYWQiLCJtdXRhdGUiLCJpc0xvYWRpbmciLCJjbGFzc05hbWUiLCJJY29ucyIsIkNhbXB4RnVsbExvZ29JY29uIiwiQ29udHJvbGxlciIsImZpZWxkIiwiVGV4dEZpZWxkIiwicGxhY2Vob2xkZXIiLCJvbkNoYW5nZSIsImZ1bGxXaWR0aCIsIlBhc3N3b3JkRmllbGQiLCJCdXR0b24iLCJjb2xvciIsIm9uQ2xpY2siLCJsb2dpbklkIiwibG9naW5UeXBlIiwiZGlzYWJsZWQiLCJsb2FkaW5nIiwidXNlTG9jYXRpb24iLCJRdWVyeUVycm9yUmVzZXRCb3VuZGFyeSIsIlJlYWN0RXJyb3JCb3VuZGFyeSIsIkVycm9yRmFsbGJhY2siLCJfZSIsIl9mIiwiX2ciLCJfaCIsIlVuQXV0aCIsIkludGVybmFsU2VydmVyRXJyb3IiLCJyZXNldEJvdW5kYXJ5IiwiUmVzb3VyY2VOb3RGb3VuZCIsImNvZGUiLCJOb0ludGVybmVDb25uZWN0aW9uIiwic2l6ZSIsImlzTW9kYWxPcGVuIiwic2V0TW9kYWxPcGVuIiwic2Vzc2lvbkNvb2tpZSIsIlVuQXV0aG9yaXplZCIsImNvbXBvbmVudCIsIl9GcmFnbWVudCIsIkRpYWxvZyIsImNvbnRlbnQiLCJmb3JtYXRQcm9kRXJyb3JNZXNzYWdlIiwic3ltYm9sX29ic2VydmFibGVfZGVmYXVsdCIsIm9ic2VydmFibGUiLCJyYW5kb21TdHJpbmciLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0cmluZyIsImpvaW4iLCJhY3Rpb25UeXBlc19kZWZhdWx0IiwiSU5JVCIsIlJFUExBQ0UiLCJQUk9CRV9VTktOT1dOX0FDVElPTiIsImlzUGxhaW5PYmplY3QiLCJvYmoiLCJwcm90byIsImdldFByb3RvdHlwZU9mIiwibWluaUtpbmRPZiIsInZhbCIsImlzQXJyYXkiLCJ0b0RhdGVTdHJpbmciLCJnZXREYXRlIiwic2V0RGF0ZSIsImlzRGF0ZSIsInN0YWNrVHJhY2VMaW1pdCIsImlzRXJyb3IiLCJjb25zdHJ1Y3Rvck5hbWUiLCJjdG9yTmFtZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJraW5kT2YiLCJ0eXBlT2ZWYWwiLCJjcmVhdGVTdG9yZSIsInJlZHVjZXIiLCJwcmVsb2FkZWRTdGF0ZSIsImVuaGFuY2VyIiwiY3VycmVudFJlZHVjZXIiLCJjdXJyZW50U3RhdGUiLCJjdXJyZW50TGlzdGVuZXJzIiwiTWFwIiwibmV4dExpc3RlbmVycyIsImxpc3RlbmVySWRDb3VudGVyIiwiaXNEaXNwYXRjaGluZyIsImVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMiLCJmb3JFYWNoIiwibGlzdGVuZXIiLCJnZXRTdGF0ZSIsInN1YnNjcmliZSIsImlzU3Vic2NyaWJlZCIsImxpc3RlbmVySWQiLCJkaXNwYXRjaCIsImFjdGlvbiIsInJlcGxhY2VSZWR1Y2VyIiwibmV4dFJlZHVjZXIiLCJvdXRlclN1YnNjcmliZSIsIm9ic2VydmVyIiwib2JzZXJ2ZVN0YXRlIiwib2JzZXJ2ZXJBc09ic2VydmVyIiwidW5zdWJzY3JpYmUiLCJ3YXJuaW5nIiwiY29uc29sZSIsImNvbWJpbmVSZWR1Y2VycyIsInJlZHVjZXJzIiwicmVkdWNlcktleXMiLCJrZXlzIiwiZmluYWxSZWR1Y2VycyIsImZpbmFsUmVkdWNlcktleXMiLCJ1bmV4cGVjdGVkS2V5Q2FjaGUiLCJzaGFwZUFzc2VydGlvbkVycm9yIiwiYXNzZXJ0UmVkdWNlclNoYXBlIiwid2FybmluZ01lc3NhZ2UiLCJpbnB1dFN0YXRlIiwiYXJndW1lbnROYW1lIiwidW5leHBlY3RlZEtleXMiLCJmaWx0ZXIiLCJnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlIiwiaGFzQ2hhbmdlZCIsIm5leHRTdGF0ZSIsInByZXZpb3VzU3RhdGVGb3JLZXkiLCJuZXh0U3RhdGVGb3JLZXkiLCJhY3Rpb25UeXBlIiwiU3RyaW5nIiwiY29tcG9zZSIsImZ1bmNzIiwiYXJnIiwiTk9USElORyIsImZvciIsIkRSQUZUQUJMRSIsIkRSQUZUX1NUQVRFIiwicGx1Z2luIiwidGhpbmciLCJkaWUiLCJtc2ciLCJpc0RyYWZ0IiwiaXNEcmFmdGFibGUiLCJpc01hcCIsImlzU2V0Iiwib2JqZWN0Q3RvclN0cmluZyIsImNhY2hlZEN0b3JTdHJpbmdzIiwiV2Vha01hcCIsIkN0b3IiLCJjdG9yU3RyaW5nIiwiRnVuY3Rpb24iLCJlYWNoIiwiaXRlciIsInN0cmljdCIsImdldEFyY2h0eXBlIiwiUmVmbGVjdCIsIm93bktleXMiLCJlbnRyeSIsInR5cGVfIiwiaGFzIiwicHJvcCIsInByb3BPck9sZFZhbHVlIiwiYWRkIiwidGFyZ2V0IiwiU2V0IiwibGF0ZXN0IiwiY29weV8iLCJiYXNlXyIsInNoYWxsb3dDb3B5IiwiYmFzZSIsImlzUGxhaW4iLCJkZXNjcmlwdG9ycyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZXNjIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZnJlZXplIiwiZGVlcCIsImlzRnJvemVuIiwiZGVmaW5lUHJvcGVydGllcyIsImRvbnRNdXRhdGVNZXRob2RPdmVycmlkZSIsImNsZWFyIiwiY3VycmVudFNjb3BlIiwicGx1Z2lucyIsImdldFBsdWdpbiIsInBsdWdpbktleSIsImdldEN1cnJlbnRTY29wZSIsInVzZVBhdGNoZXNJblNjb3BlIiwic2NvcGUiLCJwYXRjaExpc3RlbmVyIiwicGF0Y2hlc18iLCJpbnZlcnNlUGF0Y2hlc18iLCJwYXRjaExpc3RlbmVyXyIsInJldm9rZVNjb3BlIiwibGVhdmVTY29wZSIsImRyYWZ0c18iLCJyZXZva2VEcmFmdCIsInBhcmVudF8iLCJlbnRlclNjb3BlIiwiaW1tZXIyIiwiaW1tZXJfIiwiY2FuQXV0b0ZyZWV6ZV8iLCJ1bmZpbmFsaXplZERyYWZ0c18iLCJkcmFmdCIsInJldm9rZV8iLCJyZXZva2VkXyIsInByb2Nlc3NSZXN1bHQiLCJiYXNlRHJhZnQiLCJtb2RpZmllZF8iLCJmaW5hbGl6ZSIsIm1heWJlRnJlZXplIiwiZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfIiwicm9vdFNjb3BlIiwidXNlU3RyaWN0SXRlcmF0aW9uIiwic2hvdWxkVXNlU3RyaWN0SXRlcmF0aW9uIiwiY2hpbGRWYWx1ZSIsImZpbmFsaXplUHJvcGVydHkiLCJzY29wZV8iLCJmaW5hbGl6ZWRfIiwicmVzdWx0RWFjaCIsImlzU2V0MiIsImdlbmVyYXRlUGF0Y2hlc18iLCJwYXJlbnRTdGF0ZSIsInRhcmdldE9iamVjdCIsInJvb3RQYXRoIiwidGFyZ2V0SXNTZXQiLCJjaGlsZElzRnJvemVuIiwiYXNzaWduZWRfIiwiYXV0b0ZyZWV6ZV8iLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIm9iamVjdFRyYXBzIiwic291cmNlIiwiZ2V0RGVzY3JpcHRvckZyb21Qcm90byIsImRyYWZ0XyIsInJlYWRQcm9wRnJvbVByb3RvIiwicGVlayIsInByZXBhcmVDb3B5IiwiY3JlYXRlUHJveHkiLCJjdXJyZW50MiIsIngiLCJtYXJrQ2hhbmdlZCIsIk51bWJlciIsImlzTmFOIiwiZGVsZXRlUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJvd25lciIsImRlZmluZVByb3BlcnR5IiwiYXJyYXlUcmFwcyIsInVzZVN0cmljdFNoYWxsb3dDb3B5XyIsImZuIiwicGFyc2VJbnQiLCJwYXJlbnQiLCJwcm94eU1hcF8iLCJwcm94eVNldF8iLCJpc01hbnVhbF8iLCJ0cmFwcyIsInJldm9rZSIsInByb3h5IiwiUHJveHkiLCJyZXZvY2FibGUiLCJjcmVhdGVQcm94eVByb3h5IiwiY3VycmVudEltcGwiLCJjb3B5IiwiaW1tZXIiLCJ1c2VTdHJpY3RJdGVyYXRpb25fIiwicHJvZHVjZSIsInJlY2lwZSIsImRlZmF1bHRCYXNlIiwic2VsZiIsImJhc2UyIiwiaGFzRXJyb3IiLCJpcCIsInByb2R1Y2VXaXRoUGF0Y2hlcyIsInBhdGNoZXMiLCJpbnZlcnNlUGF0Y2hlcyIsImF1dG9GcmVlemUiLCJzZXRBdXRvRnJlZXplIiwidXNlU3RyaWN0U2hhbGxvd0NvcHkiLCJzZXRVc2VTdHJpY3RTaGFsbG93Q29weSIsInNldFVzZVN0cmljdEl0ZXJhdGlvbiIsImNyZWF0ZURyYWZ0IiwiY3VycmVudCIsImZpbmlzaERyYWZ0IiwiYXBwbHlQYXRjaGVzIiwicGF0Y2giLCJhcHBseVBhdGNoZXNJbXBsIiwiYXBwbHlQYXRjaGVzXyIsImNyZWF0ZVRodW5rTWlkZGxld2FyZSIsImV4dHJhQXJndW1lbnQiLCJ0aHVuayIsIndpdGhFeHRyYUFyZ3VtZW50IiwiY29tcG9zZVdpdGhEZXZUb29scyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXyIsImlzQWN0aW9uQ3JlYXRvciIsIm1hdGNoIiwiZ2V0VGltZU1lYXN1cmVVdGlscyIsIm1heERlbGF5IiwiZm5OYW1lIiwiZWxhcHNlZCIsIm1lYXN1cmVUaW1lIiwic3RhcnRlZCIsImZpbmlzaGVkIiwid2FybklmRXhjZWVkZWQiLCJUdXBsZSIsIl9UdXBsZSIsIml0ZW1zIiwic3VwZXIiLCJzcGVjaWVzIiwiYXJyIiwicHJlcGVuZCIsImlzSW1tdXRhYmxlRGVmYXVsdCIsInRyYWNrRm9yTXV0YXRpb25zIiwiaXNJbW11dGFibGUiLCJpZ25vcmVQYXRocyIsInRyYWNrZWRQcm9wZXJ0aWVzIiwidHJhY2tQcm9wZXJ0aWVzIiwiZGV0ZWN0TXV0YXRpb25zIiwiY2hlY2tlZE9iamVjdHMiLCJ0cmFja2VkIiwiY2hpbGRQYXRoIiwiaW5kZXhPZiIsImlnbm9yZWRQYXRocyIsInRyYWNrZWRQcm9wZXJ0eSIsInNhbWVQYXJlbnRSZWYiLCJwcmV2T2JqIiwic2FtZVJlZiIsIndhc011dGF0ZWQiLCJrZXlzVG9EZXRlY3QiLCJoYXNJZ25vcmVkUGF0aHMiLCJuZXN0ZWRQYXRoIiwiaWdub3JlZCIsIlJlZ0V4cCIsInRlc3QiLCJmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUiLCJpc1NlcmlhbGl6YWJsZSIsImdldEVudHJpZXMiLCJjYWNoZSIsImZvdW5kTmVzdGVkU2VyaWFsaXphYmxlIiwia2V5UGF0aCIsIm5lc3RlZFZhbHVlIiwiaXNOZXN0ZWRGcm96ZW4iLCJjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUiLCJvcHRpb25zIiwiaWdub3JlZEFjdGlvbnMiLCJpZ25vcmVkQWN0aW9uUGF0aHMiLCJ3YXJuQWZ0ZXIiLCJpZ25vcmVTdGF0ZSIsImlnbm9yZUFjdGlvbnMiLCJkaXNhYmxlQ2FjaGUiLCJXZWFrU2V0Iiwic3RvcmVBUEkiLCJpc0FjdGlvbiIsIm1lYXN1cmVVdGlscyIsImZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWUiLCJmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWUiLCJpc0Jvb2xlYW4iLCJidWlsZEdldERlZmF1bHRNaWRkbGV3YXJlIiwiaW1tdXRhYmxlQ2hlY2siLCJzZXJpYWxpemFibGVDaGVjayIsImFjdGlvbkNyZWF0b3JDaGVjayIsIm1pZGRsZXdhcmVBcnJheSIsInRodW5rTWlkZGxld2FyZSIsImltbXV0YWJsZU9wdGlvbnMiLCJ1bnNoaWZ0Iiwic3RyaW5naWZ5MiIsInNlcmlhbGl6ZXIiLCJpbmRlbnQiLCJkZWN5Y2xlciIsImdldFNlcmlhbGl6ZTIiLCJzdGFjayIsInRoaXNQb3MiLCJzcGxpY2UiLCJJbmZpbml0eSIsInRyYWNrIiwidHJhY2tlciIsImRpc3BhdGNoZWRBY3Rpb24iLCJjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUiLCJzZXJpYWxpemFibGVPcHRpb25zIiwiYWN0aW9uQ3JlYXRvck9wdGlvbnMiLCJpc0FjdGlvbkNyZWF0b3IyIiwiY3JlYXRlQWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUiLCJjcmVhdGVRdWV1ZVdpdGhUaW1lciIsInRpbWVvdXQiLCJub3RpZnkiLCJzZXRUaW1lb3V0IiwiYnVpbGRHZXREZWZhdWx0RW5oYW5jZXJzIiwibWlkZGxld2FyZUVuaGFuY2VyIiwiYXV0b0JhdGNoIiwiZW5oYW5jZXJBcnJheSIsInN0b3JlIiwibm90aWZ5aW5nIiwic2hvdWxkTm90aWZ5QXRFbmRPZlRpY2siLCJub3RpZmljYXRpb25RdWV1ZWQiLCJsaXN0ZW5lcnMiLCJxdWV1ZUNhbGxiYWNrIiwicXVldWVNaWNyb3Rhc2siLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJxdWV1ZU5vdGlmaWNhdGlvbiIsIm5vdGlmeUxpc3RlbmVycyIsImwiLCJsaXN0ZW5lcjIiLCJtZXRhIiwiYXV0b0JhdGNoRW5oYW5jZXIiLCJjb25maWd1cmVTdG9yZSIsImdldERlZmF1bHRNaWRkbGV3YXJlIiwibWlkZGxld2FyZSIsImRldlRvb2xzIiwiZHVwbGljYXRlTWlkZGxld2FyZUNoZWNrIiwiZW5oYW5jZXJzIiwicm9vdFJlZHVjZXIiLCJmaW5hbE1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlUmVmZXJlbmNlcyIsIm1pZGRsZXdhcmUyIiwiZmluYWxDb21wb3NlIiwidHJhY2UiLCJtaWRkbGV3YXJlcyIsImNyZWF0ZVN0b3JlMiIsIm1pZGRsZXdhcmVBUEkiLCJjaGFpbiIsImFwcGx5TWlkZGxld2FyZSIsImdldERlZmF1bHRFbmhhbmNlcnMiLCJzdG9yZUVuaGFuY2VycyIsIlNuYWNrYmFyQ29udGV4dCIsIlNuYWNrYmFyUHJvdmlkZXIiLCJzaG93U25hY2tiYXIiLCJTbmFja2JhciIsImF1dG9IaWRlRHVyYXRpb24iLCJQcm92aWRlcnMiLCJiYXNlbmFtZSIsInF1ZXJ5Q2xpZW50IiwiUXVlcnlDbGllbnQiLCJkZWZhdWx0T3B0aW9ucyIsInF1ZXJpZXMiLCJyZWZldGNoT25XaW5kb3dGb2N1cyIsInJldHJ5IiwidXNlRXJyb3JCb3VuZGFyeSIsImJhc2VOYW1lIiwib3JpZ2luIiwiQnJvd3NlclJvdXRlciIsIlF1ZXJ5Q2xpZW50UHJvdmlkZXIiLCJkZWZhdWx0Q29uZmlybURpYWxvZ1N0YXRlIiwidXNlQ29uZmlybSIsInJlc2V0RGlhbG9nIiwiRGVwYXJ0bWVudE1vbmdvTXVsdGlTZWxlY3RvciIsIk11bHRpU2VsZWN0IiwiZGJMYWJlbFByb3BzIiwibGFiZWxLZXkiLCJzdWJMYWJlbEtleSIsInVzZVN1YkxhYmVsU3RhcnRDYXNlIiwiZGJWYWx1ZVByb3BzIiwidmFsdWVLZXkiLCJpc09iamVjdElkIiwiZXh0ZXJuYWxBeGlvcyIsIm9wdGlvbnNBcGlFbmRQb2ludCIsIkRlcGFydG1lbnRTcWxNdWx0aVNlbGVjdG9yIiwiaXNJbnQiLCJCYXRjaFNlbGVjdG9yIiwiU2luZ2xlU2VsZWN0IiwiQ291cnNlU2VsZWN0b3IiLCJEZXBhcnRtZW50U2VsZWN0b3IiLCJFbXBsb3llZXNTZWxlY3RvciIsIkV4YW1zUmVndWxhdGlvblNlbGVjdG9yIiwiZXhhbVR5cGVPcHRpb25zIiwiRXhhbVR5cGVTZWxlY3RvciIsIkZlZVR5cGVzIiwieWVhcnMiLCJmcm9tIiwiZ2V0RnVsbFllYXIiLCJGZWVUeXBlU2VsZWN0b3IiLCJIb3N0ZWxCbG9ja1NlbGVjdG9yIiwidXNlTGFiZWxTdGFydENhc2UiLCJIb3N0ZWxGbG9vclNlbGVjdG9yIiwiSG9zdGVsUm9vbVNlbGVjdG9yIiwiTW9udGhZZWFyU2VsZWN0b3IiLCJQcmludEZvcm1hdFNlbGVjdG9yIiwiUHJvZ3JhbVNlbGVjdG9yIiwiUmVndWxhdGlvblNlbGVjdG9yIiwiUmVzZWFyY2hFeHBlcnREZXNpZ25hdGlvblNlbGVjdG9yIiwiUmVzZWFyY2hFeHBlcnRTZWxlY3RvciIsIlJlc2VhcmNoU3RhZ2VTZWxlY3RvciIsIlNlbWVzdGVyU2VsZWN0b3IiLCJTdHVkZW50U2VsZWN0b3IiLCJTdHVkZW50U2VydmljZXNTZWxlY3RvciIsIlllYXJSYW5nZVNlbGVjdG9yIiwic3VmZml4IiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiX19yZXN0IiwieWVhciIsIm9wZW5Jbk5ld1RhYiIsInBhdGhBZnRlckJhc2UiLCJleGNsdWRlSW5zdGl0dXRpb24iLCJleGNsdWRlV29ya3NwYWNlIiwic2VnbWVudHMiLCJiYXNlUGFydHMiLCJmdWxsUGF0aCIsIkV4b3RlbFNlcnZpY2UiLCJleG90ZWxTREsiLCJ3ZWJQaG9uZSIsImNhbGxMaXN0ZW5lcnMiLCJyZWdpc3Rlckxpc3RlbmVycyIsInNlc3Npb25MaXN0ZW5lcnMiLCJoYW5kbGVDYWxsRXZlbnQiLCJldmVudCIsImNhbGxEYXRhIiwiaGFuZGxlUmVnaXN0ZXJFdmVudCIsImhhbmRsZVNlc3Npb25FdmVudCIsImdldEluc3RhbmNlIiwiaW5zdGFuY2UiLCJpbml0aWFsaXplIiwiYWNjZXNzVG9rZW5fMSIsImFnZW50VXNlcklkXzEiLCJhY2Nlc3NUb2tlbiIsImFnZW50VXNlcklkIiwiYXV0b0Nvbm5lY3RWT0lQIiwicGhvbmUiLCJjaGVja0F1ZGlvUGVybWlzc2lvbnMiLCJFeG90ZWxDUk1XZWJTREsiLCJJbml0aWFsaXplIiwiZGV2aWNlcyIsInBlcm1pc3Npb25TdGF0dXNfMSIsIm1lZGlhRGV2aWNlcyIsImVudW1lcmF0ZURldmljZXMiLCJkZXZpY2UiLCJraW5kIiwib25jaGFuZ2UiLCJyZXF1ZXN0TWljcm9waG9uZUFjY2VzcyIsImdldFVzZXJNZWRpYSIsImF1ZGlvIiwiZ2V0VHJhY2tzIiwic3RvcCIsIm1ha2VDYWxsIiwicGhvbmVOdW1iZXIiLCJNYWtlQ2FsbCIsImFjY2VwdENhbGwiLCJBY2NlcHRDYWxsIiwiaGFuZ3VwQ2FsbCIsIkhhbmd1cENhbGwiLCJyZWplY3RDYWxsIiwidG9nZ2xlSG9sZCIsIlRvZ2dsZUhvbGQiLCJ0b2dnbGVNdXRlIiwiVG9nZ2xlTXV0ZSIsInNlbmREVE1GIiwiZGlnaXQiLCJTZW5kRFRNRiIsInJlZ2lzdGVyRGV2aWNlIiwiUmVnaXN0ZXJEZXZpY2UiLCJ1bnJlZ2lzdGVyRGV2aWNlIiwiVW5SZWdpc3RlckRldmljZSIsImdldFBlcm1pc3Npb25TdGF0dXMiLCJhZGRDYWxsTGlzdGVuZXIiLCJyZW1vdmVDYWxsTGlzdGVuZXIiLCJhZGRSZWdpc3Rlckxpc3RlbmVyIiwicmVtb3ZlUmVnaXN0ZXJMaXN0ZW5lciIsImFkZFNlc3Npb25MaXN0ZW5lciIsInJlbW92ZVNlc3Npb25MaXN0ZW5lciIsImNoZWNrVm9JUEVuYWJsZWQiLCJlbmFibGVkVm9pY2VDb25maWciLCJlbmFibGVWb2ljZSIsInZvaWNlQ29uZmlncyIsImZpbmQiLCJ2YyIsImlzRW5hYmxlZCIsImVuYWJsZWQiLCJoYXNWYWxpZFRva2VuIiwiRVhPVEVMIiwidG9rZW5FeHBpcmVzQXQiLCJnZXRBY3RpdmVWb2ljZVRva2VuIiwiY3JlYXRlRXhvdGVsQXBwVG9rZW4iLCJ0b2tlbkRhdGEiLCJEYXRhIiwiaW5pdGlhdGVDYWxsQWN0aXZpdHkiLCJpbnB1dCIsInJlZ2lzdGVySW5jb21pbmdDYWxsIiwiZmV0Y2hDYWxsSGlzdG9yeSIsInByb3NwZWN0SWQiLCJnZXRDYWxsQWN0aXZpdHlCeUlkIiwiaWQiLCJnZXRDYWxsQWN0aXZpdHlCeUNhbGxTaWQiLCJjYWxsU2lkIiwiZ2V0Q2FsbENvdW50QnlQcm9zcGVjdCIsImNvdW50Iiwic2F2ZUNhbGxEaXNwb3NpdGlvbiIsInJlcXVlc3RCb2R5IiwiY2FsbFN0YXR1c0Rpc3Bvc2l0aW9uIiwiZGlzcG9zaXRpb25DYXRlZ29yeSIsInByb3NwZWN0U3RhdHVzIiwiZGlzcG9zaXRpb25Ob3RlcyIsImNhbGxiYWNrU2NoZWR1bGVkQXQiLCJjYWxsSWQiLCJjYW5jZWxDYWxsIiwiRVhPVEVMX0NPTlRFWFRfS0VZIiwiaW5pdGlhbENhbGxTdGF0ZSIsInBoYXNlIiwiaXNPbkhvbGQiLCJpc011dGVkIiwiaXNTcGVha2VyT2ZmIiwiY2FsbERpcmVjdGlvbiIsImNhbGxTdGFydFRpbWUiLCJjYWxsRHVyYXRpb24iLCJjYWxsZXJOYW1lIiwiY2FsbGVyTnVtYmVyIiwiY2FsbEFjdGl2aXR5SWQiLCJleG90ZWxDYWxsU2lkIiwicHJvc3BlY3RVbmlxdWVJZCIsIndhc0FjY2VwdGVkIiwibWFza01vYmlsZSIsIm1vYmlsZSIsInByZWZpeCIsIm51bWJlciIsInN0YXJ0c1dpdGgiLCJjbGVhbmVkIiwicmVwZWF0IiwiRXhvdGVsQ29udGV4dCIsIkV4b3RlbFByb3ZpZGVyIiwiZGVmYXVsdENhbGxlck5hbWUiLCJpc0luaXRpYWxpemVkIiwic2V0SXNJbml0aWFsaXplZCIsImlzQ29ubmVjdGVkIiwic2V0SXNDb25uZWN0ZWQiLCJzZXRQZXJtaXNzaW9uU3RhdHVzIiwiY2FsbFN0YXRlIiwic2V0Q2FsbFN0YXRlIiwiZGlzcG9zaXRpb25EYXRhIiwic2V0RGlzcG9zaXRpb25EYXRhIiwidGltZXJSZWYiLCJ1c2VSZWYiLCJjYWxsU3RhdGVSZWYiLCJleG90ZWxTZXJ2aWNlIiwic2V0SW50ZXJ2YWwiLCJwcmV2IiwiY2xlYXJJbnRlcnZhbCIsInJlcXVlc3RQZXJtaXNzaW9uIiwiY2F0Y2giLCJzdWNjZXNzIiwiaW5jb21pbmdOdW1iZXJfMSIsImNhbGxGcm9tTnVtYmVyIiwicmVtb3RlSWQiLCJyZW1vdGVEaXNwbGF5TmFtZSIsInNlc3Npb25JZCIsImZyb21OdW1iZXIiLCJ0b051bWJlciIsInByb3NwZWN0TW9iaWxlIiwicHJvc3BlY3QiLCJ1bmlxdWVJZCIsImRpc3Bvc2l0aW9uRGF0YU9iaiIsImV4b3RlbENhbGxJZCIsInVzZUNhbGxiYWNrIiwibWFza2VkTnVtYmVyIiwiZXJyb3JfMiIsInRvZ2dsZVNwZWFrZXIiLCJjbGVhckRpc3Bvc2l0aW9uIiwic2V0Q2FsbEFjdGl2aXR5SWRGbiIsInNldEV4b3RlbENhbGxTaWRGbiIsInNldENhbGxBY3Rpdml0eUlkIiwic2V0RXhvdGVsQ2FsbFNpZCIsInVzZUV4b3RlbCIsInVzZUNvbnRleHQiLCJ1c2VFeG90ZWxTYWZlIiwiRVhPVEVMX0NPTlNUQU5UUyIsIkNBTExfU1RBVFVTX09QVElPTlMiLCJDT05ORUNURURfRElTUE9TSVRJT05TIiwiTk9UX0NPTk5FQ1RFRF9ESVNQT1NJVElPTlMiLCJDYWxsRGlzcG9zaXRpb25Gb3JtIiwib25TYXZlIiwiZXhpc3RpbmdEYXRhIiwidXNlUXVlcnlDbGllbnQiLCJpc0VkaXRNb2RlIiwiY2FsbFN0YXR1cyIsInNldENhbGxTdGF0dXMiLCJzZXREaXNwb3NpdGlvbkNhdGVnb3J5IiwicmVtYXJrcyIsInNldFJlbWFya3MiLCJpbnZhbGlkYXRlUXVlcmllcyIsImhhbmRsZUNhbGxTdGF0dXNDaGFuZ2UiLCJoYW5kbGVEaXNwb3NpdGlvbkNoYW5nZSIsInN1Ym1pdERhdGEiLCJjaGFubmVsIiwiZGlyZWN0aW9uIiwiZHVyYXRpb24iLCJkaXNwb3NpdGlvbk9wdGlvbnMiLCJtYXhXaWR0aCIsIlR5cG9ncmFwaHkiLCJzZWNvbmRzIiwibWlucyIsInNlY3MiLCJSYWRpb0dyb3VwIiwiVGV4dGFyZWEiLCJyb3dzIiwiRXhvdGVsUGhvbmUiLCJwcm9zcGVjdE5hbWUiLCJwcm9zcGVjdE51bWJlciIsIm9uU2F2ZURpc3Bvc2l0aW9uIiwiaXNBY2NlcHRpbmciLCJzZXRJc0FjY2VwdGluZyIsImlzRGVjbGluaW5nIiwic2V0SXNEZWNsaW5pbmciLCJkZWNsaW5lVGltZW91dFJlZiIsInN0eWxlSWQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwic3R5bGVFbCIsInRleHRDb250ZW50IiwiaGVhZCIsImFwcGVuZENoaWxkIiwic2RrQ2FsbGVyTmFtZSIsInNka0NhbGxlck51bWJlciIsImRpc3BsYXlOYW1lIiwiZGlzcGxheU51bWJlciIsImhhbmRsZURlY2xpbmVDYWxsIiwiY2FsbFNpZEZvckFwaSIsInJlYXNvbiIsImNsZWFyVGltZW91dCIsImZpbmFsQ2FsbGVyTmFtZSIsImVucmljaGVkRGlzcG9zaXRpb25EYXRhIiwiaXNPdXRib3VuZCIsImlzSW5ib3VuZCIsImF2YXRhckJnQ29sb3IiLCJnZXRDb25uZWN0aW5nVGV4dCIsIm1vZGFsQ29udGVudCIsInN0eWxlIiwiekluZGV4IiwiYm9yZGVyUmFkaXVzIiwiYm9yZGVyIiwic3RvcFByb3BhZ2F0aW9uIiwiWCIsIlBob25lT3V0Z29pbmciLCJQaG9uZUluY29taW5nIiwiUGhvbmUiLCJwYWRTdGFydCIsImdldFN0YXR1c1RleHQiLCJNaWNPZmYiLCJNaWMiLCJQbGF5IiwiUGF1c2UiLCJWb2x1bWVYIiwiVm9sdW1lMiIsIlBob25lT2ZmIiwiYmFja2dyb3VuZENvbG9yIiwiY3JlYXRlUG9ydGFsIiwiQ3J5cHRvU2VydmljZSIsImFsZ29yaXRobSIsInNlY3JldEtleSIsImluaXRpYWxpemVkIiwiZW5zdXJlSW5pdGlhbGl6ZWQiLCJrZXlCdWZmZXIiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsInNhbHRCdWZmZXIiLCJzeW5jU2NyeXB0IiwiZGVjcnlwdERhdGEiLCJlbmNyeXB0ZWREYXRhIiwiaXZIZXgiLCJlbmNyeXB0ZWQiLCJjcnlwdG9fMSIsInJlcXVpcmUiLCJpdiIsIkJ1ZmZlciIsImRlY2lwaGVyIiwiY3JlYXRlRGVjaXBoZXJpdiIsImRlY3J5cHRlZCIsImZpbmFsIiwiQ2FsbEJ1dHRvbiIsImVuY3J5cHRlZFBob25lTnVtYmVyIiwiZXhvdGVsIiwiaXNEaWFsaW5nIiwic2V0SXNEaWFsaW5nIiwic2V0RXJyb3IiLCJpc0NhbGxJblByb2dyZXNzIiwiaGFzUGhvbmVOdW1iZXIiLCJhY3R1YWxQaG9uZU51bWJlciIsInNka1Jlc3BvbnNlIiwiZXJyXzEiLCJlcnJvck1lc3NhZ2UiLCJlcnJvckRldGFpbHMiLCJkZXNjcmlwdGlvbiIsIkNhbGxTaWQiLCJDb2RlIiwiU3RhdHVzIiwicGFyc2VFcnIiLCJlcnJvcl9kYXRhIiwiTWljcm9waG9uZVBlcm1pc3Npb24iLCJvblBlcm1pc3Npb25HcmFudGVkIiwib25QZXJtaXNzaW9uRGVuaWVkIiwiaXNSZXF1ZXN0aW5nIiwic2V0SXNSZXF1ZXN0aW5nIiwiQWxlcnRDaXJjbGUiLCJFeG90ZWxXcmFwcGVyIiwic2V0QWNjZXNzVG9rZW4iLCJzZXRJc0xvYWRpbmciLCJWb0lQUHJvdmlkZXIiLCJpc1dvcmtzcGFjZVZvSVBFbmFibGVkIiwiaGFzQWdlbnRVc2VySWQiLCJoYW5kbGVTYXZlRGlzcG9zaXRpb24iLCJkaXNwb3NpdGlvblJlYXNvbiJdLCJtYXBwaW5ncyI6Ijg2Q0ErQk8sSUFBSUEsR0FBVyxXQVFsQixPQVBBQSxHQUFXQyxPQUFPQyxRQUFVLFNBQWtCQyxHQUMxQyxJQUFLLElBQUlDLEVBQUdDLEVBQUksRUFBR0MsRUFBSUMsVUFBVUMsT0FBUUgsRUFBSUMsRUFBR0QsSUFFNUMsSUFBSyxJQUFJSSxLQURUTCxFQUFJRyxVQUFVRixHQUNPSixPQUFPUyxVQUFVQyxlQUFlQyxLQUFLUixFQUFHSyxLQUFJTixFQUFFTSxHQUFLTCxFQUFFSyxJQUU5RSxPQUFPTixDQUNYLEVBQ09ILEdBQVNhLE1BQU1DLEtBQU1QLFVBQ2hDLEVBMEVPLFNBQVNRLEdBQVVDLEVBQVNDLEVBQVlDLEVBQUdDLEdBRTlDLE9BQU8sSUFBS0QsSUFBTUEsRUFBSUUsVUFBVSxTQUFVQyxFQUFTQyxHQUMvQyxTQUFTQyxFQUFVQyxHQUFTLElBQU1DLEVBQUtOLEVBQVVPLEtBQUtGLEdBQVMsQ0FBRSxNQUFPRyxHQUFLTCxFQUFPSyxFQUFJLENBQUUsQ0FDMUYsU0FBU0MsRUFBU0osR0FBUyxJQUFNQyxFQUFLTixFQUFpQixNQUFFSyxHQUFTLENBQUUsTUFBT0csR0FBS0wsRUFBT0ssRUFBSSxDQUFFLENBQzdGLFNBQVNGLEVBQUtJLEdBSmxCLElBQWVMLEVBSWFLLEVBQU9DLEtBQU9ULEVBQVFRLEVBQU9MLFFBSjFDQSxFQUl5REssRUFBT0wsTUFKaERBLGFBQWlCTixFQUFJTSxFQUFRLElBQUlOLEVBQUUsU0FBVUcsR0FBV0EsRUFBUUcsRUFBUSxJQUlqQk8sS0FBS1IsRUFBV0ssRUFBVyxDQUM3R0gsR0FBTU4sRUFBWUEsRUFBVU4sTUFBTUcsRUFBU0MsR0FBYyxLQUFLUyxPQUNsRSxFQUNKLENBRU8sU0FBU00sR0FBWWhCLEVB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QUNsRWd4QixFQUFlM04sRUFBVXJqQixPQUd6QjJ2QixFQUFTLHFDQUVKLENBQUMsRUFBYSxHQUN2QixLQUFLLEVBSUgsT0FIQUssRUFBUWo3QixFQUFHOUYsT0FFWDBnQyxFQUFTSyxFQUFNNS9CLFNBQVcsZ0NBQ25CLENBQUMsRUFBYSxHQUN2QixLQUFLLEVBRUgsT0FEQTZnQyxHQUFhLEdBQ04sQ0FBQyxHQUNWLEtBQUssRUFDSCxNQUFPLENBQUMsR0FFZCxFQUNGLEVBekNGLE1BRkVBLEdBQWEsRUE4Q2pCLEVBQUcsQ0FBQ0UsRUFBd0JDLElBRXZCRCxHQUEyQkMsRUFNNUJqeEIsR0FBYW5LLElBQVUycEIsRUFDbEI5bkIsRUFBSzRLLEVBQVcsQ0FDckJyTCxTQUFVQSxJQUlQRyxFQUFNMnVCLEdBQWdCLENBQzNCdkcsWUFBYUEsRUFDYkMsWUFBYUEsRUFDYkMsaUJBQWlCLEVBQ2pCem9CLFNBQVUsQ0FBQ0EsRUFBVVMsRUFBS2d6QixHQUFhLENBQ3JDbEgsV0FBWUEsRUFDWm1ILGFBQWNBLEVBQ2RDLGVBQWdCQSxFQUNoQkMsa0JBQW1CcUcsT0FuQmR4NUIsRUFBSzRLLEVBQVcsQ0FDckJyTCxTQUFVQSxHQXFCaEIiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCw5LDEwLDExLDEyLDE1LDE2LDE3LDE4XX0=
|