@sidekick-coder/zenith-kit 0.1.0 → 0.3.1

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.
@@ -1,2 +1,2 @@
1
- import{toast as e}from"vue-sonner";import t from"qs";import{get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import{defineAbility as s,subject as c}from"@casl/ability";import{createMemoryHistory as l,createRouter as u,createWebHistory as d}from"vue-router";async function f(e){try{return[null,await e()]}catch(e){return[e,null]}}f.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var p=class{static __container_entry_key=`FetchService`;async handleError(t){if(!(t.headers.get(`Content-Type`)||``).includes(`application/json`)){e.error($t(`Internal Server Error`));return}if(t.headers.get(`Content-Type`)?.includes(`json`)){let n=await t.json().catch(()=>({message:$t(`Internal Server Error`)}));n.message&&e.error(n.message)}}buildUrl(e,n){if(!n)return e;let r=t.stringify(n,{arrayFormat:`brackets`});return e+`?`+r}buildRequestInit(e){let t={...e};return e.data&&(t.body=JSON.stringify(e.data),t.headers={...t.headers,"Content-Type":`application/json`}),t}async parseResponse(e){return e.headers.get(`Content-Type`)?.includes(`json`)?e.json():e.text()}async fetch(e,t={}){throw Error(`Method not implemented`)}async try(e,t={}){return f(()=>this.fetch(e,t))}async get(e,t={}){return this.fetch(e,{...t,method:`GET`})}async post(e,t={}){return this.fetch(e,{...t,method:`POST`})}async put(e,t={}){return this.fetch(e,{...t,method:`PUT`})}async delete(e,t={}){return this.fetch(e,{...t,method:`DELETE`})}},m=class e extends Error{statusCode=500;constructor(e,t=500){super(e),this.name=this.constructor.name,this.statusCode=t}static fromError(t){return new e(t.message,500)}},h=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new m(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const g=globalThis.clientContainer||new h;globalThis.clientContainer=g;const _=g.proxy(p);function v(...e){return e.reduce((e,t)=>t(e),class{})}function y(e,...t){return t.reduce((e,t)=>t(e),e)}function b(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function x(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}function S(e){return class extends e{created_at;updated_at}}function C(e){return class extends e{deleted_at=null}}v(x,S,C);var w=class{static __container_entry_key=`AuthService`;user;constructor(e={}){this.user=e.user||null}async logout(e){let[t]=await _.try(`/auth/logout`,{method:`POST`});t||(window.location.href=e?.redirect||`/`)}},T=class extends p{async fetch(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}},ee=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}};function E(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;if(i&&typeof i==`object`){E(i,e,n);continue}n[e]=i}return n}function te(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function ne(e=``){return e+te()}var re=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:n(o,e.substring(i.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),a(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return E(this.toRecord())}};const D=g.proxy(re);import.meta.env.DEV&&(globalThis.config=D);function O(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function k(e){let n={},r=e.split(`?`)[1];return r?t.parse(r):n}var A=class extends p{async fetch(e,t={}){return!e.startsWith(`http://`)&&!e.startsWith(`https://`)?this.fetchInternal(e,t):this.fetchExternal(e,t)}async fetchExternal(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}async fetchInternal(e,t={}){let n=g.get(`RouterService`),r=t.method||`GET`,i=n.resolve(r,e),a=new ee({prefix:D.get(`cookie.prefix`,``)});if(g.has(`cookies`)&&a.load(g.get(`cookies`)),!i||!i.handler)throw Error(`Route not found for ${r} ${e}`);return await n.execute(i,{url:e,params:O(i.path,e),query:t.query||k(e),body:t.data||t.body,method:r.toLowerCase(),cookie:a})}},j=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},M=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},N=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new M,e.onError&&(this.onError=e.onError)}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=i(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await f(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},P=class extends N{addImports(e){let t=[];for(let[n,r]of Object.entries(e)){let e=new(r.default||r);e.hook_id=e.hook_id||n,t.push(e)}t.forEach(e=>this.add(e))}},F=class extends v(x){id;label;layout;to;target;group;order;icon;parent},I=class extends v(x){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=f.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},L=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>I.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new M().child({label:`acl`}),this.ability=s(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=c(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=c(t,n);return this.ability.cannot(e,r)}subject(e,t){return c(e,t)}};const R=g.proxy(L);var z=class{static __container_entry_key=`MenuService`;items=new Map;add(...e){for(let t of e)t.id||=JSON.stringify(t),this.items.set(t.id,F.from(t))}remove(e){this.items.delete(e)}list(e={}){let t=JSON.parse(JSON.stringify(Array.from(this.items.values())));return e.layout&&(t=t.filter(t=>t.layout===e.layout)),e.group&&(t=t.filter(t=>t.group===e.group||t.parent===e.group)),e.parent&&(t=t.filter(t=>t.parent===e.parent)),e.allowed!==void 0&&e.allowed===!0&&(t=t.filter(e=>R.can(`view`,e))),t.sort((e,t)=>(e.order?e.order:98)-(t.order?t.order:98)),t}clear(){this.items.clear()}};const B=e=>{let t=D.get(`setup`),n=!t?.need_database&&!t?.need_users;return n&&e.path.startsWith(`/setup`)?`/`:n?!0:e.path.startsWith(`/setup`)?e.path===`/setup`?!0:t?.need_database?e.path===`/setup/database`?!0:`/setup/database`:t?.need_users?e.path===`/setup/user`?!0:`/setup/user`:!0:`/setup`};function V(e,t={}){let n=[];for(let[r,i]of Object.entries(e)){if(t.exclude?.some(e=>typeof e==`string`?r.includes(e):e.test(r)))continue;let e=r.replace(/\.vue$/,``).split(`/`).filter(e=>e&&!e.startsWith(`.`)).map(e=>{let t=e;return t.startsWith(`[`)&&t.endsWith(`]`)&&(t=`:`+t.slice(1,-1)),t});t.strip?.length&&(e=e.filter(e=>!t.strip.some(t=>typeof t==`string`?e===t:t.test(e))));let a=e.join(`/`).replace(/index$/,``);t.prefix&&(a=t.prefix+`/`+a),a.startsWith(`/`)||(a=`/`+a),a.endsWith(`/`)&&(a=a.slice(0,-1));let o={path:a,component:i,beforeEnter:[]};t.guards&&Array.isArray(t.guards)&&(o.beforeEnter=t.guards),t.guards&&typeof t.guards==`function`&&(o.beforeEnter=t.guards(o)),n.push(o)}return t.refine&&(n=t.refine(n)),n}function H(){let e=import.meta.env.SSR,t=u({history:e?l():d(),routes:[],scrollBehavior(e,t,n){return n||{top:0}}});return t.beforeEach(B),t.auto=(e,n={})=>{let r=V(e,n);return r.forEach(e=>t.addRoute(e)),r},t}var U=class{static __container_entry_key=`ToastService`;success(e,t){console.log(`Success:`,e,t)}error(e,t){console.error(`Error:`,e,t)}};const W=g.proxy(w);import.meta.env.DEV&&!import.meta.env.SSR&&(window.auth=W);const G=g.proxy(M),K=g.proxy(z),q=g.proxy(`route`),J=g.proxy(`router`),Y=g.proxy(U);var X=class extends v(x,b(j)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}},ie=class extends y(X){},ae=class extends v(x){id;name;version;enabled;aliases;version_channel;version_available_channels},oe=class extends y(ae){addPagesFolder(e,t){J.auto(e,t)}async load(){}};function se(e,t={}){return V(e,t)}const Z=_;function ce(e){return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e.accept||`*/*`,n.multiple=e.multiple||!1,n.onchange=n=>{let r=n.target,i=Array.from(r.files);t(e.multiple?Array.from(i):i[0])},n.oncancel=()=>{t(e.multiple?[]:null)},n.click()})}function le(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{e.target?.result instanceof ArrayBuffer?t(new Uint8Array(e.target.result)):n(Error(`Failed to read file as ArrayBuffer`))},r.onerror=()=>{n(r.error)},r.readAsArrayBuffer(e)})}async function ue(e){let t=new FormData;return t.append(`file`,e.file),e.directory&&t.append(`directory`,e.directory),Z(`/api/drives/${e.driveId}/upload`,{method:`POST`,body:t,query:{directory:e.directory}})}const de={pick:ce,upload:ue,toUint8Array:le},fe=e;function Q(e){let t=e.exclude||[`/auth/login`,`/auth/register`];return n=>{if(!W.user&&!t.includes(n.path))return e.redirect}}const pe=Q({redirect:`/auth/login`});function $(e){return()=>{if(W.user)return e.redirect}}const me=$({redirect:`/`});export{Z as $fetch,de as $file,fe as $toast,w as AuthService,T as FetchBrowserService,A as FetchNodeService,p as FetchService,P as LifecycleService,F as MenuItemEntity,z as MenuService,ie as ModuleEntity,oe as PluginEntity,U as ToastService,R as acl,W as auth,pe as authGuard,V as auto,se as autoRoutes,D as config,g as container,Q as createAuthGuard,$ as createGuestGuard,ne as createId,H as createRouter,_ as fetcher,me as guestGuard,G as logger,K as menu,q as route,J as router,B as setupGuard,Y as toast};
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiJGZldGNoIiwiQ29ra2llTWFwRW50aXR5IiwiTGlmZWN5Y2xlU2VydmljZSIsIkJhc2VMaWZlY3ljbGVTZXJ2aWNlIiwiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiY3JlYXRlVnVlUm91dGVyIiwiTW9kdWxlIiwiQmFzZSIsIlBsdWdpbkVudGl0eSIsIkJhc2UiLCIkb3JpZ2luYWwiLCJ0b2FzdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jb21wb3NlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0F1dGhTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GZXRjaEJyb3dzZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2ZsYXR0ZW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2NvbmZpZy50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvcGFyc2VSb3V0ZVVybC50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvRmV0Y2hOb2RlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvTWVudUl0ZW1FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9hY2wudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL01lbnVTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvc2V0dXBHdWFyZC50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvVG9hc3RTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2F1dGgudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvbG9nZ2VyLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL21lbnUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvcm91dGUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvcm91dGVyLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3RvYXN0LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2F1dG9QYWdlcy50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZmV0Y2hlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZmlsZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvdG9hc3QudHMiLCIuLi8uLi9zcmMvY2xpZW50L2d1YXJkcy9hdXRoR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2d1YXJkcy9ndWVzdEd1YXJkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImludGVyZmFjZSBUcnllciB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogYW55XG59XG5cbmludGVyZmFjZSBUcnllckFzeW5jIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4gfCBhbnlcbn1cblxudHlwZSBUcnlDYXRjaFJlc3VsdDxUIGV4dGVuZHMgVHJ5ZXI+ID0gW251bGwsIFJldHVyblR5cGU8VD5dIHwgW0Vycm9yLCBudWxsXVxuXG50eXBlIFRyeUNhdGNoQXN5bmNSZXN1bHQ8VCBleHRlbmRzIFRyeWVyQXN5bmM+ID0gW251bGwsIEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj5dIHwgW0Vycm9yLCBudWxsXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCBleHRlbmRzIFRyeWVyQXN5bmM+KHRyeWVyOiBUKTogUHJvbWlzZTxUcnlDYXRjaEFzeW5jUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG5cbnRyeUNhdGNoLnN5bmMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIFRyeWVyPih0cnllcjogVCk6IFRyeUNhdGNoUmVzdWx0PFQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cbiIsImltcG9ydCB7IHRvYXN0IH0gZnJvbSAndnVlLXNvbm5lcidcbmltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGludGVyZmFjZSBGZXRjaE9wdGlvbnMgZXh0ZW5kcyBSZXF1ZXN0SW5pdCB7XG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdGZXRjaFNlcnZpY2UnXG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRXJyb3IocmVzcG9uc2U6IFJlc3BvbnNlKSB7ICAgIFxuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSB8fCAnJ1xuXG4gICAgICAgIGlmICghY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgICAgICAgdG9hc3QuZXJyb3IoJHQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnanNvbicpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+ICh7IG1lc3NhZ2U6ICR0KCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKSB9KSlcblxuICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRvYXN0LmVycm9yKGRhdGEubWVzc2FnZSlcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYnVpbGRVcmwodXJsOiBzdHJpbmcsIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55Pik6IHN0cmluZyB7XG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcXMuc3RyaW5naWZ5KHF1ZXJ5LCB7IGFycmF5Rm9ybWF0OiAnYnJhY2tldHMnIH0pXG5cbiAgICAgICAgcmV0dXJuIHVybCArICc/JyArIHF1ZXJ5U3RyaW5nXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkUmVxdWVzdEluaXQob3B0aW9uczogRmV0Y2hPcHRpb25zKTogUmVxdWVzdEluaXQge1xuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0geyAuLi5vcHRpb25zIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5kYXRhKSB7XG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSlcbiAgICAgICAgICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgIC4uLmZldGNoT3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmV0Y2hPcHRpb25zXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LmluY2x1ZGVzKCdqc29uJykpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxUPlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKSBhcyBQcm9taXNlPFQ+XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KF91cmw6IHN0cmluZywgX29wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRyeTxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyeUNhdGNoKCgpID0+IHRoaXMuZmV0Y2g8VD4odXJsLCBvcHRpb25zKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBwb3N0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcHV0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGU8VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoPFQ+KHVybCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzQ29kZTogbnVtYmVyID0gNTAwXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXNDb2RlOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21FcnJvcihlcnJvcjogRXJyb3IpOiBCYXNlRXhjZXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIDUwMClcbiAgICB9XG59IiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBUaGUgY29uc3RydWN0b3IgJHtwYXlsb2FkLm5hbWV9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllci4gQ29uc2lkZXIgYWRkaW5nIGEgc3RhdGljIHByb3BlcnR5IF9fY29udGFpbmVyX2VudHJ5X2tleSB0byBhdm9pZCBwb3RlbnRpYWwgY29uZmxpY3RzLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAga2V5ID0gKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocGF5bG9hZDogRW50cnlLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgdmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBheWxvYWQ6IEVudHJ5S2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocGF5bG9hZDogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEVudHJ5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQgaW4gY29udGFpbmVyLmApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyBzaW5nbGV0b248VD4oY2xhc3NDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4pOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2xhc3NDb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXNzQ29uc3RydWN0b3IoKVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgbmV3SW5zdGFuY2UpXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZW50cmllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eTxUID0gdW5rbm93bj4oa2V5OiBFbnRyeUtleSk6IFQge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50cnlbcHJvcF1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZW50cnkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5W3Byb3BdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiAoX3RhcmdldCwgcHJvcCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBlbnRyeVtwcm9wXSA9IHZhbHVlXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGtleXMoKTogRW50cnlLZXlbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5rZXlzKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbnRhaW5lclNlcnZpY2UgZnJvbSBcIiNzaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50c1wiO1xuXG5jb25zdCBjb250YWluZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNsaWVudENvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG5cbmdsb2JhbFRoaXMuY2xpZW50Q29udGFpbmVyID0gY29udGFpbmVyXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRhaW5lciBhcyBDb250YWluZXJTZXJ2aWNlXG4iLCJpbXBvcnQgRmV0Y2hTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgZmV0Y2hlciA9IGNvbnRhaW5lci5wcm94eTxGZXRjaFNlcnZpY2U+KEZldGNoU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgZmV0Y2hlclxuIiwiaW1wb3J0IHR5cGUgeyBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi90eXBpbmcudHMnXG5cbmV4cG9ydCB0eXBlIEFueUNsYXNzID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+XG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgbWl4aW5zIGludG8gYSBzaW5nbGUgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQuXG4gKiBBbGxvd3MgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLWxpa2UgYmVoYXZpb3IgYnkgYXBwbHlpbmcgbWl4aW5zIHNlcXVlbnRpYWxseS5cbiAqIFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgaW5jbHVkZXMgYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2U8XG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3Rvcjxhbnk+KSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGNsYXNzIHt9IGFzIGFueSkgYXMgYW55XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgY29tcG9zZSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYmFzZSBjbGFzc1xuICogXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2VFbnRpdHksIFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VXaXRoPFxuICAgIFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3IsXG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oXG4gICAgYmFzZUNsYXNzOiBUQmFzZSxcbiAgICAuLi5taXhpbnM6IE1cbik6IFRCYXNlICYgVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBiYXNlQ2xhc3MgYXMgYW55KSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KFNvdXJjZTogVEJhc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSB7XG4gICAgICAgIGNsYXNzIE1peGVkIGV4dGVuZHMgVGFyZ2V0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IG1ldGhvZHNcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKFNvdXJjZS5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBNaXhlZC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTb3VyY2UucHJvdG90eXBlLCBrZXkpIVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNaXhlZCBhcyBUVGFyZ2V0ICYgVEJhc2VcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5pbnRlcmZhY2UgQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMge1xuICAgIHBhcnNlPzogKGRhdGE6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYXNlRW50aXR5KG9wdGlvbnM6IENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gb3B0aW9ucy5wYXJzZShkYXRhKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAoY29udHJ1Y3RvciBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMgYXMgYW55KT8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKHRoaXMgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRpbWVzdGFtcE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgY3JlYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgICAgICBwdWJsaWMgdXBkYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNvZnREZWxldGVNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGRlbGV0ZWRfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgUm9sZSBmcm9tICcuL1JvbGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGVtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHVzZXJuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbFxuXG4gICAgcHVibGljIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdXG4gICAgcHVibGljIHJvbGVzPzogUm9sZVtdXG5cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxzKCl7XG4gICAgICAgIGNvbnN0IFtmaXJzdE5hbWUsIHNlY29uZE5hbWVdID0gdGhpcy5uYW1lLnNwbGl0KCcgJylcblxuICAgICAgICBpZiAoIXNlY29uZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIGNvbnN0IGIgPSBzZWNvbmROYW1lWzBdLnRvVXBwZXJDYXNlKClcblxuICAgICAgICByZXR1cm4gYSArIGJcbiAgICB9XG59XG4iLCJpbXBvcnQgJGZldGNoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzJ1xuaW1wb3J0IFVzZXIgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzJ1xuXG5pbnRlcmZhY2UgTG9nb3V0T3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0F1dGhTZXJ2aWNlJ1xuICAgIHB1YmxpYyB1c2VyOiBVc2VyIHwgbnVsbFxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBdXRoU2VydmljZT4gPSB7fSkge1xuICAgICAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXIgfHwgbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2dvdXQob3B0aW9ucz86IExvZ291dE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0ICRmZXRjaC50cnkoJy9hdXRoL2xvZ291dCcsIHsgbWV0aG9kOiAnUE9TVCcgfSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBvcHRpb25zPy5yZWRpcmVjdCB8fCAnLydcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEZldGNoT3B0aW9ucyB9IGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hCcm93c2VyU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDb29raWVNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBjb29raWVzPzogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHByZWZpeD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0Nvb2tpZU1hcEVudGl0eSdcblxuICAgIHB1YmxpYyBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHByZWZpeDogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogQ29va2llTWFwRW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvb2tpZXMgPSBkYXRhPy5jb29raWVzIHx8IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5wcmVmaXggPSBkYXRhPy5wcmVmaXggfHwgJydcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgTWFwPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBpZiAoY29va2llcyBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvb2tpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGNvb2tpZXNba2V5XSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQoZnVsbE5hbWUpIHx8IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBXZSB3YW50IHRvIGFsbG93IGFueSBvcHRpb25zIHRvIGJlIHBhc3NlZCBoZXJlLCBhcyB0aGV5IG1heSBiZSB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIGNvb2tpZVxuICAgIC8vICBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICB0aGlzLmNvb2tpZXMuc2V0KGZ1bGxOYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5jb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHRoaXMucHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRLZXkgPSBrZXkuc2xpY2UodGhpcy5wcmVmaXgubGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0W3VucHJlZml4ZWRLZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iajogYW55LCBwcmVmaXggPSAnJywgcmVzOiBhbnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgaXNJbmRleCA9IC9eXFxkKyQvLnRlc3Qoa2V5KVxuICAgICAgICBjb25zdCBuZXdLZXkgPSBpc0luZGV4ID8gYCR7cHJlZml4fVske2tleX1dYCA6IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBuZXdLZXksIHJlcylcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXNbbmV3S2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKG9iajogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIHNldChyZXN1bHQsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbn1cbiIsImZ1bmN0aW9uIHV1aWQoKXtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0byAmJiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBjcnlwdG8ucmFuZG9tVVVJRFxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDBcbiAgICAgICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDhcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlkKHByZWZpeCA9ICcnKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHV1aWQoKVxufSIsImltcG9ydCB7IGdldCwgc2V0LCBoYXMsIHVuc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uL3V0aWxzJ1xuXG5pbnRlcmZhY2UgRW50cnkge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NvbmZpZ1NlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRW50cnk+XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJzpib29sZWFuJykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCc6Ym9vbGVhbicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Piwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRba2V5XSA9IGVudHJ5LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXModmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZSBhcyBUXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyBlbnRyeS52YWx1ZSA6IGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0KHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIGRlZmF1bHRWYWx1ZSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9uZTxUID0gYW55IHwgdW5kZWZpbmVkPihrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0PFQ+KGtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzb3VyY2UgPSAncnVudGltZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGxldCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICBwcmltYXJ5VmFsdWUgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCB2YWx1ZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICghcHJpbWFyeVZhbHVlKSByZXR1cm5cblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHVuc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKVxuICAgIH1cblxuICAgIHB1YmxpYyBkdW1wKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLnRvUmVjb3JkKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgY29uZmlnID0gY29udGFpbmVyLnByb3h5PENvbmZpZ1NlcnZpY2U+KENvbmZpZ1NlcnZpY2UpXG5cbmlmIChpbXBvcnQubWV0YS5lbnYuREVWKSB7XG4gICAgZ2xvYmFsVGhpcy5jb25maWcgPSBjb25maWdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29uZmlnXG4iLCJpbXBvcnQgcXMgZnJvbSAncXMnIFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxQYXJhbXMocm91dGVQYXRoOiBzdHJpbmcsIHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgY29uc3Qgcm91dGVTZWdtZW50cyA9IHJvdXRlUGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50cyA9IHJlcXVlc3RQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRlU2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gcm91dGVTZWdtZW50c1tpXVxuICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudCA9IHJlcXVlc3RTZWdtZW50c1tpXVxuXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQuc3RhcnRzV2l0aCgnOicpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByb3V0ZVNlZ21lbnQuc2xpY2UoMSkgLy8gUmVtb3ZlIHRoZSAnOicgcHJlZml4XG4gICAgICAgICAgICBwYXJhbXNbcGFyYW1OYW1lXSA9IHJlcXVlc3RTZWdtZW50XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgIC8vIENhcHR1cmUgYWxsIHJlbWFpbmluZyBzZWdtZW50cyBhcyBhIHNpbmdsZSBwYXRoXG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmdTZWdtZW50cyA9IHJlcXVlc3RTZWdtZW50cy5zbGljZShpKVxuICAgICAgICAgICAgcGFyYW1zWycqJ10gPSByZW1haW5pbmdTZWdtZW50cy5qb2luKCcvJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybFF1ZXJ5KHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSByZXF1ZXN0UGF0aC5zcGxpdCgnPycpWzFdXG5cbiAgICBpZiAoIXF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBxdWVyeVxuICAgIH1cblxuICAgIHJldHVybiBxcy5wYXJzZShxdWVyeVN0cmluZylcbn1cbiIsImltcG9ydCB0eXBlIHsgRmV0Y2hPcHRpb25zIH0gZnJvbSAnLi9GZXRjaFNlcnZpY2UudHMnXG5pbXBvcnQgRmV0Y2hTZXJ2aWNlIGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IENva2tpZU1hcEVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0Nvb2tpZU1hcEVudGl0eS50cydcbmltcG9ydCBjb25maWcgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbmZpZy50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCB7IHBhcnNlVXJsUGFyYW1zLCBwYXJzZVVybFF1ZXJ5IH0gZnJvbSAnI3NoYXJlZC91dGlscy9wYXJzZVJvdXRlVXJsLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGZXRjaE5vZGVTZXJ2aWNlIGV4dGVuZHMgRmV0Y2hTZXJ2aWNlIHtcbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2g8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IGlzSW50ZXJuYWwgPSAhdXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSAmJiAhdXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJylcblxuICAgICAgICBpZiAoIWlzSW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZldGNoRXh0ZXJuYWw8VD4odXJsLCBvcHRpb25zKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hJbnRlcm5hbDxUPih1cmwsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGZldGNoRXh0ZXJuYWw8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IGZ1bGxVcmwgPSB0aGlzLmJ1aWxkVXJsKHVybCwgb3B0aW9ucy5xdWVyeSlcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRpb25zID0gdGhpcy5idWlsZFJlcXVlc3RJbml0KG9wdGlvbnMpXG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChmdWxsVXJsLCBmZXRjaE9wdGlvbnMpXG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFcnJvcihyZXNwb25zZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VSZXNwb25zZTxUPihyZXNwb25zZSlcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZmV0Y2hJbnRlcm5hbDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3Qgcm91dGVyID0gIGNvbnRhaW5lci5nZXQ8YW55PignUm91dGVyU2VydmljZScpXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8ICdHRVQnXG4gICAgICAgIGNvbnN0IHJvdXRlID0gcm91dGVyLnJlc29sdmUobWV0aG9kLCB1cmwpXG4gICAgICAgIGNvbnN0IGNvb2tpZSA9IG5ldyBDb2traWVNYXBFbnRpdHkoe1xuICAgICAgICAgICAgcHJlZml4OiBjb25maWcuZ2V0KCdjb29raWUucHJlZml4JywgJycpXG4gICAgICAgIH0pXG4gICAgICAgIFxuICAgICAgICBpZiAoY29udGFpbmVyLmhhcygnY29va2llcycpKSB7XG4gICAgICAgICAgICBjb29raWUubG9hZChjb250YWluZXIuZ2V0PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCdjb29raWVzJykpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJvdXRlIHx8ICFyb3V0ZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRlIG5vdCBmb3VuZCBmb3IgJHttZXRob2R9ICR7dXJsfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByb3V0ZXIuZXhlY3V0ZShyb3V0ZSwge1xuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBwYXJhbXM6IHBhcnNlVXJsUGFyYW1zKHJvdXRlLnBhdGgsIHVybCksXG4gICAgICAgICAgICBxdWVyeTogb3B0aW9ucy5xdWVyeSB8fCBwYXJzZVVybFF1ZXJ5KHVybCksXG4gICAgICAgICAgICBib2R5OiBvcHRpb25zLmRhdGEgfHwgb3B0aW9ucy5ib2R5LFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIGNvb2tpZTogY29va2llXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBQcm9taXNlPFQ+XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlSG9vayB7XG4gICAgcHVibGljIGhvb2tfaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBob29rX2FsaWFzZXM/OiBzdHJpbmdbXVxuICAgIHB1YmxpYyBvcmRlcj86IG51bWJlclxuICAgIHB1YmxpYyBzdWJob29rcz86IExpZmVjeWNsZUhvb2tbXVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgYm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSByZWdpc3RlciAqL1xuICAgIHB1YmxpYyBhc3luYyBvblJlZ2lzdGVyKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBsb2FkICovXG4gICAgcHVibGljIGFzeW5jIG9uTG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgYm9vdCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHNodXRkb3duICovXG4gICAgcHVibGljIGFzeW5jIG9uU2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ2dlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xvZ2dlclNlcnZpY2UnIFxuXG4gICAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvciwgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuXG4gICAgcHVibGljIGNoaWxkKG9wdGlvbnM6IGFueSk6IExvZ2dlclNlcnZpY2Uge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgfVxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbnR5cGUgTGlmZWN5Y2xlTWV0aG9kID0gJ3JlZ2lzdGVyJyB8ICdsb2FkJyB8ICdib290JyB8ICdzaHV0ZG93bidcblxuaW50ZXJmYWNlIExpc3RPcHRpb25zIHtcbiAgICBpbmNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBleGNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgaG9va3M/OiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMaWZlY3ljbGVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhvb2tzOiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuaG9va3MgPSBkYXRhLmhvb2tzID8/IG5ldyBNYXAoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgXG4gICAgICAgIGlmIChkYXRhLm9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvciA9IGRhdGEub25FcnJvclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uRXJyb3IoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY29udGV4dCB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBob29rICR7Y29udGV4dC5tZXRob2R9ICgke2NvbnRleHQuaG9va0lkfSk6YCwgZXJyb3IpXG4gICAgfVxuXG4gICAgcHVibGljIG1hcEFsaWFzZXMoYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IGFsbCA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYWxsKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLmhvb2tfYWxpYXNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRBbGlhcyA9IGhvb2suaG9va19hbGlhc2VzLmZpbmQoYWxpYXMgPT4gYXJncy5pbmNsdWRlcyhhbGlhcykpXG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Qob3B0aW9ucz86IExpc3RPcHRpb25zKSB7XG4gICAgICAgIGxldCBob29rcyA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhjbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5leGNsdWRlKSA/IG9wdGlvbnMuZXhjbHVkZSA6IFtvcHRpb25zLmV4Y2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gIWlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZSkgPyBvcHRpb25zLmluY2x1ZGUgOiBbb3B0aW9ucy5pbmNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+IGlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MgPSBvcmRlckJ5KGhvb2tzLCBbJ29yZGVyJ10sIFsnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGhvb2tzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCguLi5wYXlsb2FkOiAoTGlmZWN5Y2xlSG9vayB8IENvbnN0cnVjdG9yPExpZmVjeWNsZUhvb2s+KVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF5bG9hZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2gobmV3IGl0ZW0oKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZXMucHVzaChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGluc3RhbmNlcykge1xuICAgICAgICAgICAgaWYgKCFob29rLmhvb2tfaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdTa2lwcGluZyBob29rIHdpdGhvdXQgaG9va19pZDonLCBob29rKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaG9va3Muc2V0KGhvb2suaG9va19pZCwgaG9vaylcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWRkICcgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLnN1Ymhvb2tzKSB7XG4gICAgICAgICAgICAgICAgaG9vay5zdWJob29rcy5mb3JFYWNoKHN1Ymhvb2sgPT4gdGhpcy5hZGQoc3ViaG9vaykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdE1ldGhvZChtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5saXN0KG9wdGlvbnMpIFxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgZW1pdHRpbmcgJHttZXRob2R9IGZvciBob29rczpgLCB7XG4gICAgICAgICAgICAgICAgaG9va3M6IGhvb2tzLm1hcChob29rID0+IGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5saXN0KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXI6ICgpID0+IFByb21pc2UuYWxsKFtob29rLnJlZ2lzdGVyKCksIGhvb2sub25SZWdpc3RlcigpXSksXG4gICAgICAgICAgICAgICAgbG9hZDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2subG9hZCgpLCBob29rLm9uTG9hZCgpXSksXG4gICAgICAgICAgICAgICAgYm9vdDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suYm9vdCgpLCBob29rLm9uQm9vdCgpXSksXG4gICAgICAgICAgICAgICAgc2h1dGRvd246ICgpID0+IFByb21pc2UuYWxsKFtob29rLnNodXRkb3duKCksIGhvb2sub25TaHV0ZG93bigpXSksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBtYXBbbWV0aG9kXSgpKVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IsIHsgaG9va0lkOiBob29rLmhvb2tfaWQsIG1ldGhvZCB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7bWV0aG9kfSBgICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQocGF5bG9hZDogTGlmZWN5Y2xlTWV0aG9kIHwgTGlmZWN5Y2xlTWV0aG9kW10sIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtZXRob2RzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRNZXRob2QobWV0aG9kLCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdyZWdpc3RlcicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2xvYWQnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBib290KG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdib290Jywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2h1dGRvd24nLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob29rcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJztcbmltcG9ydCBCYXNlTGlmZWN5Y2xlU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZUxpZmVjeWNsZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBhZGRJbXBvcnRzKGltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4pe1xuICAgICAgICBjb25zdCBob29rczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBtb2RdIG9mIE9iamVjdC5lbnRyaWVzKGltcG9ydHMpKSB7XG4gICAgICAgICAgICBjb25zdCBIb29rQ2xhc3MgPSBtb2QuZGVmYXVsdCB8fCBtb2RcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEhvb2tDbGFzcygpIGFzIExpZmVjeWNsZUhvb2tcblxuICAgICAgICAgICAgaW5zdGFuY2UuaG9va19pZCA9IGluc3RhbmNlLmhvb2tfaWQgfHwgbmFtZVxuXG4gICAgICAgICAgICBob29rcy5wdXNoKGluc3RhbmNlKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MuZm9yRWFjaChob29rID0+IHRoaXMuYWRkKGhvb2spKVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lbnVJdGVtIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbGFiZWw6IHN0cmluZ1xuICAgIHB1YmxpYyBsYXlvdXQ6IHN0cmluZ1xuXG4gICAgcHVibGljIHRvPzogc3RyaW5nXG5cbiAgICBwdWJsaWMgdGFyZ2V0PzogJ19ibGFuaycgfCAnX3NlbGYnIHwgJ19wYXJlbnQnIHwgJ190b3AnXG4gICAgcHVibGljIGdyb3VwPzogc3RyaW5nXG4gICAgcHVibGljIG9yZGVyPzogbnVtYmVyXG4gICAgcHVibGljIGljb24/OiBzdHJpbmdcbiAgICBwdWJsaWMgcGFyZW50Pzogc3RyaW5nXG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJtaXNzaW9uRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBvcmlnaW46IHN0cmluZ1xuICAgIHB1YmxpYyBzdWJqZWN0OiBzdHJpbmdcbiAgICBwdWJsaWMgYWN0aW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgY29uZGl0aW9uczogc3RyaW5nIHwgbnVsbCB8IFJlY29yZDxzdHJpbmcsIGFueT4gPSBudWxsXG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gPT09ICdjdXN0b20nXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJzZWRDb25kaXRpb25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbZXJyb3IsIGpzb25dID0gdHJ5Q2F0Y2guc3luYygoKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZGl0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmNvbmRpdGlvbnMgYXMgc3RyaW5nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25zIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gZXJyb3IgPyB7fSA6IGpzb25cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVBYmlsaXR5LCBzdWJqZWN0IGFzIGNyZWF0ZVN1YmplY3QgfSBmcm9tICdAY2FzbC9hYmlsaXR5J1xuaW1wb3J0IFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2xFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0FjbEVudGl0eSdcblxuICAgIHB1YmxpYyBhYmlsaXR5OiBSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVBYmlsaXR5PlxuICAgIHB1YmxpYyBwZXJtaXNzaW9uczogUGVybWlzc2lvbltdXG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPEFjbEVudGl0eT4gPSB7fSkge1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGRhdGEucGVybWlzc2lvbnMgfHwgW11cbiAgICAgICAgY29uc3QgcGVybXMgPSBwZXJtaXNzaW9ucy5tYXAoKHBlcm1pc3Npb24pID0+IFBlcm1pc3Npb24uZnJvbShwZXJtaXNzaW9uKSlcblxuICAgICAgICBcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1zXG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKS5jaGlsZCh7IGxhYmVsOiAnYWNsJyB9KVxuICAgICAgICBcbiAgICAgICAgdGhpcy5hYmlsaXR5ID0gZGVmaW5lQWJpbGl0eSgoY2FuKSA9PiB7XG4gICAgICAgICAgICBwZXJtcy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FuKHBlcm1pc3Npb24uYWN0aW9uLCBwZXJtaXNzaW9uLnN1YmplY3QsIHBlcm1pc3Npb24ucGFyc2VkQ29uZGl0aW9ucylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJywge1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiB0aGlzLnBlcm1pc3Npb25zLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW4oYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuXG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3QpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJqZWN0V2l0aE9iamVjdCA9IGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdFdpdGhPYmplY3QpXG4gICAgfVxuXG4gICAgcHVibGljIGNhbm5vdChhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3QpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJqZWN0V2l0aE9iamVjdCA9IGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdFdpdGhPYmplY3QpXG4gICAgfVxuXG4gICAgcHVibGljIHN1YmplY3Qoc3ViamVjdDogc3RyaW5nLCBvYmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuICAgIH1cbn1cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCBBY2xFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMnXG5cbmNvbnN0IGFjbCA9IGNvbnRhaW5lci5wcm94eTxBY2xFbnRpdHk+KEFjbEVudGl0eSlcblxuZXhwb3J0IGRlZmF1bHQgYWNsXG4iLCJpbXBvcnQgTWVudUl0ZW0gZnJvbSAnI2NsaWVudC9lbnRpdGllcy9NZW51SXRlbUVudGl0eS50cydcbmltcG9ydCBhY2wgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2FjbC50cydcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RmlsdGVyIHtcbiAgICBsYXlvdXQ/OiBzdHJpbmdcbiAgICBncm91cD86IHN0cmluZ1xuICAgIHBhcmVudD86IHN0cmluZ1xuICAgIGFsbG93ZWQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lbnVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdNZW51U2VydmljZSdcblxuICAgIHB1YmxpYyBpdGVtczogTWFwPHN0cmluZywgTWVudUl0ZW0+ID0gbmV3IE1hcCgpXG5cbiAgICBwdWJsaWMgYWRkKC4uLml0ZW06IE9taXQ8UGFydGlhbDxNZW51SXRlbT4sICdtZXJnZScgfCAnZnJvbSc+W10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW0pIHtcblxuICAgICAgICAgICAgaWYgKCFpLmlkKSB7XG4gICAgICAgICAgICAgICAgaS5pZCA9IEpTT04uc3RyaW5naWZ5KGkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KGkuaWQsIE1lbnVJdGVtLmZyb20oaSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKGlkOiBNZW51SXRlbVsnaWQnXSkge1xuICAgICAgICB0aGlzLml0ZW1zLmRlbGV0ZShpZClcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChmaWx0ZXI6IExpc3RGaWx0ZXIgPSB7fSkge1xuICAgICAgICBsZXQgaXRlbXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odGhpcy5pdGVtcy52YWx1ZXMoKSkpKSBhcyBNZW51SXRlbVtdXG5cblxuICAgICAgICBpZiAoZmlsdGVyLmxheW91dCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLmxheW91dCA9PT0gZmlsdGVyLmxheW91dClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIuZ3JvdXApIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gaS5ncm91cCA9PT0gZmlsdGVyLmdyb3VwIHx8IGkucGFyZW50ID09PSBmaWx0ZXIuZ3JvdXApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVyLnBhcmVudCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLnBhcmVudCA9PT0gZmlsdGVyLnBhcmVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIuYWxsb3dlZCAhPT0gdW5kZWZpbmVkICYmIGZpbHRlci5hbGxvd2VkID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGFjbC5jYW4oJ3ZpZXcnLCBpKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQSA9IGEub3JkZXIgPyBhLm9yZGVyIDogOThcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQiA9IGIub3JkZXIgPyBiLm9yZGVyIDogOThcblxuICAgICAgICAgICAgcmV0dXJuIG9yZGVyQSAtIG9yZGVyQlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29uZmlnLnRzJ1xuXG5jb25zdCBzZXR1cEd1YXJkOiBOYXZpZ2F0aW9uR3VhcmQgPSAodG8pID0+IHtcbiAgICBjb25zdCBzZXR1cCA9IGNvbmZpZy5nZXQ8YW55Pignc2V0dXAnKVxuICAgIFxuICAgIGNvbnN0IGNvbXBsZXRlZCA9ICFzZXR1cD8ubmVlZF9kYXRhYmFzZSAmJiAhc2V0dXA/Lm5lZWRfdXNlcnNcbiAgICBcbiAgICBpZiAoY29tcGxldGVkICYmIHRvLnBhdGguc3RhcnRzV2l0aCgnL3NldHVwJykpIHtcbiAgICAgICAgcmV0dXJuICcvJ1xuICAgIH1cbiAgICBcbiAgICBpZiAoY29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIFxuICAgIGlmICghdG8ucGF0aC5zdGFydHNXaXRoKCcvc2V0dXAnKSkge1xuICAgICAgICByZXR1cm4gJy9zZXR1cCdcbiAgICB9XG4gICAgXG4gICAgaWYgKHRvLnBhdGggPT09ICcvc2V0dXAnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfSAgICBcblxuICAgIGlmIChzZXR1cD8ubmVlZF9kYXRhYmFzZSkge1xuICAgICAgICByZXR1cm4gdG8ucGF0aCAhPT0gJy9zZXR1cC9kYXRhYmFzZScgPyAnL3NldHVwL2RhdGFiYXNlJyA6IHRydWVcbiAgICB9XG5cbiAgICBpZiAoc2V0dXA/Lm5lZWRfdXNlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRvLnBhdGggIT09ICcvc2V0dXAvdXNlcicgPyAnL3NldHVwL3VzZXInIDogdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldHVwR3VhcmRcbiIsImltcG9ydCB7XG4gICAgY3JlYXRlUm91dGVyIGFzIGNyZWF0ZVZ1ZVJvdXRlcixcbiAgICBjcmVhdGVNZW1vcnlIaXN0b3J5LFxuICAgIGNyZWF0ZVdlYkhpc3Rvcnlcbn0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkd1YXJkLCBSb3V0ZXIgYXMgVnVlUm91dGVyIH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCB0eXBlIHsgUm91dGVSZWNvcmRSYXcgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBEZWZpbmVDb21wb25lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgc2V0dXBHdWFyZCBmcm9tICcjY2xpZW50L2d1YXJkcy9zZXR1cEd1YXJkLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlciBleHRlbmRzIFZ1ZVJvdXRlciB7XG4gICAgYXV0bzogdHlwZW9mIGF1dG87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b09wdGlvbnMge1xuICAgIGd1YXJkcz86IE5hdmlnYXRpb25HdWFyZFtdIHwgKChyZWNvcmQ6IFJvdXRlUmVjb3JkUmF3KSA9PiBOYXZpZ2F0aW9uR3VhcmRbXSk7XG4gICAgc3RyaXA/OiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICAgIGV4Y2x1ZGU/OiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICByZWZpbmU/OiAocmVjb3JkczogUm91dGVSZWNvcmRSYXdbXSkgPT4gUm91dGVSZWNvcmRSYXdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1dG8oaW1wb3J0czogUmVjb3JkPHN0cmluZywgRGVmaW5lQ29tcG9uZW50IHwgKCgpID0+IFByb21pc2U8RGVmaW5lQ29tcG9uZW50Pik+LCBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9KTogUm91dGVSZWNvcmRSYXdbXSB7XG4gICAgbGV0IHJvdXRlczogUm91dGVSZWNvcmRSYXdbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlbmFtZSwgY29tcG9uZW50XSBvZiBPYmplY3QuZW50cmllcyhpbXBvcnRzKSkge1xuXG4gICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGU/LnNvbWUocnVsZSA9PlxuICAgICAgICAgICAgdHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBmaWxlbmFtZS5pbmNsdWRlcyhydWxlKVxuICAgICAgICAgICAgICAgIDogcnVsZS50ZXN0KGZpbGVuYW1lKVxuICAgICAgICApKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnRzID0gZmlsZW5hbWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC52dWUkLywgJycpXG4gICAgICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAgICAgLmZpbHRlcihwID0+IHAgJiYgIXAuc3RhcnRzV2l0aCgnLicpKVxuICAgICAgICAgICAgLm1hcChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcCA9IHBhcnRcblxuICAgICAgICAgICAgICAgIGlmIChwLnN0YXJ0c1dpdGgoJ1snKSAmJiBwLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcCA9ICc6JyArIHAuc2xpY2UoMSwgLTEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBcbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAvLyBTdHJpcCBzcGVjaWZpYyBzZWdtZW50c1xuICAgICAgICBpZiAob3B0aW9ucy5zdHJpcD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLmZpbHRlcihwID0+XG4gICAgICAgICAgICAgICAgIW9wdGlvbnMuc3RyaXAhLnNvbWUocnVsZSA9PlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcCA9PT0gcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBydWxlLnRlc3QocClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKS5yZXBsYWNlKC9pbmRleCQvLCAnJylcblxuICAgICAgICBpZiAob3B0aW9ucy5wcmVmaXgpIHtcbiAgICAgICAgICAgIHBhdGggPSBvcHRpb25zLnByZWZpeCArICcvJyArIHBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHBhdGggPSAnLycgKyBwYXRoXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBEZWZpbmVDb21wb25lbnQsXG4gICAgICAgICAgICBiZWZvcmVFbnRlcjogW10gYXMgTmF2aWdhdGlvbkd1YXJkW10sXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChvcHRpb25zLmd1YXJkcyAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuZ3VhcmRzKSkge1xuICAgICAgICAgICAgcmVjb3JkLmJlZm9yZUVudGVyID0gb3B0aW9ucy5ndWFyZHNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmd1YXJkcyAmJiB0eXBlb2Ygb3B0aW9ucy5ndWFyZHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWZvcmVFbnRlciA9IG9wdGlvbnMuZ3VhcmRzKHJlY29yZClcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRlcy5wdXNoKHJlY29yZClcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yZWZpbmUpIHtcbiAgICAgICAgcm91dGVzID0gb3B0aW9ucy5yZWZpbmUocm91dGVzKVxuICAgIH1cblxuICAgIHJldHVybiByb3V0ZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcigpIHtcbiAgICBjb25zdCBzc3IgPSBpbXBvcnQubWV0YS5lbnYuU1NSXG5cbiAgICBjb25zdCByb3V0ZXIgPSBjcmVhdGVWdWVSb3V0ZXIoe1xuICAgICAgICBoaXN0b3J5OiBzc3IgPyBjcmVhdGVNZW1vcnlIaXN0b3J5KCkgOiBjcmVhdGVXZWJIaXN0b3J5KCksXG4gICAgICAgIHJvdXRlczogW10sXG4gICAgICAgIHNjcm9sbEJlaGF2aW9yKHRvLCBmcm9tLCBzYXZlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBpZiAoc2F2ZWRQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZFBvc2l0aW9uXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRvcDogMCB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSkgYXMgYW55IGFzIFJvdXRlclxuXG4gICAgcm91dGVyLmJlZm9yZUVhY2goc2V0dXBHdWFyZClcblxuICAgIHJvdXRlci5hdXRvID0gKGltcG9ydHM6IFJlY29yZDxzdHJpbmcsIERlZmluZUNvbXBvbmVudCB8ICgoKSA9PiBQcm9taXNlPERlZmluZUNvbXBvbmVudD4pPiwgb3B0aW9uczogQXV0b09wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBhdXRvUm91dGVzID0gYXV0byhpbXBvcnRzLCBvcHRpb25zKVxuICAgICAgICBcbiAgICAgICAgYXV0b1JvdXRlcy5mb3JFYWNoKHJvdXRlID0+IHJvdXRlci5hZGRSb3V0ZShyb3V0ZSkpXG5cbiAgICAgICAgcmV0dXJuIGF1dG9Sb3V0ZXNcbiAgICB9XG5cbiAgICByZXR1cm4gcm91dGVyXG59XG5cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvYXN0U2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVG9hc3RTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHN1Y2Nlc3MobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCBtZXNzYWdlLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgfVxufVxuIiwiaW1wb3J0IEF1dGhTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvQXV0aFNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBhdXRoID0gY29udGFpbmVyLnByb3h5PEF1dGhTZXJ2aWNlPihBdXRoU2VydmljZSlcblxuaWYgKGltcG9ydC5tZXRhLmVudi5ERVYgJiYgIWltcG9ydC5tZXRhLmVudi5TU1IpIHtcbiAgICAod2luZG93IGFzIGFueSkuYXV0aCA9IGF1dGhcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXV0aFxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgbG9nZ2VyID0gY29udGFpbmVyLnByb3h5PExvZ2dlclNlcnZpY2U+KExvZ2dlclNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlclxuIiwiaW1wb3J0IE1lbnVTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvTWVudVNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBtZW51ID0gY29udGFpbmVyLnByb3h5PE1lbnVTZXJ2aWNlPihNZW51U2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbWVudVxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZUxvY2F0aW9uTm9ybWFsaXplZEdlbmVyaWMgfSBmcm9tICd2dWUtcm91dGVyJ1xuXG5jb25zdCByb3V0ZSA9IGNvbnRhaW5lci5wcm94eTxSb3V0ZUxvY2F0aW9uTm9ybWFsaXplZEdlbmVyaWM+KCdyb3V0ZScpXG5cbmV4cG9ydCBkZWZhdWx0IHJvdXRlXG5cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCB0eXBlIHsgUm91dGVyIH0gZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuXG5jb25zdCByb3V0ZXIgPSBjb250YWluZXIucHJveHk8Um91dGVyPigncm91dGVyJylcblxuZXhwb3J0IGRlZmF1bHQgcm91dGVyXG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgVG9hc3RTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvVG9hc3RTZXJ2aWNlLnRzJ1xuXG5jb25zdCB0b2FzdCA9IGNvbnRhaW5lci5wcm94eTxUb2FzdFNlcnZpY2U+KFRvYXN0U2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgdG9hc3RcbiIsImltcG9ydCB0eXBlIE1vZHVsZU1hbmlmZXN0IGZyb20gJy4vTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuaW50ZXJmYWNlIE1vZHVsZVVwZ3JhZGVJbmZvIHtcbiAgICBzb3VyY2U6ICdnaXQnIHwgJ3ppcCdcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBtaXhpbihMaWZlY3ljbGVIb29rKSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgYnVpbGQ6IE1vZHVsZU1hbmlmZXN0WydidWlsZCddID0ge31cbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyB1cGdyYWRlX2luZm8/OiBNb2R1bGVVcGdyYWRlSW5mb1xuXG4gICAgcHVibGljIHNldERhdGEoZGF0YTogUGFydGlhbDxNb2R1bGUgfCBNb2R1bGVNYW5pZmVzdD4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIClcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpbHRlcmVkKVxuXG4gICAgICAgIHRoaXMuaG9va19pZCA9IGBtb2R1bGU6JHt0aGlzLmlkfWBcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlV2l0aChCYXNlKSB7XG4gICBcbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhbGlhc2VzOiBzdHJpbmdbXVxuICAgIHB1YmxpYyB2ZXJzaW9uX2NoYW5uZWw6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uX2F2YWlsYWJsZV9jaGFubmVsczogc3RyaW5nW11cbn1cbiIsImltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzJ1xuaW1wb3J0IHJvdXRlciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvcm91dGVyLnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgdHlwZSB7IEF1dG9PcHRpb25zIH0gZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBjb21wb3NlV2l0aChCYXNlKSB7XG4gICAgcHVibGljIGFkZFBhZ2VzRm9sZGVyKGltcG9ydHM6IGFueSwgb3B0aW9ucz86IEF1dG9PcHRpb25zKSB7XG4gICAgICAgIHJvdXRlci5hdXRvKGltcG9ydHMsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGxvYWQgYWRkaXRpb25hbCBkYXRhIGZyb20gdGhlIHBsdWdpbidzIGRpcmVjdG9yeSBpZiBuZWVkZWRcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBhdXRvIH0gZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBBdXRvT3B0aW9ucyB9IGZyb20gJyNjbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcbmltcG9ydCB0eXBlIHsgRGVmaW5lQ29tcG9uZW50IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZVJlY29yZFJhdyB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgYXV0byBmcm9tIFJvdXRlclNlcnZpY2UgaW5zdGVhZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dG9Sb3V0ZXMoXG4gICAgaW1wb3J0czogUmVjb3JkPHN0cmluZywgRGVmaW5lQ29tcG9uZW50IHwgKCgpID0+IFByb21pc2U8RGVmaW5lQ29tcG9uZW50Pik+LFxuICAgIG9wdGlvbnM6IEF1dG9PcHRpb25zID0ge31cbik6IFJvdXRlUmVjb3JkUmF3W10ge1xuICAgIHJldHVybiBhdXRvKGltcG9ydHMsIG9wdGlvbnMpXG59XG4iLCJpbXBvcnQgJG9yaWdpbmFsIGZyb20gXCIjY2xpZW50L2ZhY2FkZXMvZmV0Y2hlci50c1wiO1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGZldGNoZXIgZmFjYWRlICovXG5leHBvcnQgY29uc3QgJGZldGNoID0gJG9yaWdpbmFsO1xuIiwiaW1wb3J0IHsgJGZldGNoIH0gZnJvbSAnLi9mZXRjaGVyJ1xuXG5pbnRlcmZhY2UgUGlja09wdGlvbnMge1xuICAgIGFjY2VwdD86IHN0cmluZ1xuICAgIG11bHRpcGxlPzogYm9vbGVhblxufVxuXG50eXBlIFBpY2tSZXN1bHQ8VCBleHRlbmRzIFBpY2tPcHRpb25zPiA9IFRbJ211bHRpcGxlJ10gZXh0ZW5kcyB0cnVlID8gRmlsZVtdIDogRmlsZSB8IG51bGxcblxuZnVuY3Rpb24gcGljazxUIGV4dGVuZHMgUGlja09wdGlvbnM+KG9wdGlvbnM6IFQpOiBQcm9taXNlPFBpY2tSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXG5cbiAgICAgICAgaW5wdXQudHlwZSA9ICdmaWxlJ1xuICAgICAgICBpbnB1dC5hY2NlcHQgPSBvcHRpb25zLmFjY2VwdCB8fCAnKi8qJ1xuICAgICAgICBpbnB1dC5tdWx0aXBsZSA9IG9wdGlvbnMubXVsdGlwbGUgfHwgZmFsc2VcblxuICAgICAgICBpbnB1dC5vbmNoYW5nZSA9IChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20odGFyZ2V0LmZpbGVzIGFzIEZpbGVMaXN0KSBhcyBGaWxlW11cblxuICAgICAgICAgICAgcmVzb2x2ZSgob3B0aW9ucy5tdWx0aXBsZSA/IEFycmF5LmZyb20oZmlsZXMpIDogZmlsZXNbMF0pIGFzIFBpY2tSZXN1bHQ8VD4pXG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dC5vbmNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUob3B0aW9ucy5tdWx0aXBsZSA/IFtdIDogKG51bGwgYXMgYW55KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0LmNsaWNrKClcbiAgICB9KVxufVxuXG5mdW5jdGlvbiB0b1VpbnQ4QXJyYXkoZmlsZTogRmlsZSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcblxuICAgICAgICByZWFkZXIub25sb2FkID0gKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLnRhcmdldD8ucmVzdWx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KGUudGFyZ2V0LnJlc3VsdCkpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZWFkIGZpbGUgYXMgQXJyYXlCdWZmZXInKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KHJlYWRlci5lcnJvcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKVxuICAgIH0pXG59XG5cbmludGVyZmFjZSBVcGxvYWRPcHRpb25zIHtcbiAgICBkcml2ZUlkOiBzdHJpbmdcbiAgICBmaWxlOiBGaWxlXG4gICAgZGlyZWN0b3J5Pzogc3RyaW5nXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZChvcHRpb25zOiBVcGxvYWRPcHRpb25zKXtcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgICBcbiAgICBmb3JtLmFwcGVuZCgnZmlsZScsIG9wdGlvbnMuZmlsZSlcblxuICAgIGlmIChvcHRpb25zLmRpcmVjdG9yeSkge1xuICAgICAgICBmb3JtLmFwcGVuZCgnZGlyZWN0b3J5Jywgb3B0aW9ucy5kaXJlY3RvcnkpXG4gICAgfVxuXG4gICAgcmV0dXJuICRmZXRjaChgL2FwaS9kcml2ZXMvJHtvcHRpb25zLmRyaXZlSWR9L3VwbG9hZGAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IGZvcm0sXG4gICAgICAgIHF1ZXJ5OiB7IGRpcmVjdG9yeTogb3B0aW9ucy5kaXJlY3RvcnksIH1cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgJGZpbGUgPSB7XG4gICAgcGljayxcbiAgICB1cGxvYWQsXG4gICAgdG9VaW50OEFycmF5LFxufSIsImltcG9ydCB7IHRvYXN0IH0gZnJvbSAndnVlLXNvbm5lcidcblxuZXhwb3J0IGNvbnN0ICR0b2FzdCA9IHRvYXN0XG4iLCJpbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25HdWFyZCB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgYXV0aCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYXV0aC50cydcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoR3VhcmRPcHRpb25zIHtcbiAgICByZWRpcmVjdDogc3RyaW5nXG4gICAgZXhjbHVkZT86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdXRoR3VhcmQob3B0aW9uczogQXV0aEd1YXJkT3B0aW9ucyk6IE5hdmlnYXRpb25HdWFyZCB7XG4gICAgY29uc3QgZXhjbHVkZSA9IG9wdGlvbnMuZXhjbHVkZSB8fCBbJy9hdXRoL2xvZ2luJywgJy9hdXRoL3JlZ2lzdGVyJ11cbiAgICBcbiAgICByZXR1cm4gKHRvKSA9PiB7XG4gICAgICAgIGlmICghYXV0aC51c2VyICYmICFleGNsdWRlLmluY2x1ZGVzKHRvLnBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZWRpcmVjdFxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBhdXRoR3VhcmQgPSBjcmVhdGVBdXRoR3VhcmQoeyBcbiAgICByZWRpcmVjdDogJy9hdXRoL2xvZ2luJyxcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IGF1dGhHdWFyZFxuIiwiaW1wb3J0IGF1dGggZnJvbSAnI2NsaWVudC9mYWNhZGVzL2F1dGgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgR3Vlc3RHdWFyZE9wdGlvbnMge1xuICAgIHJlZGlyZWN0OiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUd1ZXN0R3VhcmQob3B0aW9uczogR3Vlc3RHdWFyZE9wdGlvbnMpIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoYXV0aC51c2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZWRpcmVjdFxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBndWVzdEd1YXJkID0gY3JlYXRlR3Vlc3RHdWFyZCh7XG4gICAgcmVkaXJlY3Q6ICcvJ1xufSlcblxuZXhwb3J0IGRlZmF1bHQgZ3Vlc3RHdWFyZFxuIl0sIm1hcHBpbmdzIjoibVJBWUEsZUFBc0IsRUFBK0IsRUFBMkMsQ0FDNUYsR0FBSSxDQUVBLE1BQU8sQ0FBQyxLQURPLE1BQU0sR0FBTyxDQUNQLE9BQ2hCLEVBQU8sQ0FDWixNQUFPLENBQUMsRUFBYyxLQUFLLEVBSW5DLEVBQVMsS0FBTyxTQUEyQixFQUE2QixDQUNwRSxHQUFJLENBRUEsTUFBTyxDQUFDLEtBRE8sR0FBTyxDQUNELE9BQ2hCLEVBQU8sQ0FDWixNQUFPLENBQUMsRUFBYyxLQUFLLEdDakJuQyxJQUFxQixFQUFyQixLQUFrQyxDQUM5QixPQUFjLHNCQUF3QixlQUV0QyxNQUFnQixZQUFZLEVBQW9CLENBRzVDLEdBQUksRUFGZ0IsRUFBUyxRQUFRLElBQUksZUFBZSxFQUFJLElBRTNDLFNBQVMsbUJBQW1CLENBQUUsQ0FDM0MsRUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsQ0FDeEMsT0FHSixHQUFJLEVBQVMsUUFBUSxJQUFJLGVBQWUsRUFBRSxTQUFTLE9BQU8sQ0FBRSxDQUN4RCxJQUFNLEVBQU8sTUFBTSxFQUFTLE1BQU0sQ0FDN0IsV0FBYSxDQUFFLFFBQVMsR0FBRyx3QkFBd0IsQ0FBRSxFQUFFLENBRXhELEVBQUssU0FDTCxFQUFNLE1BQU0s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
1
+ import{t as e}from"./chunk-0Lt9GpW0.mjs";import{toast as t}from"vue-sonner";import n from"qs";import{debounce as r,get as i,has as a,orderBy as o,set as s,unset as c}from"lodash-es";import*as l from"valibot";import{format as u}from"date-fns";import{defineAbility as d,subject as f}from"@casl/ability";import{createMemoryHistory as p,createRouter as m,createWebHistory as h}from"vue-router";import{computed as g,getCurrentInstance as ee,getCurrentScope as te,hasInjectionContext as ne,inject as re,isRef as _,nextTick as ie,onMounted as ae,provide as oe,ref as v,shallowRef as y,toRef as b,toValue as x,unref as se,watch as S,watchEffect as ce}from"vue";import{toTypedSchema as le}from"@vee-validate/valibot";import{useForm as ue}from"vee-validate";import{useRouteQuery as de}from"@vueuse/router";async function C(e){try{return[null,await e()]}catch(e){return[e,null]}}C.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var w=class{static __container_entry_key=`FetchService`;async handleError(e){if(e.headers.get(`Content-Type`)?.includes(`json`)){let n=await e.json().catch(()=>({message:$t(`Internal Server Error`)}));return n.message&&t.error(n.message),n}return t.error($t(`Internal Server Error`)),{message:$t(`Internal Server Error`)}}buildUrl(e,t){if(!t)return e;let r=n.stringify(t,{arrayFormat:`brackets`});return e+`?`+r}buildRequestInit(e){let t={...e};return e.data&&(t.body=JSON.stringify(e.data),t.headers={...t.headers,"Content-Type":`application/json`}),t}async parseResponse(e){return e.headers.get(`Content-Type`)?.includes(`json`)?e.json():e.text()}async fetch(e,t={}){throw Error(`Method not implemented`)}async try(e,t={}){return C(()=>this.fetch(e,t))}async get(e,t={}){return this.fetch(e,{...t,method:`GET`})}async post(e,t={}){return this.fetch(e,{...t,method:`POST`})}async put(e,t={}){return this.fetch(e,{...t,method:`PUT`})}async delete(e,t={}){return this.fetch(e,{...t,method:`DELETE`})}},fe=class e extends Error{status=500;constructor(e,t=500){super(e),this.name=`BaseException`,this.status=t}static fromError(t){return new e(t.message,500)}},pe=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new fe(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}unset(e){let t=this.getKey(e);this.entries.delete(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const T=globalThis.clientContainer||new pe;globalThis.clientContainer=T;const E=T.proxy(w);function D(...e){return e.reduce((e,t)=>t(e),class{})}function me(e,...t){return t.reduce((e,t)=>t(e),e)}function he(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function O(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}function k(e){return class extends e{created_at;updated_at}}function A(e){return class extends e{deleted_at=null}}D(O,k,A);var ge=class{static __container_entry_key=`AuthService`;user;constructor(e={}){this.user=e.user||null}async logout(e){let[t]=await E.try(`/auth/logout`,{method:`POST`});t||(window.location.href=e?.redirect||`/`)}},_e=class extends w{async fetch(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i);return await this.parseResponse(i)}},ve=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}};function ye(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;if(i&&typeof i==`object`){ye(i,e,n);continue}n[e]=i}return n}function be(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function xe(e=``){return e+be()}var Se=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let r=n.value;return typeof r!=`object`||Array.isArray(r)?!1:a(r,e.substring(t.length+1))}get(e,t){let n=this.entries.get(e);if(n)return n.value;if(!e.includes(`.`))return t;let r=e.split(`.`)[0],a=this.entries.get(r);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:i(o,e.substring(r.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),s(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(c(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return ye(this.toRecord())}};const j=T.proxy(Se);import.meta.env.DEV&&(globalThis.config=j);function Ce(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function we(e){let t={},r=e.split(`?`)[1];return r?n.parse(r):t}var Te=class extends w{async fetch(e,t={}){return!e.startsWith(`http://`)&&!e.startsWith(`https://`)?this.fetchInternal(e,t):this.fetchExternal(e,t)}async fetchExternal(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}async fetchInternal(e,t={}){let n=T.get(`RouterService`),r=t.method||`GET`,i=n.resolve(r,e),a=new ve({prefix:j.get(`cookie.prefix`,``)});if(T.has(`cookies`)&&a.load(T.get(`cookies`)),!i||!i.handler)throw Error(`Route not found for ${r} ${e}`);return await n.execute(i,{url:e,params:Ce(i.path,e),query:t.query||we(e),body:t.data||t.body,method:r.toLowerCase(),cookie:a})}},M=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},Ee=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new M,this.debug&&this.logger.debug(`emmitter loaded with debug mode enabled`)}static create(t){return new e(t)}setDebug(e){this.debug=e,this.debug&&this.logger.debug(`debug mode enabled`)}setLogger(e){this.logger=e}on(e,t,n){let r=n?.id||xe();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=(n,i)=>{t(n,i),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,t,n){let i=r(t,n?.debounce||300),a=this.on(e,i,n);return a&&(a.originalListener=t),a}onAnyOf(e,t,n){let r=[];for(let i of e){let e=this.on(i,t,n);e&&r.push(e)}return r}off(e,t){this.handlers=this.handlers.filter(n=>!(n.event===e&&(n.listener===t||n.originalListener===t))),this.debug&&this.logger.debug(`handler removed`,{event:e})}emit(e,t){this.debug&&this.logger.debug(`emitting event`,{event:e,args:t});let n=this.handlers.filter(t=>t.event===e);for(let r of n)C.sync(()=>r.listener(t,{event:e}))}async emitAndWait(e,t){let n=this.handlers.filter(t=>t.event===e);this.debug&&this.logger.debug(`emitting event and wait`,{handlers:n.length,event:e,args:t});for await(let r of n)await r.listener(t,{event:e})}list(){return this.handlers}listByEvent(e){return this.handlers.filter(t=>t.event===e)}remove(e){let t=Array.isArray(e)?e:[e];this.handlers=this.handlers.filter(e=>!t.includes(e.id)),this.debug&&this.logger.debug(`handlers removed`,{ids:t})}clear(){this.handlers=[],this.debug&&this.logger.debug(`all handlers cleared`)}hasHandlers(){return this.handlers.length>0}},De=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},Oe=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new M,e.onError&&(this.onError=e.onError)}setOnError(e){this.onError=e}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=o(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await C(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}on(e,t){let n=new De;n.hook_id=`custom:${e}:${Date.now()}`,n[e]=t,this.add(n)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}};const N=()=>l.pipe(l.union([l.string(),l.number()]),l.transform(Number),l.integer()),ke=()=>l.pipe(l.union([l.string(),l.boolean()]),l.transform(e=>e===!0||e===`true`)),Ae=()=>l.pipe(l.union([l.string(),l.date()]),l.transform(e=>e instanceof Date?e:new Date(e)),l.transform(e=>e&&u(e,`yyyy-MM-dd`))),je=()=>l.pipe(l.union([l.string(),l.date()]),l.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),u(e,`yyyy-MM-dd HH:mm`))))),P=(e=l.any())=>l.pipe(l.union([l.string(),l.array(l.string())]),l.transform(e=>Array.isArray(e)?e:e.split(`,`)),l.array(e)),Me=()=>l.pipe(P(),l.transform(e=>e.map(Number))),Ne=()=>l.pipe(l.union([l.string(),l.record(l.string(),l.any())]),l.transform(e=>typeof e==`string`?n.parse(e):e),l.transform(e=>{let t={};for(let n in e)s(t,n,i(e,n));return t}));function F(){return Ne()}F.number=N,F.boolean=ke,F.date=Ae,F.datetime=je,F.array=P,F.arrayNumber=Me,F.object=Ne;const Pe=()=>l.pipe(l.string(),l.transform(e=>{let t=e.split(/[;\n]/).filter(Boolean).filter(e=>e.includes(`=`)).map(e=>e.trim().split(`=`)),n=Object.fromEntries(t),r={};for(let[e,t]of Object.entries(n)){let n=t;t.startsWith(`bool:`)&&(n=t.replace(`bool:`,``).trim()===`true`),s(r,e,n)}return r})),Fe=(e={})=>l.object({page:l.optional(N(),1),limit:l.optional(N(),e.maxLimit||100),orderBy:l.nullish(e.orderFields?P(l.picklist(e.orderFields)):P(l.string()),[]),orderDirection:l.nullish(P(l.union([l.literal(`asc`),l.literal(`desc`)])),[])});function Ie(e={}){return Fe(e)}Ie.base=Fe;var Le=e({array:()=>P,arrayNumber:()=>Me,base:()=>Fe,boolean:()=>ke,date:()=>Ae,datetime:()=>je,keyValue:()=>Pe,number:()=>N,object:()=>Ne,pagination:()=>Ie,url:()=>F});const I=new class{static __container_entry_key=`ValidatorService`;v={...l,extras:Le};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=l.safeParse(n,e);if(!a){let e=l.flatten(i),t=[];e.root&&t.push(...e.root),e.nested&&Object.entries(e.nested).forEach(e=>{let[n,r]=e;t.push(...r.map(e=>`${n}: ${e}`))});let n=new fe(t.length?t.join(`, `):`Validation failed`,422);throw n.name=`ValidationError`,Object.assign(n,{messages:t}),n}return r}async validateAsync(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=await l.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=l.flatten(i),n={...t.root,...t.nested};throw Object.assign(e,{details:n}),e}return r}isValid(e,t){let n=typeof t==`function`?t(this.v):t,{success:r}=l.safeParse(n,e);return r}};function L(){return I.create(e=>e.object({id:e.number(),dashboard_id:e.number(),name:e.string(),value:e.nullable(e.string())}))}L.create=I.create(e=>e.pick(L(),[`dashboard_id`,`name`,`value`])),L.update=I.create(e=>e.partial(L.create));function R(){return I.create(e=>e.object({id:e.number(),name:e.string(),description:e.nullable(e.string()),created_at:e.string(),updated_at:e.string(),deleted_at:e.nullable(e.string()),metas:e.optional(e.record(e.string(),e.any()))}))}R.create=I.create(e=>e.pick(R(),[`name`,`description`])),R.update=I.create(e=>e.partial(R.create)),l.object({id:l.number(),permission_id:l.number(),assignable_type:l.string(),assignable_id:l.string(),created_at:l.string(),updated_at:l.string()}),l.object({id:l.number(),name:l.nullable(l.string()),description:l.nullable(l.string()),action:l.string(),subject:l.string(),conditions:l.nullable(l.string()),created_at:l.string(),updated_at:l.string(),expires_at:l.string()}),l.object({id:l.number(),name:l.nullable(l.string()),type:l.string(),user_id:l.number(),token:l.string(),created_at:l.string(),updated_at:l.string(),expires_at:l.string()});function z(){return l.object({id:l.number(),name:l.optional(l.string()),email:l.pipe(l.string(),l.email()),password:l.pipe(l.string(),l.minLength(6)),username:l.pipe(l.string(),l.regex(/^[a-zA-Z0-9_-]+$/)),verified_at:l.nullable(l.string()),created_at:l.string(),updated_at:l.string(),deleted_at:l.nullable(l.string())})}z.create=()=>l.omit(z(),[`id`,`verified_at`,`created_at`,`updated_at`,`deleted_at`]),z.update=()=>l.partial(z.create());async function Re(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function ze(e,t,n){let r=e.listeners||[];r.find(e=>e.event===t&&e.listener===n)||(r.push({event:t,listener:n}),e.listeners=r)}function Be(e){return class extends e{constructor(...e){super(...e),typeof this.constructor.boot==`function`&&this.constructor.boot.apply(this.constructor)}static listeners=[];static on(e,t){return ze(this,e,t)}static async emit(e,...t){return Re(this,e,...t)}}}Be.emit=Re,Be.on=ze;var Ve=class extends D(O){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=C.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},He=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>Ve.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new M().child({label:`acl`}),this.ability=d(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=f(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=f(t,n);return this.ability.cannot(e,r)}subject(e,t){return f(e,t)}};D(O,k,A),D(O,k,A),D(O,k,A);var Ue=class extends D(O,he(De)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}};D(O);var We=class extends D(O){id;name;version;enabled;aliases;version_channel;version_available_channels};D(O,k,A);const B=T.proxy(Ee);var Ge=class{static __container_entry_key=`LayoutService`;components=new Map;options={};currendId=null;setCurrent(e){this.currendId=e,B.emit(`layout:change`,e)}add(e,t,n){this.components.set(e,t),this.options=n||{}}has(e){return this.components.has(e)}get(e){let t=this.components.get(e);if(!t)throw new fe(`Layout ${e} not found`);return t}getOptions(){return this.options}getCurrent(){return this.currendId?this.get(this.currendId):null}setOptions(e={}){this.options=e,B.emit(`layout:set-options`,e)}},Ke=class extends Oe{addImports(e){let t=[];for(let[n,r]of Object.entries(e)){let e=new(r.default||r);e.hook_id=e.hook_id||n,t.push(e)}t.forEach(e=>this.add(e))}},qe=class extends D(O){id;label;layout;to;target;group;order;icon;parent};const Je=T.proxy(He);var Ye=class{static __container_entry_key=`MenuService`;items=new Map;add(...e){for(let t of e)t.id||=JSON.stringify(t),this.items.set(t.id,qe.from(t))}remove(e){this.items.delete(e)}list(e={}){let t=JSON.parse(JSON.stringify(Array.from(this.items.values())));return e.layout&&(t=t.filter(t=>t.layout===e.layout)),e.group&&(t=t.filter(t=>t.group===e.group||t.parent===e.group)),e.parent&&(t=t.filter(t=>t.parent===e.parent)),e.allowed!==void 0&&e.allowed===!0&&(t=t.filter(e=>Je.can(`view`,e))),t.sort((e,t)=>(e.order?e.order:98)-(t.order?t.order:98)),t}clear(){this.items.clear()}};const Xe=e=>{let t=j.get(`setup`),n=!t?.need_database&&!t?.need_users;return n&&e.path.startsWith(`/setup`)?`/`:n?!0:e.path.startsWith(`/setup`)?e.path===`/setup`?!0:t?.need_database?e.path===`/setup/database`?!0:`/setup/database`:t?.need_users?e.path===`/setup/user`?!0:`/setup/user`:!0:`/setup`};function Ze(e,t={}){let n=[];for(let[r,i]of Object.entries(e)){if(t.exclude?.some(e=>typeof e==`string`?r.includes(e):e.test(r)))continue;let e=r.replace(/\.vue$/,``).split(`/`).filter(e=>e&&!e.startsWith(`.`)).map(e=>{let t=e;return t.startsWith(`[`)&&t.endsWith(`]`)&&(t=`:`+t.slice(1,-1)),t});t.strip?.length&&(e=e.filter(e=>!t.strip.some(t=>typeof t==`string`?e===t:t.test(e))));let a=e.join(`/`).replace(/index$/,``);t.prefix&&(a=t.prefix+`/`+a),a.startsWith(`/`)||(a=`/`+a),a.endsWith(`/`)&&(a=a.slice(0,-1));let o={path:a,component:i,beforeEnter:[]};t.guards&&Array.isArray(t.guards)&&(o.beforeEnter=t.guards),t.guards&&typeof t.guards==`function`&&(o.beforeEnter=t.guards(o)),n.push(o)}return t.refine&&(n=t.refine(n)),n}function Qe(){let e=import.meta.env.SSR,t=m({history:e?p():h(),routes:[],scrollBehavior(e,t,n){return n||{top:0}}});return t.beforeEach(Xe),t.auto=(e,n={})=>{let r=Ze(e,n);return r.forEach(e=>t.addRoute(e)),r},t}var $e=class{static __container_entry_key=`ToastService`;success(e,t){console.log(`Success:`,e,t)}error(e,t){console.error(`Error:`,e,t)}};const et=new WeakMap,tt=(...e)=>{let t=e[0],n=ee()?.proxy??te();if(n==null&&!ne())throw Error(`injectLocal must be called in setup`);return n&&et.has(n)&&t in et.get(n)?et.get(n)[t]:re(...e)},V=typeof window<`u`&&typeof document<`u`;typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope;const nt=Object.prototype.toString,rt=e=>nt.call(e)===`[object Object]`,it=()=>{};function at(e,t){function n(...n){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,n),{fn:t,thisArg:this,args:n})).then(r).catch(i)})}return n}const ot=e=>e();function st(e,t={}){let n,r,i=it,a=e=>{clearTimeout(e),i(),i=it},o;return s=>{let c=x(e),l=x(t.maxWait);return n&&a(n),c<=0||l!==void 0&&l<=0?(r&&=(a(r),void 0),Promise.resolve(s())):new Promise((e,u)=>{i=t.rejectOnCancel?u:e,o=s,l&&!r&&(r=setTimeout(()=>{n&&a(n),r=void 0,e(o())},l)),n=setTimeout(()=>{r&&a(r),r=void 0,e(s())},c)})}}function ct(e,t){if(typeof e==`number`)return e+t;let n=e.match(/^-?\d+\.?\d*/)?.[0]||``,r=e.slice(n.length),i=Number.parseFloat(n)+t;return Number.isNaN(i)?e:i+r}function H(e){return e.endsWith(`rem`)?Number.parseFloat(e)*16:Number.parseFloat(e)}function lt(e){return Array.isArray(e)?e:[e]}function ut(e){return e||ee()}function dt(e,t,n={}){let{eventFilter:r=ot,...i}=n;return S(e,at(r,t),i)}function ft(e,t=!0,n){ut(n)?ae(e,n):t?e():ie(e)}function pt(e,t,n={}){let{debounce:r=0,maxWait:i=void 0,...a}=n;return dt(e,t,{...a,eventFilter:st(r,{maxWait:i})})}function mt(e,t,n){return S(e,t,{...n,immediate:!0})}const ht=V?window:void 0;V&&window.document,V&&window.navigator,V&&window.location;function gt(e){let t=x(e);return t?.$el??t}function _t(...e){let t=(e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)),n=g(()=>{let t=lt(x(e[0])).filter(e=>e!=null);return t.every(e=>typeof e!=`string`)?t:void 0});return mt(()=>[n.value?.map(e=>gt(e))??[ht].filter(e=>e!=null),lt(x(n.value?e[1]:e[0])),lt(se(n.value?e[2]:e[1])),x(n.value?e[3]:e[2])],([e,n,r,i],a,o)=>{if(!e?.length||!n?.length||!r?.length)return;let s=rt(i)?{...i}:i,c=e.flatMap(e=>n.flatMap(n=>r.map(r=>t(e,n,r,s))));o(()=>{c.forEach(e=>e())})},{flush:`post`})}function vt(){let e=y(!1),t=ee();return t&&ae(()=>{e.value=!0},t),e}function yt(e){let t=vt();return g(()=>(t.value,!!e()))}const bt=Symbol(`vueuse-ssr-width`);function xt(){let e=ne()?tt(bt,null):null;return typeof e==`number`?e:void 0}function U(e,t={}){let{window:n=ht,ssrWidth:r=xt()}=t,i=yt(()=>n&&`matchMedia`in n&&typeof n.matchMedia==`function`),a=y(typeof r==`number`),o=y(),s=y(!1);return ce(()=>{if(a.value){a.value=!i.value,s.value=x(e).split(`,`).some(e=>{let t=e.includes(`not all`),n=e.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),i=e.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),a=!!(n||i);return n&&a&&(a=r>=H(n[1])),i&&a&&(a=r<=H(i[1])),t?!a:a});return}i.value&&(o.value=n.matchMedia(x(e)),s.value=o.value.matches)}),_t(o,`change`,e=>{s.value=e.matches},{passive:!0}),g(()=>s.value)}const St={sm:640,md:768,lg:1024,xl:1280,"2xl":1536};function Ct(e,t={}){function n(t,n){let r=x(e[x(t)]);return n!=null&&(r=ct(r,n)),typeof r==`number`&&(r=`${r}px`),r}let{window:r=ht,strategy:i=`min-width`,ssrWidth:a=xt()}=t,o=typeof a==`number`,s=o?y(!1):{value:!0};o&&ft(()=>s.value=!!r);function c(e,t){return!s.value&&o?e===`min`?a>=H(t):a<=H(t):r?r.matchMedia(`(${e}-width: ${t})`).matches:!1}let l=e=>U(()=>`(min-width: ${n(e)})`,t),u=e=>U(()=>`(max-width: ${n(e)})`,t),d=Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>i===`min-width`?l(t):u(t),enumerable:!0,configurable:!0}),e),{});function f(){let t=Object.keys(e).map(e=>[e,d[e],H(n(e))]).sort((e,t)=>e[2]-t[2]);return g(()=>t.filter(([,e])=>e.value).map(([e])=>e))}return Object.assign(d,{greaterOrEqual:l,smallerOrEqual:u,greater(e){return U(()=>`(min-width: ${n(e,.1)})`,t)},smaller(e){return U(()=>`(max-width: ${n(e,-.1)})`,t)},between(e,r){return U(()=>`(min-width: ${n(e)}) and (max-width: ${n(r,-.1)})`,t)},isGreater(e){return c(`min`,n(e,.1))},isGreaterOrEqual(e){return c(`min`,n(e))},isSmaller(e){return c(`max`,n(e,-.1))},isSmallerOrEqual(e){return c(`max`,n(e))},isInBetween(e,t){return c(`min`,n(e))&&c(`max`,n(t,-.1))},current:f,active(){let e=f();return g(()=>e.value.length===0?``:e.value.at(i===`min-width`?-1:0))}})}function wt(){return Ct(St)}function W(e){let t=/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*[\d.]+)?\)/.exec(e);if(!t)throw Error(`Invalid RGB color format: `+e);return{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3])}}function G(e){let t=/rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\d.]+)\)/.exec(e);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:parseFloat(t[4])}:{...W(e),a:1}}function Tt(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)throw Error(`Invalid HEX color format: `+e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}}function K(e){let t=/hsla?\((\d+),\s*(\d+)%,\s*(\d+)%(?:,\s*[\d.]+)?\)/.exec(e);if(!t)throw Error(`Invalid HSL color format: `+e);let n=parseInt(t[1])/360,r=parseInt(t[2])/100,i=parseInt(t[3])/100,a,o,s;if(r===0)a=o=s=i;else{let e=(e,t,n)=>(n<0&&(n+=1),n>1&&--n,n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e),t=i<.5?i*(1+r):i+r-i*r,c=2*i-t;a=e(c,t,n+1/3),o=e(c,t,n),s=e(c,t,n-1/3)}return{r:Math.round(a*255),g:Math.round(o*255),b:Math.round(s*255)}}function q(e,t,n){e/=255,t/=255,n/=255;let r=Math.max(e,t,n),i=Math.min(e,t,n),a=(r+i)/2;if(r===i)return{h:0,s:0,l:Math.round(a*100)};let o=r-i,s=a>.5?o/(2-r-i):o/(r+i),c=0;switch(r){case e:c=((t-n)/o+(t<n?6:0))*60;break;case t:c=((n-e)/o+2)*60;break;case n:c=((e-t)/o+4)*60;break}return{h:Math.round(c),s:Math.round(s*100),l:Math.round(a*100)}}function J(e,t,n){let r=e=>{let t=e.toString(16);return t.length===1?`0`+t:t};return`#${r(e)}${r(t)}${r(n)}`}function Et(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function Dt(e){let t=/oklch\(([\d.]+)\s+([\d.]+)\s+([\d.]+)\)/.exec(e);if(!t)throw Error(`Invalid OKLCH color format: `+e);return{l:parseFloat(t[1]),c:parseFloat(t[2]),h:parseFloat(t[3])}}function Ot(e){let{l:t,c:n,h:r}=Dt(e),i=r*Math.PI/180,a=n*Math.cos(i),o=n*Math.sin(i),s=t+.3963377774*a+.2158037573*o,c=t-.1055613458*a-.0638541728*o,l=t-.0894841775*a-1.291485548*o,u=s*s*s,d=c*c*c,f=l*l*l,p=4.0767416621*u-3.3077115913*d+.2309699292*f,m=-1.2684380046*u+2.6097574011*d-.3413193965*f,h=-.0041960863*u-.7034186147*d+1.707614701*f,g=e=>e>=.0031308?1.055*e**(1/2.4)-.055:12.92*e;return p=g(p),m=g(m),h=g(h),{r:Math.round(Math.max(0,Math.min(1,p))*255),g:Math.round(Math.max(0,Math.min(1,m))*255),b:Math.round(Math.max(0,Math.min(1,h))*255)}}function Y(e,t,n){e/=255,t/=255,n/=255;let r=e=>e>=.04045?((e+.055)/1.055)**2.4:e/12.92;e=r(e),t=r(t),n=r(n);let i=.4122214708*e+.5363325363*t+.0514459929*n,a=.2119034982*e+.6806995451*t+.1073969566*n,o=.0883024619*e+.2817188376*t+.6299787005*n,s=Math.cbrt(i),c=Math.cbrt(a),l=Math.cbrt(o),u=.2104542553*s+.793617785*c-.0040720468*l,d=1.9779984951*s-2.428592205*c+.4505937099*l,f=.0259040371*s+.7827717662*c-.808675766*l,p=Math.sqrt(d*d+f*f),m=180/Math.PI*Math.atan2(f,d);return m<0&&(m+=360),{l:Math.round(u*1e3)/1e3,c:Math.round(p*1e3)/1e3,h:Math.round(m*1e3)/1e3}}function X(e){let t=_(e)?e:v(x(e));return g({get(){return t.value?t.value.startsWith(`#`)?`hex`:/^rgba/.test(t.value)?`rgba`:/^rgb/.test(t.value)?`rgb`:/^oklch/.test(t.value)?`oklch`:/^hsla/.test(t.value)?`hsla`:/^hsl/.test(t.value)?`hsl`:`unknown`:null},set(e){if(!t.value||!e)return;let n=Z(t).value;if(n){if(e===`hex`){t.value=J(n.r,n.g,n.b);return}if(e===`rgb`){t.value=`rgb(${n.r}, ${n.g}, ${n.b})`;return}if(e===`rgba`){t.value=`rgba(${n.r}, ${n.g}, ${n.b}, 1)`;return}if(e===`hsl`){let e=q(n.r,n.g,n.b);t.value=`hsl(${e.h}, ${e.s}%, ${e.l}%)`;return}if(e===`hsla`){let e=q(n.r,n.g,n.b);t.value=`hsla(${e.h}, ${e.s}%, ${e.l}%)`;return}if(e===`oklch`){let e=Y(n.r,n.g,n.b);t.value=`oklch(${e.l} ${e.c} ${e.h})`;return}}}})}function Z(e){let t=_(e)?e:v(x(e)),n=X(t);return g({get(){if(!t.value)return null;if(n.value===`rgba`){let e=G(t.value);return{r:e.r,g:e.g,b:e.b}}return n.value===`rgb`?W(t.value):n.value===`hex`&&t.value.length===7?Tt(t.value):n.value===`hsl`?K(t.value):n.value===`oklch`?Ot(t.value):null},set(){if(t.value){if(n.value===`rgb`){let e=W(t.value);t.value=`rgb(${e.r}, ${e.g}, ${e.b})`}if(n.value===`rgba`){let e=G(t.value);t.value=`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}}}})}function kt(e){let t=_(e)?e:v(x(e)),n=X(t),r=Z(t);return g({get(){return r.value?n.value===`rgba`?G(t.value):{...r.value,a:1}:null},set(e){if(!(!e||!t.value)){if(n.value===`rgba`){t.value=`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`;return}if(n.value===`rgb`){t.value=`rgb(${e.r}, ${e.g}, ${e.b})`;return}}}})}function At(e){let t=_(e)?e:v(x(e)),n=X(t),r=Z(t);return g({get(){return r.value?q(r.value.r,r.value.g,r.value.b):null},set(e){if(!(!e||!t.value)){if(n.value===`hsl`){t.value=`hsl(${e.h}, ${e.s}%, ${e.l}%)`;return}if(n.value===`hsla`){t.value=`hsla(${e.h}, ${e.s}%, ${e.l}%)`;return}if(n.value===`hex`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=J(n.r,n.g,n.b);return}if(n.value===`rgba`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=`rgba(${n.r}, ${n.g}, ${n.b}, 1)`;return}if(n.value===`rgb`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=`rgb(${n.r}, ${n.g}, ${n.b})`;return}if(n.value===`oklch`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`),r=Y(n.r,n.g,n.b);t.value=`oklch(${r.l} ${r.c} ${r.h})`;return}}}})}function jt(e){let t=_(e)?e:v(x(e)),n=X(t),r=Z(t);return g({get(){return r.value?J(r.value.r,r.value.g,r.value.b):null},set(e){if(e&&n.value===`hex`){t.value=e.startsWith(`#`)?e:`#${e}`;return}}})}function Mt(e){let t=_(e)?e:v(x(e)),n=X(t),r=jt(t),i=Z(t),a=kt(t);return{type:n,color:t,hex:r,rgb:i,hsl:At(t),oklch:g({get(){return i.value?Y(i.value.r,i.value.g,i.value.b):null},set(e){if(!e)return;if(n.value===`oklch`){t.value=`oklch(${e.l} ${e.c} ${e.h})`;return}let r=Ot(`oklch(${e.l} ${e.c} ${e.h})`);if(n.value===`hex`){t.value=J(r.r,r.g,r.b);return}if(n.value===`rgb`){t.value=`rgb(${r.r}, ${r.g}, ${r.b})`;return}}}),rgba:a}}const Nt=Symbol(`dashboard`);function Pt(e){oe(Nt,e)}function Ft(){let e=re(Nt);if(!e)throw Error(`useDashboard must be used inside a component that calls provideDashboard`);return e}const It=Symbol(`dashboard-widget`);function Lt(e){oe(It,e)}function Rt(){let e=re(It);if(!e)throw Error(`useDashboardWidget must be used inside a component that calls provideDashboardWidget`);return e}function zt(e,t){let n=T.get(`state`),r=n[e];!r&&t?.default!==void 0&&(r=t.default()),r&&t?.transform&&(r=t.transform(r));let i=v(r),a=t=>{n[e]=t,T.set(`state`,n)};return S(i,a,{deep:!0}),g({get:()=>i.value,set:e=>{i.value=e,a(e)}})}const Bt=new Set;function Vt(e,t={}){let n=t.key||e,r=zt(n,{default:()=>({items:[],page:1,total:0,total_pages:1})}),i=v(!1),a=b(t.page||1),o=b(t.query||{}),s=b(t.limit||10),c=b(t.orderBy||null),l=b(t.orderDirection||null),u=g(()=>r.value.total),d=g(()=>r.value.total_pages),f=g(()=>{let e=Array.isArray(r.value.items)?r.value.items:[];return t.refine&&(e=t.refine(e)),t.serialize?e.map(e=>t.serialize(e)):e});async function p(){if(i.value)return;i.value=!0;let t=JSON.parse(JSON.stringify({...o.value,page:a.value,limit:s.value,orderBy:c.value?c.value:void 0,orderDirection:l.value?l.value:void 0})),[n,u]=await E.try(e,{method:`GET`,query:t});if(n){i.value=!1,console.error(n);return}if(r.value=u,import.meta.env.SSR){i.value=!1;return}await new Promise(e=>setTimeout(e,800)),i.value=!1}async function m(){if(a.value===1){await p();return}a.value=1}function h(e,t){JSON.stringify(e)!==JSON.stringify(t)&&m()}S([a,s],p),S([c,l],m,{deep:!0}),pt(()=>JSON.parse(JSON.stringify(o.value)),h,{debounce:t.debounce||1e3});async function ee(){if(!Bt.has(n)&&f.value.length){Bt.add(n);return}Bt.add(n),await p()}return{page:a,limit:s,orderBy:c,orderDirection:l,total:u,totalPages:d,items:f,loading:i,load:p,reset:m,query:o,hydrate:ee}}const Ht=Wt,Ut=le;function Wt(e,t={}){return ue({...t,validationSchema:le(e)})}const Gt=globalThis,Q=Gt.layout||new Ge;Gt.layout=Q;function Kt(){let e=v(Q.getOptions()),t=()=>{e.value=Q.getOptions()};return B.on(`layout:change`,t),B.on(`layout:set-options`,t),e}function qt(e=!1,t){let n=v(e),r=v(t?.timeout??500);function i(e){n.value=e}let a=g({get(){return n.value},set(e){if(e){n.value=!0;return}setTimeout(()=>i(!1),r.value)}});return Object.assign(a,{set:i})}const $=v(new Map);function Jt(){function e(...e){e.forEach(e=>{e.layout||=`admin`,$.value.set(e.id,e)})}function t(e){typeof e==`string`&&$.value.delete(e)}function n(e){Array.from($.value.values()).filter(t=>t.group===e||t.parent===e).forEach(e=>$.value.delete(e.id))}function r(e){e.forEach(e=>t(e))}function i(e){e.forEach(e=>n(e))}function a(){$.value.clear()}return{items:g(()=>Array.from($.value.values())),add:e,remove:t,removeGroup:n,removeMany:r,removeManyGroup:i,clear:a}}const Yt=T.proxy(`route`),Xt=T.proxy(`router`),Zt=(e,t,n)=>de(e,t,{route:Yt,router:Xt,...n}),Qt=T.proxy(ge);import.meta.env.DEV&&!import.meta.env.SSR&&(window.auth=Qt);var en=class{static __container_entry_key=`DashboardWidgetRegistry`;definitions=new Map;register(...e){for(let t of e)this.definitions.set(t.id,t)}get(e){return this.definitions.get(e)||null}list(){return Array.from(this.definitions.values())}};const tn=T.proxy(en),nn=T.proxy(Ke),rn=T.proxy(M),an=T.proxy(Ye),on=T.proxy($e),sn=`vee-validate`,cn=T.proxy(sn),ln=`Vue`,un=T.proxy(`Vue`),dn=`VueRouter`,fn=T.proxy(dn);var pn=class{id;name;definition_id;columns;rows;x;y;order;options;constructor(e){Object.assign(this,e),this.id||=xe(),this.options||={}}},mn=class{id;name;description;icon;constructor(){this.id=``,this.name=``,this.description=``,this.icon=``}component(){return null}actions(){return[]}};const hn=80;var gn=class e{data;definition;emmitter;constructor({data:e,definition:t}){this.data=e,this.definition=t,this.emmitter=new Ee}static fromData(t){let n=tn.get(t.definition_id);return n||(n=new mn,n.name=`Unknown: ${t.definition_id}`,n.id=t.definition_id,console.warn(`DashboardWidgetDefinition not found for id: ${t.definition_id}. Using unknown definition.`)),new e({data:t,definition:n})}setEmmitter(e){this.emmitter=e}get id(){return this.data.id}get name(){return this.data.name}set name(e){this.update({name:e})}get options(){return this.data.options||{}}get definition_id(){return this.data.definition_id}component(){return this.definition.component()}actions(){return this.definition.actions()}get columns(){return this.data.columns||{}}set columns(e){let t=JSON.parse(JSON.stringify(this.data.columns||{}));Object.assign(t,e),this.update({columns:t})}get rows(){return this.data.rows||{}}set rows(e){let t=JSON.parse(JSON.stringify(this.data.rows||{}));Object.assign(t,e),this.update({rows:t})}get x(){return this.data.x||{}}set x(e){let t=JSON.parse(JSON.stringify(this.data.x||{}));Object.assign(t,e),this.update({x:t})}get y(){return this.data.y||{}}set y(e){let t=JSON.parse(JSON.stringify(this.data.y||{}));Object.assign(t,e),this.update({y:t})}get classes(){let e=new Set;return Array.from(e.values()).join(` `)}computeStyles(e){let t=new Map,n=e.breakpoint??`base`,r=this.x[n]??0,i=this.y[n]??0,a=this.columns[n]??1,o=this.rows[n]??1,s=e.contianerWidth/12;return t.set(`position`,`absolute`),t.set(`left`,`${r*s}px`),t.set(`top`,`${i*80}px`),t.set(`width`,`${a*s-10}px`),t.set(`height`,`${o*80}px`),Array.from(t.entries()).map(([e,t])=>`${e}: ${t};`).join(` `)}update(e){Object.assign(this.data,e),this.emmitter.emit(`widget:updated`,{id:this.id,data:this.data})}setOption(e,t){let n=JSON.parse(JSON.stringify(this.data.options||{}));s(n,e,t),this.update({options:n})}setX(e,t=void 0){let n=JSON.parse(JSON.stringify(this.x));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({x:n})}setY(e,t=void 0){let n=JSON.parse(JSON.stringify(this.y));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({y:n})}setColumn(e,t=void 0){let n=JSON.parse(JSON.stringify(this.columns));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({columns:n})}setRow(e,t=void 0){let n=JSON.parse(JSON.stringify(this.rows));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({rows:n})}},_n=class{name=``;description=``;widgets=[];emmitter;containerWidth=0;constructor(){this.emmitter=new Ee}setName(e){return this.name=e,this}setDescription(e){return this.description=e,this}setContainerWidth(e){return this.containerWidth=e,this}setWidgets(e){this.widgets=[];for(let t of e){let e=gn.fromData(t);e.setEmmitter(this.emmitter),this.widgets.push(e)}return this}findLastRow(){let e=0;for(let t of this.widgets){let n=t.rows?.base??0,r=(t.y?.base??0)+n;r>e&&(e=r)}return e}addWidget(e={}){e.columns||={base:4},e.rows||={base:4},e.x||={base:0},e.y||={base:this.findLastRow()};let t=new pn(e),n=gn.fromData(t);n.setEmmitter(this.emmitter),this.widgets.push(n)}removeWidget(e){this.widgets=this.widgets.filter((t,n)=>n!==e)}removeWidgetById(e){this.widgets=this.widgets.filter(t=>t.id!==e)}updateWidget(e,t){this.widgets=this.widgets.map((n,r)=>r===e?t:n)}duplicateWidget(e){let t=JSON.parse(JSON.stringify(this.widgets[e]));[...this.widgets].splice(e+1,0,t)}},vn=class e extends mn{static renderer;constructor(){super(),this.name=`Chart`,this.id=`chart`}static setRenderer(t){e.renderer=t}component(){return e.renderer}async chartOptions(e){return{grid:{left:`3%`,right:`4%`,bottom:`3%`,containLabel:!0},title:{text:`ECharts Getting Started Example`},tooltip:{},xAxis:{data:[`shirt`,`cardigan`,`chiffon`,`pants`,`heels`,`socks`]},yAxis:{},series:[{name:`sales`,type:`bar`,data:[5,20,36,10,10,20]}]}}},yn=class extends me(Ue){},bn=class extends me(We){addPagesFolder(e,t){Xt.auto(e,t)}async load(){}};function xn(e,t={}){return Ze(e,t)}function Sn(e){return e}function Cn(e){return e}const wn=E;function Tn(e){return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e.accept||`*/*`,n.multiple=e.multiple||!1,n.onchange=n=>{let r=n.target,i=Array.from(r.files);t(e.multiple?Array.from(i):i[0])},n.oncancel=()=>{t(e.multiple?[]:null)},n.click()})}function En(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{e.target?.result instanceof ArrayBuffer?t(new Uint8Array(e.target.result)):n(Error(`Failed to read file as ArrayBuffer`))},r.onerror=()=>{n(r.error)},r.readAsArrayBuffer(e)})}async function Dn(e){let t=new FormData;return t.append(`file`,e.file),e.directory&&t.append(`directory`,e.directory),wn(`/api/drives/${e.driveId}/upload`,{method:`POST`,body:t,query:{directory:e.directory}})}const On={pick:Tn,upload:Dn,toUint8Array:En};function kn(e){let t=e;for(let[e,n]of Object.entries(Yt.params)){let r=`:${e}`;t=t.replace(r,String(n))}return t}const An=t;function jn(e){let t=e.exclude||[`/auth/login`,`/auth/register`];return n=>{if(!Qt.user&&!t.includes(n.path))return typeof e.redirect==`function`?e.redirect(n):e.redirect}}const Mn=jn({redirect:e=>`/auth/login?redirect=`+encodeURIComponent(e.fullPath)});function Nn(e){return()=>{if(Qt.user)return e.redirect}}const Pn=Nn({redirect:`/`});export{wn as $fetch,On as $file,An as $toast,ge as AuthService,hn as DASHBOARD_ROW_HEIGHT,_n as Dashboard,gn as DashboardWidget,pn as DashboardWidgetData,mn as DashboardWidgetDefinition,vn as DashboardWidgetDefinitionChart,en as DashboardWidgetRegistry,_e as FetchBrowserService,Te as FetchNodeService,w as FetchService,Ge as LayoutService,Ke as LifecycleService,qe as MenuItemEntity,Ye as MenuService,yn as ModuleEntity,bn as PluginEntity,$e as ToastService,sn as VEE_VALIDATE_CONTAINER_KEY,ln as VUE_CONTAINER_KEY,dn as VUE_ROUTER_CONTAINER_KEY,Je as acl,Qt as auth,Mn as authGuard,Ze as auto,xn as autoRoutes,j as config,T as container,jn as createAuthGuard,Nn as createGuestGuard,xe as createId,Qe as createRouter,tn as dashboardRegistry,Sn as defineColumns,Cn as defineFormFields,B as emmitter,W as extracRGB,Dt as extractOKLCH,G as extractRGBA,E as fetcher,Pn as guestGuard,Tt as hexToRGB,K as hslToRgb,Q as layout,nn as lifecycle,rn as logger,an as menu,Ot as oklchToRgb,kn as parseTo,Pt as provideDashboard,Lt as provideDashboardWidget,J as rgbToHex,q as rgbToHsl,Y as rgbToOklch,Et as rgbaToString,Yt as route,Xt as router,Xe as setupGuard,Ut as toTypedSchema,on as toast,wt as useBreakpoints,Mt as useColor,X as useColorType,Ft as useDashboard,Rt as useDashboardWidget,Vt as useFetchPagination,Ht as useForm,At as useHSL,jt as useHex,Kt as useLayoutOptions,qt as useLoading,Jt as useMenu,Z as useRGB,kt as useRGBA,Zt as useRouteQuery,zt as useState,Wt as useValibotForm,cn as veeValidate,un as vue,fn as vueRouter};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiJGZldGNoIiwiQ29ra2llTWFwRW50aXR5IiwiTGlmZWN5Y2xlU2VydmljZSIsIlBlcm1pc3Npb24iLCJzdWJqZWN0IiwiY3JlYXRlU3ViamVjdCIsIkJhc2VFbnRpdHlNaXhpbiIsIkJhc2VFbnRpdHlNaXhpbiIsIkJhc2VFbnRpdHlNaXhpbiIsIk1vZHVsZSIsIlBsdWdpbkVudGl0eSIsIkJhc2VMaWZlY3ljbGVTZXJ2aWNlIiwiY3JlYXRlVnVlUm91dGVyIiwidXNlQnJlYWtwb2ludHMiLCJjb3JlVXNlQnJlYWtwb2ludHMiLCJkaSIsIiRmZXRjaCIsInZlZVZhbGlkYXRlVG9UeXBlZFNjaGVtYSIsInVzZVZlZVZhbGlkYXRlRm9ybSIsIkxheW91dE1hbmFnZXIiLCJ2dWVVc2VyUm91dGVRdWVyeSIsIkJhc2UiLCJCYXNlIiwiJG9yaWdpbmFsIiwidG9hc3QiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GZXRjaFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvZmV0Y2hlci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvY29tcG9zZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9BdXRoU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvRmV0Y2hCcm93c2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mbGF0dGVuLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jcmVhdGVJZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb25maWcudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoTm9kZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy91cmxWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMva2V5VmFsdWVWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvcGFnaW5hdGlvblZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy9pbmRleC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVmFsaWRhdG9yU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvZGFzaGJvYXJkTWV0YVNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy91c2VyU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUGVybWlzc2lvbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQWNsRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlTWV0YUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZVVwbG9hZFNlc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUm9sZUVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9lbW1pdHRlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGF5b3V0U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvTWVudUl0ZW1FbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvYWNsLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9NZW51U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZ3VhcmRzL3NldHVwR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1RvYXN0U2VydmljZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL3NoYXJlZC9kaXN0L2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWV1c2UvY29yZS9kaXN0L2luZGV4LmpzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VCcmVha3BvaW50LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VDb2xvci50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlRGFzaGJvYXJkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VEYXNoYm9hcmRXaWRnZXQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2NvbXBvc2FibGVzL3VzZVN0YXRlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VGZXRjaFBhZ2luYXRpb24udHMiLCIuLi8uLi9zcmMvY2xpZW50L2NvbXBvc2FibGVzL3VzZUZvcm0udHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvbGF5b3V0LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VMYXlvdXRPcHRpb25zLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VMb2FkaW5nLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VNZW51LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3JvdXRlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3JvdXRlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlUm91dGVRdWVyeS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9hdXRoLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9yZWdpc3RyeS9EYXNoYm9hcmRXaWRnZXRSZWdpc3RyeS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9kYXNoYm9hcmRSZWdpc3RyeS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9saWZlY3ljbGUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvbG9nZ2VyLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL21lbnUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvdG9hc3QudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvdmVlVmFsaWRhdGUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvdnVlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3Z1ZVJvdXRlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvRGFzaGJvYXJkV2lkZ2V0RGF0YS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbi50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvRGFzaGJvYXJkV2lkZ2V0LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9EYXNoYm9hcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldERlZmluaXRpb25DaGFydC50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2F1dG9QYWdlcy50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZGVmaW5lQ29sdW1ucy50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZGVmaW5lRm9ybUZpZWxkcy50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZmV0Y2hlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZmlsZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvcGFyc2VUby50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvdG9hc3QudHMiLCIuLi8uLi9zcmMvY2xpZW50L2d1YXJkcy9hdXRoR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2d1YXJkcy9ndWVzdEd1YXJkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImludGVyZmFjZSBUcnllciB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogYW55XG59XG5cbmludGVyZmFjZSBUcnllckFzeW5jIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4gfCBhbnlcbn1cblxudHlwZSBUcnlDYXRjaFJlc3VsdDxUIGV4dGVuZHMgVHJ5ZXI+ID0gW251bGwsIFJldHVyblR5cGU8VD5dIHwgW0Vycm9yLCBudWxsXVxuXG50eXBlIFRyeUNhdGNoQXN5bmNSZXN1bHQ8VCBleHRlbmRzIFRyeWVyQXN5bmM+ID0gW251bGwsIEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj5dIHwgW0Vycm9yLCBudWxsXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCBleHRlbmRzIFRyeWVyQXN5bmM+KHRyeWVyOiBUKTogUHJvbWlzZTxUcnlDYXRjaEFzeW5jUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG5cbnRyeUNhdGNoLnN5bmMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIFRyeWVyPih0cnllcjogVCk6IFRyeUNhdGNoUmVzdWx0PFQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cbiIsImltcG9ydCB7IHRvYXN0IH0gZnJvbSAndnVlLXNvbm5lcidcbmltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGludGVyZmFjZSBGZXRjaE9wdGlvbnMgZXh0ZW5kcyBSZXF1ZXN0SW5pdCB7XG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdGZXRjaFNlcnZpY2UnXG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRXJyb3IocmVzcG9uc2U6IFJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LmluY2x1ZGVzKCdqc29uJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gKHsgbWVzc2FnZTogJHQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpIH0pKVxuXG4gICAgICAgICAgICBpZiAoZGF0YS5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdG9hc3QuZXJyb3IoZGF0YS5tZXNzYWdlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgICB9XG5cbiAgICAgICAgdG9hc3QuZXJyb3IoJHQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiAkdCgnSW50ZXJuYWwgU2VydmVyIEVycm9yJyksXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYnVpbGRVcmwodXJsOiBzdHJpbmcsIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55Pik6IHN0cmluZyB7XG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcXMuc3RyaW5naWZ5KHF1ZXJ5LCB7IGFycmF5Rm9ybWF0OiAnYnJhY2tldHMnIH0pXG5cbiAgICAgICAgcmV0dXJuIHVybCArICc/JyArIHF1ZXJ5U3RyaW5nXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkUmVxdWVzdEluaXQob3B0aW9uczogRmV0Y2hPcHRpb25zKTogUmVxdWVzdEluaXQge1xuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0geyAuLi5vcHRpb25zIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5kYXRhKSB7XG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSlcbiAgICAgICAgICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgIC4uLmZldGNoT3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmV0Y2hPcHRpb25zXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LmluY2x1ZGVzKCdqc29uJykpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxUPlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKSBhcyBQcm9taXNlPFQ+XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KF91cmw6IHN0cmluZywgX29wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRyeTxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyeUNhdGNoKCgpID0+IHRoaXMuZmV0Y2g8VD4odXJsLCBvcHRpb25zKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBwb3N0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcHV0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGU8VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoPFQ+KHVybCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzOiBudW1iZXIgPSA1MDBcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gJ0Jhc2VFeGNlcHRpb24nXG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogQmFzZUV4Y2VwdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUV4Y2VwdGlvbihlcnJvci5tZXNzYWdlLCA1MDApXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBUaGUgY29uc3RydWN0b3IgJHtwYXlsb2FkLm5hbWV9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllci4gQ29uc2lkZXIgYWRkaW5nIGEgc3RhdGljIHByb3BlcnR5IF9fY29udGFpbmVyX2VudHJ5X2tleSB0byBhdm9pZCBwb3RlbnRpYWwgY29uZmxpY3RzLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAga2V5ID0gKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocGF5bG9hZDogRW50cnlLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgdmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBheWxvYWQ6IEVudHJ5S2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocGF5bG9hZDogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEVudHJ5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQgaW4gY29udGFpbmVyLmApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChwYXlsb2FkOiBFbnRyeUtleSk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBzaW5nbGV0b248VD4oY2xhc3NDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4pOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2xhc3NDb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXNzQ29uc3RydWN0b3IoKVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgbmV3SW5zdGFuY2UpXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZW50cmllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eTxUID0gdW5rbm93bj4oa2V5OiBFbnRyeUtleSk6IFQge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50cnlbcHJvcF1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZW50cnkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5W3Byb3BdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiAoX3RhcmdldCwgcHJvcCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBlbnRyeVtwcm9wXSA9IHZhbHVlXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGtleXMoKTogRW50cnlLZXlbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5rZXlzKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbnRhaW5lclNlcnZpY2UgZnJvbSBcIiNzaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50c1wiO1xuXG5jb25zdCBjb250YWluZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNsaWVudENvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG5cbmdsb2JhbFRoaXMuY2xpZW50Q29udGFpbmVyID0gY29udGFpbmVyXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRhaW5lciBhcyBDb250YWluZXJTZXJ2aWNlXG4iLCJpbXBvcnQgRmV0Y2hTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgZmV0Y2hlciA9IGNvbnRhaW5lci5wcm94eTxGZXRjaFNlcnZpY2U+KEZldGNoU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgZmV0Y2hlclxuIiwiaW1wb3J0IHR5cGUgeyBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi90eXBpbmcudHMnXG5cbmV4cG9ydCB0eXBlIEFueUNsYXNzID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+XG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgbWl4aW5zIGludG8gYSBzaW5nbGUgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQuXG4gKiBBbGxvd3MgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLWxpa2UgYmVoYXZpb3IgYnkgYXBwbHlpbmcgbWl4aW5zIHNlcXVlbnRpYWxseS5cbiAqIFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgaW5jbHVkZXMgYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2U8XG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3Rvcjxhbnk+KSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGNsYXNzIHt9IGFzIGFueSkgYXMgYW55XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgY29tcG9zZSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYmFzZSBjbGFzc1xuICogXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2VFbnRpdHksIFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VXaXRoPFxuICAgIFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3IsXG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oXG4gICAgYmFzZUNsYXNzOiBUQmFzZSxcbiAgICAuLi5taXhpbnM6IE1cbik6IFRCYXNlICYgVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBiYXNlQ2xhc3MgYXMgYW55KSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KFNvdXJjZTogVEJhc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSB7XG4gICAgICAgIGNsYXNzIE1peGVkIGV4dGVuZHMgVGFyZ2V0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IG1ldGhvZHNcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKFNvdXJjZS5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBNaXhlZC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTb3VyY2UucHJvdG90eXBlLCBrZXkpIVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNaXhlZCBhcyBUVGFyZ2V0ICYgVEJhc2VcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5pbnRlcmZhY2UgQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMge1xuICAgIHBhcnNlPzogKGRhdGE6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYXNlRW50aXR5KG9wdGlvbnM6IENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gb3B0aW9ucy5wYXJzZShkYXRhKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAoY29udHJ1Y3RvciBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMgYXMgYW55KT8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKHRoaXMgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRpbWVzdGFtcE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgY3JlYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgICAgICBwdWJsaWMgdXBkYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNvZnREZWxldGVNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGRlbGV0ZWRfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgUm9sZSBmcm9tICcuL1JvbGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGVtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHVzZXJuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbFxuXG4gICAgcHVibGljIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdXG4gICAgcHVibGljIHJvbGVzPzogUm9sZVtdXG5cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxzKCl7XG4gICAgICAgIGNvbnN0IFtmaXJzdE5hbWUsIHNlY29uZE5hbWVdID0gdGhpcy5uYW1lLnNwbGl0KCcgJylcblxuICAgICAgICBpZiAoIXNlY29uZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIGNvbnN0IGIgPSBzZWNvbmROYW1lWzBdLnRvVXBwZXJDYXNlKClcblxuICAgICAgICByZXR1cm4gYSArIGJcbiAgICB9XG59XG4iLCJpbXBvcnQgJGZldGNoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzJ1xuaW1wb3J0IFVzZXIgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzJ1xuXG5pbnRlcmZhY2UgTG9nb3V0T3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0F1dGhTZXJ2aWNlJ1xuICAgIHB1YmxpYyB1c2VyOiBVc2VyIHwgbnVsbFxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBdXRoU2VydmljZT4gPSB7fSkge1xuICAgICAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXIgfHwgbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2dvdXQob3B0aW9ucz86IExvZ291dE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0ICRmZXRjaC50cnkoJy9hdXRoL2xvZ291dCcsIHsgbWV0aG9kOiAnUE9TVCcgfSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBvcHRpb25zPy5yZWRpcmVjdCB8fCAnLydcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEZldGNoT3B0aW9ucyB9IGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hCcm93c2VyU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5oYW5kbGVFcnJvcihyZXNwb25zZSlcblxuICAgICAgICAgICAgdGhyb3cgcmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG5cbiAgICAgICAgcmV0dXJuIHBhcnNlZFxuICAgIH1cbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29va2llTWFwRW50aXR5T3B0aW9ucyB7XG4gICAgY29va2llcz86IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwcmVmaXg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29va2llTWFwRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb29raWVNYXBFbnRpdHknXG5cbiAgICBwdWJsaWMgY29va2llczogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBwcmVmaXg6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IENvb2tpZU1hcEVudGl0eU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb29raWVzID0gZGF0YT8uY29va2llcyB8fCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIHRoaXMucHJlZml4ID0gZGF0YT8ucHJlZml4IHx8ICcnXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IE1hcDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICAgICAgaWYgKGNvb2tpZXMgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb29raWVzKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb29raWVzW2tleV0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvb2tpZXMuZ2V0KGZ1bGxOYW1lKSB8fCBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2Ugd2FudCB0byBhbGxvdyBhbnkgb3B0aW9ucyB0byBiZSBwYXNzZWQgaGVyZSwgYXMgdGhleSBtYXkgYmUgdXNlZCBieSB0aGUgdW5kZXJseWluZyBjb29raWVcbiAgICAvLyAgZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgdGhpcy5jb29raWVzLnNldChmdWxsTmFtZSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCh0aGlzLnByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1bnByZWZpeGVkS2V5ID0ga2V5LnNsaWNlKHRoaXMucHJlZml4Lmxlbmd0aClcblxuICAgICAgICAgICAgICAgIHJlc3VsdFt1bnByZWZpeGVkS2V5XSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbihvYmo6IGFueSwgcHJlZml4ID0gJycsIHJlczogYW55ID0ge30pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGNvbnN0IGlzSW5kZXggPSAvXlxcZCskLy50ZXN0KGtleSlcbiAgICAgICAgY29uc3QgbmV3S2V5ID0gaXNJbmRleCA/IGAke3ByZWZpeH1bJHtrZXl9XWAgOiBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXlcblxuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZmxhdHRlbih2YWx1ZSwgbmV3S2V5LCByZXMpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzW25ld0tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIHJldHVybiByZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuZmxhdHRlbihvYmo6IGFueSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBzZXQocmVzdWx0LCBrZXksIHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG59XG4iLCJmdW5jdGlvbiB1dWlkKCl7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5jcnlwdG8gJiYgc2VsZi5jcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gc2VsZi5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvICYmIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gd2luZG93LmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgY3J5cHRvLnJhbmRvbVVVSURcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwXG4gICAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4XG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJZChwcmVmaXggPSAnJykge1xuICAgIHJldHVybiBwcmVmaXggKyB1dWlkKClcbn0iLCJpbXBvcnQgeyBnZXQsIHNldCwgaGFzLCB1bnNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi91dGlscydcblxuaW50ZXJmYWNlIEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHZhbHVlOiBhbnlcbiAgICBzb3VyY2U6IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb25maWdTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIEVudHJ5PlxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXAoKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmVuZHNXaXRoKCc6Ym9vbGVhbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnOmJvb2xlYW4nLCAnJykudHJpbSgpID09PSAndHJ1ZSdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdLCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBlbnRyeS52YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IHRydWUgOiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzKHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUID0gYW55IHwgdW5kZWZpbmVkPihrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkudmFsdWUgYXMgVFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnkudmFsdWUgOiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldCh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCBkZWZhdWx0VmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPbmU8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5czogc3RyaW5nW10sIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldDxUPihrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ3J1bnRpbWUnKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBsZXQgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcHJpbWFyeVZhbHVlID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIHNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgdmFsdWUpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZXQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAoIXByaW1hcnlWYWx1ZSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB1bnNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogJ3J1bnRpbWUnLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKClcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVtcCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW4odGhpcy50b1JlY29yZCgpKVxuICAgIH1cbn1cbiIsImltcG9ydCBDb25maWdTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGNvbmZpZyA9IGNvbnRhaW5lci5wcm94eTxDb25maWdTZXJ2aWNlPihDb25maWdTZXJ2aWNlKVxuXG5pZiAoaW1wb3J0Lm1ldGEuZW52LkRFVikge1xuICAgIGdsb2JhbFRoaXMuY29uZmlnID0gY29uZmlnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZ1xuIiwiaW1wb3J0IHFzIGZyb20gJ3FzJyBcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUGFyYW1zKHJvdXRlUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgIGNvbnN0IHJvdXRlU2VnbWVudHMgPSByb3V0ZVBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCByZXF1ZXN0U2VnbWVudHMgPSByZXF1ZXN0UGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlU2VnbWVudCA9IHJvdXRlU2VnbWVudHNbaV1cbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSByZXF1ZXN0U2VnbWVudHNbaV1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcm91dGVTZWdtZW50LnNsaWNlKDEpIC8vIFJlbW92ZSB0aGUgJzonIHByZWZpeFxuICAgICAgICAgICAgcGFyYW1zW3BhcmFtTmFtZV0gPSByZXF1ZXN0U2VnbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudCA9PT0gJyonKSB7XG4gICAgICAgICAgICAvLyBDYXB0dXJlIGFsbCByZW1haW5pbmcgc2VnbWVudHMgYXMgYSBzaW5nbGUgcGF0aFxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSByZXF1ZXN0U2VnbWVudHMuc2xpY2UoaSlcbiAgICAgICAgICAgIHBhcmFtc1snKiddID0gcmVtYWluaW5nU2VnbWVudHMuam9pbignLycpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxRdWVyeShyZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcmVxdWVzdFBhdGguc3BsaXQoJz8nKVsxXVxuXG4gICAgaWYgKCFxdWVyeVN0cmluZykge1xuICAgICAgICByZXR1cm4gcXVlcnlcbiAgICB9XG5cbiAgICByZXR1cm4gcXMucGFyc2UocXVlcnlTdHJpbmcpXG59XG4iLCJpbXBvcnQgdHlwZSB7IEZldGNoT3B0aW9ucyB9IGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBDb2traWVNYXBFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb25maWcudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgeyBwYXJzZVVybFBhcmFtcywgcGFyc2VVcmxRdWVyeSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvcGFyc2VSb3V0ZVVybC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hOb2RlU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBpc0ludGVybmFsID0gIXVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXVybC5zdGFydHNXaXRoKCdodHRwczovLycpXG5cbiAgICAgICAgaWYgKCFpc0ludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEV4dGVybmFsPFQ+KHVybCwgb3B0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoSW50ZXJuYWw8VD4odXJsLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBmZXRjaEV4dGVybmFsPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGZldGNoSW50ZXJuYWw8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHJvdXRlciA9ICBjb250YWluZXIuZ2V0PGFueT4oJ1JvdXRlclNlcnZpY2UnKVxuICAgICAgICBjb25zdCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCAnR0VUJ1xuICAgICAgICBjb25zdCByb3V0ZSA9IHJvdXRlci5yZXNvbHZlKG1ldGhvZCwgdXJsKVxuICAgICAgICBjb25zdCBjb29raWUgPSBuZXcgQ29ra2llTWFwRW50aXR5KHtcbiAgICAgICAgICAgIHByZWZpeDogY29uZmlnLmdldCgnY29va2llLnByZWZpeCcsICcnKVxuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgaWYgKGNvbnRhaW5lci5oYXMoJ2Nvb2tpZXMnKSkge1xuICAgICAgICAgICAgY29va2llLmxvYWQoY29udGFpbmVyLmdldDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PignY29va2llcycpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyb3V0ZSB8fCAhcm91dGUuaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0ZSBub3QgZm91bmQgZm9yICR7bWV0aG9kfSAke3VybH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcm91dGVyLmV4ZWN1dGUocm91dGUsIHtcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgcGFyYW1zOiBwYXJzZVVybFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpLFxuICAgICAgICAgICAgcXVlcnk6IG9wdGlvbnMucXVlcnkgfHwgcGFyc2VVcmxRdWVyeSh1cmwpLFxuICAgICAgICAgICAgYm9keTogb3B0aW9ucy5kYXRhIHx8IG9wdGlvbnMuYm9keSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBjb29raWU6IGNvb2tpZVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiByZXN1bHQgYXMgUHJvbWlzZTxUPlxuICAgIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG4vLyBAdHMtbm9jaGVja1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dnZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMb2dnZXJTZXJ2aWNlJyBcblxuICAgIHB1YmxpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZXJyb3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cblxuICAgIHB1YmxpYyBjaGlsZChvcHRpb25zOiBhbnkpOiBMb2dnZXJTZXJ2aWNlIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgICAgICByZXR1cm4gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgY3JlYXRlSWQsIHRyeUNhdGNoIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXgudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1taXR0ZXJMaXN0ZW5lck9wdGlvbnMge1xuICAgIGV2ZW50OiBzdHJpbmdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRW1taXR0ZXJMaXN0ZW5lciB7XG4gICAgKGRhdGE6IGFueSwgb3B0aW9uczogRW1taXR0ZXJMaXN0ZW5lck9wdGlvbnMpOiB2b2lkXG59XG5cbmludGVyZmFjZSBFbW1pdHRlckhhbmRsZXIge1xuICAgIGlkOiBzdHJpbmdcbiAgICBldmVudDogc3RyaW5nXG4gICAgbGlzdGVuZXI6IEVtbWl0dGVyTGlzdGVuZXJcbiAgICBvcmlnaW5hbExpc3RlbmVyPzogRW1taXR0ZXJMaXN0ZW5lclxufVxuXG5pbnRlcmZhY2UgT25PcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIHVuaXF1ZT86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIE9uRGVib3VuY2VPcHRpb25zIGV4dGVuZHMgT25PcHRpb25zIHtcbiAgICBkZWJvdW5jZT86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVtbWl0dGVyU2VydmljZU9wdGlvbnMge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW1taXR0ZXJTZXJ2aWNlPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRW1taXR0ZXJTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IgKG9wdGlvbnM/OiBFbW1pdHRlclNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zPy5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnM/LmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbW1pdHRlciBsb2FkZWQgd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGU8RXZlbnRzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KG9wdGlvbnM/OiBFbW1pdHRlclNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgRW1taXR0ZXJTZXJ2aWNlPEV2ZW50cz4ob3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGVidWcoZGVidWc6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdkZWJ1ZyBtb2RlIGVuYWJsZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgb248SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaWQgPSBvcHRpb25zPy5pZCB8fCBjcmVhdGVJZCgpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnVuaXF1ZSkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gdGhpcy5oYW5kbGVycy5zb21lKGggPT4gKGguZXZlbnQgPT09IGV2ZW50ICYmIGgubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB8fCBoLmlkID09PSBpZClcblxuICAgICAgICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcjogRW1taXR0ZXJIYW5kbGVyID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIGxpc3RlbmVyXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZXJzLnB1c2goaGFuZGxlcilcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXIgYWRkZWQnLCBoYW5kbGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IChhcmdzOiBhbnksIG9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIoYXJncywgb3B0aW9ucylcblxuICAgICAgICAgICAgdGhpcy5vZmYoZXZlbnQsIHdyYXBwZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vbihldmVudCwgd3JhcHBlciBhcyBhbnksIG9wdGlvbnMpXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgb25EZWJvdW5jZTxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbkRlYm91bmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZGVib3VuY2VkID0gZGVib3VuY2UobGlzdGVuZXIsIG9wdGlvbnM/LmRlYm91bmNlIHx8IDMwMClcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vbihldmVudCwgZGVib3VuY2VkIGFzIGFueSwgb3B0aW9ucylcblxuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlci5vcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uQW55T2Y8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnRzOiBLW10sIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyW11cbiAgICBwdWJsaWMgb25BbnlPZihldmVudHM6IHN0cmluZ1tdLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBoYW5kbGVyczogRW1taXR0ZXJIYW5kbGVyW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vbihldmVudCwgbGlzdGVuZXIgYXMgYW55LCBvcHRpb25zKVxuXG4gICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1c2goaGFuZGxlcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiB7XG4gICAgICAgICAgICBpZiAoaC5ldmVudCA9PT0gZXZlbnQgJiYgKGgubGlzdGVuZXIgPT09IGxpc3RlbmVyIHx8IGgub3JpZ2luYWxMaXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVyIHJlbW92ZWQnLCB7IGV2ZW50IH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgYXJnczogRXZlbnRzW0tdKTogdm9pZFxuICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpOiB2b2lkXG4gICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSkge1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1pdHRpbmcgZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgYXJnc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHRyeUNhdGNoLnN5bmMoKCkgPT4gaGFuZGxlci5saXN0ZW5lcihhcmdzLCB7IGV2ZW50IH0pKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBhcmdzOiBFdmVudHNbS10pOiBQcm9taXNlPHZvaWQ+XG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpOiBQcm9taXNlPHZvaWQ+XG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1pdHRpbmcgZXZlbnQgYW5kIHdhaXQnLCB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyLmxpc3RlbmVyKGFyZ3MsIHsgZXZlbnQgfSlcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3RCeUV2ZW50KGV2ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZShwYXlsb2FkOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+ICFpZHMuaW5jbHVkZXMoaC5pZCkpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVycyByZW1vdmVkJywgeyBpZHMgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IFtdXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhbGwgaGFuZGxlcnMgY2xlYXJlZCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzSGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCA+IDBcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVIb29rIHtcbiAgICBwdWJsaWMgaG9va19pZDogc3RyaW5nXG4gICAgcHVibGljIGhvb2tfYWxpYXNlcz86IHN0cmluZ1tdXG4gICAgcHVibGljIG9yZGVyPzogbnVtYmVyXG4gICAgcHVibGljIHN1Ymhvb2tzPzogTGlmZWN5Y2xlSG9va1tdXG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHJlZ2lzdGVyICovXG4gICAgcHVibGljIGFzeW5jIG9uUmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGxvYWQgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Mb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBib290ICovXG4gICAgcHVibGljIGFzeW5jIG9uQm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Ugc2h1dGRvd24gKi9cbiAgICBwdWJsaWMgYXN5bmMgb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG59XG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbnR5cGUgTGlmZWN5Y2xlTWV0aG9kID0gJ3JlZ2lzdGVyJyB8ICdsb2FkJyB8ICdib290JyB8ICdzaHV0ZG93bidcblxuaW50ZXJmYWNlIExpc3RPcHRpb25zIHtcbiAgICBpbmNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBleGNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgaG9va3M/OiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMaWZlY3ljbGVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhvb2tzOiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuaG9va3MgPSBkYXRhLmhvb2tzID8/IG5ldyBNYXAoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgXG4gICAgICAgIGlmIChkYXRhLm9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvciA9IGRhdGEub25FcnJvclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldE9uRXJyb3IoaGFuZGxlcjogUmVxdWlyZWQ8TGlmZWN5Y2xlU2VydmljZU9wdGlvbnM+WydvbkVycm9yJ10pIHtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gaGFuZGxlclxuICAgIH1cblxuXG4gICAgcHVibGljIG9uRXJyb3IoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY29udGV4dCB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBob29rICR7Y29udGV4dC5tZXRob2R9ICgke2NvbnRleHQuaG9va0lkfSk6YCwgZXJyb3IpXG4gICAgfVxuXG4gICAgcHVibGljIG1hcEFsaWFzZXMoYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IGFsbCA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYWxsKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLmhvb2tfYWxpYXNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRBbGlhcyA9IGhvb2suaG9va19hbGlhc2VzLmZpbmQoYWxpYXMgPT4gYXJncy5pbmNsdWRlcyhhbGlhcykpXG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Qob3B0aW9ucz86IExpc3RPcHRpb25zKSB7XG4gICAgICAgIGxldCBob29rcyA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhjbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5leGNsdWRlKSA/IG9wdGlvbnMuZXhjbHVkZSA6IFtvcHRpb25zLmV4Y2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gIWlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZSkgPyBvcHRpb25zLmluY2x1ZGUgOiBbb3B0aW9ucy5pbmNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+IGlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MgPSBvcmRlckJ5KGhvb2tzLCBbJ29yZGVyJ10sIFsnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGhvb2tzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCguLi5wYXlsb2FkOiAoTGlmZWN5Y2xlSG9vayB8IENvbnN0cnVjdG9yPExpZmVjeWNsZUhvb2s+KVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF5bG9hZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2gobmV3IGl0ZW0oKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZXMucHVzaChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGluc3RhbmNlcykge1xuICAgICAgICAgICAgaWYgKCFob29rLmhvb2tfaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdTa2lwcGluZyBob29rIHdpdGhvdXQgaG9va19pZDonLCBob29rKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaG9va3Muc2V0KGhvb2suaG9va19pZCwgaG9vaylcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWRkICcgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLnN1Ymhvb2tzKSB7XG4gICAgICAgICAgICAgICAgaG9vay5zdWJob29rcy5mb3JFYWNoKHN1Ymhvb2sgPT4gdGhpcy5hZGQoc3ViaG9vaykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdE1ldGhvZChtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5saXN0KG9wdGlvbnMpIFxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgZW1pdHRpbmcgJHttZXRob2R9IGZvciBob29rczpgLCB7XG4gICAgICAgICAgICAgICAgaG9va3M6IGhvb2tzLm1hcChob29rID0+IGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5saXN0KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXI6ICgpID0+IFByb21pc2UuYWxsKFtob29rLnJlZ2lzdGVyKCksIGhvb2sub25SZWdpc3RlcigpXSksXG4gICAgICAgICAgICAgICAgbG9hZDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2subG9hZCgpLCBob29rLm9uTG9hZCgpXSksXG4gICAgICAgICAgICAgICAgYm9vdDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suYm9vdCgpLCBob29rLm9uQm9vdCgpXSksXG4gICAgICAgICAgICAgICAgc2h1dGRvd246ICgpID0+IFByb21pc2UuYWxsKFtob29rLnNodXRkb3duKCksIGhvb2sub25TaHV0ZG93bigpXSksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBtYXBbbWV0aG9kXSgpKVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IsIHsgaG9va0lkOiBob29rLmhvb2tfaWQsIG1ldGhvZCB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7bWV0aG9kfSBgICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQocGF5bG9hZDogTGlmZWN5Y2xlTWV0aG9kIHwgTGlmZWN5Y2xlTWV0aG9kW10sIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtZXRob2RzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRNZXRob2QobWV0aG9kLCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uKG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kLCBoYW5kbGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGggPSBuZXcgTGlmZWN5Y2xlSG9vaygpXG5cbiAgICAgICAgaC5ob29rX2lkID0gYGN1c3RvbToke21ldGhvZH06JHtEYXRlLm5vdygpfWBcblxuICAgICAgICBoW21ldGhvZF0gPSBoYW5kbGVyXG5cbiAgICAgICAgdGhpcy5hZGQoaClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3JlZ2lzdGVyJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnbG9hZCcsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJvb3Qob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Jvb3QnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzaHV0ZG93bicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvb2tzLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCB7IGdldCwgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0IHFzIGZyb20gJ3FzJ1xuXG5leHBvcnQgY29uc3QgbnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYubnVtYmVyKCldKSxcbiAgICB2LnRyYW5zZm9ybShOdW1iZXIpLFxuICAgIHYuaW50ZWdlcigpLFxuKVxuXG5leHBvcnQgY29uc3QgYm9vbGVhbiA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmJvb2xlYW4oKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiA9PT0gdHJ1ZSB8fCB2ID09PSAndHJ1ZScpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZSA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmRhdGUoKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiBpbnN0YW5jZW9mIERhdGUgPyB2IDogbmV3IERhdGUodikpLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiA/IGZvcm1hdCh2LCAneXl5eS1NTS1kZCcpIDogdiksXG4pXG5cbmV4cG9ydCBjb25zdCBkYXRldGltZSA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmRhdGUoKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4ge1xuICAgICAgICBpZiAoIXYpIHJldHVybiB2XG5cbiAgICAgICAgaWYgKHYgPT09ICdudWxsJykgcmV0dXJuIG51bGxcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gbmV3IERhdGUodilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQodiwgJ3l5eXktTU0tZGQgSEg6bW0nKVxuICAgIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgYXJyYXkgPSA8VCBleHRlbmRzIHYuQmFzZVNjaGVtYTxhbnksIGFueSwgYW55Pj4oc2NoZW1hOiBUID0gdi5hbnkoKSBhcyBhbnkgYXMgVCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuYXJyYXkodi5zdHJpbmcoKSldKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogdmFsdWUuc3BsaXQoJywnKSksXG4gICAgdi5hcnJheShzY2hlbWEpLFxuKVxuXG5leHBvcnQgY29uc3QgYXJyYXlOdW1iZXIgPSAoKSA9PiB2LnBpcGUoXG4gICAgYXJyYXkoKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB2YWx1ZS5tYXAoTnVtYmVyKSksXG4pXG5cbmV4cG9ydCBjb25zdCBvYmplY3QgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5yZWNvcmQodi5zdHJpbmcoKSwgdi5hbnkoKSldKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gcXMucGFyc2UodmFsdWUpIDogdmFsdWUpLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgc2V0KHJlc3VsdCwga2V5LCBnZXQodmFsdWUsIGtleSkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSksXG4pXG5cbmV4cG9ydCBmdW5jdGlvbiB1cmwoKSB7XG4gICAgcmV0dXJuIG9iamVjdCgpXG59XG5cbnVybC5udW1iZXIgPSBudW1iZXJcbnVybC5ib29sZWFuID0gYm9vbGVhbiBcbnVybC5kYXRlID0gZGF0ZSBcbnVybC5kYXRldGltZSA9IGRhdGV0aW1lXG51cmwuYXJyYXkgPSBhcnJheVxudXJsLmFycmF5TnVtYmVyID0gYXJyYXlOdW1iZXJcbnVybC5vYmplY3QgPSBvYmplY3RcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCcgXG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBjb25zdCBrZXlWYWx1ZSA9ICgpID0+IHYucGlwZSh2LnN0cmluZygpLCB2LnRyYW5zZm9ybSgodmFsdWUpID0+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gdmFsdWUuc3BsaXQoL1s7XFxuXS8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmZpbHRlcihsID0+IGwuaW5jbHVkZXMoJz0nKSlcbiAgICAgICAgLm1hcChsID0+IGwudHJpbSgpLnNwbGl0KCc9JykpXG5cbiAgICBjb25zdCBvYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcykgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgbGV0IHBhcnNlZFZhbHVlOiBhbnkgPSB2YWx1ZVxuXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdib29sOicpKSB7XG4gICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ2Jvb2w6JywgJycpLnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICBzZXQocmVzdWx0LCBrZXksIHBhcnNlZFZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn0pKVxuIiwiaW1wb3J0IHsgbnVtYmVyLCBhcnJheSB9IGZyb20gJy4vdXJsVmFsaWRhdG9yLnRzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25QYXJhbXMge1xuICAgIG1heExpbWl0PzogbnVtYmVyXG4gICAgb3JkZXJGaWVsZHM/OiBzdHJpbmdbXVxufVxuXG5cbmV4cG9ydCBjb25zdCBiYXNlID0gKG9wdGlvbnM6IFBhZ2luYXRpb25QYXJhbXMgPSB7fSkgPT4gdi5vYmplY3Qoe1xuICAgIHBhZ2U6IHYub3B0aW9uYWwobnVtYmVyKCksIDEpLFxuICAgIGxpbWl0OiB2Lm9wdGlvbmFsKG51bWJlcigpLCBvcHRpb25zLm1heExpbWl0IHx8IDEwMCksXG4gICAgb3JkZXJCeTogdi5udWxsaXNoKG9wdGlvbnMub3JkZXJGaWVsZHMgPyBhcnJheSh2LnBpY2tsaXN0KG9wdGlvbnMub3JkZXJGaWVsZHMpKSA6IGFycmF5KHYuc3RyaW5nKCkpLCBbXSksXG4gICAgb3JkZXJEaXJlY3Rpb246IHYubnVsbGlzaChhcnJheSh2LnVuaW9uKFt2LmxpdGVyYWwoJ2FzYycpLCB2LmxpdGVyYWwoJ2Rlc2MnKV0pKSwgW10pLFxufSlcblxuZXhwb3J0IGZ1bmN0aW9uIHBhZ2luYXRpb24ob3B0aW9uczogUGFnaW5hdGlvblBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIGJhc2Uob3B0aW9ucylcbn1cblxucGFnaW5hdGlvbi5iYXNlID0gYmFzZVxuIiwiZXhwb3J0ICogZnJvbSAnLi91cmxWYWxpZGF0b3IudHMnXG5leHBvcnQgKiBmcm9tICcuL2tleVZhbHVlVmFsaWRhdG9yLnRzJ1xuZXhwb3J0ICogZnJvbSAnLi9wYWdpbmF0aW9uVmFsaWRhdG9yLnRzJ1xuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0ICogYXMgZXh0cmFzIGZyb20gJyNzaGFyZWQvdmFsaWRhdG9ycy9pbmRleC50cydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJy4uL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IHR5cGUgVmFsaWJvdCA9IHR5cGVvZiB2ICYgeyBleHRyYXM6IHR5cGVvZiBleHRyYXMgfVxuXG5leHBvcnQgdHlwZSBWYWxpYm90U2NoZW1hID0gdi5CYXNlU2NoZW1hPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuZXhwb3J0IHR5cGUgVmFsaWJvdE9iamVjdFNjaGVtYSA9IHYuT2JqZWN0U2NoZW1hPGFueSwgYW55PlxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYUFzeW5jID0gdi5CYXNlU2NoZW1hQXN5bmM8dW5rbm93biwgdW5rbm93biwgdi5CYXNlSXNzdWU8dW5rbm93bj4+XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yQ2FsbGJhY2s8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+IHtcbiAgICAoX3Y6IFZhbGlib3QpOiBUXG59XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvckNhbGxiYWNrQXN5bmM8VCBleHRlbmRzIFZhbGlib3RTY2hlbWFBc3luYz4gPSB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JSZXN1bHQ8VCBleHRlbmRzIHYuQmFzZVNjaGVtYTxhbnksIGFueSwgYW55Pj4gPSB2LkluZmVyT3V0cHV0PFQ+XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRlUGF5bG9hZDxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA9IFZhbGlib3RTY2hlbWE+ID0gVmFsaWRhdG9yQ2FsbGJhY2s8VD4gfCBUXG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRlUmVzdWx0PFQgZXh0ZW5kcyBWYWxpZGF0ZVBheWxvYWQ+ID1cbiAgICBUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA/IHYuSW5mZXJPdXRwdXQ8VD4gOlxuICAgIFQgZXh0ZW5kcyBWYWxpZGF0b3JDYWxsYmFjazxpbmZlciBVPiA/IHYuSW5mZXJPdXRwdXQ8VT4gOlxuICAgIHVua25vd25cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYWxpZGF0b3JTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdWYWxpZGF0b3JTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHY6IFZhbGlib3QgPSB7XG4gICAgICAgIC4uLnYsXG4gICAgICAgIGV4dHJhcyxcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihjYjogVmFsaWRhdG9yQ2FsbGJhY2s8VD4pIHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMudilcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGU8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPikge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSB2LnNhZmVQYXJzZShzY2hlbWEsIHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gW10gYXMgc3RyaW5nW11cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ucm9vdCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4uZmxhdHRlbi5yb290KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmxhdHRlbi5uZXN0ZWQpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhmbGF0dGVuLm5lc3RlZCkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnkgYXMgW3N0cmluZywgc3RyaW5nW11dXG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCguLi52YWx1ZS5tYXAoKHYpID0+IGAke2tleX06ICR7dn1gKSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXMubGVuZ3RoID8gbWVzc2FnZXMuam9pbignLCAnKSA6ICdWYWxpZGF0aW9uIGZhaWxlZCdcblxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQmFzZUV4Y2VwdGlvbihtZXNzYWdlLCA0MjIpXG5cbiAgICAgICAgICAgIGVycm9yLm5hbWUgPSAnVmFsaWRhdGlvbkVycm9yJ1xuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IG1lc3NhZ2VzLCB9KVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUFzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRvckNhbGxiYWNrQXN5bmM8VD4gfCBUKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgb3V0cHV0LCBpc3N1ZXMsIHN1Y2Nlc3MgfSA9IGF3YWl0IHYuc2FmZVBhcnNlQXN5bmMoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1ZhbGlkYXRpb24gZmFpbGVkJylcbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW4gPSB2LmZsYXR0ZW4oaXNzdWVzKVxuICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgICAuLi5mbGF0dGVuLnJvb3QsXG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5uZXN0ZWQsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZGV0YWlscywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWYWxpZDxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4ocGF5bG9hZDogYW55LCBjYjogVmFsaWRhdGVQYXlsb2FkPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfVxufVxuXG4iLCJpbXBvcnQgVmFsaWRhdG9yU2VydmljZSBmcm9tIFwiLi4vc2VydmljZXMvVmFsaWRhdG9yU2VydmljZVwiXG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yU2VydmljZSgpXG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRvclxuIiwiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JSZXN1bHQgfSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMnXG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJyNzaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMnXG5cblxuZXhwb3J0IHR5cGUgRGFzaGJvYXJkTWV0YVNjaGVtYSA9IFZhbGlkYXRvclJlc3VsdDxSZXR1cm5UeXBlPHR5cGVvZiBkYXNoYm9hcmRNZXRhU2NoZW1hPj5cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZE1ldGFTY2hlbWEoKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGUodiA9PiB2Lm9iamVjdCh7XG4gICAgICAgIGlkOiB2Lm51bWJlcigpLFxuICAgICAgICBkYXNoYm9hcmRfaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYuc3RyaW5nKCksXG4gICAgICAgIHZhbHVlOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIH0pKVxufVxuXG5kYXNoYm9hcmRNZXRhU2NoZW1hLmNyZWF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBpY2soZGFzaGJvYXJkTWV0YVNjaGVtYSgpLCBbJ2Rhc2hib2FyZF9pZCcsICduYW1lJywgJ3ZhbHVlJ10pKVxuXG5kYXNoYm9hcmRNZXRhU2NoZW1hLnVwZGF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBhcnRpYWwoZGFzaGJvYXJkTWV0YVNjaGVtYS5jcmVhdGUpKVxuIiwiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JSZXN1bHQgfSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMnXG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJyNzaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMnXG5cbmV4cG9ydCB0eXBlIERhc2hib2FyZFNjaGVtYSA9IFZhbGlkYXRvclJlc3VsdDxSZXR1cm5UeXBlPHR5cGVvZiBkYXNoYm9hcmRTY2hlbWE+PlxuXG5leHBvcnQgZnVuY3Rpb24gZGFzaGJvYXJkU2NoZW1hKCkge1xuICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5vYmplY3Qoe1xuICAgICAgICBpZDogdi5udW1iZXIoKSxcbiAgICAgICAgbmFtZTogdi5zdHJpbmcoKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlbGV0ZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG5cbiAgICAgICAgbWV0YXM6IHYub3B0aW9uYWwodi5yZWNvcmQodi5zdHJpbmcoKSwgdi5hbnkoKSkpLFxuICAgIH0pKVxufVxuXG5kYXNoYm9hcmRTY2hlbWEuY3JlYXRlID0gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYucGljayhkYXNoYm9hcmRTY2hlbWEoKSwgWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ10pKVxuXG5kYXNoYm9hcmRTY2hlbWEudXBkYXRlID0gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYucGFydGlhbChkYXNoYm9hcmRTY2hlbWEuY3JlYXRlKSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbkFzc2lnbm1lbnQgPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHBlcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIHBlcm1pc3Npb25faWQ6IHYubnVtYmVyKCksXG4gICAgYXNzaWduYWJsZV90eXBlOiB2LnN0cmluZygpLFxuICAgIGFzc2lnbmFibGVfaWQ6IHYuc3RyaW5nKCksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHBlcm1pc3Npb25TY2hlbWE+XG5cbmV4cG9ydCBjb25zdCBwZXJtaXNzaW9uU2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIG5hbWU6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgZGVzY3JpcHRpb246IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgYWN0aW9uOiB2LnN0cmluZygpLFxuICAgIHN1YmplY3Q6IHYuc3RyaW5nKCksXG4gICAgY29uZGl0aW9uczogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgZXhwaXJlc19hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFRva2VuID0gdi5JbmZlck91dHB1dDx0eXBlb2YgdG9rZW5TY2hlbWE+XG5cbmV4cG9ydCBjb25zdCB0b2tlblNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBuYW1lOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIHR5cGU6IHYuc3RyaW5nKCksXG4gICAgdXNlcl9pZDogdi5udW1iZXIoKSxcbiAgICB0b2tlbjogdi5zdHJpbmcoKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgZXhwaXJlc19hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmZ1bmN0aW9uIHVzZXJTY2hlbWEoKSB7XG4gICAgcmV0dXJuIHYub2JqZWN0KHtcbiAgICAgICAgaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgICAgIGVtYWlsOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5lbWFpbCgpKSxcbiAgICAgICAgcGFzc3dvcmQ6IHYucGlwZSh2LnN0cmluZygpLCB2Lm1pbkxlbmd0aCg2KSksXG4gICAgICAgIHVzZXJuYW1lOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5yZWdleCgvXlthLXpBLVowLTlfLV0rJC8pKSxcbiAgICAgICAgdmVyaWZpZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlbGV0ZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSlcbiAgICB9KVxufVxuXG51c2VyU2NoZW1hLmNyZWF0ZSA9ICgpID0+IHYub21pdCh1c2VyU2NoZW1hKCksIFsnaWQnLCAndmVyaWZpZWRfYXQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2RlbGV0ZWRfYXQnXSlcbnVzZXJTY2hlbWEudXBkYXRlID0gKCkgPT4gdi5wYXJ0aWFsKHVzZXJTY2hlbWEuY3JlYXRlKCkpXG5cbmV4cG9ydCBkZWZhdWx0IHVzZXJTY2hlbWFcbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXIge1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbWl0SG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgeyAgICAgICAgICAgICAgICBcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGZvciBhd2FpdCAoY29uc3QgbCBvZiBsaXN0ZW5lcnMuZmlsdGVyKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50KSkge1xuICAgICAgICBhd2FpdCBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Ib29rKGNvbnN0cnVjdG9yOiBhbnksIGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGNvbnN0IGV4aXN0cyA9IGxpc3RlbmVycy5maW5kKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICBldmVudCxcbiAgICAgICAgbGlzdGVuZXIgXG4gICAgfSlcblxuICAgIGNvbnN0cnVjdG9yLmxpc3RlbmVycyA9IGxpc3RlbmVyc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSG9va3NTdGF0aWM8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdC5hcHBseSh0aGlzLmNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBsaXN0ZW5lcnMgPSBbXSBhcyBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICByZXR1cm4gb25Ib29rKHRoaXMsIGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZW1pdChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRIb29rKHRoaXMsIGV2ZW50LCAuLi5hcmdzKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBIb29rczxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgbGlzdGVuZXJzOiBMaXN0ZW5lcltdXG5cbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGxpc3RlbmVyIFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVycy5maW5kSW5kZXgoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcigobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQpXG5cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcHVibGljIGFzeW5jIGVtaXRBc3luYyhldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuSG9va3NTdGF0aWMuZW1pdCA9IGVtaXRIb29rXG5Ib29rc1N0YXRpYy5vbiA9IG9uSG9va1xuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgb3JpZ2luOiBzdHJpbmdcbiAgICBwdWJsaWMgc3ViamVjdDogc3RyaW5nXG4gICAgcHVibGljIGFjdGlvbjogc3RyaW5nXG4gICAgcHVibGljIGNvbmRpdGlvbnM6IHN0cmluZyB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbnVsbFxuXG4gICAgcHVibGljIGdldCBlZGl0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luID09PSAnY3VzdG9tJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyc2VkQ29uZGl0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCBqc29uXSA9IHRyeUNhdGNoLnN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmRpdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5jb25kaXRpb25zIGFzIHN0cmluZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGVycm9yID8ge30gOiBqc29uXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lQWJpbGl0eSwgc3ViamVjdCBhcyBjcmVhdGVTdWJqZWN0IH0gZnJvbSAnQGNhc2wvYWJpbGl0eSdcbmltcG9ydCBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNsRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdBY2xFbnRpdHknXG5cbiAgICBwdWJsaWMgYWJpbGl0eTogUmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lQWJpbGl0eT5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBY2xFbnRpdHk+ID0ge30pIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBkYXRhLnBlcm1pc3Npb25zIHx8IFtdXG4gICAgICAgIGNvbnN0IHBlcm1zID0gcGVybWlzc2lvbnMubWFwKChwZXJtaXNzaW9uKSA9PiBQZXJtaXNzaW9uLmZyb20ocGVybWlzc2lvbikpXG5cbiAgICAgICAgXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtc1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKCkuY2hpbGQoeyBsYWJlbDogJ2FjbCcgfSlcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYWJpbGl0eSA9IGRlZmluZUFiaWxpdHkoKGNhbikgPT4ge1xuICAgICAgICAgICAgcGVybXMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbihwZXJtaXNzaW9uLmFjdGlvbiwgcGVybWlzc2lvbi5zdWJqZWN0LCBwZXJtaXNzaW9uLnBhcnNlZENvbmRpdGlvbnMpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScsIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuKGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblxuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW5ub3QoYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWJqZWN0KHN1YmplY3Q6IHN0cmluZywgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcbiAgICB9XG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZUVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBkcml2ZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWV0eXBlOiBzdHJpbmdcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIGNsaWVudF9uYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZmlsZW5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwdWJsaWM6IGJvb2xlYW5cblxuICAgIC8vIGR5bmFtaWNcbiAgICBwdWJsaWMgdXJsPzogc3RyaW5nXG4gICAgcHVibGljIG1ldGFzPzogUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgcHVibGljIGlzSW1hZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWV0eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVNZXRhIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGZpbGVfaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZyB8IG51bGxcbn1cbiIsImltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHlNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRTZXNzaW9uIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBwdXJwb3NlOiBzdHJpbmdcbiAgICBwdWJsaWMgbWltZV90eXBlczogc3RyaW5nXG4gICAgcHVibGljIG1heF9zaXplOiBudW1iZXJcblxuICAgIC8vIGR5bmFtaWMgXG4gICAgcHVibGljIHVwbG9hZF91cmw/OiBzdHJpbmdcbiAgICBwdWJsaWMgY3JlYXRlX2ZpbGVfdXJsPzogc3RyaW5nXG5cbiAgICBwdWJsaWMgZ2V0UGFyc2VkTWltZVR5cGVzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWltZV90eXBlcy5zcGxpdCgnLCcpLm1hcCh0eXBlID0+IHR5cGUudHJpbSgpKVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0FsbG93ZWRNaW1lVHlwZShtaW1lVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IHRoaXMuZ2V0UGFyc2VkTWltZVR5cGVzKClcbiAgICAgICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5pbmNsdWRlcyhtaW1lVHlwZSkgfHwgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKCcqLyonKVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0FsbG93ZWRTaXplKHNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc2l6ZSA8PSB0aGlzLm1heF9zaXplXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgTW9kdWxlTWFuaWZlc3QgZnJvbSAnLi9Nb2R1bGVNYW5pZmVzdEVudGl0eS50cydcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB7IGNvbXBvc2UsIG1peGluIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5pbnRlcmZhY2UgTW9kdWxlVXBncmFkZUluZm8ge1xuICAgIHNvdXJjZTogJ2dpdCcgfCAnemlwJ1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIG1peGluKExpZmVjeWNsZUhvb2spKSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICAgIHB1YmxpYyBidWlsZDogTW9kdWxlTWFuaWZlc3RbJ2J1aWxkJ10gPSB7fVxuICAgIHB1YmxpYyBkaXJlY3Rvcnk6IHN0cmluZ1xuXG4gICAgcHVibGljIHVwZ3JhZGVfaW5mbz86IE1vZHVsZVVwZ3JhZGVJbmZvXG5cbiAgICBwdWJsaWMgc2V0RGF0YShkYXRhOiBQYXJ0aWFsPE1vZHVsZSB8IE1vZHVsZU1hbmlmZXN0Pikge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbHRlcigoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZmlsdGVyZWQpXG5cbiAgICAgICAgdGhpcy5ob29rX2lkID0gYG1vZHVsZToke3RoaXMuaWR9YFxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RCdWlsZEltcG9ydCB7XG4gICAgZnJvbTogc3RyaW5nXG4gICAgdG8/OiBzdHJpbmdcbiAgICB0eXBlOiAnZ2xvYmFsX2ltcG9ydCdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RCdWlsZCB7XG4gICAgaW1wb3J0cz86IE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnRbXVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGVNYW5pZmVzdCBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhdXRob3I/OiBzdHJpbmdcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBidWlsZD86IE1vZHVsZU1hbmlmZXN0QnVpbGRcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhbGlhc2VzOiBzdHJpbmdbXVxuICAgIHB1YmxpYyB2ZXJzaW9uX2NoYW5uZWw6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uX2F2YWlsYWJsZV9jaGFubmVsczogc3RyaW5nW11cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcbmltcG9ydCB7IEVtbWl0dGVyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5cbmNvbnN0IGVtbWl0dGVyID0gY29udGFpbmVyLnByb3h5PEVtbWl0dGVyU2VydmljZT4oRW1taXR0ZXJTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBlbW1pdHRlclxuIiwiaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiB9IGZyb20gXCIjc2hhcmVkL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIHsgRGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiXG5pbXBvcnQgZW1taXR0ZXIgZnJvbSAnLi4vZmFjYWRlcy9lbW1pdHRlci50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGF5b3V0U2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTGF5b3V0U2VydmljZSdcbiAgICBwdWJsaWMgY29tcG9uZW50czogTWFwPHN0cmluZywgRGVmaW5lQ29tcG9uZW50PiA9IG5ldyBNYXAoKVxuICAgIHB1YmxpYyBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgY3VycmVuZElkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gICAgcHVibGljIHNldEN1cnJlbnQoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmN1cnJlbmRJZCA9IGlkXG5cbiAgICAgICAgZW1taXR0ZXIuZW1pdCgnbGF5b3V0OmNoYW5nZScsIGlkKVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGQobmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IERlZmluZUNvbXBvbmVudCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMuc2V0KG5hbWUsIGNvbXBvbmVudClcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXMobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHMuaGFzKG5hbWUpXG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmNvbXBvbmVudHMuZ2V0KG5hbWUpXG5cbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYExheW91dCAke25hbWV9IG5vdCBmb3VuZGApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVuZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuY3VycmVuZElkKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRPcHRpb25zKG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcblxuICAgICAgICBlbW1pdHRlci5lbWl0KCdsYXlvdXQ6c2V0LW9wdGlvbnMnLCBvcHRpb25zKVxuICAgIH1cbn1cbiIsImltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyc7XG5pbXBvcnQgQmFzZUxpZmVjeWNsZVNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlU2VydmljZSBleHRlbmRzIEJhc2VMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgYWRkSW1wb3J0cyhpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KXtcbiAgICAgICAgY29uc3QgaG9va3M6IExpZmVjeWNsZUhvb2tbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbW9kXSBvZiBPYmplY3QuZW50cmllcyhpbXBvcnRzKSkge1xuICAgICAgICAgICAgY29uc3QgSG9va0NsYXNzID0gbW9kLmRlZmF1bHQgfHwgbW9kXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBIb29rQ2xhc3MoKSBhcyBMaWZlY3ljbGVIb29rXG5cbiAgICAgICAgICAgIGluc3RhbmNlLmhvb2tfaWQgPSBpbnN0YW5jZS5ob29rX2lkIHx8IG5hbWVcblxuICAgICAgICAgICAgaG9va3MucHVzaChpbnN0YW5jZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGhvb2tzLmZvckVhY2goaG9vayA9PiB0aGlzLmFkZChob29rKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZW51SXRlbSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIGxhYmVsOiBzdHJpbmdcbiAgICBwdWJsaWMgbGF5b3V0OiBzdHJpbmdcblxuICAgIHB1YmxpYyB0bz86IHN0cmluZ1xuXG4gICAgcHVibGljIHRhcmdldD86ICdfYmxhbmsnIHwgJ19zZWxmJyB8ICdfcGFyZW50JyB8ICdfdG9wJ1xuICAgIHB1YmxpYyBncm91cD86IHN0cmluZ1xuICAgIHB1YmxpYyBvcmRlcj86IG51bWJlclxuICAgIHB1YmxpYyBpY29uPzogc3RyaW5nXG4gICAgcHVibGljIHBhcmVudD86IHN0cmluZ1xufVxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IEFjbEVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cydcblxuY29uc3QgYWNsID0gY29udGFpbmVyLnByb3h5PEFjbEVudGl0eT4oQWNsRW50aXR5KVxuXG5leHBvcnQgZGVmYXVsdCBhY2xcbiIsImltcG9ydCBNZW51SXRlbSBmcm9tICcjY2xpZW50L2VudGl0aWVzL01lbnVJdGVtRW50aXR5LnRzJ1xuaW1wb3J0IGFjbCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYWNsLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGaWx0ZXIge1xuICAgIGxheW91dD86IHN0cmluZ1xuICAgIGdyb3VwPzogc3RyaW5nXG4gICAgcGFyZW50Pzogc3RyaW5nXG4gICAgYWxsb3dlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVudVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ01lbnVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGl0ZW1zOiBNYXA8c3RyaW5nLCBNZW51SXRlbT4gPSBuZXcgTWFwKClcblxuICAgIHB1YmxpYyBhZGQoLi4uaXRlbTogT21pdDxQYXJ0aWFsPE1lbnVJdGVtPiwgJ21lcmdlJyB8ICdmcm9tJz5bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbSkge1xuXG4gICAgICAgICAgICBpZiAoIWkuaWQpIHtcbiAgICAgICAgICAgICAgICBpLmlkID0gSlNPTi5zdHJpbmdpZnkoaSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pdGVtcy5zZXQoaS5pZCwgTWVudUl0ZW0uZnJvbShpKSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoaWQ6IE1lbnVJdGVtWydpZCddKSB7XG4gICAgICAgIHRoaXMuaXRlbXMuZGVsZXRlKGlkKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KGZpbHRlcjogTGlzdEZpbHRlciA9IHt9KSB7XG4gICAgICAgIGxldCBpdGVtcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh0aGlzLml0ZW1zLnZhbHVlcygpKSkpIGFzIE1lbnVJdGVtW11cblxuXG4gICAgICAgIGlmIChmaWx0ZXIubGF5b3V0KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGkubGF5b3V0ID09PSBmaWx0ZXIubGF5b3V0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlci5ncm91cCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLmdyb3VwID09PSBmaWx0ZXIuZ3JvdXAgfHwgaS5wYXJlbnQgPT09IGZpbHRlci5ncm91cClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIucGFyZW50KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGkucGFyZW50ID09PSBmaWx0ZXIucGFyZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlci5hbGxvd2VkICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyLmFsbG93ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gYWNsLmNhbigndmlldycsIGkpKVxuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JkZXJBID0gYS5vcmRlciA/IGEub3JkZXIgOiA5OFxuICAgICAgICAgICAgY29uc3Qgb3JkZXJCID0gYi5vcmRlciA/IGIub3JkZXIgOiA5OFxuXG4gICAgICAgICAgICByZXR1cm4gb3JkZXJBIC0gb3JkZXJCXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLml0ZW1zLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25HdWFyZCB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgY29uZmlnIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb25maWcudHMnXG5cbmNvbnN0IHNldHVwR3VhcmQ6IE5hdmlnYXRpb25HdWFyZCA9ICh0bykgPT4ge1xuICAgIGNvbnN0IHNldHVwID0gY29uZmlnLmdldDxhbnk+KCdzZXR1cCcpXG4gICAgXG4gICAgY29uc3QgY29tcGxldGVkID0gIXNldHVwPy5uZWVkX2RhdGFiYXNlICYmICFzZXR1cD8ubmVlZF91c2Vyc1xuICAgIFxuICAgIGlmIChjb21wbGV0ZWQgJiYgdG8ucGF0aC5zdGFydHNXaXRoKCcvc2V0dXAnKSkge1xuICAgICAgICByZXR1cm4gJy8nXG4gICAgfVxuICAgIFxuICAgIGlmIChjb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0by5wYXRoLnN0YXJ0c1dpdGgoJy9zZXR1cCcpKSB7XG4gICAgICAgIHJldHVybiAnL3NldHVwJ1xuICAgIH1cbiAgICBcbiAgICBpZiAodG8ucGF0aCA9PT0gJy9zZXR1cCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9ICAgIFxuXG4gICAgaWYgKHNldHVwPy5uZWVkX2RhdGFiYXNlKSB7XG4gICAgICAgIHJldHVybiB0by5wYXRoICE9PSAnL3NldHVwL2RhdGFiYXNlJyA/ICcvc2V0dXAvZGF0YWJhc2UnIDogdHJ1ZVxuICAgIH1cblxuICAgIGlmIChzZXR1cD8ubmVlZF91c2Vycykge1xuICAgICAgICByZXR1cm4gdG8ucGF0aCAhPT0gJy9zZXR1cC91c2VyJyA/ICcvc2V0dXAvdXNlcicgOiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0dXBHdWFyZFxuIiwiaW1wb3J0IHtcbiAgICBjcmVhdGVSb3V0ZXIgYXMgY3JlYXRlVnVlUm91dGVyLFxuICAgIGNyZWF0ZU1lbW9yeUhpc3RvcnksXG4gICAgY3JlYXRlV2ViSGlzdG9yeVxufSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQsIFJvdXRlciBhcyBWdWVSb3V0ZXIgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZVJlY29yZFJhdyB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgdHlwZSB7IERlZmluZUNvbXBvbmVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBzZXR1cEd1YXJkIGZyb20gJyNjbGllbnQvZ3VhcmRzL3NldHVwR3VhcmQudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVyIGV4dGVuZHMgVnVlUm91dGVyIHtcbiAgICBhdXRvOiB0eXBlb2YgYXV0bztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRvT3B0aW9ucyB7XG4gICAgZ3VhcmRzPzogTmF2aWdhdGlvbkd1YXJkW10gfCAoKHJlY29yZDogUm91dGVSZWNvcmRSYXcpID0+IE5hdmlnYXRpb25HdWFyZFtdKTtcbiAgICBzdHJpcD86IChzdHJpbmcgfCBSZWdFeHApW107XG4gICAgZXhjbHVkZT86IChzdHJpbmcgfCBSZWdFeHApW107XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHJlZmluZT86IChyZWNvcmRzOiBSb3V0ZVJlY29yZFJhd1tdKSA9PiBSb3V0ZVJlY29yZFJhd1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXV0byhpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVDb21wb25lbnQgfCAoKCkgPT4gUHJvbWlzZTxEZWZpbmVDb21wb25lbnQ+KT4sIG9wdGlvbnM6IEF1dG9PcHRpb25zID0ge30pOiBSb3V0ZVJlY29yZFJhd1tdIHtcbiAgICBsZXQgcm91dGVzOiBSb3V0ZVJlY29yZFJhd1tdID0gW11cblxuICAgIGZvciAoY29uc3QgW2ZpbGVuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKGltcG9ydHMpKSB7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZT8uc29tZShydWxlID0+XG4gICAgICAgICAgICB0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGZpbGVuYW1lLmluY2x1ZGVzKHJ1bGUpXG4gICAgICAgICAgICAgICAgOiBydWxlLnRlc3QoZmlsZW5hbWUpXG4gICAgICAgICkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFydHMgPSBmaWxlbmFtZVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLnZ1ZSQvLCAnJylcbiAgICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gcCAmJiAhcC5zdGFydHNXaXRoKCcuJykpXG4gICAgICAgICAgICAubWFwKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwID0gcGFydFxuXG4gICAgICAgICAgICAgICAgaWYgKHAuc3RhcnRzV2l0aCgnWycpICYmIHAuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICAgICAgICAgICAgICBwID0gJzonICsgcC5zbGljZSgxLCAtMSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcFxuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIC8vIFN0cmlwIHNwZWNpZmljIHNlZ21lbnRzXG4gICAgICAgIGlmIChvcHRpb25zLnN0cmlwPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhcnRzID0gcGFydHMuZmlsdGVyKHAgPT5cbiAgICAgICAgICAgICAgICAhb3B0aW9ucy5zdHJpcCEuc29tZShydWxlID0+XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBydWxlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBwID09PSBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bGUudGVzdChwKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXRoID0gcGFydHMuam9pbignLycpLnJlcGxhY2UoL2luZGV4JC8sICcnKVxuXG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCkge1xuICAgICAgICAgICAgcGF0aCA9IG9wdGlvbnMucHJlZml4ICsgJy8nICsgcGF0aFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgcGF0aCA9ICcvJyArIHBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIERlZmluZUNvbXBvbmVudCxcbiAgICAgICAgICAgIGJlZm9yZUVudGVyOiBbXSBhcyBOYXZpZ2F0aW9uR3VhcmRbXSxcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKG9wdGlvbnMuZ3VhcmRzICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5ndWFyZHMpKSB7XG4gICAgICAgICAgICByZWNvcmQuYmVmb3JlRW50ZXIgPSBvcHRpb25zLmd1YXJkc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZ3VhcmRzICYmIHR5cGVvZiBvcHRpb25zLmd1YXJkcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmVjb3JkLmJlZm9yZUVudGVyID0gb3B0aW9ucy5ndWFyZHMocmVjb3JkKVxuICAgICAgICB9XG5cbiAgICAgICAgcm91dGVzLnB1c2gocmVjb3JkKVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlZmluZSkge1xuICAgICAgICByb3V0ZXMgPSBvcHRpb25zLnJlZmluZShyb3V0ZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJvdXRlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVyKCkge1xuICAgIGNvbnN0IHNzciA9IGltcG9ydC5tZXRhLmVudi5TU1JcblxuICAgIGNvbnN0IHJvdXRlciA9IGNyZWF0ZVZ1ZVJvdXRlcih7XG4gICAgICAgIGhpc3Rvcnk6IHNzciA/IGNyZWF0ZU1lbW9yeUhpc3RvcnkoKSA6IGNyZWF0ZVdlYkhpc3RvcnkoKSxcbiAgICAgICAgcm91dGVzOiBbXSxcbiAgICAgICAgc2Nyb2xsQmVoYXZpb3IodG8sIGZyb20sIHNhdmVkUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGlmIChzYXZlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNhdmVkUG9zaXRpb25cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiAwIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KSBhcyBhbnkgYXMgUm91dGVyXG5cbiAgICByb3V0ZXIuYmVmb3JlRWFjaChzZXR1cEd1YXJkKVxuXG4gICAgcm91dGVyLmF1dG8gPSAoaW1wb3J0czogUmVjb3JkPHN0cmluZywgRGVmaW5lQ29tcG9uZW50IHwgKCgpID0+IFByb21pc2U8RGVmaW5lQ29tcG9uZW50Pik+LCBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGF1dG9Sb3V0ZXMgPSBhdXRvKGltcG9ydHMsIG9wdGlvbnMpXG4gICAgICAgIFxuICAgICAgICBhdXRvUm91dGVzLmZvckVhY2gocm91dGUgPT4gcm91dGVyLmFkZFJvdXRlKHJvdXRlKSlcblxuICAgICAgICByZXR1cm4gYXV0b1JvdXRlc1xuICAgIH1cblxuICAgIHJldHVybiByb3V0ZXJcbn1cblxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9hc3RTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdUb2FzdFNlcnZpY2UnXG5cbiAgICBwdWJsaWMgc3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzOicsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgbWVzc2FnZSwgb3B0aW9ucylcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb21wdXRlZCwgY3VzdG9tUmVmLCBlZmZlY3RTY29wZSwgZ2V0Q3VycmVudEluc3RhbmNlLCBnZXRDdXJyZW50U2NvcGUsIGhhc0luamVjdGlvbkNvbnRleHQsIGluamVjdCwgaXNSZWFjdGl2ZSwgaXNSZWYsIG5leHRUaWNrLCBvbkJlZm9yZU1vdW50LCBvbkJlZm9yZVVubW91bnQsIG9uTW91bnRlZCwgb25TY29wZURpc3Bvc2UsIG9uVW5tb3VudGVkLCBwcm92aWRlLCByZWFjdGl2ZSwgcmVhZG9ubHksIHJlZiwgc2hhbGxvd1JlYWRvbmx5LCBzaGFsbG93UmVmLCB0b1JlZiBhcyB0b1JlZiQxLCB0b1JlZnMgYXMgdG9SZWZzJDEsIHRvVmFsdWUsIHVucmVmLCB3YXRjaCwgd2F0Y2hFZmZlY3QgfSBmcm9tIFwidnVlXCI7XG5cbi8vI3JlZ2lvbiBjb21wdXRlZEVhZ2VyL2luZGV4LnRzXG4vKipcbipcbiogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb24uXG4qXG4qIE5vdGU6IElmIHlvdSBhcmUgdXNpbmcgVnVlIDMuNCssIHlvdSBjYW4gc3RyYWlnaHQgdXNlIGNvbXB1dGVkIGluc3RlYWQuXG4qIEJlY2F1c2UgaW4gVnVlIDMuNCssIGlmIGNvbXB1dGVkIG5ldyB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UsXG4qIGNvbXB1dGVkLCBlZmZlY3QsIHdhdGNoLCB3YXRjaEVmZmVjdCwgcmVuZGVyIGRlcGVuZGVuY2llcyB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQuXG4qIHJlZmVyOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvY29yZS9wdWxsLzU5MTJcbipcbiogQHBhcmFtIGZuIGVmZmVjdCBmdW5jdGlvblxuKiBAcGFyYW0gb3B0aW9ucyBXYXRjaE9wdGlvbnNCYXNlXG4qIEByZXR1cm5zIHJlYWRvbmx5IHNoYWxsb3dSZWZcbiovXG5mdW5jdGlvbiBjb21wdXRlZEVhZ2VyKGZuLCBvcHRpb25zKSB7XG5cdHZhciBfb3B0aW9ucyRmbHVzaDtcblx0Y29uc3QgcmVzdWx0ID0gc2hhbGxvd1JlZigpO1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0cmVzdWx0LnZhbHVlID0gZm4oKTtcblx0fSwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0Zmx1c2g6IChfb3B0aW9ucyRmbHVzaCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5mbHVzaCkgIT09IG51bGwgJiYgX29wdGlvbnMkZmx1c2ggIT09IHZvaWQgMCA/IF9vcHRpb25zJGZsdXNoIDogXCJzeW5jXCJcblx0fSk7XG5cdHJldHVybiByZWFkb25seShyZXN1bHQpO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgY29tcHV0ZWRFYWdlcmAgaW5zdGVhZCAqL1xuY29uc3QgZWFnZXJDb21wdXRlZCA9IGNvbXB1dGVkRWFnZXI7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGNvbXB1dGVkV2l0aENvbnRyb2wvaW5kZXgudHNcbi8qKlxuKiBFeHBsaWNpdGx5IGRlZmluZSB0aGUgZGVwcyBvZiBjb21wdXRlZC5cbipcbiogQHBhcmFtIHNvdXJjZVxuKiBAcGFyYW0gZm5cbiovXG5mdW5jdGlvbiBjb21wdXRlZFdpdGhDb250cm9sKHNvdXJjZSwgZm4sIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgdiA9IHZvaWQgMDtcblx0bGV0IHRyYWNrO1xuXHRsZXQgdHJpZ2dlcjtcblx0bGV0IGRpcnR5ID0gdHJ1ZTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4ge1xuXHRcdGRpcnR5ID0gdHJ1ZTtcblx0XHR0cmlnZ2VyKCk7XG5cdH07XG5cdHdhdGNoKHNvdXJjZSwgdXBkYXRlLCB7XG5cdFx0Zmx1c2g6IFwic3luY1wiLFxuXHRcdC4uLm9wdGlvbnNcblx0fSk7XG5cdGNvbnN0IGdldCQxID0gdHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIgPyBmbiA6IGZuLmdldDtcblx0Y29uc3Qgc2V0JDEgPSB0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIiA/IHZvaWQgMCA6IGZuLnNldDtcblx0Y29uc3QgcmVzdWx0ID0gY3VzdG9tUmVmKChfdHJhY2ssIF90cmlnZ2VyKSA9PiB7XG5cdFx0dHJhY2sgPSBfdHJhY2s7XG5cdFx0dHJpZ2dlciA9IF90cmlnZ2VyO1xuXHRcdHJldHVybiB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdGlmIChkaXJ0eSkge1xuXHRcdFx0XHRcdHYgPSBnZXQkMSh2KTtcblx0XHRcdFx0XHRkaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRyYWNrKCk7XG5cdFx0XHRcdHJldHVybiB2O1xuXHRcdFx0fSxcblx0XHRcdHNldCh2JDEpIHtcblx0XHRcdFx0c2V0JDEgPT09IG51bGwgfHwgc2V0JDEgPT09IHZvaWQgMCB8fCBzZXQkMSh2JDEpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xuXHRyZXN1bHQudHJpZ2dlciA9IHVwZGF0ZTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYGNvbXB1dGVkV2l0aENvbnRyb2xgIGluc3RlYWQgKi9cbmNvbnN0IGNvbnRyb2xsZWRDb21wdXRlZCA9IGNvbXB1dGVkV2l0aENvbnRyb2w7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHRyeU9uU2NvcGVEaXNwb3NlL2luZGV4LnRzXG4vKipcbiogQ2FsbCBvblNjb3BlRGlzcG9zZSgpIGlmIGl0J3MgaW5zaWRlIGFuIGVmZmVjdCBzY29wZSBsaWZlY3ljbGUsIGlmIG5vdCwgZG8gbm90aGluZ1xuKlxuKiBAcGFyYW0gZm5cbiovXG5mdW5jdGlvbiB0cnlPblNjb3BlRGlzcG9zZShmbiwgZmFpbFNpbGVudGx5KSB7XG5cdGlmIChnZXRDdXJyZW50U2NvcGUoKSkge1xuXHRcdG9uU2NvcGVEaXNwb3NlKGZuLCBmYWlsU2lsZW50bHkpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlRXZlbnRIb29rL2luZGV4LnRzXG4vKipcbiogVXRpbGl0eSBmb3IgY3JlYXRpbmcgZXZlbnQgaG9va3NcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlRXZlbnRIb29rXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gY3JlYXRlRXZlbnRIb29rKCkge1xuXHRjb25zdCBmbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRjb25zdCBvZmYgPSAoZm4pID0+IHtcblx0XHRmbnMuZGVsZXRlKGZuKTtcblx0fTtcblx0Y29uc3QgY2xlYXIgPSAoKSA9PiB7XG5cdFx0Zm5zLmNsZWFyKCk7XG5cdH07XG5cdGNvbnN0IG9uID0gKGZuKSA9PiB7XG5cdFx0Zm5zLmFkZChmbik7XG5cdFx0Y29uc3Qgb2ZmRm4gPSAoKSA9PiBvZmYoZm4pO1xuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKG9mZkZuKTtcblx0XHRyZXR1cm4geyBvZmY6IG9mZkZuIH07XG5cdH07XG5cdGNvbnN0IHRyaWdnZXIgPSAoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChBcnJheS5mcm9tKGZucykubWFwKChmbikgPT4gZm4oLi4uYXJncykpKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRvbixcblx0XHRvZmYsXG5cdFx0dHJpZ2dlcixcblx0XHRjbGVhclxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVHbG9iYWxTdGF0ZS9pbmRleC50c1xuLyoqXG4qIEtlZXAgc3RhdGVzIGluIHRoZSBnbG9iYWwgc2NvcGUgdG8gYmUgcmV1c2FibGUgYWNyb3NzIFZ1ZSBpbnN0YW5jZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZUdsb2JhbFN0YXRlXG4qIEBwYXJhbSBzdGF0ZUZhY3RvcnkgQSBmYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgc3RhdGVcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxTdGF0ZShzdGF0ZUZhY3RvcnkpIHtcblx0bGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5cdGxldCBzdGF0ZTtcblx0Y29uc3Qgc2NvcGUgPSBlZmZlY3RTY29wZSh0cnVlKTtcblx0cmV0dXJuICgoLi4uYXJncykgPT4ge1xuXHRcdGlmICghaW5pdGlhbGl6ZWQpIHtcblx0XHRcdHN0YXRlID0gc2NvcGUucnVuKCgpID0+IHN0YXRlRmFjdG9yeSguLi5hcmdzKSk7XG5cdFx0XHRpbml0aWFsaXplZCA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBzdGF0ZTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHByb3ZpZGVMb2NhbC9tYXAudHNcbmNvbnN0IGxvY2FsUHJvdmlkZWRTdGF0ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBpbmplY3RMb2NhbC9pbmRleC50c1xuLyoqXG4qIE9uIHRoZSBiYXNpcyBvZiBgaW5qZWN0YCwgaXQgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBjYWxsIGluamVjdCB0byBvYnRhaW4gdGhlIHZhbHVlIGFmdGVyIGNhbGwgcHJvdmlkZSBpbiB0aGUgc2FtZSBjb21wb25lbnQuXG4qXG4qIEBleGFtcGxlXG4qIGBgYHRzXG4qIGluamVjdExvY2FsKCdNeUluamVjdGlvbktleScsIDEpXG4qIGNvbnN0IGluamVjdGVkVmFsdWUgPSBpbmplY3RMb2NhbCgnTXlJbmplY3Rpb25LZXknKSAvLyBpbmplY3RlZFZhbHVlID09PSAxXG4qIGBgYFxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmNvbnN0IGluamVjdExvY2FsID0gKC4uLmFyZ3MpID0+IHtcblx0dmFyIF9nZXRDdXJyZW50SW5zdGFuY2U7XG5cdGNvbnN0IGtleSA9IGFyZ3NbMF07XG5cdGNvbnN0IGluc3RhbmNlID0gKF9nZXRDdXJyZW50SW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKSkgPT09IG51bGwgfHwgX2dldEN1cnJlbnRJbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dldEN1cnJlbnRJbnN0YW5jZS5wcm94eTtcblx0Y29uc3Qgb3duZXIgPSBpbnN0YW5jZSAhPT0gbnVsbCAmJiBpbnN0YW5jZSAhPT0gdm9pZCAwID8gaW5zdGFuY2UgOiBnZXRDdXJyZW50U2NvcGUoKTtcblx0aWYgKG93bmVyID09IG51bGwgJiYgIWhhc0luamVjdGlvbkNvbnRleHQoKSkgdGhyb3cgbmV3IEVycm9yKFwiaW5qZWN0TG9jYWwgbXVzdCBiZSBjYWxsZWQgaW4gc2V0dXBcIik7XG5cdGlmIChvd25lciAmJiBsb2NhbFByb3ZpZGVkU3RhdGVNYXAuaGFzKG93bmVyKSAmJiBrZXkgaW4gbG9jYWxQcm92aWRlZFN0YXRlTWFwLmdldChvd25lcikpIHJldHVybiBsb2NhbFByb3ZpZGVkU3RhdGVNYXAuZ2V0KG93bmVyKVtrZXldO1xuXHRyZXR1cm4gaW5qZWN0KC4uLmFyZ3MpO1xufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcHJvdmlkZUxvY2FsL2luZGV4LnRzXG4vKipcbiogT24gdGhlIGJhc2lzIG9mIGBwcm92aWRlYCwgaXQgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBjYWxsIGluamVjdCB0byBvYnRhaW4gdGhlIHZhbHVlIGFmdGVyIGNhbGwgcHJvdmlkZSBpbiB0aGUgc2FtZSBjb21wb25lbnQuXG4qXG4qIEBleGFtcGxlXG4qIGBgYHRzXG4qIHByb3ZpZGVMb2NhbCgnTXlJbmplY3Rpb25LZXknLCAxKVxuKiBjb25zdCBpbmplY3RlZFZhbHVlID0gaW5qZWN0TG9jYWwoJ015SW5qZWN0aW9uS2V5JykgLy8gaW5qZWN0ZWRWYWx1ZSA9PT0gMVxuKiBgYGBcbiovXG5mdW5jdGlvbiBwcm92aWRlTG9jYWwoa2V5LCB2YWx1ZSkge1xuXHR2YXIgX2dldEN1cnJlbnRJbnN0YW5jZTtcblx0Y29uc3QgaW5zdGFuY2UgPSAoX2dldEN1cnJlbnRJbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpKSA9PT0gbnVsbCB8fCBfZ2V0Q3VycmVudEluc3RhbmNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZ2V0Q3VycmVudEluc3RhbmNlLnByb3h5O1xuXHRjb25zdCBvd25lciA9IGluc3RhbmNlICE9PSBudWxsICYmIGluc3RhbmNlICE9PSB2b2lkIDAgPyBpbnN0YW5jZSA6IGdldEN1cnJlbnRTY29wZSgpO1xuXHRpZiAob3duZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwicHJvdmlkZUxvY2FsIG11c3QgYmUgY2FsbGVkIGluIHNldHVwXCIpO1xuXHRpZiAoIWxvY2FsUHJvdmlkZWRTdGF0ZU1hcC5oYXMob3duZXIpKSBsb2NhbFByb3ZpZGVkU3RhdGVNYXAuc2V0KG93bmVyLCBPYmplY3QuY3JlYXRlKG51bGwpKTtcblx0Y29uc3QgbG9jYWxQcm92aWRlZFN0YXRlID0gbG9jYWxQcm92aWRlZFN0YXRlTWFwLmdldChvd25lcik7XG5cdGxvY2FsUHJvdmlkZWRTdGF0ZVtrZXldID0gdmFsdWU7XG5cdHJldHVybiBwcm92aWRlKGtleSwgdmFsdWUpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVJbmplY3Rpb25TdGF0ZS9pbmRleC50c1xuLyoqXG4qIENyZWF0ZSBnbG9iYWwgc3RhdGUgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgaW50byBjb21wb25lbnRzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9jcmVhdGVJbmplY3Rpb25TdGF0ZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZUluamVjdGlvblN0YXRlKGNvbXBvc2FibGUsIG9wdGlvbnMpIHtcblx0Y29uc3Qga2V5ID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbmplY3Rpb25LZXkpIHx8IFN5bWJvbChjb21wb3NhYmxlLm5hbWUgfHwgXCJJbmplY3Rpb25TdGF0ZVwiKTtcblx0Y29uc3QgZGVmYXVsdFZhbHVlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcblx0Y29uc3QgdXNlUHJvdmlkaW5nU3RhdGUgPSAoLi4uYXJncykgPT4ge1xuXHRcdGNvbnN0IHN0YXRlID0gY29tcG9zYWJsZSguLi5hcmdzKTtcblx0XHRwcm92aWRlTG9jYWwoa2V5LCBzdGF0ZSk7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9O1xuXHRjb25zdCB1c2VJbmplY3RlZFN0YXRlID0gKCkgPT4gaW5qZWN0TG9jYWwoa2V5LCBkZWZhdWx0VmFsdWUpO1xuXHRyZXR1cm4gW3VzZVByb3ZpZGluZ1N0YXRlLCB1c2VJbmplY3RlZFN0YXRlXTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlUmVmL2luZGV4LnRzXG4vKipcbiogUmV0dXJucyBhIGBkZWVwUmVmYCBvciBgc2hhbGxvd1JlZmAgZGVwZW5kaW5nIG9uIHRoZSBgZGVlcGAgcGFyYW0uXG4qXG4qIEBleGFtcGxlIGNyZWF0ZVJlZigxKSAvLyBTaGFsbG93UmVmPG51bWJlcj5cbiogQGV4YW1wbGUgY3JlYXRlUmVmKDEsIGZhbHNlKSAvLyBTaGFsbG93UmVmPG51bWJlcj5cbiogQGV4YW1wbGUgY3JlYXRlUmVmKDEsIHRydWUpIC8vIFJlZjxudW1iZXI+XG4qIEBleGFtcGxlIGNyZWF0ZVJlZihcInN0cmluZ1wiKSAvLyBTaGFsbG93UmVmPHN0cmluZz5cbiogQGV4YW1wbGUgY3JlYXRlUmVmPFwiQVwifFwiQlwiPihcIkFcIiwgdHJ1ZSkgLy8gUmVmPFwiQVwifFwiQlwiPlxuKlxuKiBAcGFyYW0gdmFsdWVcbiogQHBhcmFtIGRlZXBcbiogQHJldHVybnMgdGhlIGBkZWVwUmVmYCBvciBgc2hhbGxvd1JlZmBcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVSZWYodmFsdWUsIGRlZXApIHtcblx0aWYgKGRlZXAgPT09IHRydWUpIHJldHVybiByZWYodmFsdWUpO1xuXHRlbHNlIHJldHVybiBzaGFsbG93UmVmKHZhbHVlKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXRpbHMvaXMudHNcbmNvbnN0IGlzQ2xpZW50ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCI7XG5jb25zdCBpc1dvcmtlciA9IHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWxUaGlzIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7XG5jb25zdCBpc0RlZiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgIT09IFwidW5kZWZpbmVkXCI7XG5jb25zdCBub3ROdWxsaXNoID0gKHZhbCkgPT4gdmFsICE9IG51bGw7XG5jb25zdCBhc3NlcnQgPSAoY29uZGl0aW9uLCAuLi5pbmZvcykgPT4ge1xuXHRpZiAoIWNvbmRpdGlvbikgY29uc29sZS53YXJuKC4uLmluZm9zKTtcbn07XG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCBpc09iamVjdCA9ICh2YWwpID0+IHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbmNvbnN0IG5vdyA9ICgpID0+IERhdGUubm93KCk7XG5jb25zdCB0aW1lc3RhbXAgPSAoKSA9PiArRGF0ZS5ub3coKTtcbmNvbnN0IGNsYW1wID0gKG4sIG1pbiwgbWF4KSA9PiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuY29uc3QgcmFuZCA9IChtaW4sIG1heCkgPT4ge1xuXHRtaW4gPSBNYXRoLmNlaWwobWluKTtcblx0bWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuXHRyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcbn07XG5jb25zdCBoYXNPd24gPSAodmFsLCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGtleSk7XG5jb25zdCBpc0lPUyA9IC8qIEBfX1BVUkVfXyAqLyBnZXRJc0lPUygpO1xuZnVuY3Rpb24gZ2V0SXNJT1MoKSB7XG5cdHZhciBfd2luZG93LCBfd2luZG93MiwgX3dpbmRvdzM7XG5cdHJldHVybiBpc0NsaWVudCAmJiAhISgoX3dpbmRvdyA9IHdpbmRvdykgPT09IG51bGwgfHwgX3dpbmRvdyA9PT0gdm9pZCAwIHx8IChfd2luZG93ID0gX3dpbmRvdy5uYXZpZ2F0b3IpID09PSBudWxsIHx8IF93aW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3cudXNlckFnZW50KSAmJiAoL2lQKD86YWR8aG9uZXxvZCkvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpIHx8ICgoX3dpbmRvdzIgPSB3aW5kb3cpID09PSBudWxsIHx8IF93aW5kb3cyID09PSB2b2lkIDAgfHwgKF93aW5kb3cyID0gX3dpbmRvdzIubmF2aWdhdG9yKSA9PT0gbnVsbCB8fCBfd2luZG93MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdzIubWF4VG91Y2hQb2ludHMpID4gMiAmJiAvaVBhZHxNYWNpbnRvc2gvLnRlc3QoKF93aW5kb3czID0gd2luZG93KSA9PT0gbnVsbCB8fCBfd2luZG93MyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdzMubmF2aWdhdG9yLnVzZXJBZ2VudCkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0b1JlZi9pbmRleC50c1xuZnVuY3Rpb24gdG9SZWYoLi4uYXJncykge1xuXHRpZiAoYXJncy5sZW5ndGggIT09IDEpIHJldHVybiB0b1JlZiQxKC4uLmFyZ3MpO1xuXHRjb25zdCByID0gYXJnc1swXTtcblx0cmV0dXJuIHR5cGVvZiByID09PSBcImZ1bmN0aW9uXCIgPyByZWFkb25seShjdXN0b21SZWYoKCkgPT4gKHtcblx0XHRnZXQ6IHIsXG5cdFx0c2V0OiBub29wXG5cdH0pKSkgOiByZWYocik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL2ZpbHRlcnMudHNcbi8qKlxuKiBAaW50ZXJuYWxcbiovXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJXcmFwcGVyKGZpbHRlciwgZm4pIHtcblx0ZnVuY3Rpb24gd3JhcHBlciguLi5hcmdzKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFByb21pc2UucmVzb2x2ZShmaWx0ZXIoKCkgPT4gZm4uYXBwbHkodGhpcywgYXJncyksIHtcblx0XHRcdFx0Zm4sXG5cdFx0XHRcdHRoaXNBcmc6IHRoaXMsXG5cdFx0XHRcdGFyZ3Ncblx0XHRcdH0pKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHdyYXBwZXI7XG59XG5jb25zdCBieXBhc3NGaWx0ZXIgPSAoaW52b2tlJDEpID0+IHtcblx0cmV0dXJuIGludm9rZSQxKCk7XG59O1xuLyoqXG4qIENyZWF0ZSBhbiBFdmVudEZpbHRlciB0aGF0IGRlYm91bmNlIHRoZSBldmVudHNcbiovXG5mdW5jdGlvbiBkZWJvdW5jZUZpbHRlcihtcywgb3B0aW9ucyA9IHt9KSB7XG5cdGxldCB0aW1lcjtcblx0bGV0IG1heFRpbWVyO1xuXHRsZXQgbGFzdFJlamVjdG9yID0gbm9vcDtcblx0Y29uc3QgX2NsZWFyVGltZW91dCA9ICh0aW1lciQxKSA9PiB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVyJDEpO1xuXHRcdGxhc3RSZWplY3RvcigpO1xuXHRcdGxhc3RSZWplY3RvciA9IG5vb3A7XG5cdH07XG5cdGxldCBsYXN0SW52b2tlcjtcblx0Y29uc3QgZmlsdGVyID0gKGludm9rZSQxKSA9PiB7XG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0b1ZhbHVlKG1zKTtcblx0XHRjb25zdCBtYXhEdXJhdGlvbiA9IHRvVmFsdWUob3B0aW9ucy5tYXhXYWl0KTtcblx0XHRpZiAodGltZXIpIF9jbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdGlmIChkdXJhdGlvbiA8PSAwIHx8IG1heER1cmF0aW9uICE9PSB2b2lkIDAgJiYgbWF4RHVyYXRpb24gPD0gMCkge1xuXHRcdFx0aWYgKG1heFRpbWVyKSB7XG5cdFx0XHRcdF9jbGVhclRpbWVvdXQobWF4VGltZXIpO1xuXHRcdFx0XHRtYXhUaW1lciA9IHZvaWQgMDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoaW52b2tlJDEoKSk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRsYXN0UmVqZWN0b3IgPSBvcHRpb25zLnJlamVjdE9uQ2FuY2VsID8gcmVqZWN0IDogcmVzb2x2ZTtcblx0XHRcdGxhc3RJbnZva2VyID0gaW52b2tlJDE7XG5cdFx0XHRpZiAobWF4RHVyYXRpb24gJiYgIW1heFRpbWVyKSBtYXhUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAodGltZXIpIF9jbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0XHRtYXhUaW1lciA9IHZvaWQgMDtcblx0XHRcdFx0cmVzb2x2ZShsYXN0SW52b2tlcigpKTtcblx0XHRcdH0sIG1heER1cmF0aW9uKTtcblx0XHRcdHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmIChtYXhUaW1lcikgX2NsZWFyVGltZW91dChtYXhUaW1lcik7XG5cdFx0XHRcdG1heFRpbWVyID0gdm9pZCAwO1xuXHRcdFx0XHRyZXNvbHZlKGludm9rZSQxKCkpO1xuXHRcdFx0fSwgZHVyYXRpb24pO1xuXHRcdH0pO1xuXHR9O1xuXHRyZXR1cm4gZmlsdGVyO1xufVxuZnVuY3Rpb24gdGhyb3R0bGVGaWx0ZXIoLi4uYXJncykge1xuXHRsZXQgbGFzdEV4ZWMgPSAwO1xuXHRsZXQgdGltZXI7XG5cdGxldCBpc0xlYWRpbmcgPSB0cnVlO1xuXHRsZXQgbGFzdFJlamVjdG9yID0gbm9vcDtcblx0bGV0IGxhc3RWYWx1ZTtcblx0bGV0IG1zO1xuXHRsZXQgdHJhaWxpbmc7XG5cdGxldCBsZWFkaW5nO1xuXHRsZXQgcmVqZWN0T25DYW5jZWw7XG5cdGlmICghaXNSZWYoYXJnc1swXSkgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwib2JqZWN0XCIpICh7ZGVsYXk6IG1zLCB0cmFpbGluZyA9IHRydWUsIGxlYWRpbmcgPSB0cnVlLCByZWplY3RPbkNhbmNlbCA9IGZhbHNlfSA9IGFyZ3NbMF0pO1xuXHRlbHNlIFttcywgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSwgcmVqZWN0T25DYW5jZWwgPSBmYWxzZV0gPSBhcmdzO1xuXHRjb25zdCBjbGVhciA9ICgpID0+IHtcblx0XHRpZiAodGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHR0aW1lciA9IHZvaWQgMDtcblx0XHRcdGxhc3RSZWplY3RvcigpO1xuXHRcdFx0bGFzdFJlamVjdG9yID0gbm9vcDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGZpbHRlciA9IChfaW52b2tlKSA9PiB7XG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0b1ZhbHVlKG1zKTtcblx0XHRjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIGxhc3RFeGVjO1xuXHRcdGNvbnN0IGludm9rZSQxID0gKCkgPT4ge1xuXHRcdFx0cmV0dXJuIGxhc3RWYWx1ZSA9IF9pbnZva2UoKTtcblx0XHR9O1xuXHRcdGNsZWFyKCk7XG5cdFx0aWYgKGR1cmF0aW9uIDw9IDApIHtcblx0XHRcdGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcblx0XHRcdHJldHVybiBpbnZva2UkMSgpO1xuXHRcdH1cblx0XHRpZiAoZWxhcHNlZCA+IGR1cmF0aW9uKSB7XG5cdFx0XHRsYXN0RXhlYyA9IERhdGUubm93KCk7XG5cdFx0XHRpZiAobGVhZGluZyB8fCAhaXNMZWFkaW5nKSBpbnZva2UkMSgpO1xuXHRcdH0gZWxzZSBpZiAodHJhaWxpbmcpIGxhc3RWYWx1ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGxhc3RSZWplY3RvciA9IHJlamVjdE9uQ2FuY2VsID8gcmVqZWN0IDogcmVzb2x2ZTtcblx0XHRcdHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcblx0XHRcdFx0aXNMZWFkaW5nID0gdHJ1ZTtcblx0XHRcdFx0cmVzb2x2ZShpbnZva2UkMSgpKTtcblx0XHRcdFx0Y2xlYXIoKTtcblx0XHRcdH0sIE1hdGgubWF4KDAsIGR1cmF0aW9uIC0gZWxhcHNlZCkpO1xuXHRcdH0pO1xuXHRcdGlmICghbGVhZGluZyAmJiAhdGltZXIpIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBpc0xlYWRpbmcgPSB0cnVlLCBkdXJhdGlvbik7XG5cdFx0aXNMZWFkaW5nID0gZmFsc2U7XG5cdFx0cmV0dXJuIGxhc3RWYWx1ZTtcblx0fTtcblx0cmV0dXJuIGZpbHRlcjtcbn1cbi8qKlxuKiBFdmVudEZpbHRlciB0aGF0IGdpdmVzIGV4dHJhIGNvbnRyb2xzIHRvIHBhdXNlIGFuZCByZXN1bWUgdGhlIGZpbHRlclxuKlxuKiBAcGFyYW0gZXh0ZW5kRmlsdGVyICBFeHRyYSBmaWx0ZXIgdG8gYXBwbHkgd2hlbiB0aGUgUGF1c2FibGVGaWx0ZXIgaXMgYWN0aXZlLCBkZWZhdWx0IHRvIG5vbmVcbiogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGZpbHRlclxuKi9cbmZ1bmN0aW9uIHBhdXNhYmxlRmlsdGVyKGV4dGVuZEZpbHRlciA9IGJ5cGFzc0ZpbHRlciwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFN0YXRlID0gXCJhY3RpdmVcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNBY3RpdmUgPSB0b1JlZihpbml0aWFsU3RhdGUgPT09IFwiYWN0aXZlXCIpO1xuXHRmdW5jdGlvbiBwYXVzZSgpIHtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGZ1bmN0aW9uIHJlc3VtZSgpIHtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG5cdH1cblx0Y29uc3QgZXZlbnRGaWx0ZXIgPSAoLi4uYXJncykgPT4ge1xuXHRcdGlmIChpc0FjdGl2ZS52YWx1ZSkgZXh0ZW5kRmlsdGVyKC4uLmFyZ3MpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdGlzQWN0aXZlOiByZWFkb25seShpc0FjdGl2ZSksXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGV2ZW50RmlsdGVyXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL2dlbmVyYWwudHNcbmZ1bmN0aW9uIHByb21pc2VUaW1lb3V0KG1zLCB0aHJvd09uVGltZW91dCA9IGZhbHNlLCByZWFzb24gPSBcIlRpbWVvdXRcIikge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGlmICh0aHJvd09uVGltZW91dCkgc2V0VGltZW91dCgoKSA9PiByZWplY3QocmVhc29uKSwgbXMpO1xuXHRcdGVsc2Ugc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG5cdH0pO1xufVxuZnVuY3Rpb24gaWRlbnRpdHkoYXJnKSB7XG5cdHJldHVybiBhcmc7XG59XG4vKipcbiogQ3JlYXRlIHNpbmdsZXRvbiBwcm9taXNlIGZ1bmN0aW9uXG4qXG4qIEBleGFtcGxlXG4qIGBgYFxuKiBjb25zdCBwcm9taXNlID0gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShhc3luYyAoKSA9PiB7IC4uLiB9KVxuKlxuKiBhd2FpdCBwcm9taXNlKClcbiogYXdhaXQgcHJvbWlzZSgpIC8vIGFsbCBvZiB0aGVtIHdpbGwgYmUgYmluZCB0byBhIHNpbmdsZSBwcm9taXNlIGluc3RhbmNlXG4qIGF3YWl0IHByb21pc2UoKSAvLyBhbmQgYmUgcmVzb2x2ZWQgdG9nZXRoZXJcbiogYGBgXG4qL1xuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShmbikge1xuXHRsZXQgX3Byb21pc2U7XG5cdGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG5cdFx0aWYgKCFfcHJvbWlzZSkgX3Byb21pc2UgPSBmbigpO1xuXHRcdHJldHVybiBfcHJvbWlzZTtcblx0fVxuXHR3cmFwcGVyLnJlc2V0ID0gYXN5bmMgKCkgPT4ge1xuXHRcdGNvbnN0IF9wcmV2ID0gX3Byb21pc2U7XG5cdFx0X3Byb21pc2UgPSB2b2lkIDA7XG5cdFx0aWYgKF9wcmV2KSBhd2FpdCBfcHJldjtcblx0fTtcblx0cmV0dXJuIHdyYXBwZXI7XG59XG5mdW5jdGlvbiBpbnZva2UoZm4pIHtcblx0cmV0dXJuIGZuKCk7XG59XG5mdW5jdGlvbiBjb250YWluc1Byb3Aob2JqLCAuLi5wcm9wcykge1xuXHRyZXR1cm4gcHJvcHMuc29tZSgoaykgPT4gayBpbiBvYmopO1xufVxuZnVuY3Rpb24gaW5jcmVhc2VXaXRoVW5pdCh0YXJnZXQsIGRlbHRhKSB7XG5cdHZhciBfdGFyZ2V0JG1hdGNoO1xuXHRpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHRhcmdldCArIGRlbHRhO1xuXHRjb25zdCB2YWx1ZSA9ICgoX3RhcmdldCRtYXRjaCA9IHRhcmdldC5tYXRjaCgvXi0/XFxkK1xcLj9cXGQqLykpID09PSBudWxsIHx8IF90YXJnZXQkbWF0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YXJnZXQkbWF0Y2hbMF0pIHx8IFwiXCI7XG5cdGNvbnN0IHVuaXQgPSB0YXJnZXQuc2xpY2UodmFsdWUubGVuZ3RoKTtcblx0Y29uc3QgcmVzdWx0ID0gTnVtYmVyLnBhcnNlRmxvYXQodmFsdWUpICsgZGVsdGE7XG5cdGlmIChOdW1iZXIuaXNOYU4ocmVzdWx0KSkgcmV0dXJuIHRhcmdldDtcblx0cmV0dXJuIHJlc3VsdCArIHVuaXQ7XG59XG4vKipcbiogR2V0IGEgcHggdmFsdWUgZm9yIFNTUiB1c2UsIGRvIG5vdCByZWx5IG9uIHRoaXMgbWV0aG9kIG91dHNpZGUgb2YgU1NSIGFzIFJFTSB1bml0IGlzIGFzc3VtZWQgYXQgMTZweCwgd2hpY2ggbWlnaHQgbm90IGJlIHRoZSBjYXNlIG9uIHRoZSBjbGllbnRcbiovXG5mdW5jdGlvbiBweFZhbHVlKHB4KSB7XG5cdHJldHVybiBweC5lbmRzV2l0aChcInJlbVwiKSA/IE51bWJlci5wYXJzZUZsb2F0KHB4KSAqIDE2IDogTnVtYmVyLnBhcnNlRmxvYXQocHgpO1xufVxuLyoqXG4qIENyZWF0ZSBhIG5ldyBzdWJzZXQgb2JqZWN0IGJ5IGdpdmluZyBrZXlzXG4qL1xuZnVuY3Rpb24gb2JqZWN0UGljayhvYmosIGtleXMsIG9taXRVbmRlZmluZWQgPSBmYWxzZSkge1xuXHRyZXR1cm4ga2V5cy5yZWR1Y2UoKG4sIGspID0+IHtcblx0XHRpZiAoayBpbiBvYmopIHtcblx0XHRcdGlmICghb21pdFVuZGVmaW5lZCB8fCBvYmpba10gIT09IHZvaWQgMCkgbltrXSA9IG9ialtrXTtcblx0XHR9XG5cdFx0cmV0dXJuIG47XG5cdH0sIHt9KTtcbn1cbi8qKlxuKiBDcmVhdGUgYSBuZXcgc3Vic2V0IG9iamVjdCBieSBvbWl0IGdpdmluZyBrZXlzXG4qL1xuZnVuY3Rpb24gb2JqZWN0T21pdChvYmosIGtleXMsIG9taXRVbmRlZmluZWQgPSBmYWxzZSkge1xuXHRyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHtcblx0XHRyZXR1cm4gKCFvbWl0VW5kZWZpbmVkIHx8IHZhbHVlICE9PSB2b2lkIDApICYmICFrZXlzLmluY2x1ZGVzKGtleSk7XG5cdH0pKTtcbn1cbmZ1bmN0aW9uIG9iamVjdEVudHJpZXMob2JqKSB7XG5cdHJldHVybiBPYmplY3QuZW50cmllcyhvYmopO1xufVxuZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL3BvcnQudHNcbmZ1bmN0aW9uIGNhY2hlU3RyaW5nRnVuY3Rpb24oZm4pIHtcblx0Y29uc3QgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHRyZXR1cm4gKChzdHIpID0+IHtcblx0XHRyZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpO1xuXHR9KTtcbn1cbmNvbnN0IGh5cGhlbmF0ZVJFID0gL1xcQihbQS1aXSkvZztcbmNvbnN0IGh5cGhlbmF0ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsIFwiLSQxXCIpLnRvTG93ZXJDYXNlKCkpO1xuY29uc3QgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbmNvbnN0IGNhbWVsaXplID0gY2FjaGVTdHJpbmdGdW5jdGlvbigoc3RyKSA9PiB7XG5cdHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCAoXywgYykgPT4gYyA/IGMudG9VcHBlckNhc2UoKSA6IFwiXCIpO1xufSk7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL3Z1ZS50c1xuZnVuY3Rpb24gZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCkge1xuXHRyZXR1cm4gdGFyZ2V0IHx8IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVTaGFyZWRDb21wb3NhYmxlL2luZGV4LnRzXG4vKipcbiogTWFrZSBhIGNvbXBvc2FibGUgZnVuY3Rpb24gdXNhYmxlIHdpdGggbXVsdGlwbGUgVnVlIGluc3RhbmNlcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlU2hhcmVkQ29tcG9zYWJsZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVNoYXJlZENvbXBvc2FibGUoY29tcG9zYWJsZSkge1xuXHRpZiAoIWlzQ2xpZW50KSByZXR1cm4gY29tcG9zYWJsZTtcblx0bGV0IHN1YnNjcmliZXJzID0gMDtcblx0bGV0IHN0YXRlO1xuXHRsZXQgc2NvcGU7XG5cdGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XG5cdFx0c3Vic2NyaWJlcnMgLT0gMTtcblx0XHRpZiAoc2NvcGUgJiYgc3Vic2NyaWJlcnMgPD0gMCkge1xuXHRcdFx0c2NvcGUuc3RvcCgpO1xuXHRcdFx0c3RhdGUgPSB2b2lkIDA7XG5cdFx0XHRzY29wZSA9IHZvaWQgMDtcblx0XHR9XG5cdH07XG5cdHJldHVybiAoKC4uLmFyZ3MpID0+IHtcblx0XHRzdWJzY3JpYmVycyArPSAxO1xuXHRcdGlmICghc2NvcGUpIHtcblx0XHRcdHNjb3BlID0gZWZmZWN0U2NvcGUodHJ1ZSk7XG5cdFx0XHRzdGF0ZSA9IHNjb3BlLnJ1bigoKSA9PiBjb21wb3NhYmxlKC4uLmFyZ3MpKTtcblx0XHR9XG5cdFx0dHJ5T25TY29wZURpc3Bvc2UoZGlzcG9zZSk7XG5cdFx0cmV0dXJuIHN0YXRlO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gZXh0ZW5kUmVmL2luZGV4LnRzXG5mdW5jdGlvbiBleHRlbmRSZWYocmVmJDEsIGV4dGVuZCwgeyBlbnVtZXJhYmxlID0gZmFsc2UsIHVud3JhcCA9IHRydWUgfSA9IHt9KSB7XG5cdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4dGVuZCkpIHtcblx0XHRpZiAoa2V5ID09PSBcInZhbHVlXCIpIGNvbnRpbnVlO1xuXHRcdGlmIChpc1JlZih2YWx1ZSkgJiYgdW53cmFwKSBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVmJDEsIGtleSwge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUudmFsdWU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0KHYpIHtcblx0XHRcdFx0dmFsdWUudmFsdWUgPSB2O1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGVcblx0XHR9KTtcblx0XHRlbHNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWYkMSwga2V5LCB7XG5cdFx0XHR2YWx1ZSxcblx0XHRcdGVudW1lcmFibGVcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gcmVmJDE7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGdldC9pbmRleC50c1xuZnVuY3Rpb24gZ2V0KG9iaiwga2V5KSB7XG5cdGlmIChrZXkgPT0gbnVsbCkgcmV0dXJuIHVucmVmKG9iaik7XG5cdHJldHVybiB1bnJlZihvYmopW2tleV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGlzRGVmaW5lZC9pbmRleC50c1xuZnVuY3Rpb24gaXNEZWZpbmVkKHYpIHtcblx0cmV0dXJuIHVucmVmKHYpICE9IG51bGw7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIG1ha2VEZXN0cnVjdHVyYWJsZS9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIG1ha2VEZXN0cnVjdHVyYWJsZShvYmosIGFycikge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdGNvbnN0IGNsb25lID0geyAuLi5vYmogfTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xvbmUsIFN5bWJvbC5pdGVyYXRvciwge1xuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHR2YWx1ZSgpIHtcblx0XHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdFx0cmV0dXJuIHsgbmV4dDogKCkgPT4gKHtcblx0XHRcdFx0XHR2YWx1ZTogYXJyW2luZGV4KytdLFxuXHRcdFx0XHRcdGRvbmU6IGluZGV4ID4gYXJyLmxlbmd0aFxuXHRcdFx0XHR9KSB9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBjbG9uZTtcblx0fSBlbHNlIHJldHVybiBPYmplY3QuYXNzaWduKFsuLi5hcnJdLCBvYmopO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGlmeS9pbmRleC50c1xuLyoqXG4qIENvbnZlcnRzIHBsYWluIGZ1bmN0aW9uIGludG8gYSByZWFjdGl2ZSBmdW5jdGlvbi5cbiogVGhlIGNvbnZlcnRlZCBmdW5jdGlvbiBhY2NlcHRzIHJlZnMgYXMgaXQncyBhcmd1bWVudHNcbiogYW5kIHJldHVybnMgYSBDb21wdXRlZFJlZiwgd2l0aCBwcm9wZXIgdHlwaW5nLlxuKlxuKiBAcGFyYW0gZm4gLSBTb3VyY2UgZnVuY3Rpb25cbiogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVhY3RpZnkoZm4sIG9wdGlvbnMpIHtcblx0Y29uc3QgdW5yZWZGbiA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY29tcHV0ZWRHZXR0ZXIpID09PSBmYWxzZSA/IHVucmVmIDogdG9WYWx1ZTtcblx0cmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0XHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gZm4uYXBwbHkodGhpcywgYXJncy5tYXAoKGkpID0+IHVucmVmRm4oaSkpKSk7XG5cdH07XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWFjdGlmeWAgaW5zdGVhZCAqL1xuY29uc3QgY3JlYXRlUmVhY3RpdmVGbiA9IHJlYWN0aWZ5O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGlmeU9iamVjdC9pbmRleC50c1xuLyoqXG4qIEFwcGx5IGByZWFjdGlmeWAgdG8gYW4gb2JqZWN0XG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVhY3RpZnlPYmplY3Qob2JqLCBvcHRpb25zT3JLZXlzID0ge30pIHtcblx0bGV0IGtleXMgPSBbXTtcblx0bGV0IG9wdGlvbnM7XG5cdGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnNPcktleXMpKSBrZXlzID0gb3B0aW9uc09yS2V5cztcblx0ZWxzZSB7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnNPcktleXM7XG5cdFx0Y29uc3QgeyBpbmNsdWRlT3duUHJvcGVydGllcyA9IHRydWUgfSA9IG9wdGlvbnNPcktleXM7XG5cdFx0a2V5cy5wdXNoKC4uLk9iamVjdC5rZXlzKG9iaikpO1xuXHRcdGlmIChpbmNsdWRlT3duUHJvcGVydGllcykga2V5cy5wdXNoKC4uLk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikpO1xuXHR9XG5cdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoa2V5cy5tYXAoKGtleSkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG5cdFx0cmV0dXJuIFtrZXksIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVhY3RpZnkodmFsdWUuYmluZChvYmopLCBvcHRpb25zKSA6IHZhbHVlXTtcblx0fSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0b1JlYWN0aXZlL2luZGV4LnRzXG4vKipcbiogQ29udmVydHMgcmVmIHRvIHJlYWN0aXZlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy90b1JlYWN0aXZlXG4qIEBwYXJhbSBvYmplY3RSZWYgQSByZWYgb2Ygb2JqZWN0XG4qL1xuZnVuY3Rpb24gdG9SZWFjdGl2ZShvYmplY3RSZWYpIHtcblx0aWYgKCFpc1JlZihvYmplY3RSZWYpKSByZXR1cm4gcmVhY3RpdmUob2JqZWN0UmVmKTtcblx0cmV0dXJuIHJlYWN0aXZlKG5ldyBQcm94eSh7fSwge1xuXHRcdGdldChfLCBwLCByZWNlaXZlcikge1xuXHRcdFx0cmV0dXJuIHVucmVmKFJlZmxlY3QuZ2V0KG9iamVjdFJlZi52YWx1ZSwgcCwgcmVjZWl2ZXIpKTtcblx0XHR9LFxuXHRcdHNldChfLCBwLCB2YWx1ZSkge1xuXHRcdFx0aWYgKGlzUmVmKG9iamVjdFJlZi52YWx1ZVtwXSkgJiYgIWlzUmVmKHZhbHVlKSkgb2JqZWN0UmVmLnZhbHVlW3BdLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRlbHNlIG9iamVjdFJlZi52YWx1ZVtwXSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblx0XHRkZWxldGVQcm9wZXJ0eShfLCBwKSB7XG5cdFx0XHRyZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShvYmplY3RSZWYudmFsdWUsIHApO1xuXHRcdH0sXG5cdFx0aGFzKF8sIHApIHtcblx0XHRcdHJldHVybiBSZWZsZWN0LmhhcyhvYmplY3RSZWYudmFsdWUsIHApO1xuXHRcdH0sXG5cdFx0b3duS2V5cygpIHtcblx0XHRcdHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RSZWYudmFsdWUpO1xuXHRcdH0sXG5cdFx0Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH1cblx0fSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGl2ZUNvbXB1dGVkL2luZGV4LnRzXG4vKipcbiogQ29tcHV0ZWQgcmVhY3RpdmUgb2JqZWN0LlxuKi9cbmZ1bmN0aW9uIHJlYWN0aXZlQ29tcHV0ZWQoZm4pIHtcblx0cmV0dXJuIHRvUmVhY3RpdmUoY29tcHV0ZWQoZm4pKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpdmVPbWl0L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBvbWl0IGZpZWxkcyBmcm9tIGEgcmVhY3RpdmUgb2JqZWN0XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3JlYWN0aXZlT21pdFxuKi9cbmZ1bmN0aW9uIHJlYWN0aXZlT21pdChvYmosIC4uLmtleXMpIHtcblx0Y29uc3QgZmxhdEtleXMgPSBrZXlzLmZsYXQoKTtcblx0Y29uc3QgcHJlZGljYXRlID0gZmxhdEtleXNbMF07XG5cdHJldHVybiByZWFjdGl2ZUNvbXB1dGVkKCgpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09IFwiZnVuY3Rpb25cIiA/IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0b1JlZnMkMShvYmopKS5maWx0ZXIoKFtrLCB2XSkgPT4gIXByZWRpY2F0ZSh0b1ZhbHVlKHYpLCBrKSkpIDogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRvUmVmcyQxKG9iaikpLmZpbHRlcigoZSkgPT4gIWZsYXRLZXlzLmluY2x1ZGVzKGVbMF0pKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWFjdGl2ZVBpY2svaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IHBpY2sgZmllbGRzIGZyb20gYSByZWFjdGl2ZSBvYmplY3RcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvcmVhY3RpdmVQaWNrXG4qL1xuZnVuY3Rpb24gcmVhY3RpdmVQaWNrKG9iaiwgLi4ua2V5cykge1xuXHRjb25zdCBmbGF0S2V5cyA9IGtleXMuZmxhdCgpO1xuXHRjb25zdCBwcmVkaWNhdGUgPSBmbGF0S2V5c1swXTtcblx0cmV0dXJuIHJlYWN0aXZlQ29tcHV0ZWQoKCkgPT4gdHlwZW9mIHByZWRpY2F0ZSA9PT0gXCJmdW5jdGlvblwiID8gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRvUmVmcyQxKG9iaikpLmZpbHRlcigoW2ssIHZdKSA9PiBwcmVkaWNhdGUodG9WYWx1ZSh2KSwgaykpKSA6IE9iamVjdC5mcm9tRW50cmllcyhmbGF0S2V5cy5tYXAoKGspID0+IFtrLCB0b1JlZihvYmosIGspXSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVmQXV0b1Jlc2V0L2luZGV4LnRzXG4vKipcbiogQ3JlYXRlIGEgcmVmIHdoaWNoIHdpbGwgYmUgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgYWZ0ZXIgc29tZSB0aW1lLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9yZWZBdXRvUmVzZXRcbiogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgd2hpY2ggd2lsbCBiZSBzZXQuXG4qIEBwYXJhbSBhZnRlck1zICAgICAgQSB6ZXJvLW9yLWdyZWF0ZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuKi9cbmZ1bmN0aW9uIHJlZkF1dG9SZXNldChkZWZhdWx0VmFsdWUsIGFmdGVyTXMgPSAxZTQpIHtcblx0cmV0dXJuIGN1c3RvbVJlZigodHJhY2ssIHRyaWdnZXIpID0+IHtcblx0XHRsZXQgdmFsdWUgPSB0b1ZhbHVlKGRlZmF1bHRWYWx1ZSk7XG5cdFx0bGV0IHRpbWVyO1xuXHRcdGNvbnN0IHJlc2V0QWZ0ZXIgPSAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHZhbHVlID0gdG9WYWx1ZShkZWZhdWx0VmFsdWUpO1xuXHRcdFx0dHJpZ2dlcigpO1xuXHRcdH0sIHRvVmFsdWUoYWZ0ZXJNcykpO1xuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0dHJhY2soKTtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldChuZXdWYWx1ZSkge1xuXHRcdFx0XHR2YWx1ZSA9IG5ld1ZhbHVlO1xuXHRcdFx0XHR0cmlnZ2VyKCk7XG5cdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHRcdHRpbWVyID0gcmVzZXRBZnRlcigpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmQXV0b1Jlc2V0YCBpbnN0ZWFkICovXG5jb25zdCBhdXRvUmVzZXRSZWYgPSByZWZBdXRvUmVzZXQ7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURlYm91bmNlRm4vaW5kZXgudHNcbi8qKlxuKiBEZWJvdW5jZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGVib3VuY2VGblxuKiBAcGFyYW0gIGZuICAgICAgICAgIEEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZGVsYXkgbWlsbGlzZWNvbmRzIGRlYm91bmNlZC5cbiogQHBhcmFtICBtcyAgICAgICAgICBBIHplcm8tb3ItZ3JlYXRlciBkZWxheSBpbiBtaWxsaXNlY29uZHMuIEZvciBldmVudCBjYWxsYmFja3MsIHZhbHVlcyBhcm91bmQgMTAwIG9yIDI1MCAob3IgZXZlbiBoaWdoZXIpIGFyZSBtb3N0IHVzZWZ1bC5cbiogQHBhcmFtICBvcHRpb25zICAgICBPcHRpb25zXG4qXG4qIEByZXR1cm4gQSBuZXcsIGRlYm91bmNlLCBmdW5jdGlvbi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEZWJvdW5jZUZuKGZuLCBtcyA9IDIwMCwgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBjcmVhdGVGaWx0ZXJXcmFwcGVyKGRlYm91bmNlRmlsdGVyKG1zLCBvcHRpb25zKSwgZm4pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZEZWJvdW5jZWQvaW5kZXgudHNcbi8qKlxuKiBEZWJvdW5jZSB1cGRhdGVzIG9mIGEgcmVmLlxuKlxuKiBAcmV0dXJuIEEgbmV3IGRlYm91bmNlZCByZWYuXG4qL1xuZnVuY3Rpb24gcmVmRGVib3VuY2VkKHZhbHVlLCBtcyA9IDIwMCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGRlYm91bmNlZCA9IHJlZih0b1ZhbHVlKHZhbHVlKSk7XG5cdGNvbnN0IHVwZGF0ZXIgPSB1c2VEZWJvdW5jZUZuKCgpID0+IHtcblx0XHRkZWJvdW5jZWQudmFsdWUgPSB2YWx1ZS52YWx1ZTtcblx0fSwgbXMsIG9wdGlvbnMpO1xuXHR3YXRjaCh2YWx1ZSwgKCkgPT4gdXBkYXRlcigpKTtcblx0cmV0dXJuIHNoYWxsb3dSZWFkb25seShkZWJvdW5jZWQpO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmRGVib3VuY2VkYCBpbnN0ZWFkICovXG5jb25zdCBkZWJvdW5jZWRSZWYgPSByZWZEZWJvdW5jZWQ7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWZEZWJvdW5jZWRgIGluc3RlYWQgKi9cbmNvbnN0IHVzZURlYm91bmNlID0gcmVmRGVib3VuY2VkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZEZWZhdWx0L2luZGV4LnRzXG4vKipcbiogQXBwbHkgZGVmYXVsdCB2YWx1ZSB0byBhIHJlZi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiByZWZEZWZhdWx0KHNvdXJjZSwgZGVmYXVsdFZhbHVlKSB7XG5cdHJldHVybiBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0dmFyIF9zb3VyY2UkdmFsdWU7XG5cdFx0XHRyZXR1cm4gKF9zb3VyY2UkdmFsdWUgPSBzb3VyY2UudmFsdWUpICE9PSBudWxsICYmIF9zb3VyY2UkdmFsdWUgIT09IHZvaWQgMCA/IF9zb3VyY2UkdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHNvdXJjZS52YWx1ZSA9IHZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHJlZk1hbnVhbFJlc2V0L2luZGV4LnRzXG4vKipcbiogQ3JlYXRlIGEgcmVmIHdpdGggbWFudWFsIHJlc2V0IGZ1bmN0aW9uYWxpdHkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3JlZk1hbnVhbFJlc2V0XG4qIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHdoaWNoIHdpbGwgYmUgc2V0LlxuKi9cbmZ1bmN0aW9uIHJlZk1hbnVhbFJlc2V0KGRlZmF1bHRWYWx1ZSkge1xuXHRsZXQgdmFsdWUgPSB0b1ZhbHVlKGRlZmF1bHRWYWx1ZSk7XG5cdGxldCB0cmlnZ2VyO1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHR2YWx1ZSA9IHRvVmFsdWUoZGVmYXVsdFZhbHVlKTtcblx0XHR0cmlnZ2VyKCk7XG5cdH07XG5cdGNvbnN0IHJlZlZhbHVlID0gY3VzdG9tUmVmKCh0cmFjaywgX3RyaWdnZXIpID0+IHtcblx0XHR0cmlnZ2VyID0gX3RyaWdnZXI7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0dHJhY2soKTtcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldChuZXdWYWx1ZSkge1xuXHRcdFx0XHR2YWx1ZSA9IG5ld1ZhbHVlO1xuXHRcdFx0XHR0cmlnZ2VyKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSk7XG5cdHJlZlZhbHVlLnJlc2V0ID0gcmVzZXQ7XG5cdHJldHVybiByZWZWYWx1ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGhyb3R0bGVGbi9pbmRleC50c1xuLyoqXG4qIFRocm90dGxlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgcmF0ZSBsaW1pdGluZ1xuKiBleGVjdXRpb24gb2YgaGFuZGxlcnMgb24gZXZlbnRzIGxpa2UgcmVzaXplIGFuZCBzY3JvbGwuXG4qXG4qIEBwYXJhbSAgIGZuICAgICAgICAgICAgIEEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZGVsYXkgbWlsbGlzZWNvbmRzLiBUaGUgYHRoaXNgIGNvbnRleHQgYW5kIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoLCBhcy1pcyxcbiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBgY2FsbGJhY2tgIHdoZW4gdGhlIHRocm90dGxlZC1mdW5jdGlvbiBpcyBleGVjdXRlZC5cbiogQHBhcmFtICAgbXMgICAgICAgICAgICAgQSB6ZXJvLW9yLWdyZWF0ZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBGb3IgZXZlbnQgY2FsbGJhY2tzLCB2YWx1ZXMgYXJvdW5kIDEwMCBvciAyNTAgKG9yIGV2ZW4gaGlnaGVyKSBhcmUgbW9zdCB1c2VmdWwuXG4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgdmFsdWU6IDIwMClcbipcbiogQHBhcmFtIFt0cmFpbGluZ10gaWYgdHJ1ZSwgY2FsbCBmbiBhZ2FpbiBhZnRlciB0aGUgdGltZSBpcyB1cCAoZGVmYXVsdCB2YWx1ZTogZmFsc2UpXG4qXG4qIEBwYXJhbSBbbGVhZGluZ10gaWYgdHJ1ZSwgY2FsbCBmbiBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBtcyB0aW1lb3V0IChkZWZhdWx0IHZhbHVlOiB0cnVlKVxuKlxuKiBAcGFyYW0gW3JlamVjdE9uQ2FuY2VsXSBpZiB0cnVlLCByZWplY3QgdGhlIGxhc3QgY2FsbCBpZiBpdCdzIGJlZW4gY2FuY2VsIChkZWZhdWx0IHZhbHVlOiBmYWxzZSlcbipcbiogQHJldHVybiAgQSBuZXcsIHRocm90dGxlZCwgZnVuY3Rpb24uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVGhyb3R0bGVGbihmbiwgbXMgPSAyMDAsIHRyYWlsaW5nID0gZmFsc2UsIGxlYWRpbmcgPSB0cnVlLCByZWplY3RPbkNhbmNlbCA9IGZhbHNlKSB7XG5cdHJldHVybiBjcmVhdGVGaWx0ZXJXcmFwcGVyKHRocm90dGxlRmlsdGVyKG1zLCB0cmFpbGluZywgbGVhZGluZywgcmVqZWN0T25DYW5jZWwpLCBmbik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHJlZlRocm90dGxlZC9pbmRleC50c1xuLyoqXG4qIFRocm90dGxlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgcmF0ZSBsaW1pdGluZ1xuKiBleGVjdXRpb24gb2YgaGFuZGxlcnMgb24gZXZlbnRzIGxpa2UgcmVzaXplIGFuZCBzY3JvbGwuXG4qXG4qIEBwYXJhbSB2YWx1ZSBSZWYgdmFsdWUgdG8gYmUgd2F0Y2hlZCB3aXRoIHRocm90dGxlIGVmZmVjdFxuKiBAcGFyYW0gIGRlbGF5ICBBIHplcm8tb3ItZ3JlYXRlciBkZWxheSBpbiBtaWxsaXNlY29uZHMuIEZvciBldmVudCBjYWxsYmFja3MsIHZhbHVlcyBhcm91bmQgMTAwIG9yIDI1MCAob3IgZXZlbiBoaWdoZXIpIGFyZSBtb3N0IHVzZWZ1bC5cbiogQHBhcmFtIHRyYWlsaW5nIGlmIHRydWUsIHVwZGF0ZSB0aGUgdmFsdWUgYWdhaW4gYWZ0ZXIgdGhlIGRlbGF5IHRpbWUgaXMgdXBcbiogQHBhcmFtIGxlYWRpbmcgaWYgdHJ1ZSwgdXBkYXRlIHRoZSB2YWx1ZSBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBtcyB0aW1lb3V0XG4qL1xuZnVuY3Rpb24gcmVmVGhyb3R0bGVkKHZhbHVlLCBkZWxheSA9IDIwMCwgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSkge1xuXHRpZiAoZGVsYXkgPD0gMCkgcmV0dXJuIHZhbHVlO1xuXHRjb25zdCB0aHJvdHRsZWQgPSByZWYodG9WYWx1ZSh2YWx1ZSkpO1xuXHRjb25zdCB1cGRhdGVyID0gdXNlVGhyb3R0bGVGbigoKSA9PiB7XG5cdFx0dGhyb3R0bGVkLnZhbHVlID0gdmFsdWUudmFsdWU7XG5cdH0sIGRlbGF5LCB0cmFpbGluZywgbGVhZGluZyk7XG5cdHdhdGNoKHZhbHVlLCAoKSA9PiB1cGRhdGVyKCkpO1xuXHRyZXR1cm4gdGhyb3R0bGVkO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmVGhyb3R0bGVkYCBpbnN0ZWFkICovXG5jb25zdCB0aHJvdHRsZWRSZWYgPSByZWZUaHJvdHRsZWQ7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWZUaHJvdHRsZWRgIGluc3RlYWQgKi9cbmNvbnN0IHVzZVRocm90dGxlID0gcmVmVGhyb3R0bGVkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZXaXRoQ29udHJvbC9pbmRleC50c1xuLyoqXG4qIEZpbmUtZ3JhaW5lZCBjb250cm9scyBvdmVyIHJlZiBhbmQgaXRzIHJlYWN0aXZpdHkuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVmV2l0aENvbnRyb2woaW5pdGlhbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGxldCBzb3VyY2UgPSBpbml0aWFsO1xuXHRsZXQgdHJhY2s7XG5cdGxldCB0cmlnZ2VyO1xuXHRjb25zdCByZWYkMSA9IGN1c3RvbVJlZigoX3RyYWNrLCBfdHJpZ2dlcikgPT4ge1xuXHRcdHRyYWNrID0gX3RyYWNrO1xuXHRcdHRyaWdnZXIgPSBfdHJpZ2dlcjtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRyZXR1cm4gZ2V0JDEoKTtcblx0XHRcdH0sXG5cdFx0XHRzZXQodikge1xuXHRcdFx0XHRzZXQkMSh2KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9KTtcblx0ZnVuY3Rpb24gZ2V0JDEodHJhY2tpbmcgPSB0cnVlKSB7XG5cdFx0aWYgKHRyYWNraW5nKSB0cmFjaygpO1xuXHRcdHJldHVybiBzb3VyY2U7XG5cdH1cblx0ZnVuY3Rpb24gc2V0JDEodmFsdWUsIHRyaWdnZXJpbmcgPSB0cnVlKSB7XG5cdFx0dmFyIF9vcHRpb25zJG9uQmVmb3JlQ2hhbiwgX29wdGlvbnMkb25DaGFuZ2VkO1xuXHRcdGlmICh2YWx1ZSA9PT0gc291cmNlKSByZXR1cm47XG5cdFx0Y29uc3Qgb2xkID0gc291cmNlO1xuXHRcdGlmICgoKF9vcHRpb25zJG9uQmVmb3JlQ2hhbiA9IG9wdGlvbnMub25CZWZvcmVDaGFuZ2UpID09PSBudWxsIHx8IF9vcHRpb25zJG9uQmVmb3JlQ2hhbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkb25CZWZvcmVDaGFuLmNhbGwob3B0aW9ucywgdmFsdWUsIG9sZCkpID09PSBmYWxzZSkgcmV0dXJuO1xuXHRcdHNvdXJjZSA9IHZhbHVlO1xuXHRcdChfb3B0aW9ucyRvbkNoYW5nZWQgPSBvcHRpb25zLm9uQ2hhbmdlZCkgPT09IG51bGwgfHwgX29wdGlvbnMkb25DaGFuZ2VkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25DaGFuZ2VkLmNhbGwob3B0aW9ucywgdmFsdWUsIG9sZCk7XG5cdFx0aWYgKHRyaWdnZXJpbmcpIHRyaWdnZXIoKTtcblx0fVxuXHQvKipcblx0KiBHZXQgdGhlIHZhbHVlIHdpdGhvdXQgdHJhY2tlZCBpbiB0aGUgcmVhY3Rpdml0eSBzeXN0ZW1cblx0Ki9cblx0Y29uc3QgdW50cmFja2VkR2V0ID0gKCkgPT4gZ2V0JDEoZmFsc2UpO1xuXHQvKipcblx0KiBTZXQgdGhlIHZhbHVlIHdpdGhvdXQgdHJpZ2dlcmluZyB0aGUgcmVhY3Rpdml0eSBzeXN0ZW1cblx0Ki9cblx0Y29uc3Qgc2lsZW50U2V0ID0gKHYpID0+IHNldCQxKHYsIGZhbHNlKTtcblx0LyoqXG5cdCogR2V0IHRoZSB2YWx1ZSB3aXRob3V0IHRyYWNrZWQgaW4gdGhlIHJlYWN0aXZpdHkgc3lzdGVtLlxuXHQqXG5cdCogQWxpYXMgZm9yIGB1bnRyYWNrZWRHZXQoKWBcblx0Ki9cblx0Y29uc3QgcGVlayA9ICgpID0+IGdldCQxKGZhbHNlKTtcblx0LyoqXG5cdCogU2V0IHRoZSB2YWx1ZSB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIHJlYWN0aXZpdHkgc3lzdGVtXG5cdCpcblx0KiBBbGlhcyBmb3IgYHNpbGVudFNldCh2KWBcblx0Ki9cblx0Y29uc3QgbGF5ID0gKHYpID0+IHNldCQxKHYsIGZhbHNlKTtcblx0cmV0dXJuIGV4dGVuZFJlZihyZWYkMSwge1xuXHRcdGdldDogZ2V0JDEsXG5cdFx0c2V0OiBzZXQkMSxcblx0XHR1bnRyYWNrZWRHZXQsXG5cdFx0c2lsZW50U2V0LFxuXHRcdHBlZWssXG5cdFx0bGF5XG5cdH0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHJlZldpdGhDb250cm9sYCBpbnN0ZWFkICovXG5jb25zdCBjb250cm9sbGVkUmVmID0gcmVmV2l0aENvbnRyb2w7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNldC9pbmRleC50c1xuLyoqXG4qICBTaG9ydGhhbmQgZm9yIGByZWYudmFsdWUgPSB4YFxuKi9cbmZ1bmN0aW9uIHNldCguLi5hcmdzKSB7XG5cdGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuXHRcdGNvbnN0IFtyZWYkMSwgdmFsdWVdID0gYXJncztcblx0XHRyZWYkMS52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cdGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbnN0IFt0YXJnZXQsIGtleSwgdmFsdWVdID0gYXJncztcblx0XHR0YXJnZXRba2V5XSA9IHZhbHVlO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoV2l0aEZpbHRlci9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyID0gYnlwYXNzRmlsdGVyLC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0cmV0dXJuIHdhdGNoKHNvdXJjZSwgY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgY2IpLCB3YXRjaE9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaFBhdXNhYmxlL2luZGV4LnRzXG4vKiogQGRlcHJlY2F0ZWQgVXNlIFZ1ZSdzIGJ1aWx0LWluIGB3YXRjaGAgaW5zdGVhZC4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb24uICovXG5mdW5jdGlvbiB3YXRjaFBhdXNhYmxlKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyOiBmaWx0ZXIsIGluaXRpYWxTdGF0ZSA9IFwiYWN0aXZlXCIsLi4ud2F0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyLCBwYXVzZSwgcmVzdW1lLCBpc0FjdGl2ZSB9ID0gcGF1c2FibGVGaWx0ZXIoZmlsdGVyLCB7IGluaXRpYWxTdGF0ZSB9KTtcblx0cmV0dXJuIHtcblx0XHRzdG9wOiB3YXRjaFdpdGhGaWx0ZXIoc291cmNlLCBjYiwge1xuXHRcdFx0Li4ud2F0Y2hPcHRpb25zLFxuXHRcdFx0ZXZlbnRGaWx0ZXJcblx0XHR9KSxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWUsXG5cdFx0aXNBY3RpdmVcblx0fTtcbn1cbi8qKiBAZGVwcmVjYXRlZCBVc2UgVnVlJ3MgYnVpbHQtaW4gYHdhdGNoYCBpbnN0ZWFkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbi4gKi9cbmNvbnN0IHBhdXNhYmxlV2F0Y2ggPSB3YXRjaFBhdXNhYmxlO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzeW5jUmVmL2luZGV4LnRzXG4vKipcbiogVHdvLXdheSByZWZzIHN5bmNocm9uaXphdGlvbi5cbiogRnJvbSB0aGUgc2V0IHRoZW9yeSBwZXJzcGVjdGl2ZSB0byByZXN0cmljdCB0aGUgb3B0aW9uJ3MgdHlwZVxuKiBDaGVjayBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuKiAxLiBMID0gUlxuKiAyLiBMIOKIqSBSIOKJoCDiiIVcbiogMy4gTCDiioYgUlxuKiA0LiBMIOKIqSBSID0g4oiFXG4qL1xuZnVuY3Rpb24gc3luY1JlZihsZWZ0LCByaWdodCwgLi4uW29wdGlvbnNdKSB7XG5cdGNvbnN0IHsgZmx1c2ggPSBcInN5bmNcIiwgZGVlcCA9IGZhbHNlLCBpbW1lZGlhdGUgPSB0cnVlLCBkaXJlY3Rpb24gPSBcImJvdGhcIiwgdHJhbnNmb3JtID0ge30gfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IHdhdGNoZXJzID0gW107XG5cdGNvbnN0IHRyYW5zZm9ybUxUUiA9IFwibHRyXCIgaW4gdHJhbnNmb3JtICYmIHRyYW5zZm9ybS5sdHIgfHwgKCh2KSA9PiB2KTtcblx0Y29uc3QgdHJhbnNmb3JtUlRMID0gXCJydGxcIiBpbiB0cmFuc2Zvcm0gJiYgdHJhbnNmb3JtLnJ0bCB8fCAoKHYpID0+IHYpO1xuXHRpZiAoZGlyZWN0aW9uID09PSBcImJvdGhcIiB8fCBkaXJlY3Rpb24gPT09IFwibHRyXCIpIHdhdGNoZXJzLnB1c2god2F0Y2hQYXVzYWJsZShsZWZ0LCAobmV3VmFsdWUpID0+IHtcblx0XHR3YXRjaGVycy5mb3JFYWNoKCh3KSA9PiB3LnBhdXNlKCkpO1xuXHRcdHJpZ2h0LnZhbHVlID0gdHJhbnNmb3JtTFRSKG5ld1ZhbHVlKTtcblx0XHR3YXRjaGVycy5mb3JFYWNoKCh3KSA9PiB3LnJlc3VtZSgpKTtcblx0fSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0aW1tZWRpYXRlXG5cdH0pKTtcblx0aWYgKGRpcmVjdGlvbiA9PT0gXCJib3RoXCIgfHwgZGlyZWN0aW9uID09PSBcInJ0bFwiKSB3YXRjaGVycy5wdXNoKHdhdGNoUGF1c2FibGUocmlnaHQsIChuZXdWYWx1ZSkgPT4ge1xuXHRcdHdhdGNoZXJzLmZvckVhY2goKHcpID0+IHcucGF1c2UoKSk7XG5cdFx0bGVmdC52YWx1ZSA9IHRyYW5zZm9ybVJUTChuZXdWYWx1ZSk7XG5cdFx0d2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5yZXN1bWUoKSk7XG5cdH0sIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGltbWVkaWF0ZVxuXHR9KSk7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0d2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5zdG9wKCkpO1xuXHR9O1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3luY1JlZnMvaW5kZXgudHNcbi8qKlxuKiBLZWVwIHRhcmdldCByZWYocykgaW4gc3luYyB3aXRoIHRoZSBzb3VyY2UgcmVmXG4qXG4qIEBwYXJhbSBzb3VyY2Ugc291cmNlIHJlZlxuKiBAcGFyYW0gdGFyZ2V0c1xuKi9cbmZ1bmN0aW9uIHN5bmNSZWZzKHNvdXJjZSwgdGFyZ2V0cywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZmx1c2ggPSBcInN5bmNcIiwgZGVlcCA9IGZhbHNlLCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB0YXJnZXRzQXJyYXkgPSB0b0FycmF5KHRhcmdldHMpO1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCAobmV3VmFsdWUpID0+IHRhcmdldHNBcnJheS5mb3JFYWNoKCh0YXJnZXQpID0+IHRhcmdldC52YWx1ZSA9IG5ld1ZhbHVlKSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0aW1tZWRpYXRlXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0b1JlZnMvaW5kZXgudHNcbi8qKlxuKiBFeHRlbmRlZCBgdG9SZWZzYCB0aGF0IGFsc28gYWNjZXB0cyByZWZzIG9mIGFuIG9iamVjdC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdG9SZWZzXG4qIEBwYXJhbSBvYmplY3RSZWYgQSByZWYgb3Igbm9ybWFsIG9iamVjdCBvciBhcnJheS5cbiogQHBhcmFtIG9wdGlvbnMgT3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3RSZWYsIG9wdGlvbnMgPSB7fSkge1xuXHRpZiAoIWlzUmVmKG9iamVjdFJlZikpIHJldHVybiB0b1JlZnMkMShvYmplY3RSZWYpO1xuXHRjb25zdCByZXN1bHQgPSBBcnJheS5pc0FycmF5KG9iamVjdFJlZi52YWx1ZSkgPyBBcnJheS5mcm9tKHsgbGVuZ3RoOiBvYmplY3RSZWYudmFsdWUubGVuZ3RoIH0pIDoge307XG5cdGZvciAoY29uc3Qga2V5IGluIG9iamVjdFJlZi52YWx1ZSkgcmVzdWx0W2tleV0gPSBjdXN0b21SZWYoKCkgPT4gKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gb2JqZWN0UmVmLnZhbHVlW2tleV07XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0dmFyIF90b1ZhbHVlO1xuXHRcdFx0aWYgKChfdG9WYWx1ZSA9IHRvVmFsdWUob3B0aW9ucy5yZXBsYWNlUmVmKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogdHJ1ZSkgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0UmVmLnZhbHVlKSkge1xuXHRcdFx0XHRjb25zdCBjb3B5ID0gWy4uLm9iamVjdFJlZi52YWx1ZV07XG5cdFx0XHRcdGNvcHlba2V5XSA9IHY7XG5cdFx0XHRcdG9iamVjdFJlZi52YWx1ZSA9IGNvcHk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBuZXdPYmplY3QgPSB7XG5cdFx0XHRcdFx0Li4ub2JqZWN0UmVmLnZhbHVlLFxuXHRcdFx0XHRcdFtrZXldOiB2XG5cdFx0XHRcdH07XG5cdFx0XHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdPYmplY3QsIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3RSZWYudmFsdWUpKTtcblx0XHRcdFx0b2JqZWN0UmVmLnZhbHVlID0gbmV3T2JqZWN0O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBvYmplY3RSZWYudmFsdWVba2V5XSA9IHY7XG5cdFx0fVxuXHR9KSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHRyeU9uQmVmb3JlTW91bnQvaW5kZXgudHNcbi8qKlxuKiBDYWxsIG9uQmVmb3JlTW91bnQoKSBpZiBpdCdzIGluc2lkZSBhIGNvbXBvbmVudCBsaWZlY3ljbGUsIGlmIG5vdCwganVzdCBjYWxsIHRoZSBmdW5jdGlvblxuKlxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIHN5bmMgaWYgc2V0IHRvIGZhbHNlLCBpdCB3aWxsIHJ1biBpbiB0aGUgbmV4dFRpY2soKSBvZiBWdWVcbiogQHBhcmFtIHRhcmdldFxuKi9cbmZ1bmN0aW9uIHRyeU9uQmVmb3JlTW91bnQoZm4sIHN5bmMgPSB0cnVlLCB0YXJnZXQpIHtcblx0aWYgKGdldExpZmVDeWNsZVRhcmdldCh0YXJnZXQpKSBvbkJlZm9yZU1vdW50KGZuLCB0YXJnZXQpO1xuXHRlbHNlIGlmIChzeW5jKSBmbigpO1xuXHRlbHNlIG5leHRUaWNrKGZuKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdHJ5T25CZWZvcmVVbm1vdW50L2luZGV4LnRzXG4vKipcbiogQ2FsbCBvbkJlZm9yZVVubW91bnQoKSBpZiBpdCdzIGluc2lkZSBhIGNvbXBvbmVudCBsaWZlY3ljbGUsIGlmIG5vdCwgZG8gbm90aGluZ1xuKlxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIHRhcmdldFxuKi9cbmZ1bmN0aW9uIHRyeU9uQmVmb3JlVW5tb3VudChmbiwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25CZWZvcmVVbm1vdW50KGZuLCB0YXJnZXQpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0cnlPbk1vdW50ZWQvaW5kZXgudHNcbi8qKlxuKiBDYWxsIG9uTW91bnRlZCgpIGlmIGl0J3MgaW5zaWRlIGEgY29tcG9uZW50IGxpZmVjeWNsZSwgaWYgbm90LCBqdXN0IGNhbGwgdGhlIGZ1bmN0aW9uXG4qXG4qIEBwYXJhbSBmblxuKiBAcGFyYW0gc3luYyBpZiBzZXQgdG8gZmFsc2UsIGl0IHdpbGwgcnVuIGluIHRoZSBuZXh0VGljaygpIG9mIFZ1ZVxuKiBAcGFyYW0gdGFyZ2V0XG4qL1xuZnVuY3Rpb24gdHJ5T25Nb3VudGVkKGZuLCBzeW5jID0gdHJ1ZSwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25Nb3VudGVkKGZuLCB0YXJnZXQpO1xuXHRlbHNlIGlmIChzeW5jKSBmbigpO1xuXHRlbHNlIG5leHRUaWNrKGZuKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdHJ5T25Vbm1vdW50ZWQvaW5kZXgudHNcbi8qKlxuKiBDYWxsIG9uVW5tb3VudGVkKCkgaWYgaXQncyBpbnNpZGUgYSBjb21wb25lbnQgbGlmZWN5Y2xlLCBpZiBub3QsIGRvIG5vdGhpbmdcbipcbiogQHBhcmFtIGZuXG4qIEBwYXJhbSB0YXJnZXRcbiovXG5mdW5jdGlvbiB0cnlPblVubW91bnRlZChmbiwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25Vbm1vdW50ZWQoZm4sIHRhcmdldCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVudGlsL2luZGV4LnRzXG5mdW5jdGlvbiBjcmVhdGVVbnRpbChyLCBpc05vdCA9IGZhbHNlKSB7XG5cdGZ1bmN0aW9uIHRvTWF0Y2goY29uZGl0aW9uLCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgdGltZW91dCwgdGhyb3dPblRpbWVvdXQgfSA9IHt9KSB7XG5cdFx0bGV0IHN0b3AgPSBudWxsO1xuXHRcdGNvbnN0IHByb21pc2VzID0gW25ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHRzdG9wID0gd2F0Y2gociwgKHYpID0+IHtcblx0XHRcdFx0aWYgKGNvbmRpdGlvbih2KSAhPT0gaXNOb3QpIHtcblx0XHRcdFx0XHRpZiAoc3RvcCkgc3RvcCgpO1xuXHRcdFx0XHRcdGVsc2UgbmV4dFRpY2soKCkgPT4gc3RvcCA9PT0gbnVsbCB8fCBzdG9wID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdG9wKCkpO1xuXHRcdFx0XHRcdHJlc29sdmUodik7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHtcblx0XHRcdFx0Zmx1c2gsXG5cdFx0XHRcdGRlZXAsXG5cdFx0XHRcdGltbWVkaWF0ZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fSldO1xuXHRcdGlmICh0aW1lb3V0ICE9IG51bGwpIHByb21pc2VzLnB1c2gocHJvbWlzZVRpbWVvdXQodGltZW91dCwgdGhyb3dPblRpbWVvdXQpLnRoZW4oKCkgPT4gdG9WYWx1ZShyKSkuZmluYWxseSgoKSA9PiBzdG9wID09PSBudWxsIHx8IHN0b3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0b3AoKSkpO1xuXHRcdHJldHVybiBQcm9taXNlLnJhY2UocHJvbWlzZXMpO1xuXHR9XG5cdGZ1bmN0aW9uIHRvQmUodmFsdWUsIG9wdGlvbnMpIHtcblx0XHRpZiAoIWlzUmVmKHZhbHVlKSkgcmV0dXJuIHRvTWF0Y2goKHYpID0+IHYgPT09IHZhbHVlLCBvcHRpb25zKTtcblx0XHRjb25zdCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgdGltZW91dCwgdGhyb3dPblRpbWVvdXQgfSA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuXHRcdGxldCBzdG9wID0gbnVsbDtcblx0XHRjb25zdCBwcm9taXNlcyA9IFtuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0c3RvcCA9IHdhdGNoKFtyLCB2YWx1ZV0sIChbdjEsIHYyXSkgPT4ge1xuXHRcdFx0XHRpZiAoaXNOb3QgIT09ICh2MSA9PT0gdjIpKSB7XG5cdFx0XHRcdFx0aWYgKHN0b3ApIHN0b3AoKTtcblx0XHRcdFx0XHRlbHNlIG5leHRUaWNrKCgpID0+IHN0b3AgPT09IG51bGwgfHwgc3RvcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RvcCgpKTtcblx0XHRcdFx0XHRyZXNvbHZlKHYxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwge1xuXHRcdFx0XHRmbHVzaCxcblx0XHRcdFx0ZGVlcCxcblx0XHRcdFx0aW1tZWRpYXRlOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9KV07XG5cdFx0aWYgKHRpbWVvdXQgIT0gbnVsbCkgcHJvbWlzZXMucHVzaChwcm9taXNlVGltZW91dCh0aW1lb3V0LCB0aHJvd09uVGltZW91dCkudGhlbigoKSA9PiB0b1ZhbHVlKHIpKS5maW5hbGx5KCgpID0+IHtcblx0XHRcdHN0b3AgPT09IG51bGwgfHwgc3RvcCA9PT0gdm9pZCAwIHx8IHN0b3AoKTtcblx0XHRcdHJldHVybiB0b1ZhbHVlKHIpO1xuXHRcdH0pKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yYWNlKHByb21pc2VzKTtcblx0fVxuXHRmdW5jdGlvbiB0b0JlVHJ1dGh5KG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gdG9NYXRjaCgodikgPT4gQm9vbGVhbih2KSwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gdG9CZU51bGwob3B0aW9ucykge1xuXHRcdHJldHVybiB0b0JlKG51bGwsIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIHRvQmVVbmRlZmluZWQob3B0aW9ucykge1xuXHRcdHJldHVybiB0b0JlKHZvaWQgMCwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gdG9CZU5hTihvcHRpb25zKSB7XG5cdFx0cmV0dXJuIHRvTWF0Y2goTnVtYmVyLmlzTmFOLCBvcHRpb25zKTtcblx0fVxuXHRmdW5jdGlvbiB0b0NvbnRhaW5zKHZhbHVlLCBvcHRpb25zKSB7XG5cdFx0cmV0dXJuIHRvTWF0Y2goKHYpID0+IHtcblx0XHRcdGNvbnN0IGFycmF5ID0gQXJyYXkuZnJvbSh2KTtcblx0XHRcdHJldHVybiBhcnJheS5pbmNsdWRlcyh2YWx1ZSkgfHwgYXJyYXkuaW5jbHVkZXModG9WYWx1ZSh2YWx1ZSkpO1xuXHRcdH0sIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIGNoYW5nZWQob3B0aW9ucykge1xuXHRcdHJldHVybiBjaGFuZ2VkVGltZXMoMSwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gY2hhbmdlZFRpbWVzKG4gPSAxLCBvcHRpb25zKSB7XG5cdFx0bGV0IGNvdW50ID0gLTE7XG5cdFx0cmV0dXJuIHRvTWF0Y2goKCkgPT4ge1xuXHRcdFx0Y291bnQgKz0gMTtcblx0XHRcdHJldHVybiBjb3VudCA+PSBuO1xuXHRcdH0sIG9wdGlvbnMpO1xuXHR9XG5cdGlmIChBcnJheS5pc0FycmF5KHRvVmFsdWUocikpKSByZXR1cm4ge1xuXHRcdHRvTWF0Y2gsXG5cdFx0dG9Db250YWlucyxcblx0XHRjaGFuZ2VkLFxuXHRcdGNoYW5nZWRUaW1lcyxcblx0XHRnZXQgbm90KCkge1xuXHRcdFx0cmV0dXJuIGNyZWF0ZVVudGlsKHIsICFpc05vdCk7XG5cdFx0fVxuXHR9O1xuXHRlbHNlIHJldHVybiB7XG5cdFx0dG9NYXRjaCxcblx0XHR0b0JlLFxuXHRcdHRvQmVUcnV0aHksXG5cdFx0dG9CZU51bGwsXG5cdFx0dG9CZU5hTixcblx0XHR0b0JlVW5kZWZpbmVkLFxuXHRcdGNoYW5nZWQsXG5cdFx0Y2hhbmdlZFRpbWVzLFxuXHRcdGdldCBub3QoKSB7XG5cdFx0XHRyZXR1cm4gY3JlYXRlVW50aWwociwgIWlzTm90KTtcblx0XHR9XG5cdH07XG59XG5mdW5jdGlvbiB1bnRpbChyKSB7XG5cdHJldHVybiBjcmVhdGVVbnRpbChyKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlEaWZmZXJlbmNlL2luZGV4LnRzXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcih2YWx1ZSwgb3RoVmFsKSB7XG5cdHJldHVybiB2YWx1ZSA9PT0gb3RoVmFsO1xufVxuLyoqXG4qIFJlYWN0aXZlIGdldCBhcnJheSBkaWZmZXJlbmNlIG9mIHR3byBhcnJheVxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheURpZmZlcmVuY2VcbiogQHJldHVybnMgLSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gYXJyYXlcbiogQHBhcmFtIGFyZ3NcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheURpZmZlcmVuY2UoLi4uYXJncykge1xuXHR2YXIgX2FyZ3MkLCBfYXJncyQyO1xuXHRjb25zdCBsaXN0ID0gYXJnc1swXTtcblx0Y29uc3QgdmFsdWVzID0gYXJnc1sxXTtcblx0bGV0IGNvbXBhcmVGbiA9IChfYXJncyQgPSBhcmdzWzJdKSAhPT0gbnVsbCAmJiBfYXJncyQgIT09IHZvaWQgMCA/IF9hcmdzJCA6IGRlZmF1bHRDb21wYXJhdG9yO1xuXHRjb25zdCB7IHN5bW1ldHJpYyA9IGZhbHNlIH0gPSAoX2FyZ3MkMiA9IGFyZ3NbM10pICE9PSBudWxsICYmIF9hcmdzJDIgIT09IHZvaWQgMCA/IF9hcmdzJDIgOiB7fTtcblx0aWYgKHR5cGVvZiBjb21wYXJlRm4gPT09IFwic3RyaW5nXCIpIHtcblx0XHRjb25zdCBrZXkgPSBjb21wYXJlRm47XG5cdFx0Y29tcGFyZUZuID0gKHZhbHVlLCBvdGhWYWwpID0+IHZhbHVlW2tleV0gPT09IG90aFZhbFtrZXldO1xuXHR9XG5cdGNvbnN0IGRpZmYxID0gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5maWx0ZXIoKHgpID0+IHRvVmFsdWUodmFsdWVzKS5maW5kSW5kZXgoKHkpID0+IGNvbXBhcmVGbih4LCB5KSkgPT09IC0xKSk7XG5cdGlmIChzeW1tZXRyaWMpIHtcblx0XHRjb25zdCBkaWZmMiA9IGNvbXB1dGVkKCgpID0+IHRvVmFsdWUodmFsdWVzKS5maWx0ZXIoKHgpID0+IHRvVmFsdWUobGlzdCkuZmluZEluZGV4KCh5KSA9PiBjb21wYXJlRm4oeCwgeSkpID09PSAtMSkpO1xuXHRcdHJldHVybiBjb21wdXRlZCgoKSA9PiBzeW1tZXRyaWMgPyBbLi4udG9WYWx1ZShkaWZmMSksIC4uLnRvVmFsdWUoZGlmZjIpXSA6IHRvVmFsdWUoZGlmZjEpKTtcblx0fSBlbHNlIHJldHVybiBkaWZmMTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlFdmVyeS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5ldmVyeWBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlFdmVyeVxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zICoqdHJ1ZSoqIGlmIHRoZSBgZm5gIGZ1bmN0aW9uIHJldHVybnMgYSAqKnRydXRoeSoqIHZhbHVlIGZvciBldmVyeSBlbGVtZW50IGZyb20gdGhlIGFycmF5LiBPdGhlcndpc2UsICoqZmFsc2UqKi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheUV2ZXJ5KGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLmV2ZXJ5KChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaWx0ZXIvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkuZmlsdGVyYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUZpbHRlclxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGBsaXN0YC4gRWFjaCB0aW1lIGBmbmAgZXhlY3V0ZXMsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgbmV3IGFycmF5LlxuKlxuKiBAcmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiBhIHBvcnRpb24gb2YgdGhlIGdpdmVuIGFycmF5LCBmaWx0ZXJlZCBkb3duIHRvIGp1c3QgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGdpdmVuIGFycmF5IHRoYXQgcGFzcyB0aGUgdGVzdCBpbXBsZW1lbnRlZCBieSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uIElmIG5vIGVsZW1lbnRzIHBhc3MgdGhlIHRlc3QsIGFuIGVtcHR5IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlGaWx0ZXIobGlzdCwgZm4pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkubWFwKChpKSA9PiB0b1ZhbHVlKGkpKS5maWx0ZXIoZm4pKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaW5kL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmZpbmRgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5RmluZFxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSB0aGF0IHNhdGlzZmllcyB0aGUgcHJvdmlkZWQgdGVzdGluZyBmdW5jdGlvbi4gT3RoZXJ3aXNlLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlGaW5kKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKHRvVmFsdWUobGlzdCkuZmluZCgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheUZpbmRJbmRleC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5maW5kSW5kZXhgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5RmluZEluZGV4XG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGZuIC0gYSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbipcbiogQHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSB0aGF0IHBhc3NlcyB0aGUgdGVzdC4gT3RoZXJ3aXNlLCBcIi0xXCIuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlGaW5kSW5kZXgobGlzdCwgZm4pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkuZmluZEluZGV4KChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaW5kTGFzdC9pbmRleC50c1xuZnVuY3Rpb24gZmluZExhc3QoYXJyLCBjYikge1xuXHRsZXQgaW5kZXggPSBhcnIubGVuZ3RoO1xuXHR3aGlsZSAoaW5kZXgtLSA+IDApIGlmIChjYihhcnJbaW5kZXhdLCBpbmRleCwgYXJyKSkgcmV0dXJuIGFycltpbmRleF07XG59XG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmZpbmRMYXN0YFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUZpbmRMYXN0XG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGZuIC0gYSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbipcbiogQHJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIHRlc3RpbmcgZnVuY3Rpb24uIE90aGVyd2lzZSwgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5RmluZExhc3QobGlzdCwgZm4pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUoIUFycmF5LnByb3RvdHlwZS5maW5kTGFzdCA/IGZpbmRMYXN0KHRvVmFsdWUobGlzdCksIChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpIDogdG9WYWx1ZShsaXN0KS5maW5kTGFzdCgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheUluY2x1ZGVzL2luZGV4LnRzXG5mdW5jdGlvbiBpc0FycmF5SW5jbHVkZXNPcHRpb25zKG9iaikge1xuXHRyZXR1cm4gaXNPYmplY3Qob2JqKSAmJiBjb250YWluc1Byb3Aob2JqLCBcImZvcm1JbmRleFwiLCBcImNvbXBhcmF0b3JcIik7XG59XG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmluY2x1ZGVzYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUluY2x1ZGVzXG4qXG4qIEByZXR1cm5zIHRydWUgaWYgdGhlIGB2YWx1ZWAgaXMgZm91bmQgaW4gdGhlIGFycmF5LiBPdGhlcndpc2UsIGZhbHNlLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5SW5jbHVkZXMoLi4uYXJncykge1xuXHR2YXIgX2NvbXBhcmF0b3I7XG5cdGNvbnN0IGxpc3QgPSBhcmdzWzBdO1xuXHRjb25zdCB2YWx1ZSA9IGFyZ3NbMV07XG5cdGxldCBjb21wYXJhdG9yID0gYXJnc1syXTtcblx0bGV0IGZvcm1JbmRleCA9IDA7XG5cdGlmIChpc0FycmF5SW5jbHVkZXNPcHRpb25zKGNvbXBhcmF0b3IpKSB7XG5cdFx0dmFyIF9jb21wYXJhdG9yJGZyb21JbmRleDtcblx0XHRmb3JtSW5kZXggPSAoX2NvbXBhcmF0b3IkZnJvbUluZGV4ID0gY29tcGFyYXRvci5mcm9tSW5kZXgpICE9PSBudWxsICYmIF9jb21wYXJhdG9yJGZyb21JbmRleCAhPT0gdm9pZCAwID8gX2NvbXBhcmF0b3IkZnJvbUluZGV4IDogMDtcblx0XHRjb21wYXJhdG9yID0gY29tcGFyYXRvci5jb21wYXJhdG9yO1xuXHR9XG5cdGlmICh0eXBlb2YgY29tcGFyYXRvciA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGNvbnN0IGtleSA9IGNvbXBhcmF0b3I7XG5cdFx0Y29tcGFyYXRvciA9IChlbGVtZW50LCB2YWx1ZSQxKSA9PiBlbGVtZW50W2tleV0gPT09IHRvVmFsdWUodmFsdWUkMSk7XG5cdH1cblx0Y29tcGFyYXRvciA9IChfY29tcGFyYXRvciA9IGNvbXBhcmF0b3IpICE9PSBudWxsICYmIF9jb21wYXJhdG9yICE9PSB2b2lkIDAgPyBfY29tcGFyYXRvciA6ICgoZWxlbWVudCwgdmFsdWUkMSkgPT4gZWxlbWVudCA9PT0gdG9WYWx1ZSh2YWx1ZSQxKSk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLnNsaWNlKGZvcm1JbmRleCkuc29tZSgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBjb21wYXJhdG9yKHRvVmFsdWUoZWxlbWVudCksIHRvVmFsdWUodmFsdWUpLCBpbmRleCwgdG9WYWx1ZShhcnJheSkpKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5Sm9pbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5qb2luYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUpvaW5cbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gc2VwYXJhdG9yIC0gYSBzdHJpbmcgdG8gc2VwYXJhdGUgZWFjaCBwYWlyIG9mIGFkamFjZW50IGVsZW1lbnRzIG9mIHRoZSBhcnJheS4gSWYgb21pdHRlZCwgdGhlIGFycmF5IGVsZW1lbnRzIGFyZSBzZXBhcmF0ZWQgd2l0aCBhIGNvbW1hIChcIixcIikuXG4qXG4qIEByZXR1cm5zIGEgc3RyaW5nIHdpdGggYWxsIGFycmF5IGVsZW1lbnRzIGpvaW5lZC4gSWYgYXJyLmxlbmd0aCBpcyAwLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5Sm9pbihsaXN0LCBzZXBhcmF0b3IpIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkubWFwKChpKSA9PiB0b1ZhbHVlKGkpKS5qb2luKHRvVmFsdWUoc2VwYXJhdG9yKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheU1hcC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5tYXBgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5TWFwXG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGZuIC0gYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBmb3IgZXZlcnkgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gYGxpc3RgLiBFYWNoIHRpbWUgYGZuYCBleGVjdXRlcywgdGhlIHJldHVybmVkIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBuZXcgYXJyYXkuXG4qXG4qIEByZXR1cm5zIGEgbmV3IGFycmF5IHdpdGggZWFjaCBlbGVtZW50IGJlaW5nIHRoZSByZXN1bHQgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5TWFwKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLm1hcCgoaSkgPT4gdG9WYWx1ZShpKSkubWFwKGZuKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5UmVkdWNlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LnJlZHVjZWBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlSZWR1Y2VcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gcmVkdWNlciAtIGEgXCJyZWR1Y2VyXCIgZnVuY3Rpb24uXG4qIEBwYXJhbSBhcmdzXG4qXG4qIEByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHJlc3VsdHMgZnJvbSBydW5uaW5nIHRoZSBcInJlZHVjZXJcIiBjYWxsYmFjayBmdW5jdGlvbiB0byBjb21wbGV0aW9uIG92ZXIgdGhlIGVudGlyZSBhcnJheS5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheVJlZHVjZShsaXN0LCByZWR1Y2VyLCAuLi5hcmdzKSB7XG5cdGNvbnN0IHJlZHVjZUNhbGxiYWNrID0gKHN1bSwgdmFsdWUsIGluZGV4KSA9PiByZWR1Y2VyKHRvVmFsdWUoc3VtKSwgdG9WYWx1ZSh2YWx1ZSksIGluZGV4KTtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCByZXNvbHZlZCA9IHRvVmFsdWUobGlzdCk7XG5cdFx0cmV0dXJuIGFyZ3MubGVuZ3RoID8gcmVzb2x2ZWQucmVkdWNlKHJlZHVjZUNhbGxiYWNrLCB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiID8gdG9WYWx1ZShhcmdzWzBdKCkpIDogdG9WYWx1ZShhcmdzWzBdKSkgOiByZXNvbHZlZC5yZWR1Y2UocmVkdWNlQ2FsbGJhY2spO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlTb21lL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LnNvbWVgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5U29tZVxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zICoqdHJ1ZSoqIGlmIHRoZSBgZm5gIGZ1bmN0aW9uIHJldHVybnMgYSAqKnRydXRoeSoqIHZhbHVlIGZvciBhbnkgZWxlbWVudCBmcm9tIHRoZSBhcnJheS4gT3RoZXJ3aXNlLCAqKmZhbHNlKiouXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlTb21lKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLnNvbWUoKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gZm4odG9WYWx1ZShlbGVtZW50KSwgaW5kZXgsIGFycmF5KSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheVVuaXF1ZS9pbmRleC50c1xuZnVuY3Rpb24gdW5pcShhcnJheSkge1xuXHRyZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFycmF5KSk7XG59XG5mdW5jdGlvbiB1bmlxdWVFbGVtZW50c0J5KGFycmF5LCBmbikge1xuXHRyZXR1cm4gYXJyYXkucmVkdWNlKChhY2MsIHYpID0+IHtcblx0XHRpZiAoIWFjYy5zb21lKCh4KSA9PiBmbih2LCB4LCBhcnJheSkpKSBhY2MucHVzaCh2KTtcblx0XHRyZXR1cm4gYWNjO1xuXHR9LCBbXSk7XG59XG4vKipcbiogcmVhY3RpdmUgdW5pcXVlIGFycmF5XG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5VW5pcXVlXG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIGNvbXBhcmVGblxuKiBAcmV0dXJucyBBIGNvbXB1dGVkIHJlZiB0aGF0IHJldHVybnMgYSB1bmlxdWUgYXJyYXkgb2YgaXRlbXMuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlVbmlxdWUobGlzdCwgY29tcGFyZUZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcmVzb2x2ZWRMaXN0ID0gdG9WYWx1ZShsaXN0KS5tYXAoKGVsZW1lbnQpID0+IHRvVmFsdWUoZWxlbWVudCkpO1xuXHRcdHJldHVybiBjb21wYXJlRm4gPyB1bmlxdWVFbGVtZW50c0J5KHJlc29sdmVkTGlzdCwgY29tcGFyZUZuKSA6IHVuaXEocmVzb2x2ZWRMaXN0KTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvdW50ZXIvaW5kZXgudHNcbi8qKlxuKiBCYXNpYyBjb3VudGVyIHdpdGggdXRpbGl0eSBmdW5jdGlvbnMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNvdW50ZXJcbiogQHBhcmFtIFtpbml0aWFsVmFsdWVdXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlQ291bnRlcihpbml0aWFsVmFsdWUgPSAwLCBvcHRpb25zID0ge30pIHtcblx0bGV0IF9pbml0aWFsVmFsdWUgPSB1bnJlZihpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBjb3VudCA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgeyBtYXggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG1pbiA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaW5jID0gKGRlbHRhID0gMSkgPT4gY291bnQudmFsdWUgPSBNYXRoLm1heChNYXRoLm1pbihtYXgsIGNvdW50LnZhbHVlICsgZGVsdGEpLCBtaW4pO1xuXHRjb25zdCBkZWMgPSAoZGVsdGEgPSAxKSA9PiBjb3VudC52YWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KG1pbiwgY291bnQudmFsdWUgLSBkZWx0YSksIG1heCk7XG5cdGNvbnN0IGdldCQxID0gKCkgPT4gY291bnQudmFsdWU7XG5cdGNvbnN0IHNldCQxID0gKHZhbCkgPT4gY291bnQudmFsdWUgPSBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsKSk7XG5cdGNvbnN0IHJlc2V0ID0gKHZhbCA9IF9pbml0aWFsVmFsdWUpID0+IHtcblx0XHRfaW5pdGlhbFZhbHVlID0gdmFsO1xuXHRcdHJldHVybiBzZXQkMSh2YWwpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdGNvdW50OiBzaGFsbG93UmVhZG9ubHkoY291bnQpLFxuXHRcdGluYyxcblx0XHRkZWMsXG5cdFx0Z2V0OiBnZXQkMSxcblx0XHRzZXQ6IHNldCQxLFxuXHRcdHJlc2V0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURhdGVGb3JtYXQvaW5kZXgudHNcbmNvbnN0IFJFR0VYX1BBUlNFID0gL14oXFxkezR9KVstL10/KFxcZHsxLDJ9KT9bLS9dPyhcXGR7MCwyfSlbVFxcc10qKFxcZHsxLDJ9KT86PyhcXGR7MSwyfSk/Oj8oXFxkezEsMn0pP1suOl0/KFxcZCspPyQvaTtcbmNvbnN0IFJFR0VYX0ZPUk1BVCA9IC9bWU1ESGhtc11vfFxcWyhbXlxcXV0rKVxcXXxZezEsNH18TXsxLDR9fER7MSwyfXxkezEsNH18SHsxLDJ9fGh7MSwyfXxhezEsMn18QXsxLDJ9fG17MSwyfXxzezEsMn18WnsxLDJ9fHp7MSw0fXxTU1MvZztcbmZ1bmN0aW9uIGRlZmF1bHRNZXJpZGllbShob3VycywgbWludXRlcywgaXNMb3dlcmNhc2UsIGhhc1BlcmlvZCkge1xuXHRsZXQgbSA9IGhvdXJzIDwgMTIgPyBcIkFNXCIgOiBcIlBNXCI7XG5cdGlmIChoYXNQZXJpb2QpIG0gPSBtLnNwbGl0KFwiXCIpLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MgKz0gYCR7Y3Vycn0uYCwgXCJcIik7XG5cdHJldHVybiBpc0xvd2VyY2FzZSA/IG0udG9Mb3dlckNhc2UoKSA6IG07XG59XG5mdW5jdGlvbiBmb3JtYXRPcmRpbmFsKG51bSkge1xuXHRjb25zdCBzdWZmaXhlcyA9IFtcblx0XHRcInRoXCIsXG5cdFx0XCJzdFwiLFxuXHRcdFwibmRcIixcblx0XHRcInJkXCJcblx0XTtcblx0Y29uc3QgdiA9IG51bSAlIDEwMDtcblx0cmV0dXJuIG51bSArIChzdWZmaXhlc1sodiAtIDIwKSAlIDEwXSB8fCBzdWZmaXhlc1t2XSB8fCBzdWZmaXhlc1swXSk7XG59XG5mdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUsIGZvcm1hdFN0ciwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRjdXN0b21NZXJpZGk7XG5cdGNvbnN0IHllYXJzID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHRjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcblx0Y29uc3QgZGF5cyA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHRjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcblx0Y29uc3QgbWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpO1xuXHRjb25zdCBzZWNvbmRzID0gZGF0ZS5nZXRTZWNvbmRzKCk7XG5cdGNvbnN0IG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG5cdGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF5KCk7XG5cdGNvbnN0IG1lcmlkaWVtID0gKF9vcHRpb25zJGN1c3RvbU1lcmlkaSA9IG9wdGlvbnMuY3VzdG9tTWVyaWRpZW0pICE9PSBudWxsICYmIF9vcHRpb25zJGN1c3RvbU1lcmlkaSAhPT0gdm9pZCAwID8gX29wdGlvbnMkY3VzdG9tTWVyaWRpIDogZGVmYXVsdE1lcmlkaWVtO1xuXHRjb25zdCBzdHJpcFRpbWVab25lID0gKGRhdGVTdHJpbmcpID0+IHtcblx0XHR2YXIgX2RhdGVTdHJpbmckc3BsaXQkO1xuXHRcdHJldHVybiAoX2RhdGVTdHJpbmckc3BsaXQkID0gZGF0ZVN0cmluZy5zcGxpdChcIiBcIilbMV0pICE9PSBudWxsICYmIF9kYXRlU3RyaW5nJHNwbGl0JCAhPT0gdm9pZCAwID8gX2RhdGVTdHJpbmckc3BsaXQkIDogXCJcIjtcblx0fTtcblx0Y29uc3QgbWF0Y2hlcyA9IHtcblx0XHRZbzogKCkgPT4gZm9ybWF0T3JkaW5hbCh5ZWFycyksXG5cdFx0WVk6ICgpID0+IFN0cmluZyh5ZWFycykuc2xpY2UoLTIpLFxuXHRcdFlZWVk6ICgpID0+IHllYXJzLFxuXHRcdE06ICgpID0+IG1vbnRoICsgMSxcblx0XHRNbzogKCkgPT4gZm9ybWF0T3JkaW5hbChtb250aCArIDEpLFxuXHRcdE1NOiAoKSA9PiBgJHttb250aCArIDF9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0TU1NOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgbW9udGg6IFwic2hvcnRcIiB9KSxcblx0XHRNTU1NOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgbW9udGg6IFwibG9uZ1wiIH0pLFxuXHRcdEQ6ICgpID0+IFN0cmluZyhkYXlzKSxcblx0XHREbzogKCkgPT4gZm9ybWF0T3JkaW5hbChkYXlzKSxcblx0XHRERDogKCkgPT4gYCR7ZGF5c31gLnBhZFN0YXJ0KDIsIFwiMFwiKSxcblx0XHRIOiAoKSA9PiBTdHJpbmcoaG91cnMpLFxuXHRcdEhvOiAoKSA9PiBmb3JtYXRPcmRpbmFsKGhvdXJzKSxcblx0XHRISDogKCkgPT4gYCR7aG91cnN9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0aDogKCkgPT4gYCR7aG91cnMgJSAxMiB8fCAxMn1gLnBhZFN0YXJ0KDEsIFwiMFwiKSxcblx0XHRobzogKCkgPT4gZm9ybWF0T3JkaW5hbChob3VycyAlIDEyIHx8IDEyKSxcblx0XHRoaDogKCkgPT4gYCR7aG91cnMgJSAxMiB8fCAxMn1gLnBhZFN0YXJ0KDIsIFwiMFwiKSxcblx0XHRtOiAoKSA9PiBTdHJpbmcobWludXRlcyksXG5cdFx0bW86ICgpID0+IGZvcm1hdE9yZGluYWwobWludXRlcyksXG5cdFx0bW06ICgpID0+IGAke21pbnV0ZXN9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0czogKCkgPT4gU3RyaW5nKHNlY29uZHMpLFxuXHRcdHNvOiAoKSA9PiBmb3JtYXRPcmRpbmFsKHNlY29uZHMpLFxuXHRcdHNzOiAoKSA9PiBgJHtzZWNvbmRzfWAucGFkU3RhcnQoMiwgXCIwXCIpLFxuXHRcdFNTUzogKCkgPT4gYCR7bWlsbGlzZWNvbmRzfWAucGFkU3RhcnQoMywgXCIwXCIpLFxuXHRcdGQ6ICgpID0+IGRheSxcblx0XHRkZDogKCkgPT4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IHdlZWtkYXk6IFwibmFycm93XCIgfSksXG5cdFx0ZGRkOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgd2Vla2RheTogXCJzaG9ydFwiIH0pLFxuXHRcdGRkZGQ6ICgpID0+IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB3ZWVrZGF5OiBcImxvbmdcIiB9KSxcblx0XHRBOiAoKSA9PiBtZXJpZGllbShob3VycywgbWludXRlcyksXG5cdFx0QUE6ICgpID0+IG1lcmlkaWVtKGhvdXJzLCBtaW51dGVzLCBmYWxzZSwgdHJ1ZSksXG5cdFx0YTogKCkgPT4gbWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIHRydWUpLFxuXHRcdGFhOiAoKSA9PiBtZXJpZGllbShob3VycywgbWludXRlcywgdHJ1ZSwgdHJ1ZSksXG5cdFx0ejogKCkgPT4gc3RyaXBUaW1lWm9uZShkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgdGltZVpvbmVOYW1lOiBcInNob3J0T2Zmc2V0XCIgfSkpLFxuXHRcdHp6OiAoKSA9PiBzdHJpcFRpbWVab25lKGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB0aW1lWm9uZU5hbWU6IFwic2hvcnRPZmZzZXRcIiB9KSksXG5cdFx0enp6OiAoKSA9PiBzdHJpcFRpbWVab25lKGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB0aW1lWm9uZU5hbWU6IFwic2hvcnRPZmZzZXRcIiB9KSksXG5cdFx0enp6ejogKCkgPT4gc3RyaXBUaW1lWm9uZShkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgdGltZVpvbmVOYW1lOiBcImxvbmdPZmZzZXRcIiB9KSlcblx0fTtcblx0cmV0dXJuIGZvcm1hdFN0ci5yZXBsYWNlKFJFR0VYX0ZPUk1BVCwgKG1hdGNoLCAkMSkgPT4ge1xuXHRcdHZhciBfcmVmLCBfbWF0Y2hlcyRtYXRjaDtcblx0XHRyZXR1cm4gKF9yZWYgPSAkMSAhPT0gbnVsbCAmJiAkMSAhPT0gdm9pZCAwID8gJDEgOiAoX21hdGNoZXMkbWF0Y2ggPSBtYXRjaGVzW21hdGNoXSkgPT09IG51bGwgfHwgX21hdGNoZXMkbWF0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9tYXRjaGVzJG1hdGNoLmNhbGwobWF0Y2hlcykpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBtYXRjaDtcblx0fSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVEYXRlKGRhdGUpIHtcblx0aWYgKGRhdGUgPT09IG51bGwpIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoTmFOKTtcblx0aWYgKGRhdGUgPT09IHZvaWQgMCkgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcblx0aWYgKHR5cGVvZiBkYXRlID09PSBcInN0cmluZ1wiICYmICEvWiQvaS50ZXN0KGRhdGUpKSB7XG5cdFx0Y29uc3QgZCA9IGRhdGUubWF0Y2goUkVHRVhfUEFSU0UpO1xuXHRcdGlmIChkKSB7XG5cdFx0XHRjb25zdCBtID0gZFsyXSAtIDEgfHwgMDtcblx0XHRcdGNvbnN0IG1zID0gKGRbN10gfHwgXCIwXCIpLnN1YnN0cmluZygwLCAzKTtcblx0XHRcdHJldHVybiBuZXcgRGF0ZShkWzFdLCBtLCBkWzNdIHx8IDEsIGRbNF0gfHwgMCwgZFs1XSB8fCAwLCBkWzZdIHx8IDAsIG1zKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xufVxuLyoqXG4qIEdldCB0aGUgZm9ybWF0dGVkIGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBzdHJpbmcgb2YgdG9rZW5zIHBhc3NlZCBpbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGF0ZUZvcm1hdFxuKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGZvcm1hdCwgY2FuIGVpdGhlciBiZSBhIGBEYXRlYCBvYmplY3QsIGEgdGltZXN0YW1wLCBvciBhIHN0cmluZ1xuKiBAcGFyYW0gZm9ybWF0U3RyIC0gVGhlIGNvbWJpbmF0aW9uIG9mIHRva2VucyB0byBmb3JtYXQgdGhlIGRhdGVcbiogQHBhcmFtIG9wdGlvbnMgLSBVc2VEYXRlRm9ybWF0T3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURhdGVGb3JtYXQoZGF0ZSwgZm9ybWF0U3RyID0gXCJISDptbTpzc1wiLCBvcHRpb25zID0ge30pIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IGZvcm1hdERhdGUobm9ybWFsaXplRGF0ZSh0b1ZhbHVlKGRhdGUpKSwgdG9WYWx1ZShmb3JtYXRTdHIpLCBvcHRpb25zKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUludGVydmFsRm4vaW5kZXgudHNcbi8qKlxuKiBXcmFwcGVyIGZvciBgc2V0SW50ZXJ2YWxgIHdpdGggY29udHJvbHNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSW50ZXJ2YWxGblxuKiBAcGFyYW0gY2JcbiogQHBhcmFtIGludGVydmFsXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwgPSAxZTMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIGltbWVkaWF0ZUNhbGxiYWNrID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGxldCB0aW1lciA9IG51bGw7XG5cdGNvbnN0IGlzQWN0aXZlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGZ1bmN0aW9uIGNsZWFuKCkge1xuXHRcdGlmICh0aW1lcikge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbCh0aW1lcik7XG5cdFx0XHR0aW1lciA9IG51bGw7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHBhdXNlKCkge1xuXHRcdGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xlYW4oKTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoKSB7XG5cdFx0Y29uc3QgaW50ZXJ2YWxWYWx1ZSA9IHRvVmFsdWUoaW50ZXJ2YWwpO1xuXHRcdGlmIChpbnRlcnZhbFZhbHVlIDw9IDApIHJldHVybjtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG5cdFx0aWYgKGltbWVkaWF0ZUNhbGxiYWNrKSBjYigpO1xuXHRcdGNsZWFuKCk7XG5cdFx0aWYgKGlzQWN0aXZlLnZhbHVlKSB0aW1lciA9IHNldEludGVydmFsKGNiLCBpbnRlcnZhbFZhbHVlKTtcblx0fVxuXHRpZiAoaW1tZWRpYXRlICYmIGlzQ2xpZW50KSByZXN1bWUoKTtcblx0aWYgKGlzUmVmKGludGVydmFsKSB8fCB0eXBlb2YgaW50ZXJ2YWwgPT09IFwiZnVuY3Rpb25cIikgdHJ5T25TY29wZURpc3Bvc2Uod2F0Y2goaW50ZXJ2YWwsICgpID0+IHtcblx0XHRpZiAoaXNBY3RpdmUudmFsdWUgJiYgaXNDbGllbnQpIHJlc3VtZSgpO1xuXHR9KSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHBhdXNlKTtcblx0cmV0dXJuIHtcblx0XHRpc0FjdGl2ZTogc2hhbGxvd1JlYWRvbmx5KGlzQWN0aXZlKSxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlSW50ZXJ2YWwvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUludGVydmFsKGludGVydmFsID0gMWUzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBjb250cm9sczogZXhwb3NlQ29udHJvbHMgPSBmYWxzZSwgaW1tZWRpYXRlID0gdHJ1ZSwgY2FsbGJhY2sgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNvdW50ZXIgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCB1cGRhdGUgPSAoKSA9PiBjb3VudGVyLnZhbHVlICs9IDE7XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdGNvdW50ZXIudmFsdWUgPSAwO1xuXHR9O1xuXHRjb25zdCBjb250cm9scyA9IHVzZUludGVydmFsRm4oY2FsbGJhY2sgPyAoKSA9PiB7XG5cdFx0dXBkYXRlKCk7XG5cdFx0Y2FsbGJhY2soY291bnRlci52YWx1ZSk7XG5cdH0gOiB1cGRhdGUsIGludGVydmFsLCB7IGltbWVkaWF0ZSB9KTtcblx0aWYgKGV4cG9zZUNvbnRyb2xzKSByZXR1cm4ge1xuXHRcdGNvdW50ZXI6IHNoYWxsb3dSZWFkb25seShjb3VudGVyKSxcblx0XHRyZXNldCxcblx0XHQuLi5jb250cm9sc1xuXHR9O1xuXHRlbHNlIHJldHVybiBzaGFsbG93UmVhZG9ubHkoY291bnRlcik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUxhc3RDaGFuZ2VkL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VMYXN0Q2hhbmdlZChzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkaW5pdGlhbFZhbHVlO1xuXHRjb25zdCBtcyA9IHNoYWxsb3dSZWYoKF9vcHRpb25zJGluaXRpYWxWYWx1ZSA9IG9wdGlvbnMuaW5pdGlhbFZhbHVlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRpbml0aWFsVmFsdWUgIT09IHZvaWQgMCA/IF9vcHRpb25zJGluaXRpYWxWYWx1ZSA6IG51bGwpO1xuXHR3YXRjaChzb3VyY2UsICgpID0+IG1zLnZhbHVlID0gdGltZXN0YW1wKCksIG9wdGlvbnMpO1xuXHRyZXR1cm4gc2hhbGxvd1JlYWRvbmx5KG1zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZW91dEZuL2luZGV4LnRzXG4vKipcbiogV3JhcHBlciBmb3IgYHNldFRpbWVvdXRgIHdpdGggY29udHJvbHMuXG4qXG4qIEBwYXJhbSBjYlxuKiBAcGFyYW0gaW50ZXJ2YWxcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VUaW1lb3V0Rm4oY2IsIGludGVydmFsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBpbW1lZGlhdGVDYWxsYmFjayA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1BlbmRpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHRpbWVyO1xuXHRmdW5jdGlvbiBjbGVhcigpIHtcblx0XHRpZiAodGltZXIpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHR0aW1lciA9IHZvaWQgMDtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gc3RvcCgpIHtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRjbGVhcigpO1xuXHR9XG5cdGZ1bmN0aW9uIHN0YXJ0KC4uLmFyZ3MpIHtcblx0XHRpZiAoaW1tZWRpYXRlQ2FsbGJhY2spIGNiKCk7XG5cdFx0Y2xlYXIoKTtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRpc1BlbmRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdHRpbWVyID0gdm9pZCAwO1xuXHRcdFx0Y2IoLi4uYXJncyk7XG5cdFx0fSwgdG9WYWx1ZShpbnRlcnZhbCkpO1xuXHR9XG5cdGlmIChpbW1lZGlhdGUpIHtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlmIChpc0NsaWVudCkgc3RhcnQoKTtcblx0fVxuXHR0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcblx0cmV0dXJuIHtcblx0XHRpc1BlbmRpbmc6IHNoYWxsb3dSZWFkb25seShpc1BlbmRpbmcpLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZW91dC9pbmRleC50c1xuZnVuY3Rpb24gdXNlVGltZW91dChpbnRlcnZhbCA9IDFlMywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIGNhbGxiYWNrIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjb250cm9scyA9IHVzZVRpbWVvdXRGbihjYWxsYmFjayAhPT0gbnVsbCAmJiBjYWxsYmFjayAhPT0gdm9pZCAwID8gY2FsbGJhY2sgOiBub29wLCBpbnRlcnZhbCwgb3B0aW9ucyk7XG5cdGNvbnN0IHJlYWR5ID0gY29tcHV0ZWQoKCkgPT4gIWNvbnRyb2xzLmlzUGVuZGluZy52YWx1ZSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHRyZWFkeSxcblx0XHQuLi5jb250cm9sc1xuXHR9O1xuXHRlbHNlIHJldHVybiByZWFkeTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVG9OdW1iZXIvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IGNvbnZlcnQgYSBzdHJpbmcgcmVmIHRvIG51bWJlci5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUb051bWJlcih2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbWV0aG9kID0gXCJwYXJzZUZsb2F0XCIsIHJhZGl4LCBuYW5Ub1plcm8gfSA9IG9wdGlvbnM7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0bGV0IHJlc29sdmVkID0gdG9WYWx1ZSh2YWx1ZSk7XG5cdFx0aWYgKHR5cGVvZiBtZXRob2QgPT09IFwiZnVuY3Rpb25cIikgcmVzb2x2ZWQgPSBtZXRob2QocmVzb2x2ZWQpO1xuXHRcdGVsc2UgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJzdHJpbmdcIikgcmVzb2x2ZWQgPSBOdW1iZXJbbWV0aG9kXShyZXNvbHZlZCwgcmFkaXgpO1xuXHRcdGlmIChuYW5Ub1plcm8gJiYgTnVtYmVyLmlzTmFOKHJlc29sdmVkKSkgcmVzb2x2ZWQgPSAwO1xuXHRcdHJldHVybiByZXNvbHZlZDtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRvU3RyaW5nL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBjb252ZXJ0IGEgcmVmIHRvIHN0cmluZy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVG9TdHJpbmdcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUb1N0cmluZyh2YWx1ZSkge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gYCR7dG9WYWx1ZSh2YWx1ZSl9YCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRvZ2dsZS9pbmRleC50c1xuLyoqXG4qIEEgYm9vbGVhbiByZWYgd2l0aCBhIHRvZ2dsZXJcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVG9nZ2xlXG4qIEBwYXJhbSBbaW5pdGlhbFZhbHVlXVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVRvZ2dsZShpbml0aWFsVmFsdWUgPSBmYWxzZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdHJ1dGh5VmFsdWUgPSB0cnVlLCBmYWxzeVZhbHVlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHZhbHVlSXNSZWYgPSBpc1JlZihpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBfdmFsdWUgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGZ1bmN0aW9uIHRvZ2dsZSh2YWx1ZSkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRfdmFsdWUudmFsdWUgPSB2YWx1ZTtcblx0XHRcdHJldHVybiBfdmFsdWUudmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHRydXRoeSA9IHRvVmFsdWUodHJ1dGh5VmFsdWUpO1xuXHRcdFx0X3ZhbHVlLnZhbHVlID0gX3ZhbHVlLnZhbHVlID09PSB0cnV0aHkgPyB0b1ZhbHVlKGZhbHN5VmFsdWUpIDogdHJ1dGh5O1xuXHRcdFx0cmV0dXJuIF92YWx1ZS52YWx1ZTtcblx0XHR9XG5cdH1cblx0aWYgKHZhbHVlSXNSZWYpIHJldHVybiB0b2dnbGU7XG5cdGVsc2UgcmV0dXJuIFtfdmFsdWUsIHRvZ2dsZV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoQXJyYXkvaW5kZXgudHNcbi8qKlxuKiBXYXRjaCBmb3IgYW4gYXJyYXkgd2l0aCBhZGRpdGlvbnMgYW5kIHJlbW92YWxzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy93YXRjaEFycmF5XG4qL1xuZnVuY3Rpb24gd2F0Y2hBcnJheShzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG5cdGxldCBvbGRMaXN0ID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbW1lZGlhdGUpID8gW10gOiBbLi4udHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiID8gc291cmNlKCkgOiBBcnJheS5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UgOiB0b1ZhbHVlKHNvdXJjZSldO1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCAobmV3TGlzdCwgXywgb25DbGVhbnVwKSA9PiB7XG5cdFx0Y29uc3Qgb2xkTGlzdFJlbWFpbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBvbGRMaXN0Lmxlbmd0aCB9KTtcblx0XHRjb25zdCBhZGRlZCA9IFtdO1xuXHRcdGZvciAoY29uc3Qgb2JqIG9mIG5ld0xpc3QpIHtcblx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvbGRMaXN0Lmxlbmd0aDsgaSsrKSBpZiAoIW9sZExpc3RSZW1haW5zW2ldICYmIG9iaiA9PT0gb2xkTGlzdFtpXSkge1xuXHRcdFx0XHRvbGRMaXN0UmVtYWluc1tpXSA9IHRydWU7XG5cdFx0XHRcdGZvdW5kID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWZvdW5kKSBhZGRlZC5wdXNoKG9iaik7XG5cdFx0fVxuXHRcdGNvbnN0IHJlbW92ZWQgPSBvbGRMaXN0LmZpbHRlcigoXyQxLCBpKSA9PiAhb2xkTGlzdFJlbWFpbnNbaV0pO1xuXHRcdGNiKG5ld0xpc3QsIG9sZExpc3QsIGFkZGVkLCByZW1vdmVkLCBvbkNsZWFudXApO1xuXHRcdG9sZExpc3QgPSBbLi4ubmV3TGlzdF07XG5cdH0sIG9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaEF0TW9zdC9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hBdE1vc3Qoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRjb25zdCB7IGNvdW50LC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0Y29uc3QgY3VycmVudCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHsgc3RvcCwgcmVzdW1lLCBwYXVzZSB9ID0gd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgKC4uLmFyZ3MpID0+IHtcblx0XHRjdXJyZW50LnZhbHVlICs9IDE7XG5cdFx0aWYgKGN1cnJlbnQudmFsdWUgPj0gdG9WYWx1ZShjb3VudCkpIG5leHRUaWNrKCgpID0+IHN0b3AoKSk7XG5cdFx0Y2IoLi4uYXJncyk7XG5cdH0sIHdhdGNoT3B0aW9ucyk7XG5cdHJldHVybiB7XG5cdFx0Y291bnQ6IGN1cnJlbnQsXG5cdFx0c3RvcCxcblx0XHRyZXN1bWUsXG5cdFx0cGF1c2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hEZWJvdW5jZWQvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoRGVib3VuY2VkKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRlYm91bmNlID0gMCwgbWF4V2FpdCA9IHZvaWQgMCwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB3YXRjaFdpdGhGaWx0ZXIoc291cmNlLCBjYiwge1xuXHRcdC4uLndhdGNoT3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogZGVib3VuY2VGaWx0ZXIoZGVib3VuY2UsIHsgbWF4V2FpdCB9KVxuXHR9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHdhdGNoRGVib3VuY2VkYCBpbnN0ZWFkICovXG5jb25zdCBkZWJvdW5jZWRXYXRjaCA9IHdhdGNoRGVib3VuY2VkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaERlZXAvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHdhdGNoaW5nIHZhbHVlIHdpdGgge2RlZXA6IHRydWV9XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3dhdGNoRGVlcFxuKi9cbmZ1bmN0aW9uIHdhdGNoRGVlcChzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG5cdHJldHVybiB3YXRjaChzb3VyY2UsIGNiLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRkZWVwOiB0cnVlXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaElnbm9yYWJsZS9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hJZ25vcmFibGUoc291cmNlLCBjYiwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZXZlbnRGaWx0ZXIgPSBieXBhc3NGaWx0ZXIsLi4ud2F0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRjb25zdCBmaWx0ZXJlZENiID0gY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgY2IpO1xuXHRsZXQgaWdub3JlVXBkYXRlcztcblx0bGV0IGlnbm9yZVByZXZBc3luY1VwZGF0ZXM7XG5cdGxldCBzdG9wO1xuXHRpZiAod2F0Y2hPcHRpb25zLmZsdXNoID09PSBcInN5bmNcIikge1xuXHRcdGxldCBpZ25vcmUgPSBmYWxzZTtcblx0XHRpZ25vcmVQcmV2QXN5bmNVcGRhdGVzID0gKCkgPT4ge307XG5cdFx0aWdub3JlVXBkYXRlcyA9ICh1cGRhdGVyKSA9PiB7XG5cdFx0XHRpZ25vcmUgPSB0cnVlO1xuXHRcdFx0dXBkYXRlcigpO1xuXHRcdFx0aWdub3JlID0gZmFsc2U7XG5cdFx0fTtcblx0XHRzdG9wID0gd2F0Y2goc291cmNlLCAoLi4uYXJncykgPT4ge1xuXHRcdFx0aWYgKCFpZ25vcmUpIGZpbHRlcmVkQ2IoLi4uYXJncyk7XG5cdFx0fSwgd2F0Y2hPcHRpb25zKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBkaXNwb3NhYmxlcyA9IFtdO1xuXHRcdGxldCBpZ25vcmVDb3VudGVyID0gMDtcblx0XHRsZXQgc3luY0NvdW50ZXIgPSAwO1xuXHRcdGlnbm9yZVByZXZBc3luY1VwZGF0ZXMgPSAoKSA9PiB7XG5cdFx0XHRpZ25vcmVDb3VudGVyID0gc3luY0NvdW50ZXI7XG5cdFx0fTtcblx0XHRkaXNwb3NhYmxlcy5wdXNoKHdhdGNoKHNvdXJjZSwgKCkgPT4ge1xuXHRcdFx0c3luY0NvdW50ZXIrKztcblx0XHR9LCB7XG5cdFx0XHQuLi53YXRjaE9wdGlvbnMsXG5cdFx0XHRmbHVzaDogXCJzeW5jXCJcblx0XHR9KSk7XG5cdFx0aWdub3JlVXBkYXRlcyA9ICh1cGRhdGVyKSA9PiB7XG5cdFx0XHRjb25zdCBzeW5jQ291bnRlclByZXYgPSBzeW5jQ291bnRlcjtcblx0XHRcdHVwZGF0ZXIoKTtcblx0XHRcdGlnbm9yZUNvdW50ZXIgKz0gc3luY0NvdW50ZXIgLSBzeW5jQ291bnRlclByZXY7XG5cdFx0fTtcblx0XHRkaXNwb3NhYmxlcy5wdXNoKHdhdGNoKHNvdXJjZSwgKC4uLmFyZ3MpID0+IHtcblx0XHRcdGNvbnN0IGlnbm9yZSA9IGlnbm9yZUNvdW50ZXIgPiAwICYmIGlnbm9yZUNvdW50ZXIgPT09IHN5bmNDb3VudGVyO1xuXHRcdFx0aWdub3JlQ291bnRlciA9IDA7XG5cdFx0XHRzeW5jQ291bnRlciA9IDA7XG5cdFx0XHRpZiAoaWdub3JlKSByZXR1cm47XG5cdFx0XHRmaWx0ZXJlZENiKC4uLmFyZ3MpO1xuXHRcdH0sIHdhdGNoT3B0aW9ucykpO1xuXHRcdHN0b3AgPSAoKSA9PiB7XG5cdFx0XHRkaXNwb3NhYmxlcy5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG5cdFx0fTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHN0b3AsXG5cdFx0aWdub3JlVXBkYXRlcyxcblx0XHRpZ25vcmVQcmV2QXN5bmNVcGRhdGVzXG5cdH07XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGB3YXRjaElnbm9yYWJsZWAgaW5zdGVhZCAqL1xuY29uc3QgaWdub3JhYmxlV2F0Y2ggPSB3YXRjaElnbm9yYWJsZTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hJbW1lZGlhdGUvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHdhdGNoaW5nIHZhbHVlIHdpdGgge2ltbWVkaWF0ZTogdHJ1ZX1cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvd2F0Y2hJbW1lZGlhdGVcbiovXG5mdW5jdGlvbiB3YXRjaEltbWVkaWF0ZShzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG5cdHJldHVybiB3YXRjaChzb3VyY2UsIGNiLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRpbW1lZGlhdGU6IHRydWVcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoT25jZS9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3Igd2F0Y2hpbmcgdmFsdWUgd2l0aCB7IG9uY2U6IHRydWUgfVxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy93YXRjaE9uY2VcbiovXG5mdW5jdGlvbiB3YXRjaE9uY2Uoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCBjYiwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0b25jZTogdHJ1ZVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hUaHJvdHRsZWQvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoVGhyb3R0bGVkKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocm90dGxlID0gMCwgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB3YXRjaFdpdGhGaWx0ZXIoc291cmNlLCBjYiwge1xuXHRcdC4uLndhdGNoT3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogdGhyb3R0bGVGaWx0ZXIodGhyb3R0bGUsIHRyYWlsaW5nLCBsZWFkaW5nKVxuXHR9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHdhdGNoVGhyb3R0bGVkYCBpbnN0ZWFkICovXG5jb25zdCB0aHJvdHRsZWRXYXRjaCA9IHdhdGNoVGhyb3R0bGVkO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaFRyaWdnZXJhYmxlL2luZGV4LnRzXG5mdW5jdGlvbiB3YXRjaFRyaWdnZXJhYmxlKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgY2xlYW51cEZuO1xuXHRmdW5jdGlvbiBvbkVmZmVjdCgpIHtcblx0XHRpZiAoIWNsZWFudXBGbikgcmV0dXJuO1xuXHRcdGNvbnN0IGZuID0gY2xlYW51cEZuO1xuXHRcdGNsZWFudXBGbiA9IHZvaWQgMDtcblx0XHRmbigpO1xuXHR9XG5cdC8qKiBSZWdpc3RlciB0aGUgZnVuY3Rpb24gYGNsZWFudXBGbmAgKi9cblx0ZnVuY3Rpb24gb25DbGVhbnVwKGNhbGxiYWNrKSB7XG5cdFx0Y2xlYW51cEZuID0gY2FsbGJhY2s7XG5cdH1cblx0Y29uc3QgX2NiID0gKHZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xuXHRcdG9uRWZmZWN0KCk7XG5cdFx0cmV0dXJuIGNiKHZhbHVlLCBvbGRWYWx1ZSwgb25DbGVhbnVwKTtcblx0fTtcblx0Y29uc3QgcmVzID0gd2F0Y2hJZ25vcmFibGUoc291cmNlLCBfY2IsIG9wdGlvbnMpO1xuXHRjb25zdCB7IGlnbm9yZVVwZGF0ZXMgfSA9IHJlcztcblx0Y29uc3QgdHJpZ2dlciA9ICgpID0+IHtcblx0XHRsZXQgcmVzJDE7XG5cdFx0aWdub3JlVXBkYXRlcygoKSA9PiB7XG5cdFx0XHRyZXMkMSA9IF9jYihnZXRXYXRjaFNvdXJjZXMoc291cmNlKSwgZ2V0T2xkVmFsdWUoc291cmNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHJlcyQxO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdC4uLnJlcyxcblx0XHR0cmlnZ2VyXG5cdH07XG59XG5mdW5jdGlvbiBnZXRXYXRjaFNvdXJjZXMoc291cmNlcykge1xuXHRpZiAoaXNSZWFjdGl2ZShzb3VyY2VzKSkgcmV0dXJuIHNvdXJjZXM7XG5cdGlmIChBcnJheS5pc0FycmF5KHNvdXJjZXMpKSByZXR1cm4gc291cmNlcy5tYXAoKGl0ZW0pID0+IHRvVmFsdWUoaXRlbSkpO1xuXHRyZXR1cm4gdG9WYWx1ZShzb3VyY2VzKTtcbn1cbmZ1bmN0aW9uIGdldE9sZFZhbHVlKHNvdXJjZSkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheShzb3VyY2UpID8gc291cmNlLm1hcCgoKSA9PiB2b2lkIDApIDogdm9pZCAwO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3aGVuZXZlci9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3Igd2F0Y2hpbmcgdmFsdWUgdG8gYmUgdHJ1dGh5XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3doZW5ldmVyXG4qL1xuZnVuY3Rpb24gd2hlbmV2ZXIoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRjb25zdCBzdG9wID0gd2F0Y2goc291cmNlLCAodiwgb3YsIG9uSW52YWxpZGF0ZSkgPT4ge1xuXHRcdGlmICh2KSB7XG5cdFx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9uY2UpIG5leHRUaWNrKCgpID0+IHN0b3AoKSk7XG5cdFx0XHRjYih2LCBvdiwgb25JbnZhbGlkYXRlKTtcblx0XHR9XG5cdH0sIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdG9uY2U6IGZhbHNlXG5cdH0pO1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBhc3NlcnQsIGF1dG9SZXNldFJlZiwgYnlwYXNzRmlsdGVyLCBjYW1lbGl6ZSwgY2xhbXAsIGNvbXB1dGVkRWFnZXIsIGNvbXB1dGVkV2l0aENvbnRyb2wsIGNvbnRhaW5zUHJvcCwgY29udHJvbGxlZENvbXB1dGVkLCBjb250cm9sbGVkUmVmLCBjcmVhdGVFdmVudEhvb2ssIGNyZWF0ZUZpbHRlcldyYXBwZXIsIGNyZWF0ZUdsb2JhbFN0YXRlLCBjcmVhdGVJbmplY3Rpb25TdGF0ZSwgY3JlYXRlUmVhY3RpdmVGbiwgY3JlYXRlUmVmLCBjcmVhdGVTaGFyZWRDb21wb3NhYmxlLCBjcmVhdGVTaW5nbGV0b25Qcm9taXNlLCBkZWJvdW5jZUZpbHRlciwgZGVib3VuY2VkUmVmLCBkZWJvdW5jZWRXYXRjaCwgZWFnZXJDb21wdXRlZCwgZXh0ZW5kUmVmLCBmb3JtYXREYXRlLCBnZXQsIGdldExpZmVDeWNsZVRhcmdldCwgaGFzT3duLCBoeXBoZW5hdGUsIGlkZW50aXR5LCBpZ25vcmFibGVXYXRjaCwgaW5jcmVhc2VXaXRoVW5pdCwgaW5qZWN0TG9jYWwsIGludm9rZSwgaXNDbGllbnQsIGlzRGVmLCBpc0RlZmluZWQsIGlzSU9TLCBpc09iamVjdCwgaXNXb3JrZXIsIG1ha2VEZXN0cnVjdHVyYWJsZSwgbm9vcCwgbm9ybWFsaXplRGF0ZSwgbm90TnVsbGlzaCwgbm93LCBvYmplY3RFbnRyaWVzLCBvYmplY3RPbWl0LCBvYmplY3RQaWNrLCBwYXVzYWJsZUZpbHRlciwgcGF1c2FibGVXYXRjaCwgcHJvbWlzZVRpbWVvdXQsIHByb3ZpZGVMb2NhbCwgcHhWYWx1ZSwgcmFuZCwgcmVhY3RpZnksIHJlYWN0aWZ5T2JqZWN0LCByZWFjdGl2ZUNvbXB1dGVkLCByZWFjdGl2ZU9taXQsIHJlYWN0aXZlUGljaywgcmVmQXV0b1Jlc2V0LCByZWZEZWJvdW5jZWQsIHJlZkRlZmF1bHQsIHJlZk1hbnVhbFJlc2V0LCByZWZUaHJvdHRsZWQsIHJlZldpdGhDb250cm9sLCBzZXQsIHN5bmNSZWYsIHN5bmNSZWZzLCB0aHJvdHRsZUZpbHRlciwgdGhyb3R0bGVkUmVmLCB0aHJvdHRsZWRXYXRjaCwgdGltZXN0YW1wLCB0b0FycmF5LCB0b1JlYWN0aXZlLCB0b1JlZiwgdG9SZWZzLCB0cnlPbkJlZm9yZU1vdW50LCB0cnlPbkJlZm9yZVVubW91bnQsIHRyeU9uTW91bnRlZCwgdHJ5T25TY29wZURpc3Bvc2UsIHRyeU9uVW5tb3VudGVkLCB1bnRpbCwgdXNlQXJyYXlEaWZmZXJlbmNlLCB1c2VBcnJheUV2ZXJ5LCB1c2VBcnJheUZpbHRlciwgdXNlQXJyYXlGaW5kLCB1c2VBcnJheUZpbmRJbmRleCwgdXNlQXJyYXlGaW5kTGFzdCwgdXNlQXJyYXlJbmNsdWRlcywgdXNlQXJyYXlKb2luLCB1c2VBcnJheU1hcCwgdXNlQXJyYXlSZWR1Y2UsIHVzZUFycmF5U29tZSwgdXNlQXJyYXlVbmlxdWUsIHVzZUNvdW50ZXIsIHVzZURhdGVGb3JtYXQsIHVzZURlYm91bmNlLCB1c2VEZWJvdW5jZUZuLCB1c2VJbnRlcnZhbCwgdXNlSW50ZXJ2YWxGbiwgdXNlTGFzdENoYW5nZWQsIHVzZVRocm90dGxlLCB1c2VUaHJvdHRsZUZuLCB1c2VUaW1lb3V0LCB1c2VUaW1lb3V0Rm4sIHVzZVRvTnVtYmVyLCB1c2VUb1N0cmluZywgdXNlVG9nZ2xlLCB3YXRjaEFycmF5LCB3YXRjaEF0TW9zdCwgd2F0Y2hEZWJvdW5jZWQsIHdhdGNoRGVlcCwgd2F0Y2hJZ25vcmFibGUsIHdhdGNoSW1tZWRpYXRlLCB3YXRjaE9uY2UsIHdhdGNoUGF1c2FibGUsIHdhdGNoVGhyb3R0bGVkLCB3YXRjaFRyaWdnZXJhYmxlLCB3YXRjaFdpdGhGaWx0ZXIsIHdoZW5ldmVyIH07IiwiaW1wb3J0IHsgYnlwYXNzRmlsdGVyLCBjYW1lbGl6ZSwgY2xhbXAsIGNvbXB1dGVkV2l0aENvbnRyb2wsIGNvbnRhaW5zUHJvcCwgY3JlYXRlRXZlbnRIb29rLCBjcmVhdGVGaWx0ZXJXcmFwcGVyLCBjcmVhdGVSZWYsIGNyZWF0ZVNpbmdsZXRvblByb21pc2UsIGRlYm91bmNlRmlsdGVyLCBoYXNPd24sIGlkZW50aXR5LCBpbmNyZWFzZVdpdGhVbml0LCBpbmplY3RMb2NhbCwgaXNDbGllbnQsIGlzRGVmLCBpc0lPUywgaXNPYmplY3QsIGlzV29ya2VyLCBtYWtlRGVzdHJ1Y3R1cmFibGUsIG5vb3AsIG5vdE51bGxpc2gsIG9iamVjdEVudHJpZXMsIG9iamVjdE9taXQsIG9iamVjdFBpY2ssIHBhdXNhYmxlRmlsdGVyLCBwcm9taXNlVGltZW91dCwgcHJvdmlkZUxvY2FsLCBweFZhbHVlLCBzeW5jUmVmLCB0aHJvdHRsZUZpbHRlciwgdGltZXN0YW1wLCB0b0FycmF5LCB0b1JlZiwgdG9SZWZzLCB0cnlPbk1vdW50ZWQsIHRyeU9uU2NvcGVEaXNwb3NlLCB0cnlPblVubW91bnRlZCwgdW50aWwsIHVzZURlYm91bmNlRm4sIHVzZUludGVydmFsRm4sIHVzZVRocm90dGxlRm4sIHVzZVRpbWVvdXRGbiwgd2F0Y2hJZ25vcmFibGUsIHdhdGNoSW1tZWRpYXRlLCB3YXRjaE9uY2UsIHdhdGNoUGF1c2FibGUsIHdhdGNoV2l0aEZpbHRlciwgd2hlbmV2ZXIgfSBmcm9tIFwiQHZ1ZXVzZS9zaGFyZWRcIjtcbmltcG9ydCB7IEZyYWdtZW50LCBUcmFuc2l0aW9uR3JvdXAsIGNvbXB1dGVkLCBjdXN0b21SZWYsIGRlZmluZUNvbXBvbmVudCwgZ2V0Q3VycmVudEluc3RhbmNlLCBnZXRDdXJyZW50U2NvcGUsIGgsIGhhc0luamVjdGlvbkNvbnRleHQsIGluamVjdCwgaXNSZWFkb25seSwgaXNSZWYsIG1hcmtSYXcsIG5leHRUaWNrLCBvbkJlZm9yZVVwZGF0ZSwgb25Nb3VudGVkLCBvblVwZGF0ZWQsIHJlYWN0aXZlLCByZWFkb25seSwgcmVmLCBzaGFsbG93UmVhY3RpdmUsIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgdG9SYXcsIHRvVmFsdWUsIHVucmVmLCB3YXRjaCwgd2F0Y2hFZmZlY3QgfSBmcm9tIFwidnVlXCI7XG5cbmV4cG9ydCAqIGZyb20gXCJAdnVldXNlL3NoYXJlZFwiXG5cbi8vI3JlZ2lvbiBjb21wdXRlZEFzeW5jL2luZGV4LnRzXG5mdW5jdGlvbiBjb21wdXRlZEFzeW5jKGV2YWx1YXRpb25DYWxsYmFjaywgaW5pdGlhbFN0YXRlLCBvcHRpb25zT3JSZWYpIHtcblx0dmFyIF9nbG9iYWxUaGlzJHJlcG9ydEVycjtcblx0bGV0IG9wdGlvbnM7XG5cdGlmIChpc1JlZihvcHRpb25zT3JSZWYpKSBvcHRpb25zID0geyBldmFsdWF0aW5nOiBvcHRpb25zT3JSZWYgfTtcblx0ZWxzZSBvcHRpb25zID0gb3B0aW9uc09yUmVmIHx8IHt9O1xuXHRjb25zdCB7IGxhenkgPSBmYWxzZSwgZmx1c2ggPSBcInN5bmNcIiwgZXZhbHVhdGluZyA9IHZvaWQgMCwgc2hhbGxvdyA9IHRydWUsIG9uRXJyb3IgPSAoX2dsb2JhbFRoaXMkcmVwb3J0RXJyID0gZ2xvYmFsVGhpcy5yZXBvcnRFcnJvcikgIT09IG51bGwgJiYgX2dsb2JhbFRoaXMkcmVwb3J0RXJyICE9PSB2b2lkIDAgPyBfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgOiBub29wIH0gPSBvcHRpb25zO1xuXHRjb25zdCBzdGFydGVkID0gc2hhbGxvd1JlZighbGF6eSk7XG5cdGNvbnN0IGN1cnJlbnQgPSBzaGFsbG93ID8gc2hhbGxvd1JlZihpbml0aWFsU3RhdGUpIDogcmVmKGluaXRpYWxTdGF0ZSk7XG5cdGxldCBjb3VudGVyID0gMDtcblx0d2F0Y2hFZmZlY3QoYXN5bmMgKG9uSW52YWxpZGF0ZSkgPT4ge1xuXHRcdGlmICghc3RhcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGNvdW50ZXIrKztcblx0XHRjb25zdCBjb3VudGVyQXRCZWdpbm5pbmcgPSBjb3VudGVyO1xuXHRcdGxldCBoYXNGaW5pc2hlZCA9IGZhbHNlO1xuXHRcdGlmIChldmFsdWF0aW5nKSBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcblx0XHRcdGV2YWx1YXRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdH0pO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBldmFsdWF0aW9uQ2FsbGJhY2soKGNhbmNlbENhbGxiYWNrKSA9PiB7XG5cdFx0XHRcdG9uSW52YWxpZGF0ZSgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGV2YWx1YXRpbmcpIGV2YWx1YXRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAoIWhhc0ZpbmlzaGVkKSBjYW5jZWxDYWxsYmFjaygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGNvdW50ZXJBdEJlZ2lubmluZyA9PT0gY291bnRlcikgY3VycmVudC52YWx1ZSA9IHJlc3VsdDtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoZXZhbHVhdGluZyAmJiBjb3VudGVyQXRCZWdpbm5pbmcgPT09IGNvdW50ZXIpIGV2YWx1YXRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdGhhc0ZpbmlzaGVkID0gdHJ1ZTtcblx0XHR9XG5cdH0sIHsgZmx1c2ggfSk7XG5cdGlmIChsYXp5KSByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHN0YXJ0ZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBjdXJyZW50LnZhbHVlO1xuXHR9KTtcblx0ZWxzZSByZXR1cm4gY3VycmVudDtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYGNvbXB1dGVkQXN5bmNgIGluc3RlYWQgKi9cbmNvbnN0IGFzeW5jQ29tcHV0ZWQgPSBjb21wdXRlZEFzeW5jO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjb21wdXRlZEluamVjdC9pbmRleC50c1xuZnVuY3Rpb24gY29tcHV0ZWRJbmplY3Qoa2V5LCBvcHRpb25zLCBkZWZhdWx0U291cmNlLCB0cmVhdERlZmF1bHRBc0ZhY3RvcnkpIHtcblx0bGV0IHNvdXJjZSA9IGluamVjdChrZXkpO1xuXHRpZiAoZGVmYXVsdFNvdXJjZSkgc291cmNlID0gaW5qZWN0KGtleSwgZGVmYXVsdFNvdXJjZSk7XG5cdGlmICh0cmVhdERlZmF1bHRBc0ZhY3RvcnkpIHNvdXJjZSA9IGluamVjdChrZXksIGRlZmF1bHRTb3VyY2UsIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSk7XG5cdGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gY29tcHV0ZWQoKG9sZFZhbHVlKSA9PiBvcHRpb25zKHNvdXJjZSwgb2xkVmFsdWUpKTtcblx0ZWxzZSByZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldDogKG9sZFZhbHVlKSA9PiBvcHRpb25zLmdldChzb3VyY2UsIG9sZFZhbHVlKSxcblx0XHRzZXQ6IG9wdGlvbnMuc2V0XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVSZXVzYWJsZVRlbXBsYXRlL2luZGV4LnRzXG4vKipcbiogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGBkZWZpbmVgIGFuZCBgcmV1c2VgIGNvbXBvbmVudHMgaW4gcGFpcixcbiogSXQgYWxzbyBhbGxvdyB0byBwYXNzIGEgZ2VuZXJpYyB0byBiaW5kIHdpdGggdHlwZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlUmV1c2FibGVUZW1wbGF0ZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldXNhYmxlVGVtcGxhdGUob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5oZXJpdEF0dHJzID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcmVuZGVyID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBkZWZpbmUgPSBkZWZpbmVDb21wb25lbnQoeyBzZXR1cChfLCB7IHNsb3RzIH0pIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0cmVuZGVyLnZhbHVlID0gc2xvdHMuZGVmYXVsdDtcblx0XHR9O1xuXHR9IH0pO1xuXHRjb25zdCByZXVzZSA9IGRlZmluZUNvbXBvbmVudCh7XG5cdFx0aW5oZXJpdEF0dHJzLFxuXHRcdHByb3BzOiBvcHRpb25zLnByb3BzLFxuXHRcdHNldHVwKHByb3BzLCB7IGF0dHJzLCBzbG90cyB9KSB7XG5cdFx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0XHR2YXIgX3JlbmRlciR2YWx1ZTtcblx0XHRcdFx0aWYgKCFyZW5kZXIudmFsdWUgJiYgdHJ1ZSkgdGhyb3cgbmV3IEVycm9yKFwiW1Z1ZVVzZV0gRmFpbGVkIHRvIGZpbmQgdGhlIGRlZmluaXRpb24gb2YgcmV1c2FibGUgdGVtcGxhdGVcIik7XG5cdFx0XHRcdGNvbnN0IHZub2RlID0gKF9yZW5kZXIkdmFsdWUgPSByZW5kZXIudmFsdWUpID09PSBudWxsIHx8IF9yZW5kZXIkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yZW5kZXIkdmFsdWUuY2FsbChyZW5kZXIsIHtcblx0XHRcdFx0XHQuLi5vcHRpb25zLnByb3BzID09IG51bGwgPyBrZXlzVG9DYW1lbEtlYmFiQ2FzZShhdHRycykgOiBwcm9wcyxcblx0XHRcdFx0XHQkc2xvdHM6IHNsb3RzXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gaW5oZXJpdEF0dHJzICYmICh2bm9kZSA9PT0gbnVsbCB8fCB2bm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdm5vZGUubGVuZ3RoKSA9PT0gMSA/IHZub2RlWzBdIDogdm5vZGU7XG5cdFx0XHR9O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBtYWtlRGVzdHJ1Y3R1cmFibGUoe1xuXHRcdGRlZmluZSxcblx0XHRyZXVzZVxuXHR9LCBbZGVmaW5lLCByZXVzZV0pO1xufVxuZnVuY3Rpb24ga2V5c1RvQ2FtZWxLZWJhYkNhc2Uob2JqKSB7XG5cdGNvbnN0IG5ld09iaiA9IHt9O1xuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmopIG5ld09ialtjYW1lbGl6ZShrZXkpXSA9IG9ialtrZXldO1xuXHRyZXR1cm4gbmV3T2JqO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjcmVhdGVUZW1wbGF0ZVByb21pc2UvaW5kZXgudHNcbi8qKlxuKiBDcmVhdGVzIGEgdGVtcGxhdGUgcHJvbWlzZSBjb21wb25lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZVRlbXBsYXRlUHJvbWlzZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVRlbXBsYXRlUHJvbWlzZShvcHRpb25zID0ge30pIHtcblx0bGV0IGluZGV4ID0gMDtcblx0Y29uc3QgaW5zdGFuY2VzID0gcmVmKFtdKTtcblx0ZnVuY3Rpb24gY3JlYXRlKC4uLmFyZ3MpIHtcblx0XHRjb25zdCBwcm9wcyA9IHNoYWxsb3dSZWFjdGl2ZSh7XG5cdFx0XHRrZXk6IGluZGV4KyssXG5cdFx0XHRhcmdzLFxuXHRcdFx0cHJvbWlzZTogdm9pZCAwLFxuXHRcdFx0cmVzb2x2ZTogKCkgPT4ge30sXG5cdFx0XHRyZWplY3Q6ICgpID0+IHt9LFxuXHRcdFx0aXNSZXNvbHZpbmc6IGZhbHNlLFxuXHRcdFx0b3B0aW9uc1xuXHRcdH0pO1xuXHRcdGluc3RhbmNlcy52YWx1ZS5wdXNoKHByb3BzKTtcblx0XHRwcm9wcy5wcm9taXNlID0gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG5cdFx0XHRwcm9wcy5yZXNvbHZlID0gKHYpID0+IHtcblx0XHRcdFx0cHJvcHMuaXNSZXNvbHZpbmcgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gX3Jlc29sdmUodik7XG5cdFx0XHR9O1xuXHRcdFx0cHJvcHMucmVqZWN0ID0gX3JlamVjdDtcblx0XHR9KS5maW5hbGx5KCgpID0+IHtcblx0XHRcdHByb3BzLnByb21pc2UgPSB2b2lkIDA7XG5cdFx0XHRjb25zdCBpbmRleCQxID0gaW5zdGFuY2VzLnZhbHVlLmluZGV4T2YocHJvcHMpO1xuXHRcdFx0aWYgKGluZGV4JDEgIT09IC0xKSBpbnN0YW5jZXMudmFsdWUuc3BsaWNlKGluZGV4JDEsIDEpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcm9wcy5wcm9taXNlO1xuXHR9XG5cdGZ1bmN0aW9uIHN0YXJ0KC4uLmFyZ3MpIHtcblx0XHRpZiAob3B0aW9ucy5zaW5nbGV0b24gJiYgaW5zdGFuY2VzLnZhbHVlLmxlbmd0aCA+IDApIHJldHVybiBpbnN0YW5jZXMudmFsdWVbMF0ucHJvbWlzZTtcblx0XHRyZXR1cm4gY3JlYXRlKC4uLmFyZ3MpO1xuXHR9XG5cdGNvbnN0IGNvbXBvbmVudCA9IGRlZmluZUNvbXBvbmVudCgoXywgeyBzbG90cyB9KSA9PiB7XG5cdFx0Y29uc3QgcmVuZGVyTGlzdCA9ICgpID0+IGluc3RhbmNlcy52YWx1ZS5tYXAoKHByb3BzKSA9PiB7XG5cdFx0XHR2YXIgX3Nsb3RzJGRlZmF1bHQ7XG5cdFx0XHRyZXR1cm4gaChGcmFnbWVudCwgeyBrZXk6IHByb3BzLmtleSB9LCAoX3Nsb3RzJGRlZmF1bHQgPSBzbG90cy5kZWZhdWx0KSA9PT0gbnVsbCB8fCBfc2xvdHMkZGVmYXVsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Nsb3RzJGRlZmF1bHQuY2FsbChzbG90cywgcHJvcHMpKTtcblx0XHR9KTtcblx0XHRpZiAob3B0aW9ucy50cmFuc2l0aW9uKSByZXR1cm4gKCkgPT4gaChUcmFuc2l0aW9uR3JvdXAsIG9wdGlvbnMudHJhbnNpdGlvbiwgcmVuZGVyTGlzdCk7XG5cdFx0cmV0dXJuIHJlbmRlckxpc3Q7XG5cdH0pO1xuXHRjb21wb25lbnQuc3RhcnQgPSBzdGFydDtcblx0cmV0dXJuIGNvbXBvbmVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlVW5yZWZGbi9pbmRleC50c1xuLyoqXG4qIE1ha2UgYSBwbGFpbiBmdW5jdGlvbiBhY2NlcHRpbmcgcmVmIGFuZCByYXcgdmFsdWVzIGFzIGFyZ3VtZW50cy5cbiogUmV0dXJucyB0aGUgc2FtZSB2YWx1ZSB0aGUgdW5jb252ZXJ0ZWQgZnVuY3Rpb24gcmV0dXJucywgd2l0aCBwcm9wZXIgdHlwaW5nLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZVVucmVmRm4oZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0XHRyZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncy5tYXAoKGkpID0+IHRvVmFsdWUoaSkpKTtcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gX2NvbmZpZ3VyYWJsZS50c1xuY29uc3QgZGVmYXVsdFdpbmRvdyA9IGlzQ2xpZW50ID8gd2luZG93IDogdm9pZCAwO1xuY29uc3QgZGVmYXVsdERvY3VtZW50ID0gaXNDbGllbnQgPyB3aW5kb3cuZG9jdW1lbnQgOiB2b2lkIDA7XG5jb25zdCBkZWZhdWx0TmF2aWdhdG9yID0gaXNDbGllbnQgPyB3aW5kb3cubmF2aWdhdG9yIDogdm9pZCAwO1xuY29uc3QgZGVmYXVsdExvY2F0aW9uID0gaXNDbGllbnQgPyB3aW5kb3cubG9jYXRpb24gOiB2b2lkIDA7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVucmVmRWxlbWVudC9pbmRleC50c1xuLyoqXG4qIEdldCB0aGUgZG9tIGVsZW1lbnQgb2YgYSByZWYgb2YgZWxlbWVudCBvciBWdWUgY29tcG9uZW50IGluc3RhbmNlXG4qXG4qIEBwYXJhbSBlbFJlZlxuKi9cbmZ1bmN0aW9uIHVucmVmRWxlbWVudChlbFJlZikge1xuXHR2YXIgXyRlbDtcblx0Y29uc3QgcGxhaW4gPSB0b1ZhbHVlKGVsUmVmKTtcblx0cmV0dXJuIChfJGVsID0gcGxhaW4gPT09IG51bGwgfHwgcGxhaW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBsYWluLiRlbCkgIT09IG51bGwgJiYgXyRlbCAhPT0gdm9pZCAwID8gXyRlbCA6IHBsYWluO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFdmVudExpc3RlbmVyL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VFdmVudExpc3RlbmVyKC4uLmFyZ3MpIHtcblx0Y29uc3QgcmVnaXN0ZXIgPSAoZWwsIGV2ZW50LCBsaXN0ZW5lciwgb3B0aW9ucykgPT4ge1xuXHRcdGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zKTtcblx0XHRyZXR1cm4gKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuXHR9O1xuXHRjb25zdCBmaXJzdFBhcmFtVGFyZ2V0cyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB0ZXN0ID0gdG9BcnJheSh0b1ZhbHVlKGFyZ3NbMF0pKS5maWx0ZXIoKGUpID0+IGUgIT0gbnVsbCk7XG5cdFx0cmV0dXJuIHRlc3QuZXZlcnkoKGUpID0+IHR5cGVvZiBlICE9PSBcInN0cmluZ1wiKSA/IHRlc3QgOiB2b2lkIDA7XG5cdH0pO1xuXHRyZXR1cm4gd2F0Y2hJbW1lZGlhdGUoKCkgPT4ge1xuXHRcdHZhciBfZmlyc3RQYXJhbVRhcmdldHMkdmEsIF9maXJzdFBhcmFtVGFyZ2V0cyR2YTI7XG5cdFx0cmV0dXJuIFtcblx0XHRcdChfZmlyc3RQYXJhbVRhcmdldHMkdmEgPSAoX2ZpcnN0UGFyYW1UYXJnZXRzJHZhMiA9IGZpcnN0UGFyYW1UYXJnZXRzLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlyc3RQYXJhbVRhcmdldHMkdmEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlyc3RQYXJhbVRhcmdldHMkdmEyLm1hcCgoZSkgPT4gdW5yZWZFbGVtZW50KGUpKSkgIT09IG51bGwgJiYgX2ZpcnN0UGFyYW1UYXJnZXRzJHZhICE9PSB2b2lkIDAgPyBfZmlyc3RQYXJhbVRhcmdldHMkdmEgOiBbZGVmYXVsdFdpbmRvd10uZmlsdGVyKChlKSA9PiBlICE9IG51bGwpLFxuXHRcdFx0dG9BcnJheSh0b1ZhbHVlKGZpcnN0UGFyYW1UYXJnZXRzLnZhbHVlID8gYXJnc1sxXSA6IGFyZ3NbMF0pKSxcblx0XHRcdHRvQXJyYXkodW5yZWYoZmlyc3RQYXJhbVRhcmdldHMudmFsdWUgPyBhcmdzWzJdIDogYXJnc1sxXSkpLFxuXHRcdFx0dG9WYWx1ZShmaXJzdFBhcmFtVGFyZ2V0cy52YWx1ZSA/IGFyZ3NbM10gOiBhcmdzWzJdKVxuXHRcdF07XG5cdH0sIChbcmF3X3RhcmdldHMsIHJhd19ldmVudHMsIHJhd19saXN0ZW5lcnMsIHJhd19vcHRpb25zXSwgXywgb25DbGVhbnVwKSA9PiB7XG5cdFx0aWYgKCEocmF3X3RhcmdldHMgPT09IG51bGwgfHwgcmF3X3RhcmdldHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd190YXJnZXRzLmxlbmd0aCkgfHwgIShyYXdfZXZlbnRzID09PSBudWxsIHx8IHJhd19ldmVudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd19ldmVudHMubGVuZ3RoKSB8fCAhKHJhd19saXN0ZW5lcnMgPT09IG51bGwgfHwgcmF3X2xpc3RlbmVycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmF3X2xpc3RlbmVycy5sZW5ndGgpKSByZXR1cm47XG5cdFx0Y29uc3Qgb3B0aW9uc0Nsb25lID0gaXNPYmplY3QocmF3X29wdGlvbnMpID8geyAuLi5yYXdfb3B0aW9ucyB9IDogcmF3X29wdGlvbnM7XG5cdFx0Y29uc3QgY2xlYW51cHMgPSByYXdfdGFyZ2V0cy5mbGF0TWFwKChlbCkgPT4gcmF3X2V2ZW50cy5mbGF0TWFwKChldmVudCkgPT4gcmF3X2xpc3RlbmVycy5tYXAoKGxpc3RlbmVyKSA9PiByZWdpc3RlcihlbCwgZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zQ2xvbmUpKSkpO1xuXHRcdG9uQ2xlYW51cCgoKSA9PiB7XG5cdFx0XHRjbGVhbnVwcy5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG5cdFx0fSk7XG5cdH0sIHsgZmx1c2g6IFwicG9zdFwiIH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBvbkNsaWNrT3V0c2lkZS9pbmRleC50c1xubGV0IF9pT1NXb3JrYXJvdW5kID0gZmFsc2U7XG5mdW5jdGlvbiBvbkNsaWNrT3V0c2lkZSh0YXJnZXQsIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpZ25vcmUgPSBbXSwgY2FwdHVyZSA9IHRydWUsIGRldGVjdElmcmFtZSA9IGZhbHNlLCBjb250cm9scyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRpZiAoIXdpbmRvdyQxKSByZXR1cm4gY29udHJvbHMgPyB7XG5cdFx0c3RvcDogbm9vcCxcblx0XHRjYW5jZWw6IG5vb3AsXG5cdFx0dHJpZ2dlcjogbm9vcFxuXHR9IDogbm9vcDtcblx0aWYgKGlzSU9TICYmICFfaU9TV29ya2Fyb3VuZCkge1xuXHRcdF9pT1NXb3JrYXJvdW5kID0gdHJ1ZTtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHRBcnJheS5mcm9tKHdpbmRvdyQxLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goKGVsKSA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgbm9vcCwgbGlzdGVuZXJPcHRpb25zKSk7XG5cdFx0d2luZG93JDEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBub29wLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGxldCBzaG91bGRMaXN0ZW4gPSB0cnVlO1xuXHRjb25zdCBzaG91bGRJZ25vcmUgPSAoZXZlbnQpID0+IHtcblx0XHRyZXR1cm4gdG9WYWx1ZShpZ25vcmUpLnNvbWUoKHRhcmdldCQxKSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIHRhcmdldCQxID09PSBcInN0cmluZ1wiKSByZXR1cm4gQXJyYXkuZnJvbSh3aW5kb3ckMS5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRhcmdldCQxKSkuc29tZSgoZWwpID0+IGVsID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoZWwpKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXQkMSk7XG5cdFx0XHRcdHJldHVybiBlbCAmJiAoZXZlbnQudGFyZ2V0ID09PSBlbCB8fCBldmVudC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhlbCkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0YXJnZXQgaGFzIG11bHRpcGxlIHJvb3QgZWxlbWVudHMuXG5cdCogUmVmZXJlbmNlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdGVzdC11dGlscy9ibG9iL2NjYjQ2MGJlNTVmOWY2YmUwNWFiNzA4NTAwYTQxZWM4YWRmNmY0YmMvc3JjL3Z1ZS13cmFwcGVyLnRzI0wyMVxuXHQqL1xuXHRmdW5jdGlvbiBoYXNNdWx0aXBsZVJvb3RzKHRhcmdldCQxKSB7XG5cdFx0Y29uc3Qgdm0gPSB0b1ZhbHVlKHRhcmdldCQxKTtcblx0XHRyZXR1cm4gdm0gJiYgdm0uJC5zdWJUcmVlLnNoYXBlRmxhZyA9PT0gMTY7XG5cdH1cblx0ZnVuY3Rpb24gY2hlY2tNdWx0aXBsZVJvb3RzKHRhcmdldCQxLCBldmVudCkge1xuXHRcdGNvbnN0IHZtID0gdG9WYWx1ZSh0YXJnZXQkMSk7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB2bS4kLnN1YlRyZWUgJiYgdm0uJC5zdWJUcmVlLmNoaWxkcmVuO1xuXHRcdGlmIChjaGlsZHJlbiA9PSBudWxsIHx8ICFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gY2hpbGQuZWwgPT09IGV2ZW50LnRhcmdldCB8fCBldmVudC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhjaGlsZC5lbCkpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRpZiAoZXZlbnQudGFyZ2V0ID09IG51bGwpIHJldHVybjtcblx0XHRpZiAoIShlbCBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIGhhc011bHRpcGxlUm9vdHModGFyZ2V0KSAmJiBjaGVja011bHRpcGxlUm9vdHModGFyZ2V0LCBldmVudCkpIHJldHVybjtcblx0XHRpZiAoIWVsIHx8IGVsID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoZWwpKSByZXR1cm47XG5cdFx0aWYgKFwiZGV0YWlsXCIgaW4gZXZlbnQgJiYgZXZlbnQuZGV0YWlsID09PSAwKSBzaG91bGRMaXN0ZW4gPSAhc2hvdWxkSWdub3JlKGV2ZW50KTtcblx0XHRpZiAoIXNob3VsZExpc3Rlbikge1xuXHRcdFx0c2hvdWxkTGlzdGVuID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGFuZGxlcihldmVudCk7XG5cdH07XG5cdGxldCBpc1Byb2Nlc3NpbmdDbGljayA9IGZhbHNlO1xuXHRjb25zdCBjbGVhbnVwID0gW1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiY2xpY2tcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRpZiAoIWlzUHJvY2Vzc2luZ0NsaWNrKSB7XG5cdFx0XHRcdGlzUHJvY2Vzc2luZ0NsaWNrID0gdHJ1ZTtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0aXNQcm9jZXNzaW5nQ2xpY2sgPSBmYWxzZTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdGxpc3RlbmVyKGV2ZW50KTtcblx0XHRcdH1cblx0XHR9LCB7XG5cdFx0XHRwYXNzaXZlOiB0cnVlLFxuXHRcdFx0Y2FwdHVyZVxuXHRcdH0pLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwicG9pbnRlcmRvd25cIiwgKGUpID0+IHtcblx0XHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0XHRzaG91bGRMaXN0ZW4gPSAhc2hvdWxkSWdub3JlKGUpICYmICEhKGVsICYmICFlLmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKGVsKSk7XG5cdFx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pLFxuXHRcdGRldGVjdElmcmFtZSAmJiB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImJsdXJcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dmFyIF93aW5kb3ckZG9jdW1lbnQkYWN0aTtcblx0XHRcdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRcdFx0aWYgKCgoX3dpbmRvdyRkb2N1bWVudCRhY3RpID0gd2luZG93JDEuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPT09IG51bGwgfHwgX3dpbmRvdyRkb2N1bWVudCRhY3RpID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfd2luZG93JGRvY3VtZW50JGFjdGkudGFnTmFtZSkgPT09IFwiSUZSQU1FXCIgJiYgIShlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuY29udGFpbnMod2luZG93JDEuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpKSBoYW5kbGVyKGV2ZW50KTtcblx0XHRcdH0sIDApO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuXHRdLmZpbHRlcihCb29sZWFuKTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IGNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRpZiAoY29udHJvbHMpIHJldHVybiB7XG5cdFx0c3RvcCxcblx0XHRjYW5jZWw6ICgpID0+IHtcblx0XHRcdHNob3VsZExpc3RlbiA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0dHJpZ2dlcjogKGV2ZW50KSA9PiB7XG5cdFx0XHRzaG91bGRMaXN0ZW4gPSB0cnVlO1xuXHRcdFx0bGlzdGVuZXIoZXZlbnQpO1xuXHRcdFx0c2hvdWxkTGlzdGVuID0gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTW91bnRlZC9pbmRleC50c1xuLyoqXG4qIE1vdW50ZWQgc3RhdGUgaW4gcmVmLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNb3VudGVkXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTW91bnRlZCgpIHtcblx0Y29uc3QgaXNNb3VudGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGlmIChpbnN0YW5jZSkgb25Nb3VudGVkKCgpID0+IHtcblx0XHRpc01vdW50ZWQudmFsdWUgPSB0cnVlO1xuXHR9LCBpbnN0YW5jZSk7XG5cdHJldHVybiBpc01vdW50ZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN1cHBvcnRlZC9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZVN1cHBvcnRlZChjYWxsYmFjaykge1xuXHRjb25zdCBpc01vdW50ZWQgPSB1c2VNb3VudGVkKCk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aXNNb3VudGVkLnZhbHVlO1xuXHRcdHJldHVybiBCb29sZWFuKGNhbGxiYWNrKCkpO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTXV0YXRpb25PYnNlcnZlci9pbmRleC50c1xuLyoqXG4qIFdhdGNoIGZvciBjaGFuZ2VzIGJlaW5nIG1hZGUgdG8gdGhlIERPTSB0cmVlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNdXRhdGlvbk9ic2VydmVyXG4qIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL011dGF0aW9uT2JzZXJ2ZXIgTXV0YXRpb25PYnNlcnZlciBNRE5cbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gY2FsbGJhY2tcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VNdXRhdGlvbk9ic2VydmVyKHRhcmdldCwgY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LC4uLm11dGF0aW9uT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0bGV0IG9ic2VydmVyO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJNdXRhdGlvbk9ic2VydmVyXCIgaW4gd2luZG93JDEpO1xuXHRjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuXHRcdGlmIChvYnNlcnZlcikge1xuXHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0b2JzZXJ2ZXIgPSB2b2lkIDA7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaChjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgaXRlbXMgPSB0b0FycmF5KHRvVmFsdWUodGFyZ2V0KSkubWFwKHVucmVmRWxlbWVudCkuZmlsdGVyKG5vdE51bGxpc2gpO1xuXHRcdHJldHVybiBuZXcgU2V0KGl0ZW1zKTtcblx0fSksIChuZXdUYXJnZXRzKSA9PiB7XG5cdFx0Y2xlYW51cCgpO1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiBuZXdUYXJnZXRzLnNpemUpIHtcblx0XHRcdG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuXHRcdFx0bmV3VGFyZ2V0cy5mb3JFYWNoKChlbCkgPT4gb2JzZXJ2ZXIub2JzZXJ2ZShlbCwgbXV0YXRpb25PcHRpb25zKSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdGZsdXNoOiBcInBvc3RcIlxuXHR9KTtcblx0Y29uc3QgdGFrZVJlY29yZHMgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIG9ic2VydmVyID09PSBudWxsIHx8IG9ic2VydmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvYnNlcnZlci50YWtlUmVjb3JkcygpO1xuXHR9O1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdHN0b3BXYXRjaCgpO1xuXHRcdGNsZWFudXAoKTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c3RvcCxcblx0XHR0YWtlUmVjb3Jkc1xuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBvbkVsZW1lbnRSZW1vdmFsL2luZGV4LnRzXG4vKipcbiogRmlyZXMgd2hlbiB0aGUgZWxlbWVudCBvciBhbnkgZWxlbWVudCBjb250YWluaW5nIGl0IGlzIHJlbW92ZWQuXG4qXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIGNhbGxiYWNrXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gb25FbGVtZW50UmVtb3ZhbCh0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuZG9jdW1lbnQsIGZsdXNoID0gXCJzeW5jXCIgfSA9IG9wdGlvbnM7XG5cdGlmICghd2luZG93JDEgfHwgIWRvY3VtZW50JDEpIHJldHVybiBub29wO1xuXHRsZXQgc3RvcEZuO1xuXHRjb25zdCBjbGVhbnVwQW5kVXBkYXRlID0gKGZuKSA9PiB7XG5cdFx0c3RvcEZuID09PSBudWxsIHx8IHN0b3BGbiA9PT0gdm9pZCAwIHx8IHN0b3BGbigpO1xuXHRcdHN0b3BGbiA9IGZuO1xuXHR9O1xuXHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRpZiAoZWwpIHtcblx0XHRcdGNvbnN0IHsgc3RvcCB9ID0gdXNlTXV0YXRpb25PYnNlcnZlcihkb2N1bWVudCQxLCAobXV0YXRpb25zTGlzdCkgPT4ge1xuXHRcdFx0XHRpZiAobXV0YXRpb25zTGlzdC5tYXAoKG11dGF0aW9uKSA9PiBbLi4ubXV0YXRpb24ucmVtb3ZlZE5vZGVzXSkuZmxhdCgpLnNvbWUoKG5vZGUpID0+IG5vZGUgPT09IGVsIHx8IG5vZGUuY29udGFpbnMoZWwpKSkgY2FsbGJhY2sobXV0YXRpb25zTGlzdCk7XG5cdFx0XHR9LCB7XG5cdFx0XHRcdHdpbmRvdzogd2luZG93JDEsXG5cdFx0XHRcdGNoaWxkTGlzdDogdHJ1ZSxcblx0XHRcdFx0c3VidHJlZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0XHRjbGVhbnVwQW5kVXBkYXRlKHN0b3ApO1xuXHRcdH1cblx0fSwgeyBmbHVzaCB9KTtcblx0Y29uc3Qgc3RvcEhhbmRsZSA9ICgpID0+IHtcblx0XHRzdG9wV2F0Y2goKTtcblx0XHRjbGVhbnVwQW5kVXBkYXRlKCk7XG5cdH07XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHN0b3BIYW5kbGUpO1xuXHRyZXR1cm4gc3RvcEhhbmRsZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25LZXlTdHJva2UvaW5kZXgudHNcbmZ1bmN0aW9uIGNyZWF0ZUtleVByZWRpY2F0ZShrZXlGaWx0ZXIpIHtcblx0aWYgKHR5cGVvZiBrZXlGaWx0ZXIgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGtleUZpbHRlcjtcblx0ZWxzZSBpZiAodHlwZW9mIGtleUZpbHRlciA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIChldmVudCkgPT4gZXZlbnQua2V5ID09PSBrZXlGaWx0ZXI7XG5cdGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoa2V5RmlsdGVyKSkgcmV0dXJuIChldmVudCkgPT4ga2V5RmlsdGVyLmluY2x1ZGVzKGV2ZW50LmtleSk7XG5cdHJldHVybiAoKSA9PiB0cnVlO1xufVxuZnVuY3Rpb24gb25LZXlTdHJva2UoLi4uYXJncykge1xuXHRsZXQga2V5O1xuXHRsZXQgaGFuZGxlcjtcblx0bGV0IG9wdGlvbnMgPSB7fTtcblx0aWYgKGFyZ3MubGVuZ3RoID09PSAzKSB7XG5cdFx0a2V5ID0gYXJnc1swXTtcblx0XHRoYW5kbGVyID0gYXJnc1sxXTtcblx0XHRvcHRpb25zID0gYXJnc1syXTtcblx0fSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikgaWYgKHR5cGVvZiBhcmdzWzFdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0a2V5ID0gdHJ1ZTtcblx0XHRoYW5kbGVyID0gYXJnc1swXTtcblx0XHRvcHRpb25zID0gYXJnc1sxXTtcblx0fSBlbHNlIHtcblx0XHRrZXkgPSBhcmdzWzBdO1xuXHRcdGhhbmRsZXIgPSBhcmdzWzFdO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGtleSA9IHRydWU7XG5cdFx0aGFuZGxlciA9IGFyZ3NbMF07XG5cdH1cblx0Y29uc3QgeyB0YXJnZXQgPSBkZWZhdWx0V2luZG93LCBldmVudE5hbWUgPSBcImtleWRvd25cIiwgcGFzc2l2ZSA9IGZhbHNlLCBkZWR1cGUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcHJlZGljYXRlID0gY3JlYXRlS2V5UHJlZGljYXRlKGtleSk7XG5cdGNvbnN0IGxpc3RlbmVyID0gKGUpID0+IHtcblx0XHRpZiAoZS5yZXBlYXQgJiYgdG9WYWx1ZShkZWR1cGUpKSByZXR1cm47XG5cdFx0aWYgKHByZWRpY2F0ZShlKSkgaGFuZGxlcihlKTtcblx0fTtcblx0cmV0dXJuIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBldmVudE5hbWUsIGxpc3RlbmVyLCBwYXNzaXZlKTtcbn1cbi8qKlxuKiBMaXN0ZW4gdG8gdGhlIGtleWRvd24gZXZlbnQgb2YgdGhlIGdpdmVuIGtleS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvb25LZXlTdHJva2VcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaGFuZGxlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uS2V5RG93bihrZXksIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb25LZXlTdHJva2Uoa2V5LCBoYW5kbGVyLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudE5hbWU6IFwia2V5ZG93blwiXG5cdH0pO1xufVxuLyoqXG4qIExpc3RlbiB0byB0aGUga2V5cHJlc3MgZXZlbnQgb2YgdGhlIGdpdmVuIGtleS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvb25LZXlTdHJva2VcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaGFuZGxlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uS2V5UHJlc3NlZChrZXksIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb25LZXlTdHJva2Uoa2V5LCBoYW5kbGVyLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudE5hbWU6IFwia2V5cHJlc3NcIlxuXHR9KTtcbn1cbi8qKlxuKiBMaXN0ZW4gdG8gdGhlIGtleXVwIGV2ZW50IG9mIHRoZSBnaXZlbiBrZXkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL29uS2V5U3Ryb2tlXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGhhbmRsZXJcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiBvbktleVVwKGtleSwgaGFuZGxlciwgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBvbktleVN0cm9rZShrZXksIGhhbmRsZXIsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGV2ZW50TmFtZTogXCJrZXl1cFwiXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBvbkxvbmdQcmVzcy9pbmRleC50c1xuY29uc3QgREVGQVVMVF9ERUxBWSA9IDUwMDtcbmNvbnN0IERFRkFVTFRfVEhSRVNIT0xEID0gMTA7XG5mdW5jdGlvbiBvbkxvbmdQcmVzcyh0YXJnZXQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcblx0dmFyIF9vcHRpb25zJG1vZGlmaWVyczEwLCBfb3B0aW9ucyRtb2RpZmllcnMxMTtcblx0Y29uc3QgZWxlbWVudFJlZiA9IGNvbXB1dGVkKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpKTtcblx0bGV0IHRpbWVvdXQ7XG5cdGxldCBwb3NTdGFydDtcblx0bGV0IHN0YXJ0VGltZXN0YW1wO1xuXHRsZXQgaGFzTG9uZ1ByZXNzZWQgPSBmYWxzZTtcblx0ZnVuY3Rpb24gY2xlYXIoKSB7XG5cdFx0aWYgKHRpbWVvdXQpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHRcdHRpbWVvdXQgPSB2b2lkIDA7XG5cdFx0fVxuXHRcdHBvc1N0YXJ0ID0gdm9pZCAwO1xuXHRcdHN0YXJ0VGltZXN0YW1wID0gdm9pZCAwO1xuXHRcdGhhc0xvbmdQcmVzc2VkID0gZmFsc2U7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0RGVsYXkoZXYpIHtcblx0XHRjb25zdCBkZWxheSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZWxheTtcblx0XHRpZiAodHlwZW9mIGRlbGF5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBkZWxheShldik7XG5cdFx0cmV0dXJuIGRlbGF5ICE9PSBudWxsICYmIGRlbGF5ICE9PSB2b2lkIDAgPyBkZWxheSA6IERFRkFVTFRfREVMQVk7XG5cdH1cblx0ZnVuY3Rpb24gb25SZWxlYXNlKGV2KSB7XG5cdFx0dmFyIF9vcHRpb25zJG1vZGlmaWVycywgX29wdGlvbnMkbW9kaWZpZXJzMiwgX29wdGlvbnMkbW9kaWZpZXJzMztcblx0XHRjb25zdCBbX3N0YXJ0VGltZXN0YW1wLCBfcG9zU3RhcnQsIF9oYXNMb25nUHJlc3NlZF0gPSBbXG5cdFx0XHRzdGFydFRpbWVzdGFtcCxcblx0XHRcdHBvc1N0YXJ0LFxuXHRcdFx0aGFzTG9uZ1ByZXNzZWRcblx0XHRdO1xuXHRcdGNsZWFyKCk7XG5cdFx0aWYgKCEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9uTW91c2VVcCkgfHwgIV9wb3NTdGFydCB8fCAhX3N0YXJ0VGltZXN0YW1wKSByZXR1cm47XG5cdFx0aWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzLnNlbGYpICYmIGV2LnRhcmdldCAhPT0gZWxlbWVudFJlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzMiA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnMyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnMyLnByZXZlbnQpIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnMzID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczMuc3RvcCkgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0Y29uc3QgZHggPSBldi54IC0gX3Bvc1N0YXJ0Lng7XG5cdFx0Y29uc3QgZHkgPSBldi55IC0gX3Bvc1N0YXJ0Lnk7XG5cdFx0Y29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuXHRcdG9wdGlvbnMub25Nb3VzZVVwKGV2LnRpbWVTdGFtcCAtIF9zdGFydFRpbWVzdGFtcCwgZGlzdGFuY2UsIF9oYXNMb25nUHJlc3NlZCk7XG5cdH1cblx0ZnVuY3Rpb24gb25Eb3duKGV2KSB7XG5cdFx0dmFyIF9vcHRpb25zJG1vZGlmaWVyczQsIF9vcHRpb25zJG1vZGlmaWVyczUsIF9vcHRpb25zJG1vZGlmaWVyczY7XG5cdFx0aWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzNCA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnM0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnM0LnNlbGYpICYmIGV2LnRhcmdldCAhPT0gZWxlbWVudFJlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGNsZWFyKCk7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnM1ID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczUucHJldmVudCkgZXYucHJldmVudERlZmF1bHQoKTtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczYgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzNiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzNi5zdG9wKSBldi5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRwb3NTdGFydCA9IHtcblx0XHRcdHg6IGV2LngsXG5cdFx0XHR5OiBldi55XG5cdFx0fTtcblx0XHRzdGFydFRpbWVzdGFtcCA9IGV2LnRpbWVTdGFtcDtcblx0XHR0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRoYXNMb25nUHJlc3NlZCA9IHRydWU7XG5cdFx0XHRoYW5kbGVyKGV2KTtcblx0XHR9LCBnZXREZWxheShldikpO1xuXHR9XG5cdGZ1bmN0aW9uIG9uTW92ZShldikge1xuXHRcdHZhciBfb3B0aW9ucyRtb2RpZmllcnM3LCBfb3B0aW9ucyRtb2RpZmllcnM4LCBfb3B0aW9ucyRtb2RpZmllcnM5LCBfb3B0aW9ucyRkaXN0YW5jZVRocmU7XG5cdFx0aWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzNyA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnM3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnM3LnNlbGYpICYmIGV2LnRhcmdldCAhPT0gZWxlbWVudFJlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmICghcG9zU3RhcnQgfHwgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kaXN0YW5jZVRocmVzaG9sZCkgPT09IGZhbHNlKSByZXR1cm47XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnM4ID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczgucHJldmVudCkgZXYucHJldmVudERlZmF1bHQoKTtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczkgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzOSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzOS5zdG9wKSBldi5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRjb25zdCBkeCA9IGV2LnggLSBwb3NTdGFydC54O1xuXHRcdGNvbnN0IGR5ID0gZXYueSAtIHBvc1N0YXJ0Lnk7XG5cdFx0aWYgKE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkgPj0gKChfb3B0aW9ucyRkaXN0YW5jZVRocmUgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGlzdGFuY2VUaHJlc2hvbGQpICE9PSBudWxsICYmIF9vcHRpb25zJGRpc3RhbmNlVGhyZSAhPT0gdm9pZCAwID8gX29wdGlvbnMkZGlzdGFuY2VUaHJlIDogREVGQVVMVF9USFJFU0hPTEQpKSBjbGVhcigpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRjYXB0dXJlOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzMTAgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzMTAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczEwLmNhcHR1cmUsXG5cdFx0b25jZTogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczExID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczExID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnMxMS5vbmNlXG5cdH07XG5cdGNvbnN0IGNsZWFudXAgPSBbXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihlbGVtZW50UmVmLCBcInBvaW50ZXJkb3duXCIsIG9uRG93biwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsZW1lbnRSZWYsIFwicG9pbnRlcm1vdmVcIiwgb25Nb3ZlLCBsaXN0ZW5lck9wdGlvbnMpLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWxlbWVudFJlZiwgW1wicG9pbnRlcnVwXCIsIFwicG9pbnRlcmxlYXZlXCJdLCBvblJlbGVhc2UsIGxpc3RlbmVyT3B0aW9ucylcblx0XTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IGNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRyZXR1cm4gc3RvcDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25TdGFydFR5cGluZy9pbmRleC50c1xuZnVuY3Rpb24gaXNGb2N1c2VkRWxlbWVudEVkaXRhYmxlKCkge1xuXHRjb25zdCB7IGFjdGl2ZUVsZW1lbnQsIGJvZHkgfSA9IGRvY3VtZW50O1xuXHRpZiAoIWFjdGl2ZUVsZW1lbnQpIHJldHVybiBmYWxzZTtcblx0aWYgKGFjdGl2ZUVsZW1lbnQgPT09IGJvZHkpIHJldHVybiBmYWxzZTtcblx0c3dpdGNoIChhY3RpdmVFbGVtZW50LnRhZ05hbWUpIHtcblx0XHRjYXNlIFwiSU5QVVRcIjpcblx0XHRjYXNlIFwiVEVYVEFSRUFcIjogcmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGFjdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpO1xufVxuZnVuY3Rpb24gaXNUeXBlZENoYXJWYWxpZCh7IGtleUNvZGUsIG1ldGFLZXksIGN0cmxLZXksIGFsdEtleSB9KSB7XG5cdGlmIChtZXRhS2V5IHx8IGN0cmxLZXkgfHwgYWx0S2V5KSByZXR1cm4gZmFsc2U7XG5cdGlmIChrZXlDb2RlID49IDQ4ICYmIGtleUNvZGUgPD0gNTcgfHwga2V5Q29kZSA+PSA5NiAmJiBrZXlDb2RlIDw9IDEwNSkgcmV0dXJuIHRydWU7XG5cdGlmIChrZXlDb2RlID49IDY1ICYmIGtleUNvZGUgPD0gOTApIHJldHVybiB0cnVlO1xuXHRyZXR1cm4gZmFsc2U7XG59XG4vKipcbiogRmlyZXMgd2hlbiB1c2VycyBzdGFydCB0eXBpbmcgb24gbm9uLWVkaXRhYmxlIGVsZW1lbnRzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9vblN0YXJ0VHlwaW5nXG4qIEBwYXJhbSBjYWxsYmFja1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uU3RhcnRUeXBpbmcoY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBrZXlkb3duID0gKGV2ZW50KSA9PiB7XG5cdFx0aWYgKCFpc0ZvY3VzZWRFbGVtZW50RWRpdGFibGUoKSAmJiBpc1R5cGVkQ2hhclZhbGlkKGV2ZW50KSkgY2FsbGJhY2soZXZlbnQpO1xuXHR9O1xuXHRpZiAoZG9jdW1lbnQkMSkgdXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcImtleWRvd25cIiwga2V5ZG93biwgeyBwYXNzaXZlOiB0cnVlIH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0ZW1wbGF0ZVJlZi9pbmRleC50c1xuLyoqXG4qIEBkZXByZWNhdGVkIFVzZSBWdWUncyBidWlsdC1pbiBgdXNlVGVtcGxhdGVSZWZgIGluc3RlYWQuXG4qXG4qIFNob3J0aGFuZCBmb3IgYmluZGluZyByZWYgdG8gdGVtcGxhdGUgZWxlbWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdGVtcGxhdGVSZWZcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaW5pdGlhbFZhbHVlXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdGVtcGxhdGVSZWYoa2V5LCBpbml0aWFsVmFsdWUgPSBudWxsKSB7XG5cdGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGxldCBfdHJpZ2dlciA9ICgpID0+IHt9O1xuXHRjb25zdCBlbGVtZW50ID0gY3VzdG9tUmVmKCh0cmFjaywgdHJpZ2dlcikgPT4ge1xuXHRcdF90cmlnZ2VyID0gdHJpZ2dlcjtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHR2YXIgX2luc3RhbmNlJHByb3h5JCRyZWZzLCBfaW5zdGFuY2UkcHJveHk7XG5cdFx0XHRcdHRyYWNrKCk7XG5cdFx0XHRcdHJldHVybiAoX2luc3RhbmNlJHByb3h5JCRyZWZzID0gaW5zdGFuY2UgPT09IG51bGwgfHwgaW5zdGFuY2UgPT09IHZvaWQgMCB8fCAoX2luc3RhbmNlJHByb3h5ID0gaW5zdGFuY2UucHJveHkpID09PSBudWxsIHx8IF9pbnN0YW5jZSRwcm94eSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2luc3RhbmNlJHByb3h5LiRyZWZzW2tleV0pICE9PSBudWxsICYmIF9pbnN0YW5jZSRwcm94eSQkcmVmcyAhPT0gdm9pZCAwID8gX2luc3RhbmNlJHByb3h5JCRyZWZzIDogaW5pdGlhbFZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldCgpIHt9XG5cdFx0fTtcblx0fSk7XG5cdHRyeU9uTW91bnRlZChfdHJpZ2dlcik7XG5cdG9uVXBkYXRlZChfdHJpZ2dlcik7XG5cdHJldHVybiBlbGVtZW50O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBY3RpdmVFbGVtZW50L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFjdGl2ZUVsZW1lbnRcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBY3RpdmVFbGVtZW50KG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkZG9jdW1lbnQ7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGRlZXAgPSB0cnVlLCB0cmlnZ2VyT25SZW1vdmFsID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRvY3VtZW50JDEgPSAoX29wdGlvbnMkZG9jdW1lbnQgPSBvcHRpb25zLmRvY3VtZW50KSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRkb2N1bWVudCAhPT0gdm9pZCAwID8gX29wdGlvbnMkZG9jdW1lbnQgOiB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuZG9jdW1lbnQ7XG5cdGNvbnN0IGdldERlZXBBY3RpdmVFbGVtZW50ID0gKCkgPT4ge1xuXHRcdGxldCBlbGVtZW50ID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmFjdGl2ZUVsZW1lbnQ7XG5cdFx0aWYgKGRlZXApIHtcblx0XHRcdHZhciBfZWxlbWVudCRzaGFkb3dSb290O1xuXHRcdFx0d2hpbGUgKGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWxlbWVudC5zaGFkb3dSb290KSBlbGVtZW50ID0gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgfHwgKF9lbGVtZW50JHNoYWRvd1Jvb3QgPSBlbGVtZW50LnNoYWRvd1Jvb3QpID09PSBudWxsIHx8IF9lbGVtZW50JHNoYWRvd1Jvb3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lbGVtZW50JHNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudDtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW1lbnQ7XG5cdH07XG5cdGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHRyaWdnZXIgPSAoKSA9PiB7XG5cdFx0YWN0aXZlRWxlbWVudC52YWx1ZSA9IGdldERlZXBBY3RpdmVFbGVtZW50KCk7XG5cdH07XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRcdGNhcHR1cmU6IHRydWUsXG5cdFx0XHRwYXNzaXZlOiB0cnVlXG5cdFx0fTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImJsdXJcIiwgKGV2ZW50KSA9PiB7XG5cdFx0XHRpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0dHJpZ2dlcigpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJmb2N1c1wiLCB0cmlnZ2VyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGlmICh0cmlnZ2VyT25SZW1vdmFsKSBvbkVsZW1lbnRSZW1vdmFsKGFjdGl2ZUVsZW1lbnQsIHRyaWdnZXIsIHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgfSk7XG5cdHRyaWdnZXIoKTtcblx0cmV0dXJuIGFjdGl2ZUVsZW1lbnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVJhZkZuL2luZGV4LnRzXG4vKipcbiogQ2FsbCBmdW5jdGlvbiBvbiBldmVyeSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4gV2l0aCBjb250cm9scyBvZiBwYXVzaW5nIGFuZCByZXN1bWluZy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmFmRm5cbiogQHBhcmFtIGZuXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlUmFmRm4oZm4sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIGZwc0xpbWl0ID0gbnVsbCwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIG9uY2UgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNBY3RpdmUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaW50ZXJ2YWxMaW1pdCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBsaW1pdCA9IHRvVmFsdWUoZnBzTGltaXQpO1xuXHRcdHJldHVybiBsaW1pdCA/IDFlMyAvIGxpbWl0IDogbnVsbDtcblx0fSk7XG5cdGxldCBwcmV2aW91c0ZyYW1lVGltZXN0YW1wID0gMDtcblx0bGV0IHJhZklkID0gbnVsbDtcblx0ZnVuY3Rpb24gbG9vcCh0aW1lc3RhbXAkMSkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUgfHwgIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0aWYgKCFwcmV2aW91c0ZyYW1lVGltZXN0YW1wKSBwcmV2aW91c0ZyYW1lVGltZXN0YW1wID0gdGltZXN0YW1wJDE7XG5cdFx0Y29uc3QgZGVsdGEgPSB0aW1lc3RhbXAkMSAtIHByZXZpb3VzRnJhbWVUaW1lc3RhbXA7XG5cdFx0aWYgKGludGVydmFsTGltaXQudmFsdWUgJiYgZGVsdGEgPCBpbnRlcnZhbExpbWl0LnZhbHVlKSB7XG5cdFx0XHRyYWZJZCA9IHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IHRpbWVzdGFtcCQxO1xuXHRcdGZuKHtcblx0XHRcdGRlbHRhLFxuXHRcdFx0dGltZXN0YW1wOiB0aW1lc3RhbXAkMVxuXHRcdH0pO1xuXHRcdGlmIChvbmNlKSB7XG5cdFx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0cmFmSWQgPSBudWxsO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRyYWZJZCA9IHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoKSB7XG5cdFx0aWYgKCFpc0FjdGl2ZS52YWx1ZSAmJiB3aW5kb3ckMSkge1xuXHRcdFx0aXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuXHRcdFx0cHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IDA7XG5cdFx0XHRyYWZJZCA9IHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gcGF1c2UoKSB7XG5cdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0XHRpZiAocmFmSWQgIT0gbnVsbCAmJiB3aW5kb3ckMSkge1xuXHRcdFx0d2luZG93JDEuY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuXHRcdFx0cmFmSWQgPSBudWxsO1xuXHRcdH1cblx0fVxuXHRpZiAoaW1tZWRpYXRlKSByZXN1bWUoKTtcblx0dHJ5T25TY29wZURpc3Bvc2UocGF1c2UpO1xuXHRyZXR1cm4ge1xuXHRcdGlzQWN0aXZlOiByZWFkb25seShpc0FjdGl2ZSksXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFuaW1hdGUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBXZWIgQW5pbWF0aW9ucyBBUElcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQW5pbWF0ZVxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBrZXlmcmFtZXNcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VBbmltYXRlKHRhcmdldCwga2V5ZnJhbWVzLCBvcHRpb25zKSB7XG5cdGxldCBjb25maWc7XG5cdGxldCBhbmltYXRlT3B0aW9ucztcblx0aWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG5cdFx0Y29uZmlnID0gb3B0aW9ucztcblx0XHRhbmltYXRlT3B0aW9ucyA9IG9iamVjdE9taXQob3B0aW9ucywgW1xuXHRcdFx0XCJ3aW5kb3dcIixcblx0XHRcdFwiaW1tZWRpYXRlXCIsXG5cdFx0XHRcImNvbW1pdFN0eWxlc1wiLFxuXHRcdFx0XCJwZXJzaXN0XCIsXG5cdFx0XHRcIm9uUmVhZHlcIixcblx0XHRcdFwib25FcnJvclwiXG5cdFx0XSk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uZmlnID0geyBkdXJhdGlvbjogb3B0aW9ucyB9O1xuXHRcdGFuaW1hdGVPcHRpb25zID0gb3B0aW9ucztcblx0fVxuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpbW1lZGlhdGUgPSB0cnVlLCBjb21taXRTdHlsZXMsIHBlcnNpc3QsIHBsYXliYWNrUmF0ZTogX3BsYXliYWNrUmF0ZSA9IDEsIG9uUmVhZHksIG9uRXJyb3IgPSAoZSkgPT4ge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH0gfSA9IGNvbmZpZztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIEhUTUxFbGVtZW50ICYmIFwiYW5pbWF0ZVwiIGluIEhUTUxFbGVtZW50LnByb3RvdHlwZSk7XG5cdGNvbnN0IGFuaW1hdGUgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IHN0b3JlID0gc2hhbGxvd1JlYWN0aXZlKHtcblx0XHRzdGFydFRpbWU6IG51bGwsXG5cdFx0Y3VycmVudFRpbWU6IG51bGwsXG5cdFx0dGltZWxpbmU6IG51bGwsXG5cdFx0cGxheWJhY2tSYXRlOiBfcGxheWJhY2tSYXRlLFxuXHRcdHBlbmRpbmc6IGZhbHNlLFxuXHRcdHBsYXlTdGF0ZTogaW1tZWRpYXRlID8gXCJpZGxlXCIgOiBcInBhdXNlZFwiLFxuXHRcdHJlcGxhY2VTdGF0ZTogXCJhY3RpdmVcIlxuXHR9KTtcblx0Y29uc3QgcGVuZGluZyA9IGNvbXB1dGVkKCgpID0+IHN0b3JlLnBlbmRpbmcpO1xuXHRjb25zdCBwbGF5U3RhdGUgPSBjb21wdXRlZCgoKSA9PiBzdG9yZS5wbGF5U3RhdGUpO1xuXHRjb25zdCByZXBsYWNlU3RhdGUgPSBjb21wdXRlZCgoKSA9PiBzdG9yZS5yZXBsYWNlU3RhdGUpO1xuXHRjb25zdCBzdGFydFRpbWUgPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHN0b3JlLnN0YXJ0VGltZTtcblx0XHR9LFxuXHRcdHNldCh2YWx1ZSkge1xuXHRcdFx0c3RvcmUuc3RhcnRUaW1lID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZS5zdGFydFRpbWUgPSB2YWx1ZTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBjdXJyZW50VGltZSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RvcmUuY3VycmVudFRpbWU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHN0b3JlLmN1cnJlbnRUaW1lID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkge1xuXHRcdFx0XHRhbmltYXRlLnZhbHVlLmN1cnJlbnRUaW1lID0gdmFsdWU7XG5cdFx0XHRcdHN5bmNSZXN1bWUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRjb25zdCB0aW1lbGluZSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RvcmUudGltZWxpbmU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHN0b3JlLnRpbWVsaW5lID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZS50aW1lbGluZSA9IHZhbHVlO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHBsYXliYWNrUmF0ZSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RvcmUucGxheWJhY2tSYXRlO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHRzdG9yZS5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblx0XHRcdGlmIChhbmltYXRlLnZhbHVlKSBhbmltYXRlLnZhbHVlLnBsYXliYWNrUmF0ZSA9IHZhbHVlO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHBsYXkgPSAoKSA9PiB7XG5cdFx0aWYgKGFuaW1hdGUudmFsdWUpIHRyeSB7XG5cdFx0XHRhbmltYXRlLnZhbHVlLnBsYXkoKTtcblx0XHRcdHN5bmNSZXN1bWUoKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRzeW5jUGF1c2UoKTtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0fVxuXHRcdGVsc2UgdXBkYXRlKCk7XG5cdH07XG5cdGNvbnN0IHBhdXNlID0gKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWU7XG5cdFx0XHQoX2FuaW1hdGUkdmFsdWUgPSBhbmltYXRlLnZhbHVlKSA9PT0gbnVsbCB8fCBfYW5pbWF0ZSR2YWx1ZSA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlLnBhdXNlKCk7XG5cdFx0XHRzeW5jUGF1c2UoKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcmV2ZXJzZSA9ICgpID0+IHtcblx0XHRpZiAoIWFuaW1hdGUudmFsdWUpIHVwZGF0ZSgpO1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWUyO1xuXHRcdFx0KF9hbmltYXRlJHZhbHVlMiA9IGFuaW1hdGUudmFsdWUpID09PSBudWxsIHx8IF9hbmltYXRlJHZhbHVlMiA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlMi5yZXZlcnNlKCk7XG5cdFx0XHRzeW5jUmVzdW1lKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0c3luY1BhdXNlKCk7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgZmluaXNoID0gKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWUzO1xuXHRcdFx0KF9hbmltYXRlJHZhbHVlMyA9IGFuaW1hdGUudmFsdWUpID09PSBudWxsIHx8IF9hbmltYXRlJHZhbHVlMyA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlMy5maW5pc2goKTtcblx0XHRcdHN5bmNQYXVzZSgpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdHZhciBfYW5pbWF0ZSR2YWx1ZTQ7XG5cdFx0XHQoX2FuaW1hdGUkdmFsdWU0ID0gYW5pbWF0ZS52YWx1ZSkgPT09IG51bGwgfHwgX2FuaW1hdGUkdmFsdWU0ID09PSB2b2lkIDAgfHwgX2FuaW1hdGUkdmFsdWU0LmNhbmNlbCgpO1xuXHRcdFx0c3luY1BhdXNlKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH07XG5cdHdhdGNoKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpLCAoZWwpID0+IHtcblx0XHRpZiAoZWwpIHVwZGF0ZSh0cnVlKTtcblx0XHRlbHNlIGFuaW1hdGUudmFsdWUgPSB2b2lkIDA7XG5cdH0pO1xuXHR3YXRjaCgoKSA9PiBrZXlmcmFtZXMsICh2YWx1ZSkgPT4ge1xuXHRcdGlmIChhbmltYXRlLnZhbHVlKSB7XG5cdFx0XHR1cGRhdGUoKTtcblx0XHRcdGNvbnN0IHRhcmdldEVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0XHRpZiAodGFyZ2V0RWwpIGFuaW1hdGUudmFsdWUuZWZmZWN0ID0gbmV3IEtleWZyYW1lRWZmZWN0KHRhcmdldEVsLCB0b1ZhbHVlKHZhbHVlKSwgYW5pbWF0ZU9wdGlvbnMpO1xuXHRcdH1cblx0fSwgeyBkZWVwOiB0cnVlIH0pO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4gdXBkYXRlKHRydWUpLCBmYWxzZSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKGNhbmNlbCk7XG5cdGZ1bmN0aW9uIHVwZGF0ZShpbml0KSB7XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8ICFlbCkgcmV0dXJuO1xuXHRcdGlmICghYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZSA9IGVsLmFuaW1hdGUodG9WYWx1ZShrZXlmcmFtZXMpLCBhbmltYXRlT3B0aW9ucyk7XG5cdFx0aWYgKHBlcnNpc3QpIGFuaW1hdGUudmFsdWUucGVyc2lzdCgpO1xuXHRcdGlmIChfcGxheWJhY2tSYXRlICE9PSAxKSBhbmltYXRlLnZhbHVlLnBsYXliYWNrUmF0ZSA9IF9wbGF5YmFja1JhdGU7XG5cdFx0aWYgKGluaXQgJiYgIWltbWVkaWF0ZSkgYW5pbWF0ZS52YWx1ZS5wYXVzZSgpO1xuXHRcdGVsc2Ugc3luY1Jlc3VtZSgpO1xuXHRcdG9uUmVhZHkgPT09IG51bGwgfHwgb25SZWFkeSA9PT0gdm9pZCAwIHx8IG9uUmVhZHkoYW5pbWF0ZS52YWx1ZSk7XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIoYW5pbWF0ZSwgW1xuXHRcdFwiY2FuY2VsXCIsXG5cdFx0XCJmaW5pc2hcIixcblx0XHRcInJlbW92ZVwiXG5cdF0sIHN5bmNQYXVzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcihhbmltYXRlLCBcImZpbmlzaFwiLCAoKSA9PiB7XG5cdFx0dmFyIF9hbmltYXRlJHZhbHVlNTtcblx0XHRpZiAoY29tbWl0U3R5bGVzKSAoX2FuaW1hdGUkdmFsdWU1ID0gYW5pbWF0ZS52YWx1ZSkgPT09IG51bGwgfHwgX2FuaW1hdGUkdmFsdWU1ID09PSB2b2lkIDAgfHwgX2FuaW1hdGUkdmFsdWU1LmNvbW1pdFN0eWxlcygpO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRjb25zdCB7IHJlc3VtZTogcmVzdW1lUmVmLCBwYXVzZTogcGF1c2VSZWYgfSA9IHVzZVJhZkZuKCgpID0+IHtcblx0XHRpZiAoIWFuaW1hdGUudmFsdWUpIHJldHVybjtcblx0XHRzdG9yZS5wZW5kaW5nID0gYW5pbWF0ZS52YWx1ZS5wZW5kaW5nO1xuXHRcdHN0b3JlLnBsYXlTdGF0ZSA9IGFuaW1hdGUudmFsdWUucGxheVN0YXRlO1xuXHRcdHN0b3JlLnJlcGxhY2VTdGF0ZSA9IGFuaW1hdGUudmFsdWUucmVwbGFjZVN0YXRlO1xuXHRcdHN0b3JlLnN0YXJ0VGltZSA9IGFuaW1hdGUudmFsdWUuc3RhcnRUaW1lO1xuXHRcdHN0b3JlLmN1cnJlbnRUaW1lID0gYW5pbWF0ZS52YWx1ZS5jdXJyZW50VGltZTtcblx0XHRzdG9yZS50aW1lbGluZSA9IGFuaW1hdGUudmFsdWUudGltZWxpbmU7XG5cdFx0c3RvcmUucGxheWJhY2tSYXRlID0gYW5pbWF0ZS52YWx1ZS5wbGF5YmFja1JhdGU7XG5cdH0sIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcblx0ZnVuY3Rpb24gc3luY1Jlc3VtZSgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHJlc3VtZVJlZigpO1xuXHR9XG5cdGZ1bmN0aW9uIHN5bmNQYXVzZSgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgd2luZG93JDEpIHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShwYXVzZVJlZik7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRhbmltYXRlLFxuXHRcdHBsYXksXG5cdFx0cGF1c2UsXG5cdFx0cmV2ZXJzZSxcblx0XHRmaW5pc2gsXG5cdFx0Y2FuY2VsLFxuXHRcdHBlbmRpbmcsXG5cdFx0cGxheVN0YXRlLFxuXHRcdHJlcGxhY2VTdGF0ZSxcblx0XHRzdGFydFRpbWUsXG5cdFx0Y3VycmVudFRpbWUsXG5cdFx0dGltZWxpbmUsXG5cdFx0cGxheWJhY2tSYXRlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFzeW5jUXVldWUvaW5kZXgudHNcbi8qKlxuKiBBc3luY2hyb25vdXMgcXVldWUgdGFzayBjb250cm9sbGVyLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBc3luY1F1ZXVlXG4qIEBwYXJhbSB0YXNrc1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUFzeW5jUXVldWUodGFza3MsIG9wdGlvbnMpIHtcblx0Y29uc3QgeyBpbnRlcnJ1cHQgPSB0cnVlLCBvbkVycm9yID0gbm9vcCwgb25GaW5pc2hlZCA9IG5vb3AsIHNpZ25hbCB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgcHJvbWlzZVN0YXRlID0ge1xuXHRcdGFib3J0ZWQ6IFwiYWJvcnRlZFwiLFxuXHRcdGZ1bGZpbGxlZDogXCJmdWxmaWxsZWRcIixcblx0XHRwZW5kaW5nOiBcInBlbmRpbmdcIixcblx0XHRyZWplY3RlZDogXCJyZWplY3RlZFwiXG5cdH07XG5cdGNvbnN0IHJlc3VsdCA9IHJlYWN0aXZlKEFycmF5LmZyb20oQXJyYXkuZnJvbSh7IGxlbmd0aDogdGFza3MubGVuZ3RoIH0pLCAoKSA9PiAoe1xuXHRcdHN0YXRlOiBwcm9taXNlU3RhdGUucGVuZGluZyxcblx0XHRkYXRhOiBudWxsXG5cdH0pKSk7XG5cdGNvbnN0IGFjdGl2ZUluZGV4ID0gc2hhbGxvd1JlZigtMSk7XG5cdGlmICghdGFza3MgfHwgdGFza3MubGVuZ3RoID09PSAwKSB7XG5cdFx0b25GaW5pc2hlZCgpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRhY3RpdmVJbmRleCxcblx0XHRcdHJlc3VsdFxuXHRcdH07XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlUmVzdWx0KHN0YXRlLCByZXMpIHtcblx0XHRhY3RpdmVJbmRleC52YWx1ZSsrO1xuXHRcdHJlc3VsdFthY3RpdmVJbmRleC52YWx1ZV0uZGF0YSA9IHJlcztcblx0XHRyZXN1bHRbYWN0aXZlSW5kZXgudmFsdWVdLnN0YXRlID0gc3RhdGU7XG5cdH1cblx0dGFza3MucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG5cdFx0cmV0dXJuIHByZXYudGhlbigocHJldlJlcykgPT4ge1xuXHRcdFx0dmFyIF9yZXN1bHQkYWN0aXZlSW5kZXgkdjtcblx0XHRcdGlmIChzaWduYWwgPT09IG51bGwgfHwgc2lnbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaWduYWwuYWJvcnRlZCkge1xuXHRcdFx0XHR1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLmFib3J0ZWQsIC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCgoX3Jlc3VsdCRhY3RpdmVJbmRleCR2ID0gcmVzdWx0W2FjdGl2ZUluZGV4LnZhbHVlXSkgPT09IG51bGwgfHwgX3Jlc3VsdCRhY3RpdmVJbmRleCR2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcmVzdWx0JGFjdGl2ZUluZGV4JHYuc3RhdGUpID09PSBwcm9taXNlU3RhdGUucmVqZWN0ZWQgJiYgaW50ZXJydXB0KSB7XG5cdFx0XHRcdG9uRmluaXNoZWQoKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZG9uZSA9IGN1cnIocHJldlJlcykudGhlbigoY3VycmVudFJlcykgPT4ge1xuXHRcdFx0XHR1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLmZ1bGZpbGxlZCwgY3VycmVudFJlcyk7XG5cdFx0XHRcdGlmIChhY3RpdmVJbmRleC52YWx1ZSA9PT0gdGFza3MubGVuZ3RoIC0gMSkgb25GaW5pc2hlZCgpO1xuXHRcdFx0XHRyZXR1cm4gY3VycmVudFJlcztcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCFzaWduYWwpIHJldHVybiBkb25lO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmFjZShbZG9uZSwgd2hlbkFib3J0ZWQoc2lnbmFsKV0pO1xuXHRcdH0pLmNhdGNoKChlKSA9PiB7XG5cdFx0XHRpZiAoc2lnbmFsID09PSBudWxsIHx8IHNpZ25hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2lnbmFsLmFib3J0ZWQpIHtcblx0XHRcdFx0dXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5hYm9ydGVkLCBlKTtcblx0XHRcdFx0cmV0dXJuIGU7XG5cdFx0XHR9XG5cdFx0XHR1cGRhdGVSZXN1bHQocHJvbWlzZVN0YXRlLnJlamVjdGVkLCBlKTtcblx0XHRcdG9uRXJyb3IoKTtcblx0XHRcdGlmIChhY3RpdmVJbmRleC52YWx1ZSA9PT0gdGFza3MubGVuZ3RoIC0gMSkgb25GaW5pc2hlZCgpO1xuXHRcdFx0cmV0dXJuIGU7XG5cdFx0fSk7XG5cdH0sIFByb21pc2UucmVzb2x2ZSgpKTtcblx0cmV0dXJuIHtcblx0XHRhY3RpdmVJbmRleCxcblx0XHRyZXN1bHRcblx0fTtcbn1cbmZ1bmN0aW9uIHdoZW5BYm9ydGVkKHNpZ25hbCkge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IGVycm9yID0gLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcImFib3J0ZWRcIik7XG5cdFx0aWYgKHNpZ25hbC5hYm9ydGVkKSByZWplY3QoZXJyb3IpO1xuXHRcdGVsc2Ugc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiByZWplY3QoZXJyb3IpLCB7IG9uY2U6IHRydWUgfSk7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBc3luY1N0YXRlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYXN5bmMgc3RhdGUuIFdpbGwgbm90IGJsb2NrIHlvdXIgc2V0dXAgZnVuY3Rpb24gYW5kIHdpbGwgdHJpZ2dlciBjaGFuZ2VzIG9uY2VcbiogdGhlIHByb21pc2UgaXMgcmVhZHkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFzeW5jU3RhdGVcbiogQHBhcmFtIHByb21pc2UgICAgICAgICBUaGUgcHJvbWlzZSAvIGFzeW5jIGZ1bmN0aW9uIHRvIGJlIHJlc29sdmVkXG4qIEBwYXJhbSBpbml0aWFsU3RhdGUgICAgVGhlIGluaXRpYWwgc3RhdGUsIHVzZWQgdW50aWwgdGhlIGZpcnN0IGV2YWx1YXRpb24gZmluaXNoZXNcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VBc3luY1N0YXRlKHByb21pc2UsIGluaXRpYWxTdGF0ZSwgb3B0aW9ucykge1xuXHR2YXIgX2dsb2JhbFRoaXMkcmVwb3J0RXJyO1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIGRlbGF5ID0gMCwgb25FcnJvciA9IChfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgPSBnbG9iYWxUaGlzLnJlcG9ydEVycm9yKSAhPT0gbnVsbCAmJiBfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgIT09IHZvaWQgMCA/IF9nbG9iYWxUaGlzJHJlcG9ydEVyciA6IG5vb3AsIG9uU3VjY2VzcyA9IG5vb3AsIHJlc2V0T25FeGVjdXRlID0gdHJ1ZSwgc2hhbGxvdyA9IHRydWUsIHRocm93RXJyb3IgfSA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuXHRjb25zdCBzdGF0ZSA9IHNoYWxsb3cgPyBzaGFsbG93UmVmKGluaXRpYWxTdGF0ZSkgOiByZWYoaW5pdGlhbFN0YXRlKTtcblx0Y29uc3QgaXNSZWFkeSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBpc0xvYWRpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGxldCBleGVjdXRpb25zQ291bnQgPSAwO1xuXHRhc3luYyBmdW5jdGlvbiBleGVjdXRlKGRlbGF5JDEgPSAwLCAuLi5hcmdzKSB7XG5cdFx0Y29uc3QgZXhlY3V0aW9uSWQgPSBleGVjdXRpb25zQ291bnQgKz0gMTtcblx0XHRpZiAocmVzZXRPbkV4ZWN1dGUpIHN0YXRlLnZhbHVlID0gdG9WYWx1ZShpbml0aWFsU3RhdGUpO1xuXHRcdGVycm9yLnZhbHVlID0gdm9pZCAwO1xuXHRcdGlzUmVhZHkudmFsdWUgPSBmYWxzZTtcblx0XHRpc0xvYWRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlmIChkZWxheSQxID4gMCkgYXdhaXQgcHJvbWlzZVRpbWVvdXQoZGVsYXkkMSk7XG5cdFx0Y29uc3QgX3Byb21pc2UgPSB0eXBlb2YgcHJvbWlzZSA9PT0gXCJmdW5jdGlvblwiID8gcHJvbWlzZSguLi5hcmdzKSA6IHByb21pc2U7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGRhdGEgPSBhd2FpdCBfcHJvbWlzZTtcblx0XHRcdGlmIChleGVjdXRpb25JZCA9PT0gZXhlY3V0aW9uc0NvdW50KSB7XG5cdFx0XHRcdHN0YXRlLnZhbHVlID0gZGF0YTtcblx0XHRcdFx0aXNSZWFkeS52YWx1ZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRvblN1Y2Nlc3MoZGF0YSk7XG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoZXhlY3V0aW9uSWQgPT09IGV4ZWN1dGlvbnNDb3VudCkgZXJyb3IudmFsdWUgPSBlO1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHRcdGlmICh0aHJvd0Vycm9yKSB0aHJvdyBlO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoZXhlY3V0aW9uSWQgPT09IGV4ZWN1dGlvbnNDb3VudCkgaXNMb2FkaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdGlmIChpbW1lZGlhdGUpIGV4ZWN1dGUoZGVsYXkpO1xuXHRjb25zdCBzaGVsbCA9IHtcblx0XHRzdGF0ZSxcblx0XHRpc1JlYWR5LFxuXHRcdGlzTG9hZGluZyxcblx0XHRlcnJvcixcblx0XHRleGVjdXRlLFxuXHRcdGV4ZWN1dGVJbW1lZGlhdGU6ICguLi5hcmdzKSA9PiBleGVjdXRlKDAsIC4uLmFyZ3MpXG5cdH07XG5cdGZ1bmN0aW9uIHdhaXRVbnRpbElzTG9hZGVkKCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR1bnRpbChpc0xvYWRpbmcpLnRvQmUoZmFsc2UpLnRoZW4oKCkgPT4gcmVzb2x2ZShzaGVsbCkpLmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHQuLi5zaGVsbCxcblx0XHR0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdFx0XHRyZXR1cm4gd2FpdFVudGlsSXNMb2FkZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0XHR9XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJhc2U2NC9zZXJpYWxpemF0aW9uLnRzXG5jb25zdCBkZWZhdWx0cyA9IHtcblx0YXJyYXk6ICh2KSA9PiBKU09OLnN0cmluZ2lmeSh2KSxcblx0b2JqZWN0OiAodikgPT4gSlNPTi5zdHJpbmdpZnkodiksXG5cdHNldDogKHYpID0+IEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odikpLFxuXHRtYXA6ICh2KSA9PiBKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXModikpLFxuXHRudWxsOiAoKSA9PiBcIlwiXG59O1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNlcmlhbGl6YXRpb24odGFyZ2V0KSB7XG5cdGlmICghdGFyZ2V0KSByZXR1cm4gZGVmYXVsdHMubnVsbDtcblx0aWYgKHRhcmdldCBpbnN0YW5jZW9mIE1hcCkgcmV0dXJuIGRlZmF1bHRzLm1hcDtcblx0ZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgU2V0KSByZXR1cm4gZGVmYXVsdHMuc2V0O1xuXHRlbHNlIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHJldHVybiBkZWZhdWx0cy5hcnJheTtcblx0ZWxzZSByZXR1cm4gZGVmYXVsdHMub2JqZWN0O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCYXNlNjQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUJhc2U2NCh0YXJnZXQsIG9wdGlvbnMpIHtcblx0Y29uc3QgYmFzZTY0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgcHJvbWlzZSA9IHNoYWxsb3dSZWYoKTtcblx0ZnVuY3Rpb24gZXhlY3V0ZSgpIHtcblx0XHRpZiAoIWlzQ2xpZW50KSByZXR1cm47XG5cdFx0cHJvbWlzZS52YWx1ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IF90YXJnZXQgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0XHRcdGlmIChfdGFyZ2V0ID09IG51bGwpIHJlc29sdmUoXCJcIik7XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBfdGFyZ2V0ID09PSBcInN0cmluZ1wiKSByZXNvbHZlKGJsb2JUb0Jhc2U2NChuZXcgQmxvYihbX3RhcmdldF0sIHsgdHlwZTogXCJ0ZXh0L3BsYWluXCIgfSkpKTtcblx0XHRcdFx0ZWxzZSBpZiAoX3RhcmdldCBpbnN0YW5jZW9mIEJsb2IpIHJlc29sdmUoYmxvYlRvQmFzZTY0KF90YXJnZXQpKTtcblx0XHRcdFx0ZWxzZSBpZiAoX3RhcmdldCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXNvbHZlKHdpbmRvdy5idG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4ubmV3IFVpbnQ4QXJyYXkoX3RhcmdldCkpKSk7XG5cdFx0XHRcdGVsc2UgaWYgKF90YXJnZXQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgcmVzb2x2ZShfdGFyZ2V0LnRvRGF0YVVSTChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHlwZSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnF1YWxpdHkpKTtcblx0XHRcdFx0ZWxzZSBpZiAoX3RhcmdldCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHtcblx0XHRcdFx0XHRjb25zdCBpbWcgPSBfdGFyZ2V0LmNsb25lTm9kZShmYWxzZSk7XG5cdFx0XHRcdFx0aW1nLmNyb3NzT3JpZ2luID0gXCJBbm9ueW1vdXNcIjtcblx0XHRcdFx0XHRpbWdMb2FkZWQoaW1nKS50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG5cdFx0XHRcdFx0XHRjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXHRcdFx0XHRcdFx0Y2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xuXHRcdFx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG5cdFx0XHRcdFx0XHRjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblx0XHRcdFx0XHRcdHJlc29sdmUoY2FudmFzLnRvRGF0YVVSTChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHlwZSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnF1YWxpdHkpKTtcblx0XHRcdFx0XHR9KS5jYXRjaChyZWplY3QpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBfdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2VyaWFsaXplZCA9ICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNlcmlhbGl6ZXIpIHx8IGdldERlZmF1bHRTZXJpYWxpemF0aW9uKF90YXJnZXQpKShfdGFyZ2V0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZShibG9iVG9CYXNlNjQobmV3IEJsb2IoW3NlcmlhbGl6ZWRdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pKSk7XG5cdFx0XHRcdH0gZWxzZSByZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcInRhcmdldCBpcyB1bnN1cHBvcnRlZCB0eXBlc1wiKSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHByb21pc2UudmFsdWUudGhlbigocmVzKSA9PiB7XG5cdFx0XHRiYXNlNjQudmFsdWUgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRhdGFVcmwpID09PSBmYWxzZSA/IHJlcy5yZXBsYWNlKC9eZGF0YTouKj87YmFzZTY0LC8sIFwiXCIpIDogcmVzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBwcm9taXNlLnZhbHVlO1xuXHR9XG5cdGlmIChpc1JlZih0YXJnZXQpIHx8IHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIikgd2F0Y2godGFyZ2V0LCBleGVjdXRlLCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0ZWxzZSBleGVjdXRlKCk7XG5cdHJldHVybiB7XG5cdFx0YmFzZTY0LFxuXHRcdHByb21pc2UsXG5cdFx0ZXhlY3V0ZVxuXHR9O1xufVxuZnVuY3Rpb24gaW1nTG9hZGVkKGltZykge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGlmICghaW1nLmNvbXBsZXRlKSB7XG5cdFx0XHRpbWcub25sb2FkID0gKCkgPT4ge1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9O1xuXHRcdFx0aW1nLm9uZXJyb3IgPSByZWplY3Q7XG5cdFx0fSBlbHNlIHJlc29sdmUoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBibG9iVG9CYXNlNjQoYmxvYikge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IGZyID0gbmV3IEZpbGVSZWFkZXIoKTtcblx0XHRmci5vbmxvYWQgPSAoZSkgPT4ge1xuXHRcdFx0cmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuXHRcdH07XG5cdFx0ZnIub25lcnJvciA9IHJlamVjdDtcblx0XHRmci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQmF0dGVyeS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIEJhdHRlcnkgU3RhdHVzIEFQSS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQmF0dGVyeVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUJhdHRlcnkob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGV2ZW50cyQxID0gW1xuXHRcdFwiY2hhcmdpbmdjaGFuZ2VcIixcblx0XHRcImNoYXJnaW5ndGltZWNoYW5nZVwiLFxuXHRcdFwiZGlzY2hhcmdpbmd0aW1lY2hhbmdlXCIsXG5cdFx0XCJsZXZlbGNoYW5nZVwiXG5cdF07XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImdldEJhdHRlcnlcIiBpbiBuYXZpZ2F0b3IkMSAmJiB0eXBlb2YgbmF2aWdhdG9yJDEuZ2V0QmF0dGVyeSA9PT0gXCJmdW5jdGlvblwiKTtcblx0Y29uc3QgY2hhcmdpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgY2hhcmdpbmdUaW1lID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZGlzY2hhcmdpbmdUaW1lID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgbGV2ZWwgPSBzaGFsbG93UmVmKDEpO1xuXHRsZXQgYmF0dGVyeTtcblx0ZnVuY3Rpb24gdXBkYXRlQmF0dGVyeUluZm8oKSB7XG5cdFx0Y2hhcmdpbmcudmFsdWUgPSB0aGlzLmNoYXJnaW5nO1xuXHRcdGNoYXJnaW5nVGltZS52YWx1ZSA9IHRoaXMuY2hhcmdpbmdUaW1lIHx8IDA7XG5cdFx0ZGlzY2hhcmdpbmdUaW1lLnZhbHVlID0gdGhpcy5kaXNjaGFyZ2luZ1RpbWUgfHwgMDtcblx0XHRsZXZlbC52YWx1ZSA9IHRoaXMubGV2ZWw7XG5cdH1cblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBuYXZpZ2F0b3IkMS5nZXRCYXR0ZXJ5KCkudGhlbigoX2JhdHRlcnkpID0+IHtcblx0XHRiYXR0ZXJ5ID0gX2JhdHRlcnk7XG5cdFx0dXBkYXRlQmF0dGVyeUluZm8uY2FsbChiYXR0ZXJ5KTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGJhdHRlcnksIGV2ZW50cyQxLCB1cGRhdGVCYXR0ZXJ5SW5mbywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRjaGFyZ2luZyxcblx0XHRjaGFyZ2luZ1RpbWUsXG5cdFx0ZGlzY2hhcmdpbmdUaW1lLFxuXHRcdGxldmVsXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJsdWV0b290aC9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZUJsdWV0b290aChvcHRpb25zKSB7XG5cdGxldCB7IGFjY2VwdEFsbERldmljZXMgPSBmYWxzZSB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgeyBmaWx0ZXJzID0gdm9pZCAwLCBvcHRpb25hbFNlcnZpY2VzID0gdm9pZCAwLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiYmx1ZXRvb3RoXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBkZXZpY2UgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0d2F0Y2goZGV2aWNlLCAoKSA9PiB7XG5cdFx0Y29ubmVjdFRvQmx1ZXRvb3RoR0FUVFNlcnZlcigpO1xuXHR9KTtcblx0YXN5bmMgZnVuY3Rpb24gcmVxdWVzdERldmljZSgpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdGlmIChmaWx0ZXJzICYmIGZpbHRlcnMubGVuZ3RoID4gMCkgYWNjZXB0QWxsRGV2aWNlcyA9IGZhbHNlO1xuXHRcdHRyeSB7XG5cdFx0XHRkZXZpY2UudmFsdWUgPSBhd2FpdCAobmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvciQxLmJsdWV0b290aC5yZXF1ZXN0RGV2aWNlKHtcblx0XHRcdFx0YWNjZXB0QWxsRGV2aWNlcyxcblx0XHRcdFx0ZmlsdGVycyxcblx0XHRcdFx0b3B0aW9uYWxTZXJ2aWNlc1xuXHRcdFx0fSkpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBlcnI7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHNlcnZlciA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgaXNDb25uZWN0ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cdFx0aXNDb25uZWN0ZWQudmFsdWUgPSBmYWxzZTtcblx0XHRkZXZpY2UudmFsdWUgPSB2b2lkIDA7XG5cdFx0c2VydmVyLnZhbHVlID0gdm9pZCAwO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RUb0JsdWV0b290aEdBVFRTZXJ2ZXIoKSB7XG5cdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdGlmIChkZXZpY2UudmFsdWUgJiYgZGV2aWNlLnZhbHVlLmdhdHQpIHtcblx0XHRcdHVzZUV2ZW50TGlzdGVuZXIoZGV2aWNlLCBcImdhdHRzZXJ2ZXJkaXNjb25uZWN0ZWRcIiwgcmVzZXQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHNlcnZlci52YWx1ZSA9IGF3YWl0IGRldmljZS52YWx1ZS5nYXR0LmNvbm5lY3QoKTtcblx0XHRcdFx0aXNDb25uZWN0ZWQudmFsdWUgPSBzZXJ2ZXIudmFsdWUuY29ubmVjdGVkO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdGVycm9yLnZhbHVlID0gZXJyO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdHZhciBfZGV2aWNlJHZhbHVlJGdhdHQ7XG5cdFx0aWYgKGRldmljZS52YWx1ZSkgKF9kZXZpY2UkdmFsdWUkZ2F0dCA9IGRldmljZS52YWx1ZS5nYXR0KSA9PT0gbnVsbCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQgPT09IHZvaWQgMCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQuY29ubmVjdCgpO1xuXHR9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHZhciBfZGV2aWNlJHZhbHVlJGdhdHQyO1xuXHRcdGlmIChkZXZpY2UudmFsdWUpIChfZGV2aWNlJHZhbHVlJGdhdHQyID0gZGV2aWNlLnZhbHVlLmdhdHQpID09PSBudWxsIHx8IF9kZXZpY2UkdmFsdWUkZ2F0dDIgPT09IHZvaWQgMCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQyLmRpc2Nvbm5lY3QoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNDb25uZWN0ZWQ6IHJlYWRvbmx5KGlzQ29ubmVjdGVkKSxcblx0XHRkZXZpY2UsXG5cdFx0cmVxdWVzdERldmljZSxcblx0XHRzZXJ2ZXIsXG5cdFx0ZXJyb3Jcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU1NSV2lkdGgvaW5kZXgudHNcbmNvbnN0IHNzcldpZHRoU3ltYm9sID0gU3ltYm9sKFwidnVldXNlLXNzci13aWR0aFwiKTtcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VTU1JXaWR0aCgpIHtcblx0Y29uc3Qgc3NyV2lkdGggPSBoYXNJbmplY3Rpb25Db250ZXh0KCkgPyBpbmplY3RMb2NhbChzc3JXaWR0aFN5bWJvbCwgbnVsbCkgOiBudWxsO1xuXHRyZXR1cm4gdHlwZW9mIHNzcldpZHRoID09PSBcIm51bWJlclwiID8gc3NyV2lkdGggOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBwcm92aWRlU1NSV2lkdGgod2lkdGgsIGFwcCkge1xuXHRpZiAoYXBwICE9PSB2b2lkIDApIGFwcC5wcm92aWRlKHNzcldpZHRoU3ltYm9sLCB3aWR0aCk7XG5cdGVsc2UgcHJvdmlkZUxvY2FsKHNzcldpZHRoU3ltYm9sLCB3aWR0aCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1lZGlhUXVlcnkvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBNZWRpYSBRdWVyeS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWVkaWFRdWVyeVxuKiBAcGFyYW0gcXVlcnlcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VNZWRpYVF1ZXJ5KHF1ZXJ5LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3NyV2lkdGggPSAvKiBAX19QVVJFX18gKi8gdXNlU1NSV2lkdGgoKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwibWF0Y2hNZWRpYVwiIGluIHdpbmRvdyQxICYmIHR5cGVvZiB3aW5kb3ckMS5tYXRjaE1lZGlhID09PSBcImZ1bmN0aW9uXCIpO1xuXHRjb25zdCBzc3JTdXBwb3J0ID0gc2hhbGxvd1JlZih0eXBlb2Ygc3NyV2lkdGggPT09IFwibnVtYmVyXCIpO1xuXHRjb25zdCBtZWRpYVF1ZXJ5ID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBtYXRjaGVzID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQpID0+IHtcblx0XHRtYXRjaGVzLnZhbHVlID0gZXZlbnQubWF0Y2hlcztcblx0fTtcblx0d2F0Y2hFZmZlY3QoKCkgPT4ge1xuXHRcdGlmIChzc3JTdXBwb3J0LnZhbHVlKSB7XG5cdFx0XHRzc3JTdXBwb3J0LnZhbHVlID0gIWlzU3VwcG9ydGVkLnZhbHVlO1xuXHRcdFx0bWF0Y2hlcy52YWx1ZSA9IHRvVmFsdWUocXVlcnkpLnNwbGl0KFwiLFwiKS5zb21lKChxdWVyeVN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBub3QgPSBxdWVyeVN0cmluZy5pbmNsdWRlcyhcIm5vdCBhbGxcIik7XG5cdFx0XHRcdGNvbnN0IG1pbldpZHRoID0gcXVlcnlTdHJpbmcubWF0Y2goL1xcKFxccyptaW4td2lkdGg6XFxzKigtP1xcZCsoPzpcXC5cXGQqKT9bYS16XStcXHMqKVxcKS8pO1xuXHRcdFx0XHRjb25zdCBtYXhXaWR0aCA9IHF1ZXJ5U3RyaW5nLm1hdGNoKC9cXChcXHMqbWF4LXdpZHRoOlxccyooLT9cXGQrKD86XFwuXFxkKik/W2Etel0rXFxzKilcXCkvKTtcblx0XHRcdFx0bGV0IHJlcyA9IEJvb2xlYW4obWluV2lkdGggfHwgbWF4V2lkdGgpO1xuXHRcdFx0XHRpZiAobWluV2lkdGggJiYgcmVzKSByZXMgPSBzc3JXaWR0aCA+PSBweFZhbHVlKG1pbldpZHRoWzFdKTtcblx0XHRcdFx0aWYgKG1heFdpZHRoICYmIHJlcykgcmVzID0gc3NyV2lkdGggPD0gcHhWYWx1ZShtYXhXaWR0aFsxXSk7XG5cdFx0XHRcdHJldHVybiBub3QgPyAhcmVzIDogcmVzO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRtZWRpYVF1ZXJ5LnZhbHVlID0gd2luZG93JDEubWF0Y2hNZWRpYSh0b1ZhbHVlKHF1ZXJ5KSk7XG5cdFx0bWF0Y2hlcy52YWx1ZSA9IG1lZGlhUXVlcnkudmFsdWUubWF0Y2hlcztcblx0fSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIobWVkaWFRdWVyeSwgXCJjaGFuZ2VcIiwgaGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gbWF0Y2hlcy52YWx1ZSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJyZWFrcG9pbnRzL2JyZWFrcG9pbnRzLnRzXG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBUYWlsd2luZCBWMlxuKlxuKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvYnJlYWtwb2ludHNcbiovXG5jb25zdCBicmVha3BvaW50c1RhaWx3aW5kID0ge1xuXHRcInNtXCI6IDY0MCxcblx0XCJtZFwiOiA3NjgsXG5cdFwibGdcIjogMTAyNCxcblx0XCJ4bFwiOiAxMjgwLFxuXHRcIjJ4bFwiOiAxNTM2XG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gQm9vdHN0cmFwIFY1XG4qXG4qIEBzZWUgaHR0cHM6Ly9nZXRib290c3RyYXAuY29tL2RvY3MvNS4wL2xheW91dC9icmVha3BvaW50c1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzQm9vdHN0cmFwVjUgPSB7XG5cdHhzOiAwLFxuXHRzbTogNTc2LFxuXHRtZDogNzY4LFxuXHRsZzogOTkyLFxuXHR4bDogMTIwMCxcblx0eHhsOiAxNDAwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gVnVldGlmeSBWMlxuKlxuKiBAc2VlIGh0dHBzOi8vdjIudnVldGlmeWpzLmNvbS9lbi9mZWF0dXJlcy9icmVha3BvaW50cy9cbiovXG5jb25zdCBicmVha3BvaW50c1Z1ZXRpZnlWMiA9IHtcblx0eHM6IDAsXG5cdHNtOiA2MDAsXG5cdG1kOiA5NjAsXG5cdGxnOiAxMjY0LFxuXHR4bDogMTkwNFxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIFZ1ZXRpZnkgVjNcbipcbiogQHNlZSBodHRwczovL3Z1ZXRpZnlqcy5jb20vZW4vc3R5bGVzL2Zsb2F0LyNvdmVydmlld1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzVnVldGlmeVYzID0ge1xuXHR4czogMCxcblx0c206IDYwMCxcblx0bWQ6IDk2MCxcblx0bGc6IDEyODAsXG5cdHhsOiAxOTIwLFxuXHR4eGw6IDI1NjBcbn07XG4vKipcbiogQWxpYXMgdG8gYGJyZWFrcG9pbnRzVnVldGlmeVYyYFxuKlxuKiBAZGVwcmVjYXRlZCBleHBsaWN0bHkgdXNlIGBicmVha3BvaW50c1Z1ZXRpZnlWMmAgb3IgYGJyZWFrcG9pbnRzVnVldGlmeVYzYCBpbnN0ZWFkXG4qL1xuY29uc3QgYnJlYWtwb2ludHNWdWV0aWZ5ID0gYnJlYWtwb2ludHNWdWV0aWZ5VjI7XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBBbnQgRGVzaWduXG4qXG4qIEBzZWUgaHR0cHM6Ly9hbnQuZGVzaWduL2NvbXBvbmVudHMvbGF5b3V0LyNicmVha3BvaW50LXdpZHRoXG4qL1xuY29uc3QgYnJlYWtwb2ludHNBbnREZXNpZ24gPSB7XG5cdHhzOiA0ODAsXG5cdHNtOiA1NzYsXG5cdG1kOiA3NjgsXG5cdGxnOiA5OTIsXG5cdHhsOiAxMjAwLFxuXHR4eGw6IDE2MDBcbn07XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBRdWFzYXIgVjJcbipcbiogQHNlZSBodHRwczovL3F1YXNhci5kZXYvc3R5bGUvYnJlYWtwb2ludHNcbiovXG5jb25zdCBicmVha3BvaW50c1F1YXNhciA9IHtcblx0eHM6IDAsXG5cdHNtOiA2MDAsXG5cdG1kOiAxMDI0LFxuXHRsZzogMTQ0MCxcblx0eGw6IDE5MjBcbn07XG4vKipcbiogU2VtYXRpYyBCcmVha3BvaW50c1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzU2VtYXRpYyA9IHtcblx0bW9iaWxlUzogMzIwLFxuXHRtb2JpbGVNOiAzNzUsXG5cdG1vYmlsZUw6IDQyNSxcblx0dGFibGV0OiA3NjgsXG5cdGxhcHRvcDogMTAyNCxcblx0bGFwdG9wTDogMTQ0MCxcblx0ZGVza3RvcDRLOiAyNTYwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gTWFzdGVyIENTU1xuKlxuKiBAc2VlIGh0dHBzOi8vZG9jcy5tYXN0ZXIuY28vY3NzL2JyZWFrcG9pbnRzXG4qL1xuY29uc3QgYnJlYWtwb2ludHNNYXN0ZXJDc3MgPSB7XG5cdFwiM3hzXCI6IDM2MCxcblx0XCIyeHNcIjogNDgwLFxuXHRcInhzXCI6IDYwMCxcblx0XCJzbVwiOiA3NjgsXG5cdFwibWRcIjogMTAyNCxcblx0XCJsZ1wiOiAxMjgwLFxuXHRcInhsXCI6IDE0NDAsXG5cdFwiMnhsXCI6IDE2MDAsXG5cdFwiM3hsXCI6IDE5MjAsXG5cdFwiNHhsXCI6IDI1NjBcbn07XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBQcmltZUZsZXhcbipcbiogQHNlZSBodHRwczovL3ByaW1lZmxleC5vcmcvaW5zdGFsbGF0aW9uXG4qL1xuY29uc3QgYnJlYWtwb2ludHNQcmltZUZsZXggPSB7XG5cdHNtOiA1NzYsXG5cdG1kOiA3NjgsXG5cdGxnOiA5OTIsXG5cdHhsOiAxMjAwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gRWxlbWVudFVJL0VsZW1lbnRQbHVzXG4qXG4qIEBzZWUgaHR0cHM6Ly9lbGVtZW50LmVsZW1lLmlvLyMvZW4tVVMvY29tcG9uZW50L2xheW91dFxuKiBAc2VlIGh0dHBzOi8vZWxlbWVudC1wbHVzLm9yZy9lbi1VUy9jb21wb25lbnQvbGF5b3V0Lmh0bWxcbiovXG5jb25zdCBicmVha3BvaW50c0VsZW1lbnQgPSB7XG5cdHhzOiAwLFxuXHRzbTogNzY4LFxuXHRtZDogOTkyLFxuXHRsZzogMTIwMCxcblx0eGw6IDE5MjBcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJyZWFrcG9pbnRzL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSB2aWV3cG9ydCBicmVha3BvaW50c1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VCcmVha3BvaW50c1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBvcHRpb25zID0ge30pIHtcblx0ZnVuY3Rpb24gZ2V0VmFsdWUkMShrLCBkZWx0YSkge1xuXHRcdGxldCB2ID0gdG9WYWx1ZShicmVha3BvaW50c1t0b1ZhbHVlKGspXSk7XG5cdFx0aWYgKGRlbHRhICE9IG51bGwpIHYgPSBpbmNyZWFzZVdpdGhVbml0KHYsIGRlbHRhKTtcblx0XHRpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHYgPSBgJHt2fXB4YDtcblx0XHRyZXR1cm4gdjtcblx0fVxuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBzdHJhdGVneSA9IFwibWluLXdpZHRoXCIsIHNzcldpZHRoID0gLyogQF9fUFVSRV9fICovIHVzZVNTUldpZHRoKCkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHNzclN1cHBvcnQgPSB0eXBlb2Ygc3NyV2lkdGggPT09IFwibnVtYmVyXCI7XG5cdGNvbnN0IG1vdW50ZWQgPSBzc3JTdXBwb3J0ID8gc2hhbGxvd1JlZihmYWxzZSkgOiB7IHZhbHVlOiB0cnVlIH07XG5cdGlmIChzc3JTdXBwb3J0KSB0cnlPbk1vdW50ZWQoKCkgPT4gbW91bnRlZC52YWx1ZSA9ICEhd2luZG93JDEpO1xuXHRmdW5jdGlvbiBtYXRjaChxdWVyeSwgc2l6ZSkge1xuXHRcdGlmICghbW91bnRlZC52YWx1ZSAmJiBzc3JTdXBwb3J0KSByZXR1cm4gcXVlcnkgPT09IFwibWluXCIgPyBzc3JXaWR0aCA+PSBweFZhbHVlKHNpemUpIDogc3NyV2lkdGggPD0gcHhWYWx1ZShzaXplKTtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIHdpbmRvdyQxLm1hdGNoTWVkaWEoYCgke3F1ZXJ5fS13aWR0aDogJHtzaXplfSlgKS5tYXRjaGVzO1xuXHR9XG5cdGNvbnN0IGdyZWF0ZXJPckVxdWFsID0gKGspID0+IHtcblx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1pbi13aWR0aDogJHtnZXRWYWx1ZSQxKGspfSlgLCBvcHRpb25zKTtcblx0fTtcblx0Y29uc3Qgc21hbGxlck9yRXF1YWwgPSAoaykgPT4ge1xuXHRcdHJldHVybiB1c2VNZWRpYVF1ZXJ5KCgpID0+IGAobWF4LXdpZHRoOiAke2dldFZhbHVlJDEoayl9KWAsIG9wdGlvbnMpO1xuXHR9O1xuXHRjb25zdCBzaG9ydGN1dE1ldGhvZHMgPSBPYmplY3Qua2V5cyhicmVha3BvaW50cykucmVkdWNlKChzaG9ydGN1dHMsIGspID0+IHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hvcnRjdXRzLCBrLCB7XG5cdFx0XHRnZXQ6ICgpID0+IHN0cmF0ZWd5ID09PSBcIm1pbi13aWR0aFwiID8gZ3JlYXRlck9yRXF1YWwoaykgOiBzbWFsbGVyT3JFcXVhbChrKSxcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHR9KTtcblx0XHRyZXR1cm4gc2hvcnRjdXRzO1xuXHR9LCB7fSk7XG5cdGZ1bmN0aW9uIGN1cnJlbnQoKSB7XG5cdFx0Y29uc3QgcG9pbnRzID0gT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLm1hcCgoaykgPT4gW1xuXHRcdFx0ayxcblx0XHRcdHNob3J0Y3V0TWV0aG9kc1trXSxcblx0XHRcdHB4VmFsdWUoZ2V0VmFsdWUkMShrKSlcblx0XHRdKS5zb3J0KChhLCBiKSA9PiBhWzJdIC0gYlsyXSk7XG5cdFx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IHBvaW50cy5maWx0ZXIoKFssIHZdKSA9PiB2LnZhbHVlKS5tYXAoKFtrXSkgPT4gaykpO1xuXHR9XG5cdHJldHVybiBPYmplY3QuYXNzaWduKHNob3J0Y3V0TWV0aG9kcywge1xuXHRcdGdyZWF0ZXJPckVxdWFsLFxuXHRcdHNtYWxsZXJPckVxdWFsLFxuXHRcdGdyZWF0ZXIoaykge1xuXHRcdFx0cmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUkMShrLCAuMSl9KWAsIG9wdGlvbnMpO1xuXHRcdH0sXG5cdFx0c21hbGxlcihrKSB7XG5cdFx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1heC13aWR0aDogJHtnZXRWYWx1ZSQxKGssIC0uMSl9KWAsIG9wdGlvbnMpO1xuXHRcdH0sXG5cdFx0YmV0d2VlbihhLCBiKSB7XG5cdFx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1pbi13aWR0aDogJHtnZXRWYWx1ZSQxKGEpfSkgYW5kIChtYXgtd2lkdGg6ICR7Z2V0VmFsdWUkMShiLCAtLjEpfSlgLCBvcHRpb25zKTtcblx0XHR9LFxuXHRcdGlzR3JlYXRlcihrKSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2goXCJtaW5cIiwgZ2V0VmFsdWUkMShrLCAuMSkpO1xuXHRcdH0sXG5cdFx0aXNHcmVhdGVyT3JFcXVhbChrKSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2goXCJtaW5cIiwgZ2V0VmFsdWUkMShrKSk7XG5cdFx0fSxcblx0XHRpc1NtYWxsZXIoaykge1xuXHRcdFx0cmV0dXJuIG1hdGNoKFwibWF4XCIsIGdldFZhbHVlJDEoaywgLS4xKSk7XG5cdFx0fSxcblx0XHRpc1NtYWxsZXJPckVxdWFsKGspIHtcblx0XHRcdHJldHVybiBtYXRjaChcIm1heFwiLCBnZXRWYWx1ZSQxKGspKTtcblx0XHR9LFxuXHRcdGlzSW5CZXR3ZWVuKGEsIGIpIHtcblx0XHRcdHJldHVybiBtYXRjaChcIm1pblwiLCBnZXRWYWx1ZSQxKGEpKSAmJiBtYXRjaChcIm1heFwiLCBnZXRWYWx1ZSQxKGIsIC0uMSkpO1xuXHRcdH0sXG5cdFx0Y3VycmVudCxcblx0XHRhY3RpdmUoKSB7XG5cdFx0XHRjb25zdCBicHMgPSBjdXJyZW50KCk7XG5cdFx0XHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gYnBzLnZhbHVlLmxlbmd0aCA9PT0gMCA/IFwiXCIgOiBicHMudmFsdWUuYXQoc3RyYXRlZ3kgPT09IFwibWluLXdpZHRoXCIgPyAtMSA6IDApKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCcm9hZGNhc3RDaGFubmVsL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgQnJvYWRjYXN0Q2hhbm5lbFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VCcm9hZGNhc3RDaGFubmVsXG4qIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Jyb2FkY2FzdENoYW5uZWxcbiogQHBhcmFtIG9wdGlvbnNcbipcbiovXG5mdW5jdGlvbiB1c2VCcm9hZGNhc3RDaGFubmVsKG9wdGlvbnMpIHtcblx0Y29uc3QgeyBuYW1lLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiQnJvYWRjYXN0Q2hhbm5lbFwiIGluIHdpbmRvdyQxKTtcblx0Y29uc3QgaXNDbG9zZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgY2hhbm5lbCA9IHJlZigpO1xuXHRjb25zdCBkYXRhID0gcmVmKCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgcG9zdCA9IChkYXRhJDEpID0+IHtcblx0XHRpZiAoY2hhbm5lbC52YWx1ZSkgY2hhbm5lbC52YWx1ZS5wb3N0TWVzc2FnZShkYXRhJDEpO1xuXHR9O1xuXHRjb25zdCBjbG9zZSA9ICgpID0+IHtcblx0XHRpZiAoY2hhbm5lbC52YWx1ZSkgY2hhbm5lbC52YWx1ZS5jbG9zZSgpO1xuXHRcdGlzQ2xvc2VkLnZhbHVlID0gdHJ1ZTtcblx0fTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0XHRjaGFubmVsLnZhbHVlID0gbmV3IEJyb2FkY2FzdENoYW5uZWwobmFtZSk7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihjaGFubmVsLCBcIm1lc3NhZ2VcIiwgKGUpID0+IHtcblx0XHRcdGRhdGEudmFsdWUgPSBlLmRhdGE7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGNoYW5uZWwsIFwibWVzc2FnZWVycm9yXCIsIChlKSA9PiB7XG5cdFx0XHRlcnJvci52YWx1ZSA9IGU7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGNoYW5uZWwsIFwiY2xvc2VcIiwgKCkgPT4ge1xuXHRcdFx0aXNDbG9zZWQudmFsdWUgPSB0cnVlO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH0pO1xuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0Y2xvc2UoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y2hhbm5lbCxcblx0XHRkYXRhLFxuXHRcdHBvc3QsXG5cdFx0Y2xvc2UsXG5cdFx0ZXJyb3IsXG5cdFx0aXNDbG9zZWRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQnJvd3NlckxvY2F0aW9uL2luZGV4LnRzXG5jb25zdCBXUklUQUJMRV9QUk9QRVJUSUVTID0gW1xuXHRcImhhc2hcIixcblx0XCJob3N0XCIsXG5cdFwiaG9zdG5hbWVcIixcblx0XCJocmVmXCIsXG5cdFwicGF0aG5hbWVcIixcblx0XCJwb3J0XCIsXG5cdFwicHJvdG9jb2xcIixcblx0XCJzZWFyY2hcIlxuXTtcbi8qKlxuKiBSZWFjdGl2ZSBicm93c2VyIGxvY2F0aW9uLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VCcm93c2VyTG9jYXRpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VCcm93c2VyTG9jYXRpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJlZnMgPSBPYmplY3QuZnJvbUVudHJpZXMoV1JJVEFCTEVfUFJPUEVSVElFUy5tYXAoKGtleSkgPT4gW2tleSwgcmVmKCldKSk7XG5cdGZvciAoY29uc3QgW2tleSwgcmVmJDFdIG9mIG9iamVjdEVudHJpZXMocmVmcykpIHdhdGNoKHJlZiQxLCAodmFsdWUpID0+IHtcblx0XHRpZiAoISh3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEubG9jYXRpb24pIHx8IHdpbmRvdyQxLmxvY2F0aW9uW2tleV0gPT09IHZhbHVlKSByZXR1cm47XG5cdFx0d2luZG93JDEubG9jYXRpb25ba2V5XSA9IHZhbHVlO1xuXHR9KTtcblx0Y29uc3QgYnVpbGRTdGF0ZSA9ICh0cmlnZ2VyKSA9PiB7XG5cdFx0dmFyIF93aW5kb3ckbG9jYXRpb247XG5cdFx0Y29uc3QgeyBzdGF0ZTogc3RhdGUkMSwgbGVuZ3RoIH0gPSAod2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmhpc3RvcnkpIHx8IHt9O1xuXHRcdGNvbnN0IHsgb3JpZ2luIH0gPSAod2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmxvY2F0aW9uKSB8fCB7fTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBXUklUQUJMRV9QUk9QRVJUSUVTKSByZWZzW2tleV0udmFsdWUgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwIHx8IChfd2luZG93JGxvY2F0aW9uID0gd2luZG93JDEubG9jYXRpb24pID09PSBudWxsIHx8IF93aW5kb3ckbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckbG9jYXRpb25ba2V5XTtcblx0XHRyZXR1cm4gcmVhY3RpdmUoe1xuXHRcdFx0dHJpZ2dlcixcblx0XHRcdHN0YXRlOiBzdGF0ZSQxLFxuXHRcdFx0bGVuZ3RoLFxuXHRcdFx0b3JpZ2luLFxuXHRcdFx0Li4ucmVmc1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBzdGF0ZSA9IHJlZihidWlsZFN0YXRlKFwibG9hZFwiKSk7XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwicG9wc3RhdGVcIiwgKCkgPT4gc3RhdGUudmFsdWUgPSBidWlsZFN0YXRlKFwicG9wc3RhdGVcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJoYXNoY2hhbmdlXCIsICgpID0+IHN0YXRlLnZhbHVlID0gYnVpbGRTdGF0ZShcImhhc2hjaGFuZ2VcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDYWNoZWQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUNhY2hlZChyZWZWYWx1ZSwgY29tcGFyYXRvciA9IChhLCBiKSA9PiBhID09PSBiLCBvcHRpb25zKSB7XG5cdGNvbnN0IHsgZGVlcFJlZnMgPSB0cnVlLC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgY2FjaGVkVmFsdWUgPSBjcmVhdGVSZWYocmVmVmFsdWUudmFsdWUsIGRlZXBSZWZzKTtcblx0d2F0Y2goKCkgPT4gcmVmVmFsdWUudmFsdWUsICh2YWx1ZSkgPT4ge1xuXHRcdGlmICghY29tcGFyYXRvcih2YWx1ZSwgY2FjaGVkVmFsdWUudmFsdWUpKSBjYWNoZWRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuXHR9LCB3YXRjaE9wdGlvbnMpO1xuXHRyZXR1cm4gY2FjaGVkVmFsdWU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBlcm1pc3Npb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBQZXJtaXNzaW9ucyBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVBlcm1pc3Npb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQZXJtaXNzaW9uKHBlcm1pc3Npb25EZXNjLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBjb250cm9scyA9IGZhbHNlLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwicGVybWlzc2lvbnNcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IHBlcm1pc3Npb25TdGF0dXMgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGRlc2MgPSB0eXBlb2YgcGVybWlzc2lvbkRlc2MgPT09IFwic3RyaW5nXCIgPyB7IG5hbWU6IHBlcm1pc3Npb25EZXNjIH0gOiBwZXJtaXNzaW9uRGVzYztcblx0Y29uc3Qgc3RhdGUgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcblx0XHR2YXIgX3Blcm1pc3Npb25TdGF0dXMkdmFsLCBfcGVybWlzc2lvblN0YXR1cyR2YWwyO1xuXHRcdHN0YXRlLnZhbHVlID0gKF9wZXJtaXNzaW9uU3RhdHVzJHZhbCA9IChfcGVybWlzc2lvblN0YXR1cyR2YWwyID0gcGVybWlzc2lvblN0YXR1cy52YWx1ZSkgPT09IG51bGwgfHwgX3Blcm1pc3Npb25TdGF0dXMkdmFsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Blcm1pc3Npb25TdGF0dXMkdmFsMi5zdGF0ZSkgIT09IG51bGwgJiYgX3Blcm1pc3Npb25TdGF0dXMkdmFsICE9PSB2b2lkIDAgPyBfcGVybWlzc2lvblN0YXR1cyR2YWwgOiBcInByb21wdFwiO1xuXHR9O1xuXHR1c2VFdmVudExpc3RlbmVyKHBlcm1pc3Npb25TdGF0dXMsIFwiY2hhbmdlXCIsIHVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRjb25zdCBxdWVyeSA9IGNyZWF0ZVNpbmdsZXRvblByb21pc2UoYXN5bmMgKCkgPT4ge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRpZiAoIXBlcm1pc3Npb25TdGF0dXMudmFsdWUpIHRyeSB7XG5cdFx0XHRwZXJtaXNzaW9uU3RhdHVzLnZhbHVlID0gYXdhaXQgbmF2aWdhdG9yJDEucGVybWlzc2lvbnMucXVlcnkoZGVzYyk7XG5cdFx0fSBjYXRjaCAoX3VudXNlZCkge1xuXHRcdFx0cGVybWlzc2lvblN0YXR1cy52YWx1ZSA9IHZvaWQgMDtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dXBkYXRlKCk7XG5cdFx0fVxuXHRcdGlmIChjb250cm9scykgcmV0dXJuIHRvUmF3KHBlcm1pc3Npb25TdGF0dXMudmFsdWUpO1xuXHR9KTtcblx0cXVlcnkoKTtcblx0aWYgKGNvbnRyb2xzKSByZXR1cm4ge1xuXHRcdHN0YXRlLFxuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHF1ZXJ5XG5cdH07XG5cdGVsc2UgcmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDbGlwYm9hcmQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUNsaXBib2FyZChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgcmVhZCA9IGZhbHNlLCBzb3VyY2UsIGNvcGllZER1cmluZyA9IDE1MDAsIGxlZ2FjeSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0NsaXBib2FyZEFwaVN1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJjbGlwYm9hcmRcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IHBlcm1pc3Npb25SZWFkID0gdXNlUGVybWlzc2lvbihcImNsaXBib2FyZC1yZWFkXCIpO1xuXHRjb25zdCBwZXJtaXNzaW9uV3JpdGUgPSB1c2VQZXJtaXNzaW9uKFwiY2xpcGJvYXJkLXdyaXRlXCIpO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IGNvbXB1dGVkKCgpID0+IGlzQ2xpcGJvYXJkQXBpU3VwcG9ydGVkLnZhbHVlIHx8IGxlZ2FjeSk7XG5cdGNvbnN0IHRleHQgPSBzaGFsbG93UmVmKFwiXCIpO1xuXHRjb25zdCBjb3BpZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgdGltZW91dCA9IHVzZVRpbWVvdXRGbigoKSA9PiBjb3BpZWQudmFsdWUgPSBmYWxzZSwgY29waWVkRHVyaW5nLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVRleHQoKSB7XG5cdFx0bGV0IHVzZUxlZ2FjeSA9ICEoaXNDbGlwYm9hcmRBcGlTdXBwb3J0ZWQudmFsdWUgJiYgaXNBbGxvd2VkKHBlcm1pc3Npb25SZWFkLnZhbHVlKSk7XG5cdFx0aWYgKCF1c2VMZWdhY3kpIHRyeSB7XG5cdFx0XHR0ZXh0LnZhbHVlID0gYXdhaXQgbmF2aWdhdG9yJDEuY2xpcGJvYXJkLnJlYWRUZXh0KCk7XG5cdFx0fSBjYXRjaCAoX3VudXNlZCkge1xuXHRcdFx0dXNlTGVnYWN5ID0gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHVzZUxlZ2FjeSkgdGV4dC52YWx1ZSA9IGxlZ2FjeVJlYWQoKTtcblx0fVxuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgcmVhZCkgdXNlRXZlbnRMaXN0ZW5lcihbXCJjb3B5XCIsIFwiY3V0XCJdLCB1cGRhdGVUZXh0LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdGFzeW5jIGZ1bmN0aW9uIGNvcHkodmFsdWUgPSB0b1ZhbHVlKHNvdXJjZSkpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0bGV0IHVzZUxlZ2FjeSA9ICEoaXNDbGlwYm9hcmRBcGlTdXBwb3J0ZWQudmFsdWUgJiYgaXNBbGxvd2VkKHBlcm1pc3Npb25Xcml0ZS52YWx1ZSkpO1xuXHRcdFx0aWYgKCF1c2VMZWdhY3kpIHRyeSB7XG5cdFx0XHRcdGF3YWl0IG5hdmlnYXRvciQxLmNsaXBib2FyZC53cml0ZVRleHQodmFsdWUpO1xuXHRcdFx0fSBjYXRjaCAoX3VudXNlZDIpIHtcblx0XHRcdFx0dXNlTGVnYWN5ID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmICh1c2VMZWdhY3kpIGxlZ2FjeUNvcHkodmFsdWUpO1xuXHRcdFx0dGV4dC52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0Y29waWVkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdHRpbWVvdXQuc3RhcnQoKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gbGVnYWN5Q29weSh2YWx1ZSkge1xuXHRcdGNvbnN0IHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXHRcdHRhLnZhbHVlID0gdmFsdWU7XG5cdFx0dGEuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0dGEuc3R5bGUub3BhY2l0eSA9IFwiMFwiO1xuXHRcdHRhLnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIFwiXCIpO1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpO1xuXHRcdHRhLnNlbGVjdCgpO1xuXHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcblx0XHR0YS5yZW1vdmUoKTtcblx0fVxuXHRmdW5jdGlvbiBsZWdhY3lSZWFkKCkge1xuXHRcdHZhciBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8sIF9kb2N1bWVudCwgX2RvY3VtZW50JGdldFNlbGVjdGlvMjtcblx0XHRyZXR1cm4gKF9kb2N1bWVudCRnZXRTZWxlY3RpbyA9IChfZG9jdW1lbnQgPSBkb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50ID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCRnZXRTZWxlY3RpbzIgPSBfZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8yID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCRnZXRTZWxlY3RpbzIgPSBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8yLmNhbGwoX2RvY3VtZW50KSkgPT09IG51bGwgfHwgX2RvY3VtZW50JGdldFNlbGVjdGlvMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50JGdldFNlbGVjdGlvMi50b1N0cmluZygpKSAhPT0gbnVsbCAmJiBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8gIT09IHZvaWQgMCA/IF9kb2N1bWVudCRnZXRTZWxlY3RpbyA6IFwiXCI7XG5cdH1cblx0ZnVuY3Rpb24gaXNBbGxvd2VkKHN0YXR1cykge1xuXHRcdHJldHVybiBzdGF0dXMgPT09IFwiZ3JhbnRlZFwiIHx8IHN0YXR1cyA9PT0gXCJwcm9tcHRcIjtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHRleHQ6IHJlYWRvbmx5KHRleHQpLFxuXHRcdGNvcGllZDogcmVhZG9ubHkoY29waWVkKSxcblx0XHRjb3B5XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNsaXBib2FyZEl0ZW1zL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDbGlwYm9hcmRJdGVtcyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgcmVhZCA9IGZhbHNlLCBzb3VyY2UsIGNvcGllZER1cmluZyA9IDE1MDAgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImNsaXBib2FyZFwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgY29udGVudCA9IHJlZihbXSk7XG5cdGNvbnN0IGNvcGllZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCB0aW1lb3V0ID0gdXNlVGltZW91dEZuKCgpID0+IGNvcGllZC52YWx1ZSA9IGZhbHNlLCBjb3BpZWREdXJpbmcsIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcblx0ZnVuY3Rpb24gdXBkYXRlQ29udGVudCgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIG5hdmlnYXRvciQxLmNsaXBib2FyZC5yZWFkKCkudGhlbigoaXRlbXMpID0+IHtcblx0XHRcdGNvbnRlbnQudmFsdWUgPSBpdGVtcztcblx0XHR9KTtcblx0fVxuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgcmVhZCkgdXNlRXZlbnRMaXN0ZW5lcihbXCJjb3B5XCIsIFwiY3V0XCJdLCB1cGRhdGVDb250ZW50LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdGFzeW5jIGZ1bmN0aW9uIGNvcHkodmFsdWUgPSB0b1ZhbHVlKHNvdXJjZSkpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0YXdhaXQgbmF2aWdhdG9yJDEuY2xpcGJvYXJkLndyaXRlKHZhbHVlKTtcblx0XHRcdGNvbnRlbnQudmFsdWUgPSB2YWx1ZTtcblx0XHRcdGNvcGllZC52YWx1ZSA9IHRydWU7XG5cdFx0XHR0aW1lb3V0LnN0YXJ0KCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y29udGVudDogc2hhbGxvd1JlYWRvbmx5KGNvbnRlbnQpLFxuXHRcdGNvcGllZDogcmVhZG9ubHkoY29waWVkKSxcblx0XHRjb3B5LFxuXHRcdHJlYWQ6IHVwZGF0ZUNvbnRlbnRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ2xvbmVkL2luZGV4LnRzXG5mdW5jdGlvbiBjbG9uZUZuSlNPTihzb3VyY2UpIHtcblx0cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc291cmNlKSk7XG59XG5mdW5jdGlvbiB1c2VDbG9uZWQoc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgY2xvbmVkID0gcmVmKHt9KTtcblx0Y29uc3QgaXNNb2RpZmllZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRsZXQgX2xhc3RTeW5jID0gZmFsc2U7XG5cdGNvbnN0IHsgbWFudWFsLCBjbG9uZSA9IGNsb25lRm5KU09OLCBkZWVwID0gdHJ1ZSwgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0d2F0Y2goY2xvbmVkLCAoKSA9PiB7XG5cdFx0aWYgKF9sYXN0U3luYykge1xuXHRcdFx0X2xhc3RTeW5jID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlzTW9kaWZpZWQudmFsdWUgPSB0cnVlO1xuXHR9LCB7XG5cdFx0ZGVlcDogdHJ1ZSxcblx0XHRmbHVzaDogXCJzeW5jXCJcblx0fSk7XG5cdGZ1bmN0aW9uIHN5bmMoKSB7XG5cdFx0X2xhc3RTeW5jID0gdHJ1ZTtcblx0XHRpc01vZGlmaWVkLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xvbmVkLnZhbHVlID0gY2xvbmUodG9WYWx1ZShzb3VyY2UpKTtcblx0fVxuXHRpZiAoIW1hbnVhbCAmJiAoaXNSZWYoc291cmNlKSB8fCB0eXBlb2Ygc291cmNlID09PSBcImZ1bmN0aW9uXCIpKSB3YXRjaChzb3VyY2UsIHN5bmMsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGRlZXAsXG5cdFx0aW1tZWRpYXRlXG5cdH0pO1xuXHRlbHNlIHN5bmMoKTtcblx0cmV0dXJuIHtcblx0XHRjbG9uZWQsXG5cdFx0aXNNb2RpZmllZCxcblx0XHRzeW5jXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNzci1oYW5kbGVycy50c1xuY29uc3QgX2dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDoge307XG5jb25zdCBnbG9iYWxLZXkgPSBcIl9fdnVldXNlX3Nzcl9oYW5kbGVyc19fXCI7XG5jb25zdCBoYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBnZXRIYW5kbGVycygpO1xuZnVuY3Rpb24gZ2V0SGFuZGxlcnMoKSB7XG5cdGlmICghKGdsb2JhbEtleSBpbiBfZ2xvYmFsKSkgX2dsb2JhbFtnbG9iYWxLZXldID0gX2dsb2JhbFtnbG9iYWxLZXldIHx8IHt9O1xuXHRyZXR1cm4gX2dsb2JhbFtnbG9iYWxLZXldO1xufVxuZnVuY3Rpb24gZ2V0U1NSSGFuZGxlcihrZXksIGZhbGxiYWNrKSB7XG5cdHJldHVybiBoYW5kbGVyc1trZXldIHx8IGZhbGxiYWNrO1xufVxuZnVuY3Rpb24gc2V0U1NSSGFuZGxlcihrZXksIGZuKSB7XG5cdGhhbmRsZXJzW2tleV0gPSBmbjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkRGFyay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGRhcmsgdGhlbWUgcHJlZmVyZW5jZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUHJlZmVycmVkRGFya1xuKiBAcGFyYW0gW29wdGlvbnNdXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlUHJlZmVycmVkRGFyayhvcHRpb25zKSB7XG5cdHJldHVybiB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKVwiLCBvcHRpb25zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3RvcmFnZS9ndWVzcy50c1xuZnVuY3Rpb24gZ3Vlc3NTZXJpYWxpemVyVHlwZShyYXdJbml0KSB7XG5cdHJldHVybiByYXdJbml0ID09IG51bGwgPyBcImFueVwiIDogcmF3SW5pdCBpbnN0YW5jZW9mIFNldCA/IFwic2V0XCIgOiByYXdJbml0IGluc3RhbmNlb2YgTWFwID8gXCJtYXBcIiA6IHJhd0luaXQgaW5zdGFuY2VvZiBEYXRlID8gXCJkYXRlXCIgOiB0eXBlb2YgcmF3SW5pdCA9PT0gXCJib29sZWFuXCIgPyBcImJvb2xlYW5cIiA6IHR5cGVvZiByYXdJbml0ID09PSBcInN0cmluZ1wiID8gXCJzdHJpbmdcIiA6IHR5cGVvZiByYXdJbml0ID09PSBcIm9iamVjdFwiID8gXCJvYmplY3RcIiA6ICFOdW1iZXIuaXNOYU4ocmF3SW5pdCkgPyBcIm51bWJlclwiIDogXCJhbnlcIjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3RvcmFnZS9pbmRleC50c1xuY29uc3QgU3RvcmFnZVNlcmlhbGl6ZXJzID0ge1xuXHRib29sZWFuOiB7XG5cdFx0cmVhZDogKHYpID0+IHYgPT09IFwidHJ1ZVwiLFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdG9iamVjdDoge1xuXHRcdHJlYWQ6ICh2KSA9PiBKU09OLnBhcnNlKHYpLFxuXHRcdHdyaXRlOiAodikgPT4gSlNPTi5zdHJpbmdpZnkodilcblx0fSxcblx0bnVtYmVyOiB7XG5cdFx0cmVhZDogKHYpID0+IE51bWJlci5wYXJzZUZsb2F0KHYpLFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdGFueToge1xuXHRcdHJlYWQ6ICh2KSA9PiB2LFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdHN0cmluZzoge1xuXHRcdHJlYWQ6ICh2KSA9PiB2LFxuXHRcdHdyaXRlOiAodikgPT4gU3RyaW5nKHYpXG5cdH0sXG5cdG1hcDoge1xuXHRcdHJlYWQ6ICh2KSA9PiBuZXcgTWFwKEpTT04ucGFyc2UodikpLFxuXHRcdHdyaXRlOiAodikgPT4gSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh2LmVudHJpZXMoKSkpXG5cdH0sXG5cdHNldDoge1xuXHRcdHJlYWQ6ICh2KSA9PiBuZXcgU2V0KEpTT04ucGFyc2UodikpLFxuXHRcdHdyaXRlOiAodikgPT4gSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbSh2KSlcblx0fSxcblx0ZGF0ZToge1xuXHRcdHJlYWQ6ICh2KSA9PiBuZXcgRGF0ZSh2KSxcblx0XHR3cml0ZTogKHYpID0+IHYudG9JU09TdHJpbmcoKVxuXHR9XG59O1xuY29uc3QgY3VzdG9tU3RvcmFnZUV2ZW50TmFtZSA9IFwidnVldXNlLXN0b3JhZ2VcIjtcbi8qKlxuKiBSZWFjdGl2ZSBMb2NhbFN0b3JhZ2UvU2Vzc2lvblN0b3JhZ2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVN0b3JhZ2VcbiovXG5mdW5jdGlvbiB1c2VTdG9yYWdlKGtleSwgZGVmYXVsdHMkMSwgc3RvcmFnZSwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRzZXJpYWxpemVyO1xuXHRjb25zdCB7IGZsdXNoID0gXCJwcmVcIiwgZGVlcCA9IHRydWUsIGxpc3RlblRvU3RvcmFnZUNoYW5nZXMgPSB0cnVlLCB3cml0ZURlZmF1bHRzID0gdHJ1ZSwgbWVyZ2VEZWZhdWx0cyA9IGZhbHNlLCBzaGFsbG93LCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZXZlbnRGaWx0ZXIsIG9uRXJyb3IgPSAoZSkgPT4ge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH0sIGluaXRPbk1vdW50ZWQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRhdGEgPSAoc2hhbGxvdyA/IHNoYWxsb3dSZWYgOiByZWYpKHR5cGVvZiBkZWZhdWx0cyQxID09PSBcImZ1bmN0aW9uXCIgPyBkZWZhdWx0cyQxKCkgOiBkZWZhdWx0cyQxKTtcblx0Y29uc3Qga2V5Q29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGtleSkpO1xuXHRpZiAoIXN0b3JhZ2UpIHRyeSB7XG5cdFx0c3RvcmFnZSA9IGdldFNTUkhhbmRsZXIoXCJnZXREZWZhdWx0U3RvcmFnZVwiLCAoKSA9PiBkZWZhdWx0V2luZG93ID09PSBudWxsIHx8IGRlZmF1bHRXaW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlZmF1bHRXaW5kb3cubG9jYWxTdG9yYWdlKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0b25FcnJvcihlKTtcblx0fVxuXHRpZiAoIXN0b3JhZ2UpIHJldHVybiBkYXRhO1xuXHRjb25zdCByYXdJbml0ID0gdG9WYWx1ZShkZWZhdWx0cyQxKTtcblx0Y29uc3QgdHlwZSA9IGd1ZXNzU2VyaWFsaXplclR5cGUocmF3SW5pdCk7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSAoX29wdGlvbnMkc2VyaWFsaXplciA9IG9wdGlvbnMuc2VyaWFsaXplcikgIT09IG51bGwgJiYgX29wdGlvbnMkc2VyaWFsaXplciAhPT0gdm9pZCAwID8gX29wdGlvbnMkc2VyaWFsaXplciA6IFN0b3JhZ2VTZXJpYWxpemVyc1t0eXBlXTtcblx0Y29uc3QgeyBwYXVzZTogcGF1c2VXYXRjaCwgcmVzdW1lOiByZXN1bWVXYXRjaCB9ID0gd2F0Y2hQYXVzYWJsZShkYXRhLCAobmV3VmFsdWUpID0+IHdyaXRlKG5ld1ZhbHVlKSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0ZXZlbnRGaWx0ZXJcblx0fSk7XG5cdHdhdGNoKGtleUNvbXB1dGVkLCAoKSA9PiB1cGRhdGUoKSwgeyBmbHVzaCB9KTtcblx0bGV0IGZpcnN0TW91bnRlZCA9IGZhbHNlO1xuXHRjb25zdCBvblN0b3JhZ2VFdmVudCA9IChldikgPT4ge1xuXHRcdGlmIChpbml0T25Nb3VudGVkICYmICFmaXJzdE1vdW50ZWQpIHJldHVybjtcblx0XHR1cGRhdGUoZXYpO1xuXHR9O1xuXHRjb25zdCBvblN0b3JhZ2VDdXN0b21FdmVudCA9IChldikgPT4ge1xuXHRcdGlmIChpbml0T25Nb3VudGVkICYmICFmaXJzdE1vdW50ZWQpIHJldHVybjtcblx0XHR1cGRhdGVGcm9tQ3VzdG9tRXZlbnQoZXYpO1xuXHR9O1xuXHQvKipcblx0KiBUaGUgY3VzdG9tIGV2ZW50IGlzIG5lZWRlZCBmb3Igc2FtZS1kb2N1bWVudCBzeW5jaW5nIHdoZW4gdXNpbmcgY3VzdG9tXG5cdCogc3RvcmFnZSBiYWNrZW5kcywgYnV0IGl0IGRvZXNuJ3Qgd29yayBhY3Jvc3MgZGlmZmVyZW50IGRvY3VtZW50cy5cblx0KlxuXHQqIFRPRE86IENvbnNpZGVyIGltcGxlbWVudGluZyBhIEJyb2FkY2FzdENoYW5uZWwtYmFzZWQgc29sdXRpb24gdGhhdCBmaXhlcyB0aGlzLlxuXHQqL1xuXHRpZiAod2luZG93JDEgJiYgbGlzdGVuVG9TdG9yYWdlQ2hhbmdlcykgaWYgKHN0b3JhZ2UgaW5zdGFuY2VvZiBTdG9yYWdlKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInN0b3JhZ2VcIiwgb25TdG9yYWdlRXZlbnQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0ZWxzZSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBjdXN0b21TdG9yYWdlRXZlbnROYW1lLCBvblN0b3JhZ2VDdXN0b21FdmVudCk7XG5cdGlmIChpbml0T25Nb3VudGVkKSB0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGZpcnN0TW91bnRlZCA9IHRydWU7XG5cdFx0dXBkYXRlKCk7XG5cdH0pO1xuXHRlbHNlIHVwZGF0ZSgpO1xuXHRmdW5jdGlvbiBkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG5cdFx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0XHRjb25zdCBwYXlsb2FkID0ge1xuXHRcdFx0XHRrZXk6IGtleUNvbXB1dGVkLnZhbHVlLFxuXHRcdFx0XHRvbGRWYWx1ZSxcblx0XHRcdFx0bmV3VmFsdWUsXG5cdFx0XHRcdHN0b3JhZ2VBcmVhOiBzdG9yYWdlXG5cdFx0XHR9O1xuXHRcdFx0d2luZG93JDEuZGlzcGF0Y2hFdmVudChzdG9yYWdlIGluc3RhbmNlb2YgU3RvcmFnZSA/IG5ldyBTdG9yYWdlRXZlbnQoXCJzdG9yYWdlXCIsIHBheWxvYWQpIDogbmV3IEN1c3RvbUV2ZW50KGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUsIHsgZGV0YWlsOiBwYXlsb2FkIH0pKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gd3JpdGUodikge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvbGRWYWx1ZSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXlDb21wdXRlZC52YWx1ZSk7XG5cdFx0XHRpZiAodiA9PSBudWxsKSB7XG5cdFx0XHRcdGRpc3BhdGNoV3JpdGVFdmVudChvbGRWYWx1ZSwgbnVsbCk7XG5cdFx0XHRcdHN0b3JhZ2UucmVtb3ZlSXRlbShrZXlDb21wdXRlZC52YWx1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplci53cml0ZSh2KTtcblx0XHRcdFx0aWYgKG9sZFZhbHVlICE9PSBzZXJpYWxpemVkKSB7XG5cdFx0XHRcdFx0c3RvcmFnZS5zZXRJdGVtKGtleUNvbXB1dGVkLnZhbHVlLCBzZXJpYWxpemVkKTtcblx0XHRcdFx0XHRkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIHNlcmlhbGl6ZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gcmVhZChldmVudCkge1xuXHRcdGNvbnN0IHJhd1ZhbHVlID0gZXZlbnQgPyBldmVudC5uZXdWYWx1ZSA6IHN0b3JhZ2UuZ2V0SXRlbShrZXlDb21wdXRlZC52YWx1ZSk7XG5cdFx0aWYgKHJhd1ZhbHVlID09IG51bGwpIHtcblx0XHRcdGlmICh3cml0ZURlZmF1bHRzICYmIHJhd0luaXQgIT0gbnVsbCkgc3RvcmFnZS5zZXRJdGVtKGtleUNvbXB1dGVkLnZhbHVlLCBzZXJpYWxpemVyLndyaXRlKHJhd0luaXQpKTtcblx0XHRcdHJldHVybiByYXdJbml0O1xuXHRcdH0gZWxzZSBpZiAoIWV2ZW50ICYmIG1lcmdlRGVmYXVsdHMpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0XHRcdGlmICh0eXBlb2YgbWVyZ2VEZWZhdWx0cyA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbWVyZ2VEZWZhdWx0cyh2YWx1ZSwgcmF3SW5pdCk7XG5cdFx0XHRlbHNlIGlmICh0eXBlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHtcblx0XHRcdFx0Li4ucmF3SW5pdCxcblx0XHRcdFx0Li4udmFsdWVcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcmF3VmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiByYXdWYWx1ZTtcblx0XHRlbHNlIHJldHVybiBzZXJpYWxpemVyLnJlYWQocmF3VmFsdWUpO1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZShldmVudCkge1xuXHRcdGlmIChldmVudCAmJiBldmVudC5zdG9yYWdlQXJlYSAhPT0gc3RvcmFnZSkgcmV0dXJuO1xuXHRcdGlmIChldmVudCAmJiBldmVudC5rZXkgPT0gbnVsbCkge1xuXHRcdFx0ZGF0YS52YWx1ZSA9IHJhd0luaXQ7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChldmVudCAmJiBldmVudC5rZXkgIT09IGtleUNvbXB1dGVkLnZhbHVlKSByZXR1cm47XG5cdFx0cGF1c2VXYXRjaCgpO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzZXJpYWxpemVkRGF0YSA9IHNlcmlhbGl6ZXIud3JpdGUoZGF0YS52YWx1ZSk7XG5cdFx0XHRpZiAoZXZlbnQgPT09IHZvaWQgMCB8fCAoZXZlbnQgPT09IG51bGwgfHwgZXZlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV2ZW50Lm5ld1ZhbHVlKSAhPT0gc2VyaWFsaXplZERhdGEpIGRhdGEudmFsdWUgPSByZWFkKGV2ZW50KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoZXZlbnQpIG5leHRUaWNrKHJlc3VtZVdhdGNoKTtcblx0XHRcdGVsc2UgcmVzdW1lV2F0Y2goKTtcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlRnJvbUN1c3RvbUV2ZW50KGV2ZW50KSB7XG5cdFx0dXBkYXRlKGV2ZW50LmRldGFpbCk7XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvbG9yTW9kZS9pbmRleC50c1xuY29uc3QgQ1NTX0RJU0FCTEVfVFJBTlMgPSBcIiosKjo6YmVmb3JlLCo6OmFmdGVyey13ZWJraXQtdHJhbnNpdGlvbjpub25lIWltcG9ydGFudDstbW96LXRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7LW8tdHJhbnNpdGlvbjpub25lIWltcG9ydGFudDstbXMtdHJhbnNpdGlvbjpub25lIWltcG9ydGFudDt0cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50fVwiO1xuLyoqXG4qIFJlYWN0aXZlIGNvbG9yIG1vZGUgd2l0aCBhdXRvIGRhdGEgcGVyc2lzdGVuY2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNvbG9yTW9kZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUNvbG9yTW9kZShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBzZWxlY3RvciA9IFwiaHRtbFwiLCBhdHRyaWJ1dGUgPSBcImNsYXNzXCIsIGluaXRpYWxWYWx1ZSA9IFwiYXV0b1wiLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3RvcmFnZSwgc3RvcmFnZUtleSA9IFwidnVldXNlLWNvbG9yLXNjaGVtZVwiLCBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzID0gdHJ1ZSwgc3RvcmFnZVJlZiwgZW1pdEF1dG8sIGRpc2FibGVUcmFuc2l0aW9uID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgbW9kZXMgPSB7XG5cdFx0YXV0bzogXCJcIixcblx0XHRsaWdodDogXCJsaWdodFwiLFxuXHRcdGRhcms6IFwiZGFya1wiLFxuXHRcdC4uLm9wdGlvbnMubW9kZXMgfHwge31cblx0fTtcblx0Y29uc3QgcHJlZmVycmVkRGFyayA9IHVzZVByZWZlcnJlZERhcmsoeyB3aW5kb3c6IHdpbmRvdyQxIH0pO1xuXHRjb25zdCBzeXN0ZW0gPSBjb21wdXRlZCgoKSA9PiBwcmVmZXJyZWREYXJrLnZhbHVlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIpO1xuXHRjb25zdCBzdG9yZSA9IHN0b3JhZ2VSZWYgfHwgKHN0b3JhZ2VLZXkgPT0gbnVsbCA/IHRvUmVmKGluaXRpYWxWYWx1ZSkgOiB1c2VTdG9yYWdlKHN0b3JhZ2VLZXksIGluaXRpYWxWYWx1ZSwgc3RvcmFnZSwge1xuXHRcdHdpbmRvdzogd2luZG93JDEsXG5cdFx0bGlzdGVuVG9TdG9yYWdlQ2hhbmdlc1xuXHR9KSk7XG5cdGNvbnN0IHN0YXRlID0gY29tcHV0ZWQoKCkgPT4gc3RvcmUudmFsdWUgPT09IFwiYXV0b1wiID8gc3lzdGVtLnZhbHVlIDogc3RvcmUudmFsdWUpO1xuXHRjb25zdCB1cGRhdGVIVE1MQXR0cnMgPSBnZXRTU1JIYW5kbGVyKFwidXBkYXRlSFRNTEF0dHJzXCIsIChzZWxlY3RvciQxLCBhdHRyaWJ1dGUkMSwgdmFsdWUpID0+IHtcblx0XHRjb25zdCBlbCA9IHR5cGVvZiBzZWxlY3RvciQxID09PSBcInN0cmluZ1wiID8gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IkMSkgOiB1bnJlZkVsZW1lbnQoc2VsZWN0b3IkMSk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGNvbnN0IGNsYXNzZXNUb0FkZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdFx0Y29uc3QgY2xhc3Nlc1RvUmVtb3ZlID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0XHRsZXQgYXR0cmlidXRlVG9DaGFuZ2UgPSBudWxsO1xuXHRcdGlmIChhdHRyaWJ1dGUkMSA9PT0gXCJjbGFzc1wiKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50ID0gdmFsdWUuc3BsaXQoL1xccy9nKTtcblx0XHRcdE9iamVjdC52YWx1ZXMobW9kZXMpLmZsYXRNYXAoKGkpID0+IChpIHx8IFwiXCIpLnNwbGl0KC9cXHMvZykpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKCh2KSA9PiB7XG5cdFx0XHRcdGlmIChjdXJyZW50LmluY2x1ZGVzKHYpKSBjbGFzc2VzVG9BZGQuYWRkKHYpO1xuXHRcdFx0XHRlbHNlIGNsYXNzZXNUb1JlbW92ZS5hZGQodik7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgYXR0cmlidXRlVG9DaGFuZ2UgPSB7XG5cdFx0XHRrZXk6IGF0dHJpYnV0ZSQxLFxuXHRcdFx0dmFsdWVcblx0XHR9O1xuXHRcdGlmIChjbGFzc2VzVG9BZGQuc2l6ZSA9PT0gMCAmJiBjbGFzc2VzVG9SZW1vdmUuc2l6ZSA9PT0gMCAmJiBhdHRyaWJ1dGVUb0NoYW5nZSA9PT0gbnVsbCkgcmV0dXJuO1xuXHRcdGxldCBzdHlsZTtcblx0XHRpZiAoZGlzYWJsZVRyYW5zaXRpb24pIHtcblx0XHRcdHN0eWxlID0gd2luZG93JDEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdFx0c3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoQ1NTX0RJU0FCTEVfVFJBTlMpKTtcblx0XHRcdHdpbmRvdyQxLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGMgb2YgY2xhc3Nlc1RvQWRkKSBlbC5jbGFzc0xpc3QuYWRkKGMpO1xuXHRcdGZvciAoY29uc3QgYyBvZiBjbGFzc2VzVG9SZW1vdmUpIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7XG5cdFx0aWYgKGF0dHJpYnV0ZVRvQ2hhbmdlKSBlbC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlVG9DaGFuZ2Uua2V5LCBhdHRyaWJ1dGVUb0NoYW5nZS52YWx1ZSk7XG5cdFx0aWYgKGRpc2FibGVUcmFuc2l0aW9uKSB7XG5cdFx0XHR3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKHN0eWxlKS5vcGFjaXR5O1xuXHRcdFx0ZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzdHlsZSk7XG5cdFx0fVxuXHR9KTtcblx0ZnVuY3Rpb24gZGVmYXVsdE9uQ2hhbmdlZChtb2RlKSB7XG5cdFx0dmFyIF9tb2RlcyRtb2RlO1xuXHRcdHVwZGF0ZUhUTUxBdHRycyhzZWxlY3RvciwgYXR0cmlidXRlLCAoX21vZGVzJG1vZGUgPSBtb2Rlc1ttb2RlXSkgIT09IG51bGwgJiYgX21vZGVzJG1vZGUgIT09IHZvaWQgMCA/IF9tb2RlcyRtb2RlIDogbW9kZSk7XG5cdH1cblx0ZnVuY3Rpb24gb25DaGFuZ2VkKG1vZGUpIHtcblx0XHRpZiAob3B0aW9ucy5vbkNoYW5nZWQpIG9wdGlvbnMub25DaGFuZ2VkKG1vZGUsIGRlZmF1bHRPbkNoYW5nZWQpO1xuXHRcdGVsc2UgZGVmYXVsdE9uQ2hhbmdlZChtb2RlKTtcblx0fVxuXHR3YXRjaChzdGF0ZSwgb25DaGFuZ2VkLCB7XG5cdFx0Zmx1c2g6IFwicG9zdFwiLFxuXHRcdGltbWVkaWF0ZTogdHJ1ZVxuXHR9KTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IG9uQ2hhbmdlZChzdGF0ZS52YWx1ZSkpO1xuXHRjb25zdCBhdXRvID0gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBlbWl0QXV0byA/IHN0b3JlLnZhbHVlIDogc3RhdGUudmFsdWU7XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0c3RvcmUudmFsdWUgPSB2O1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBPYmplY3QuYXNzaWduKGF1dG8sIHtcblx0XHRzdG9yZSxcblx0XHRzeXN0ZW0sXG5cdFx0c3RhdGVcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvbmZpcm1EaWFsb2cvaW5kZXgudHNcbi8qKlxuKiBIb29rcyBmb3IgY3JlYXRpbmcgY29uZmlybSBkaWFsb2dzLiBVc2VmdWwgZm9yIG1vZGFsIHdpbmRvd3MsIHBvcHVwcyBhbmQgbG9naW5zLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDb25maXJtRGlhbG9nL1xuKiBAcGFyYW0gcmV2ZWFsZWQgYGJvb2xlYW5gIGByZWZgIHRoYXQgaGFuZGxlcyBhIG1vZGFsIHdpbmRvd1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUNvbmZpcm1EaWFsb2cocmV2ZWFsZWQgPSBzaGFsbG93UmVmKGZhbHNlKSkge1xuXHRjb25zdCBjb25maXJtSG9vayA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBjYW5jZWxIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHJldmVhbEhvb2sgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0bGV0IF9yZXNvbHZlID0gbm9vcDtcblx0Y29uc3QgcmV2ZWFsID0gKGRhdGEpID0+IHtcblx0XHRyZXZlYWxIb29rLnRyaWdnZXIoZGF0YSk7XG5cdFx0cmV2ZWFsZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0X3Jlc29sdmUgPSByZXNvbHZlO1xuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBjb25maXJtID0gKGRhdGEpID0+IHtcblx0XHRyZXZlYWxlZC52YWx1ZSA9IGZhbHNlO1xuXHRcdGNvbmZpcm1Ib29rLnRyaWdnZXIoZGF0YSk7XG5cdFx0X3Jlc29sdmUoe1xuXHRcdFx0ZGF0YSxcblx0XHRcdGlzQ2FuY2VsZWQ6IGZhbHNlXG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IGNhbmNlbCA9IChkYXRhKSA9PiB7XG5cdFx0cmV2ZWFsZWQudmFsdWUgPSBmYWxzZTtcblx0XHRjYW5jZWxIb29rLnRyaWdnZXIoZGF0YSk7XG5cdFx0X3Jlc29sdmUoe1xuXHRcdFx0ZGF0YSxcblx0XHRcdGlzQ2FuY2VsZWQ6IHRydWVcblx0XHR9KTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1JldmVhbGVkOiBjb21wdXRlZCgoKSA9PiByZXZlYWxlZC52YWx1ZSksXG5cdFx0cmV2ZWFsLFxuXHRcdGNvbmZpcm0sXG5cdFx0Y2FuY2VsLFxuXHRcdG9uUmV2ZWFsOiByZXZlYWxIb29rLm9uLFxuXHRcdG9uQ29uZmlybTogY29uZmlybUhvb2sub24sXG5cdFx0b25DYW5jZWw6IGNhbmNlbEhvb2sub25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ291bnRkb3duL2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDgob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IDFlMywgaW1tZWRpYXRlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlIH0pO1xuXHR9XG5cdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIDFlMywgeyBpbW1lZGlhdGU6IGZhbHNlIH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIGNvdW50ZG93biB0aW1lciBpbiBzZWNvbmRzLlxuKlxuKiBAcGFyYW0gaW5pdGlhbENvdW50ZG93blxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDb3VudGRvd25cbiovXG5mdW5jdGlvbiB1c2VDb3VudGRvd24oaW5pdGlhbENvdW50ZG93biwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHJlbWFpbmluZyA9IHNoYWxsb3dSZWYodG9WYWx1ZShpbml0aWFsQ291bnRkb3duKSk7XG5cdGNvbnN0IHsgc2NoZWR1bGVyID0gZ2V0RGVmYXVsdFNjaGVkdWxlciQ4KG9wdGlvbnMpLCBvblRpY2ssIG9uQ29tcGxldGUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNvbnRyb2xzID0gc2NoZWR1bGVyKCgpID0+IHtcblx0XHRjb25zdCB2YWx1ZSA9IHJlbWFpbmluZy52YWx1ZSAtIDE7XG5cdFx0cmVtYWluaW5nLnZhbHVlID0gdmFsdWUgPCAwID8gMCA6IHZhbHVlO1xuXHRcdG9uVGljayA9PT0gbnVsbCB8fCBvblRpY2sgPT09IHZvaWQgMCB8fCBvblRpY2soKTtcblx0XHRpZiAocmVtYWluaW5nLnZhbHVlIDw9IDApIHtcblx0XHRcdGNvbnRyb2xzLnBhdXNlKCk7XG5cdFx0XHRvbkNvbXBsZXRlID09PSBudWxsIHx8IG9uQ29tcGxldGUgPT09IHZvaWQgMCB8fCBvbkNvbXBsZXRlKCk7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgcmVzZXQgPSAoY291bnRkb3duKSA9PiB7XG5cdFx0dmFyIF90b1ZhbHVlO1xuXHRcdHJlbWFpbmluZy52YWx1ZSA9IChfdG9WYWx1ZSA9IHRvVmFsdWUoY291bnRkb3duKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogdG9WYWx1ZShpbml0aWFsQ291bnRkb3duKTtcblx0fTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRjb250cm9scy5wYXVzZSgpO1xuXHRcdHJlc2V0KCk7XG5cdH07XG5cdGNvbnN0IHJlc3VtZSA9ICgpID0+IHtcblx0XHRpZiAoIWNvbnRyb2xzLmlzQWN0aXZlLnZhbHVlKSB7XG5cdFx0XHRpZiAocmVtYWluaW5nLnZhbHVlID4gMCkgY29udHJvbHMucmVzdW1lKCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzdGFydCA9IChjb3VudGRvd24pID0+IHtcblx0XHRyZXNldChjb3VudGRvd24pO1xuXHRcdGNvbnRyb2xzLnJlc3VtZSgpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHJlbWFpbmluZyxcblx0XHRyZXNldCxcblx0XHRzdG9wLFxuXHRcdHN0YXJ0LFxuXHRcdHBhdXNlOiBjb250cm9scy5wYXVzZSxcblx0XHRyZXN1bWUsXG5cdFx0aXNBY3RpdmU6IGNvbnRyb2xzLmlzQWN0aXZlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNzc1N1cHBvcnRzL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDc3NTdXBwb3J0cyguLi5hcmdzKSB7XG5cdGxldCBvcHRpb25zID0ge307XG5cdGlmICh0eXBlb2YgdG9WYWx1ZShhcmdzLmF0KC0xKSkgPT09IFwib2JqZWN0XCIpIG9wdGlvbnMgPSBhcmdzLnBvcCgpO1xuXHRjb25zdCBbcHJvcCwgdmFsdWVdID0gYXJncztcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3NyVmFsdWUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpO1xuXHRyZXR1cm4geyBpc1N1cHBvcnRlZDogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlzTW91bnRlZC52YWx1ZTtcblx0XHRpZiAoIWlzQ2xpZW50KSByZXR1cm4gc3NyVmFsdWU7XG5cdFx0cmV0dXJuIGFyZ3MubGVuZ3RoID09PSAyID8gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLkNTUy5zdXBwb3J0cyh0b1ZhbHVlKHByb3ApLCB0b1ZhbHVlKHZhbHVlKSkgOiB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuQ1NTLnN1cHBvcnRzKHRvVmFsdWUocHJvcCkpO1xuXHR9KSB9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDc3NWYXIvaW5kZXgudHNcbi8qKlxuKiBNYW5pcHVsYXRlIENTUyB2YXJpYWJsZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNzc1ZhclxuKiBAcGFyYW0gcHJvcFxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlQ3NzVmFyKHByb3AsIHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGluaXRpYWxWYWx1ZSwgb2JzZXJ2ZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB2YXJpYWJsZSA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgZWxSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF93aW5kb3ckZG9jdW1lbnQ7XG5cdFx0cmV0dXJuIHVucmVmRWxlbWVudCh0YXJnZXQpIHx8ICh3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwIHx8IChfd2luZG93JGRvY3VtZW50ID0gd2luZG93JDEuZG9jdW1lbnQpID09PSBudWxsIHx8IF93aW5kb3ckZG9jdW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcblx0fSk7XG5cdGZ1bmN0aW9uIHVwZGF0ZUNzc1ZhcigpIHtcblx0XHRjb25zdCBrZXkgPSB0b1ZhbHVlKHByb3ApO1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZShlbFJlZik7XG5cdFx0aWYgKGVsICYmIHdpbmRvdyQxICYmIGtleSkge1xuXHRcdFx0dmFyIF93aW5kb3ckZ2V0Q29tcHV0ZWRTdDtcblx0XHRcdHZhcmlhYmxlLnZhbHVlID0gKChfd2luZG93JGdldENvbXB1dGVkU3QgPSB3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKGVsKS5nZXRQcm9wZXJ0eVZhbHVlKGtleSkpID09PSBudWxsIHx8IF93aW5kb3ckZ2V0Q29tcHV0ZWRTdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdyRnZXRDb21wdXRlZFN0LnRyaW0oKSkgfHwgdmFyaWFibGUudmFsdWUgfHwgaW5pdGlhbFZhbHVlO1xuXHRcdH1cblx0fVxuXHRpZiAob2JzZXJ2ZSkgdXNlTXV0YXRpb25PYnNlcnZlcihlbFJlZiwgdXBkYXRlQ3NzVmFyLCB7XG5cdFx0YXR0cmlidXRlRmlsdGVyOiBbXCJzdHlsZVwiLCBcImNsYXNzXCJdLFxuXHRcdHdpbmRvdzogd2luZG93JDFcblx0fSk7XG5cdHdhdGNoKFtlbFJlZiwgKCkgPT4gdG9WYWx1ZShwcm9wKV0sIChfLCBvbGQpID0+IHtcblx0XHRpZiAob2xkWzBdICYmIG9sZFsxXSkgb2xkWzBdLnN0eWxlLnJlbW92ZVByb3BlcnR5KG9sZFsxXSk7XG5cdFx0dXBkYXRlQ3NzVmFyKCk7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHR3YXRjaChbdmFyaWFibGUsIGVsUmVmXSwgKFt2YWwsIGVsXSkgPT4ge1xuXHRcdGNvbnN0IHJhd19wcm9wID0gdG9WYWx1ZShwcm9wKTtcblx0XHRpZiAoKGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zdHlsZSkgJiYgcmF3X3Byb3ApIGlmICh2YWwgPT0gbnVsbCkgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkocmF3X3Byb3ApO1xuXHRcdGVsc2UgZWwuc3R5bGUuc2V0UHJvcGVydHkocmF3X3Byb3AsIHZhbCk7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHRyZXR1cm4gdmFyaWFibGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUN1cnJlbnRFbGVtZW50L2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDdXJyZW50RWxlbWVudChyb290Q29tcG9uZW50KSB7XG5cdGNvbnN0IHZtID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gY29tcHV0ZWRXaXRoQ29udHJvbCgoKSA9PiBudWxsLCAoKSA9PiByb290Q29tcG9uZW50ID8gdW5yZWZFbGVtZW50KHJvb3RDb21wb25lbnQpIDogdm0ucHJveHkuJGVsKTtcblx0b25VcGRhdGVkKGN1cnJlbnRFbGVtZW50LnRyaWdnZXIpO1xuXHRvbk1vdW50ZWQoY3VycmVudEVsZW1lbnQudHJpZ2dlcik7XG5cdHJldHVybiBjdXJyZW50RWxlbWVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ3ljbGVMaXN0L2luZGV4LnRzXG4vKipcbiogQ3ljbGUgdGhyb3VnaCBhIGxpc3Qgb2YgaXRlbXNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQ3ljbGVMaXN0XG4qL1xuZnVuY3Rpb24gdXNlQ3ljbGVMaXN0KGxpc3QsIG9wdGlvbnMpIHtcblx0Y29uc3Qgc3RhdGUgPSBzaGFsbG93UmVmKGdldEluaXRpYWxWYWx1ZSgpKTtcblx0Y29uc3QgbGlzdFJlZiA9IHRvUmVmKGxpc3QpO1xuXHRjb25zdCBpbmRleCA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHR2YXIgX29wdGlvbnMkZmFsbGJhY2tJbmRlO1xuXHRcdFx0Y29uc3QgdGFyZ2V0TGlzdCA9IGxpc3RSZWYudmFsdWU7XG5cdFx0XHRsZXQgaW5kZXgkMSA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2V0SW5kZXhPZikgPyBvcHRpb25zLmdldEluZGV4T2Yoc3RhdGUudmFsdWUsIHRhcmdldExpc3QpIDogdGFyZ2V0TGlzdC5pbmRleE9mKHN0YXRlLnZhbHVlKTtcblx0XHRcdGlmIChpbmRleCQxIDwgMCkgaW5kZXgkMSA9IChfb3B0aW9ucyRmYWxsYmFja0luZGUgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmFsbGJhY2tJbmRleCkgIT09IG51bGwgJiYgX29wdGlvbnMkZmFsbGJhY2tJbmRlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRmYWxsYmFja0luZGUgOiAwO1xuXHRcdFx0cmV0dXJuIGluZGV4JDE7XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0c2V0KHYpO1xuXHRcdH1cblx0fSk7XG5cdGZ1bmN0aW9uIHNldChpKSB7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdCA9IGxpc3RSZWYudmFsdWU7XG5cdFx0Y29uc3QgbGVuZ3RoID0gdGFyZ2V0TGlzdC5sZW5ndGg7XG5cdFx0Y29uc3QgdmFsdWUgPSB0YXJnZXRMaXN0WyhpICUgbGVuZ3RoICsgbGVuZ3RoKSAlIGxlbmd0aF07XG5cdFx0c3RhdGUudmFsdWUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblx0ZnVuY3Rpb24gc2hpZnQoZGVsdGEgPSAxKSB7XG5cdFx0cmV0dXJuIHNldChpbmRleC52YWx1ZSArIGRlbHRhKTtcblx0fVxuXHRmdW5jdGlvbiBuZXh0KG4gPSAxKSB7XG5cdFx0cmV0dXJuIHNoaWZ0KG4pO1xuXHR9XG5cdGZ1bmN0aW9uIHByZXYobiA9IDEpIHtcblx0XHRyZXR1cm4gc2hpZnQoLW4pO1xuXHR9XG5cdGZ1bmN0aW9uIGdldEluaXRpYWxWYWx1ZSgpIHtcblx0XHR2YXIgX3RvVmFsdWUsIF9vcHRpb25zJGluaXRpYWxWYWx1ZTtcblx0XHRyZXR1cm4gKF90b1ZhbHVlID0gdG9WYWx1ZSgoX29wdGlvbnMkaW5pdGlhbFZhbHVlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmluaXRpYWxWYWx1ZSkgIT09IG51bGwgJiYgX29wdGlvbnMkaW5pdGlhbFZhbHVlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRpbml0aWFsVmFsdWUgOiB0b1ZhbHVlKGxpc3QpWzBdKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogdm9pZCAwO1xuXHR9XG5cdHdhdGNoKGxpc3RSZWYsICgpID0+IHNldChpbmRleC52YWx1ZSkpO1xuXHRyZXR1cm4ge1xuXHRcdHN0YXRlLFxuXHRcdGluZGV4LFxuXHRcdG5leHQsXG5cdFx0cHJldixcblx0XHRnbzogc2V0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURhcmsvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBkYXJrIG1vZGUgd2l0aCBhdXRvIGRhdGEgcGVyc2lzdGVuY2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURhcmtcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEYXJrKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHZhbHVlRGFyayA9IFwiZGFya1wiLCB2YWx1ZUxpZ2h0ID0gXCJcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgbW9kZSA9IHVzZUNvbG9yTW9kZSh7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRvbkNoYW5nZWQ6IChtb2RlJDEsIGRlZmF1bHRIYW5kbGVyKSA9PiB7XG5cdFx0XHR2YXIgX29wdGlvbnMkb25DaGFuZ2VkO1xuXHRcdFx0aWYgKG9wdGlvbnMub25DaGFuZ2VkKSAoX29wdGlvbnMkb25DaGFuZ2VkID0gb3B0aW9ucy5vbkNoYW5nZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uQ2hhbmdlZCA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uQ2hhbmdlZC5jYWxsKG9wdGlvbnMsIG1vZGUkMSA9PT0gXCJkYXJrXCIsIGRlZmF1bHRIYW5kbGVyLCBtb2RlJDEpO1xuXHRcdFx0ZWxzZSBkZWZhdWx0SGFuZGxlcihtb2RlJDEpO1xuXHRcdH0sXG5cdFx0bW9kZXM6IHtcblx0XHRcdGRhcms6IHZhbHVlRGFyayxcblx0XHRcdGxpZ2h0OiB2YWx1ZUxpZ2h0XG5cdFx0fVxuXHR9KTtcblx0Y29uc3Qgc3lzdGVtID0gY29tcHV0ZWQoKCkgPT4gbW9kZS5zeXN0ZW0udmFsdWUpO1xuXHRyZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBtb2RlLnZhbHVlID09PSBcImRhcmtcIjtcblx0XHR9LFxuXHRcdHNldCh2KSB7XG5cdFx0XHRjb25zdCBtb2RlVmFsID0gdiA/IFwiZGFya1wiIDogXCJsaWdodFwiO1xuXHRcdFx0aWYgKHN5c3RlbS52YWx1ZSA9PT0gbW9kZVZhbCkgbW9kZS52YWx1ZSA9IFwiYXV0b1wiO1xuXHRcdFx0ZWxzZSBtb2RlLnZhbHVlID0gbW9kZVZhbDtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNYW51YWxSZWZIaXN0b3J5L2luZGV4LnRzXG5mdW5jdGlvbiBmbkJ5cGFzcyh2KSB7XG5cdHJldHVybiB2O1xufVxuZnVuY3Rpb24gZm5TZXRTb3VyY2Uoc291cmNlLCB2YWx1ZSkge1xuXHRyZXR1cm4gc291cmNlLnZhbHVlID0gdmFsdWU7XG59XG5mdW5jdGlvbiBkZWZhdWx0RHVtcChjbG9uZSkge1xuXHRyZXR1cm4gY2xvbmUgPyB0eXBlb2YgY2xvbmUgPT09IFwiZnVuY3Rpb25cIiA/IGNsb25lIDogY2xvbmVGbkpTT04gOiBmbkJ5cGFzcztcbn1cbmZ1bmN0aW9uIGRlZmF1bHRQYXJzZShjbG9uZSkge1xuXHRyZXR1cm4gY2xvbmUgPyB0eXBlb2YgY2xvbmUgPT09IFwiZnVuY3Rpb25cIiA/IGNsb25lIDogY2xvbmVGbkpTT04gOiBmbkJ5cGFzcztcbn1cbi8qKlxuKiBUcmFjayB0aGUgY2hhbmdlIGhpc3Rvcnkgb2YgYSByZWYsIGFsc28gcHJvdmlkZXMgdW5kbyBhbmQgcmVkbyBmdW5jdGlvbmFsaXR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNYW51YWxSZWZIaXN0b3J5XG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VNYW51YWxSZWZIaXN0b3J5KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY2xvbmUgPSBmYWxzZSwgZHVtcCA9IGRlZmF1bHREdW1wKGNsb25lKSwgcGFyc2UgPSBkZWZhdWx0UGFyc2UoY2xvbmUpLCBzZXRTb3VyY2UgPSBmblNldFNvdXJjZSB9ID0gb3B0aW9ucztcblx0ZnVuY3Rpb24gX2NyZWF0ZUhpc3RvcnlSZWNvcmQoKSB7XG5cdFx0cmV0dXJuIG1hcmtSYXcoe1xuXHRcdFx0c25hcHNob3Q6IGR1bXAoc291cmNlLnZhbHVlKSxcblx0XHRcdHRpbWVzdGFtcDogdGltZXN0YW1wKClcblx0XHR9KTtcblx0fVxuXHRjb25zdCBsYXN0ID0gcmVmKF9jcmVhdGVIaXN0b3J5UmVjb3JkKCkpO1xuXHRjb25zdCB1bmRvU3RhY2sgPSByZWYoW10pO1xuXHRjb25zdCByZWRvU3RhY2sgPSByZWYoW10pO1xuXHRjb25zdCBfc2V0U291cmNlID0gKHJlY29yZCkgPT4ge1xuXHRcdHNldFNvdXJjZShzb3VyY2UsIHBhcnNlKHJlY29yZC5zbmFwc2hvdCkpO1xuXHRcdGxhc3QudmFsdWUgPSByZWNvcmQ7XG5cdH07XG5cdGNvbnN0IGNvbW1pdCA9ICgpID0+IHtcblx0XHR1bmRvU3RhY2sudmFsdWUudW5zaGlmdChsYXN0LnZhbHVlKTtcblx0XHRsYXN0LnZhbHVlID0gX2NyZWF0ZUhpc3RvcnlSZWNvcmQoKTtcblx0XHRpZiAob3B0aW9ucy5jYXBhY2l0eSAmJiB1bmRvU3RhY2sudmFsdWUubGVuZ3RoID4gb3B0aW9ucy5jYXBhY2l0eSkgdW5kb1N0YWNrLnZhbHVlLnNwbGljZShvcHRpb25zLmNhcGFjaXR5LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXHRcdGlmIChyZWRvU3RhY2sudmFsdWUubGVuZ3RoKSByZWRvU3RhY2sudmFsdWUuc3BsaWNlKDAsIHJlZG9TdGFjay52YWx1ZS5sZW5ndGgpO1xuXHR9O1xuXHRjb25zdCBjbGVhciA9ICgpID0+IHtcblx0XHR1bmRvU3RhY2sudmFsdWUuc3BsaWNlKDAsIHVuZG9TdGFjay52YWx1ZS5sZW5ndGgpO1xuXHRcdHJlZG9TdGFjay52YWx1ZS5zcGxpY2UoMCwgcmVkb1N0YWNrLnZhbHVlLmxlbmd0aCk7XG5cdH07XG5cdGNvbnN0IHVuZG8gPSAoKSA9PiB7XG5cdFx0Y29uc3Qgc3RhdGUgPSB1bmRvU3RhY2sudmFsdWUuc2hpZnQoKTtcblx0XHRpZiAoc3RhdGUpIHtcblx0XHRcdHJlZG9TdGFjay52YWx1ZS51bnNoaWZ0KGxhc3QudmFsdWUpO1xuXHRcdFx0X3NldFNvdXJjZShzdGF0ZSk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCByZWRvID0gKCkgPT4ge1xuXHRcdGNvbnN0IHN0YXRlID0gcmVkb1N0YWNrLnZhbHVlLnNoaWZ0KCk7XG5cdFx0aWYgKHN0YXRlKSB7XG5cdFx0XHR1bmRvU3RhY2sudmFsdWUudW5zaGlmdChsYXN0LnZhbHVlKTtcblx0XHRcdF9zZXRTb3VyY2Uoc3RhdGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcmVzZXQgPSAoKSA9PiB7XG5cdFx0X3NldFNvdXJjZShsYXN0LnZhbHVlKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRzb3VyY2UsXG5cdFx0dW5kb1N0YWNrLFxuXHRcdHJlZG9TdGFjayxcblx0XHRsYXN0LFxuXHRcdGhpc3Rvcnk6IGNvbXB1dGVkKCgpID0+IFtsYXN0LnZhbHVlLCAuLi51bmRvU3RhY2sudmFsdWVdKSxcblx0XHRjYW5VbmRvOiBjb21wdXRlZCgoKSA9PiB1bmRvU3RhY2sudmFsdWUubGVuZ3RoID4gMCksXG5cdFx0Y2FuUmVkbzogY29tcHV0ZWQoKCkgPT4gcmVkb1N0YWNrLnZhbHVlLmxlbmd0aCA+IDApLFxuXHRcdGNsZWFyLFxuXHRcdGNvbW1pdCxcblx0XHRyZXNldCxcblx0XHR1bmRvLFxuXHRcdHJlZG9cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUmVmSGlzdG9yeS9pbmRleC50c1xuLyoqXG4qIFRyYWNrIHRoZSBjaGFuZ2UgaGlzdG9yeSBvZiBhIHJlZiwgYWxzbyBwcm92aWRlcyB1bmRvIGFuZCByZWRvIGZ1bmN0aW9uYWxpdHkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVJlZkhpc3RvcnlcbiogQHBhcmFtIHNvdXJjZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVJlZkhpc3Rvcnkoc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkZWVwID0gZmFsc2UsIGZsdXNoID0gXCJwcmVcIiwgZXZlbnRGaWx0ZXIsIHNob3VsZENvbW1pdCA9ICgpID0+IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHsgZXZlbnRGaWx0ZXI6IGNvbXBvc2VkRmlsdGVyLCBwYXVzZSwgcmVzdW1lOiByZXN1bWVUcmFja2luZywgaXNBY3RpdmU6IGlzVHJhY2tpbmcgfSA9IHBhdXNhYmxlRmlsdGVyKGV2ZW50RmlsdGVyKTtcblx0bGV0IGxhc3RSYXdWYWx1ZSA9IHNvdXJjZS52YWx1ZTtcblx0Y29uc3QgeyBpZ25vcmVVcGRhdGVzLCBpZ25vcmVQcmV2QXN5bmNVcGRhdGVzLCBzdG9wIH0gPSB3YXRjaElnbm9yYWJsZShzb3VyY2UsIGNvbW1pdCwge1xuXHRcdGRlZXAsXG5cdFx0Zmx1c2gsXG5cdFx0ZXZlbnRGaWx0ZXI6IGNvbXBvc2VkRmlsdGVyXG5cdH0pO1xuXHRmdW5jdGlvbiBzZXRTb3VyY2Uoc291cmNlJDEsIHZhbHVlKSB7XG5cdFx0aWdub3JlUHJldkFzeW5jVXBkYXRlcygpO1xuXHRcdGlnbm9yZVVwZGF0ZXMoKCkgPT4ge1xuXHRcdFx0c291cmNlJDEudmFsdWUgPSB2YWx1ZTtcblx0XHRcdGxhc3RSYXdWYWx1ZSA9IHZhbHVlO1xuXHRcdH0pO1xuXHR9XG5cdGNvbnN0IG1hbnVhbEhpc3RvcnkgPSB1c2VNYW51YWxSZWZIaXN0b3J5KHNvdXJjZSwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0Y2xvbmU6IG9wdGlvbnMuY2xvbmUgfHwgZGVlcCxcblx0XHRzZXRTb3VyY2Vcblx0fSk7XG5cdGNvbnN0IHsgY2xlYXIsIGNvbW1pdDogbWFudWFsQ29tbWl0IH0gPSBtYW51YWxIaXN0b3J5O1xuXHRmdW5jdGlvbiBjb21taXQoKSB7XG5cdFx0aWdub3JlUHJldkFzeW5jVXBkYXRlcygpO1xuXHRcdGlmICghc2hvdWxkQ29tbWl0KGxhc3RSYXdWYWx1ZSwgc291cmNlLnZhbHVlKSkgcmV0dXJuO1xuXHRcdGxhc3RSYXdWYWx1ZSA9IHNvdXJjZS52YWx1ZTtcblx0XHRtYW51YWxDb21taXQoKTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoY29tbWl0Tm93KSB7XG5cdFx0cmVzdW1lVHJhY2tpbmcoKTtcblx0XHRpZiAoY29tbWl0Tm93KSBjb21taXQoKTtcblx0fVxuXHRmdW5jdGlvbiBiYXRjaChmbikge1xuXHRcdGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNhbmNlbCA9ICgpID0+IGNhbmNlbGVkID0gdHJ1ZTtcblx0XHRpZ25vcmVVcGRhdGVzKCgpID0+IHtcblx0XHRcdGZuKGNhbmNlbCk7XG5cdFx0fSk7XG5cdFx0aWYgKCFjYW5jZWxlZCkgY29tbWl0KCk7XG5cdH1cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblx0XHRzdG9wKCk7XG5cdFx0Y2xlYXIoKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdC4uLm1hbnVhbEhpc3RvcnksXG5cdFx0aXNUcmFja2luZyxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWUsXG5cdFx0Y29tbWl0LFxuXHRcdGJhdGNoLFxuXHRcdGRpc3Bvc2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGVib3VuY2VkUmVmSGlzdG9yeS9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3IgW3VzZVJlZkhpc3RvcnldKGh0dHBzOi8vdnVldXNlLm9yZy91c2VSZWZIaXN0b3J5KSB3aXRoIGRlYm91bmNlIGZpbHRlci5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGVib3VuY2VkUmVmSGlzdG9yeVxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRGVib3VuY2VkUmVmSGlzdG9yeShzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBmaWx0ZXIgPSBvcHRpb25zLmRlYm91bmNlID8gZGVib3VuY2VGaWx0ZXIob3B0aW9ucy5kZWJvdW5jZSkgOiB2b2lkIDA7XG5cdHJldHVybiB7IC4uLnVzZVJlZkhpc3Rvcnkoc291cmNlLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogZmlsdGVyXG5cdH0pIH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURldmljZU1vdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIERldmljZU1vdGlvbkV2ZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEZXZpY2VNb3Rpb25cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEZXZpY2VNb3Rpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHJlcXVlc3RQZXJtaXNzaW9ucyA9IGZhbHNlLCBldmVudEZpbHRlciA9IGJ5cGFzc0ZpbHRlciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiBEZXZpY2VNb3Rpb25FdmVudCAhPT0gXCJ1bmRlZmluZWRcIik7XG5cdGNvbnN0IHJlcXVpcmVQZXJtaXNzaW9ucyA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gaXNTdXBwb3J0ZWQudmFsdWUgJiYgXCJyZXF1ZXN0UGVybWlzc2lvblwiIGluIERldmljZU1vdGlvbkV2ZW50ICYmIHR5cGVvZiBEZXZpY2VNb3Rpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbiA9PT0gXCJmdW5jdGlvblwiKTtcblx0Y29uc3QgcGVybWlzc2lvbkdyYW50ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgYWNjZWxlcmF0aW9uID0gcmVmKHtcblx0XHR4OiBudWxsLFxuXHRcdHk6IG51bGwsXG5cdFx0ejogbnVsbFxuXHR9KTtcblx0Y29uc3Qgcm90YXRpb25SYXRlID0gcmVmKHtcblx0XHRhbHBoYTogbnVsbCxcblx0XHRiZXRhOiBudWxsLFxuXHRcdGdhbW1hOiBudWxsXG5cdH0pO1xuXHRjb25zdCBpbnRlcnZhbCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkgPSByZWYoe1xuXHRcdHg6IG51bGwsXG5cdFx0eTogbnVsbCxcblx0XHR6OiBudWxsXG5cdH0pO1xuXHRmdW5jdGlvbiBpbml0KCkge1xuXHRcdGlmICh3aW5kb3ckMSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkZXZpY2Vtb3Rpb25cIiwgY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgKGV2ZW50KSA9PiB7XG5cdFx0XHR2YXIgX2V2ZW50JGFjY2VsZXJhdGlvbiwgX2V2ZW50JGFjY2VsZXJhdGlvbjIsIF9ldmVudCRhY2NlbGVyYXRpb24zLCBfZXZlbnQkYWNjZWxlcmF0aW9uSW4sIF9ldmVudCRhY2NlbGVyYXRpb25JbjIsIF9ldmVudCRhY2NlbGVyYXRpb25JbjMsIF9ldmVudCRyb3RhdGlvblJhdGUsIF9ldmVudCRyb3RhdGlvblJhdGUyLCBfZXZlbnQkcm90YXRpb25SYXRlMztcblx0XHRcdGFjY2VsZXJhdGlvbi52YWx1ZSA9IHtcblx0XHRcdFx0eDogKChfZXZlbnQkYWNjZWxlcmF0aW9uID0gZXZlbnQuYWNjZWxlcmF0aW9uKSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uLngpIHx8IG51bGwsXG5cdFx0XHRcdHk6ICgoX2V2ZW50JGFjY2VsZXJhdGlvbjIgPSBldmVudC5hY2NlbGVyYXRpb24pID09PSBudWxsIHx8IF9ldmVudCRhY2NlbGVyYXRpb24yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uMi55KSB8fCBudWxsLFxuXHRcdFx0XHR6OiAoKF9ldmVudCRhY2NlbGVyYXRpb24zID0gZXZlbnQuYWNjZWxlcmF0aW9uKSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbjMueikgfHwgbnVsbFxuXHRcdFx0fTtcblx0XHRcdGFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkudmFsdWUgPSB7XG5cdFx0XHRcdHg6ICgoX2V2ZW50JGFjY2VsZXJhdGlvbkluID0gZXZlbnQuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eSkgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbkluID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uSW4ueCkgfHwgbnVsbCxcblx0XHRcdFx0eTogKChfZXZlbnQkYWNjZWxlcmF0aW9uSW4yID0gZXZlbnQuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eSkgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbkluMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbkluMi55KSB8fCBudWxsLFxuXHRcdFx0XHR6OiAoKF9ldmVudCRhY2NlbGVyYXRpb25JbjMgPSBldmVudC5hY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5KSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uSW4zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkYWNjZWxlcmF0aW9uSW4zLnopIHx8IG51bGxcblx0XHRcdH07XG5cdFx0XHRyb3RhdGlvblJhdGUudmFsdWUgPSB7XG5cdFx0XHRcdGFscGhhOiAoKF9ldmVudCRyb3RhdGlvblJhdGUgPSBldmVudC5yb3RhdGlvblJhdGUpID09PSBudWxsIHx8IF9ldmVudCRyb3RhdGlvblJhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRyb3RhdGlvblJhdGUuYWxwaGEpIHx8IG51bGwsXG5cdFx0XHRcdGJldGE6ICgoX2V2ZW50JHJvdGF0aW9uUmF0ZTIgPSBldmVudC5yb3RhdGlvblJhdGUpID09PSBudWxsIHx8IF9ldmVudCRyb3RhdGlvblJhdGUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkcm90YXRpb25SYXRlMi5iZXRhKSB8fCBudWxsLFxuXHRcdFx0XHRnYW1tYTogKChfZXZlbnQkcm90YXRpb25SYXRlMyA9IGV2ZW50LnJvdGF0aW9uUmF0ZSkgPT09IG51bGwgfHwgX2V2ZW50JHJvdGF0aW9uUmF0ZTMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRyb3RhdGlvblJhdGUzLmdhbW1hKSB8fCBudWxsXG5cdFx0XHR9O1xuXHRcdFx0aW50ZXJ2YWwudmFsdWUgPSBldmVudC5pbnRlcnZhbDtcblx0XHR9KSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR9XG5cdGNvbnN0IGVuc3VyZVBlcm1pc3Npb25zID0gYXN5bmMgKCkgPT4ge1xuXHRcdGlmICghcmVxdWlyZVBlcm1pc3Npb25zLnZhbHVlKSBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0aWYgKHBlcm1pc3Npb25HcmFudGVkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKHJlcXVpcmVQZXJtaXNzaW9ucy52YWx1ZSkge1xuXHRcdFx0Y29uc3QgcmVxdWVzdFBlcm1pc3Npb24gPSBEZXZpY2VNb3Rpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChhd2FpdCByZXF1ZXN0UGVybWlzc2lvbigpID09PSBcImdyYW50ZWRcIikge1xuXHRcdFx0XHRcdHBlcm1pc3Npb25HcmFudGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdFx0XHRpbml0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBpZiAocmVxdWVzdFBlcm1pc3Npb25zICYmIHJlcXVpcmVQZXJtaXNzaW9ucy52YWx1ZSkgZW5zdXJlUGVybWlzc2lvbnMoKS50aGVuKCgpID0+IGluaXQoKSk7XG5cdGVsc2UgaW5pdCgpO1xuXHRyZXR1cm4ge1xuXHRcdGFjY2VsZXJhdGlvbixcblx0XHRhY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5LFxuXHRcdHJvdGF0aW9uUmF0ZSxcblx0XHRpbnRlcnZhbCxcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRyZXF1aXJlUGVybWlzc2lvbnMsXG5cdFx0ZW5zdXJlUGVybWlzc2lvbnMsXG5cdFx0cGVybWlzc2lvbkdyYW50ZWRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGV2aWNlT3JpZW50YXRpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBEZXZpY2VPcmllbnRhdGlvbkV2ZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEZXZpY2VPcmllbnRhdGlvblxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURldmljZU9yaWVudGF0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJEZXZpY2VPcmllbnRhdGlvbkV2ZW50XCIgaW4gd2luZG93JDEpO1xuXHRjb25zdCBpc0Fic29sdXRlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGFscGhhID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgYmV0YSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGdhbW1hID0gc2hhbGxvd1JlZihudWxsKTtcblx0aWYgKHdpbmRvdyQxICYmIGlzU3VwcG9ydGVkLnZhbHVlKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImRldmljZW9yaWVudGF0aW9uXCIsIChldmVudCkgPT4ge1xuXHRcdGlzQWJzb2x1dGUudmFsdWUgPSBldmVudC5hYnNvbHV0ZTtcblx0XHRhbHBoYS52YWx1ZSA9IGV2ZW50LmFscGhhO1xuXHRcdGJldGEudmFsdWUgPSBldmVudC5iZXRhO1xuXHRcdGdhbW1hLnZhbHVlID0gZXZlbnQuZ2FtbWE7XG5cdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRpc0Fic29sdXRlLFxuXHRcdGFscGhhLFxuXHRcdGJldGEsXG5cdFx0Z2FtbWFcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGV2aWNlUGl4ZWxSYXRpby9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgdHJhY2sgYHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvYC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGV2aWNlUGl4ZWxSYXRpb1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURldmljZVBpeGVsUmF0aW8ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHBpeGVsUmF0aW8gPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCBxdWVyeSA9IHVzZU1lZGlhUXVlcnkoKCkgPT4gYChyZXNvbHV0aW9uOiAke3BpeGVsUmF0aW8udmFsdWV9ZHBweClgLCBvcHRpb25zKTtcblx0bGV0IHN0b3AgPSBub29wO1xuXHRpZiAod2luZG93JDEpIHN0b3AgPSB3YXRjaEltbWVkaWF0ZShxdWVyeSwgKCkgPT4gcGl4ZWxSYXRpby52YWx1ZSA9IHdpbmRvdyQxLmRldmljZVBpeGVsUmF0aW8pO1xuXHRyZXR1cm4ge1xuXHRcdHBpeGVsUmF0aW86IHJlYWRvbmx5KHBpeGVsUmF0aW8pLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGV2aWNlc0xpc3QvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgZW51bWVyYXRlRGV2aWNlc2AgbGlzdGluZyBhdmFpbGFibGUgaW5wdXQvb3V0cHV0IGRldmljZXNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGV2aWNlc0xpc3RcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEZXZpY2VzTGlzdChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgcmVxdWVzdFBlcm1pc3Npb25zID0gZmFsc2UsIGNvbnN0cmFpbnRzID0ge1xuXHRcdGF1ZGlvOiB0cnVlLFxuXHRcdHZpZGVvOiB0cnVlXG5cdH0sIG9uVXBkYXRlZDogb25VcGRhdGVkJDEgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRldmljZXMgPSByZWYoW10pO1xuXHRjb25zdCB2aWRlb0lucHV0cyA9IGNvbXB1dGVkKCgpID0+IGRldmljZXMudmFsdWUuZmlsdGVyKChpKSA9PiBpLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiKSk7XG5cdGNvbnN0IGF1ZGlvSW5wdXRzID0gY29tcHV0ZWQoKCkgPT4gZGV2aWNlcy52YWx1ZS5maWx0ZXIoKGkpID0+IGkua2luZCA9PT0gXCJhdWRpb2lucHV0XCIpKTtcblx0Y29uc3QgYXVkaW9PdXRwdXRzID0gY29tcHV0ZWQoKCkgPT4gZGV2aWNlcy52YWx1ZS5maWx0ZXIoKGkpID0+IGkua2luZCA9PT0gXCJhdWRpb291dHB1dFwiKSk7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMgJiYgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMpO1xuXHRjb25zdCBwZXJtaXNzaW9uR3JhbnRlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRsZXQgc3RyZWFtO1xuXHRhc3luYyBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGRldmljZXMudmFsdWUgPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuXHRcdG9uVXBkYXRlZCQxID09PSBudWxsIHx8IG9uVXBkYXRlZCQxID09PSB2b2lkIDAgfHwgb25VcGRhdGVkJDEoZGV2aWNlcy52YWx1ZSk7XG5cdFx0aWYgKHN0cmVhbSkge1xuXHRcdFx0c3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcblx0XHRcdHN0cmVhbSA9IG51bGw7XG5cdFx0fVxuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVBlcm1pc3Npb25zKCkge1xuXHRcdGNvbnN0IGRldmljZU5hbWUgPSBjb25zdHJhaW50cy52aWRlbyA/IFwiY2FtZXJhXCIgOiBcIm1pY3JvcGhvbmVcIjtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm4gZmFsc2U7XG5cdFx0aWYgKHBlcm1pc3Npb25HcmFudGVkLnZhbHVlKSByZXR1cm4gdHJ1ZTtcblx0XHRjb25zdCB7IHN0YXRlLCBxdWVyeSB9ID0gdXNlUGVybWlzc2lvbihkZXZpY2VOYW1lLCB7IGNvbnRyb2xzOiB0cnVlIH0pO1xuXHRcdGF3YWl0IHF1ZXJ5KCk7XG5cdFx0aWYgKHN0YXRlLnZhbHVlICE9PSBcImdyYW50ZWRcIikge1xuXHRcdFx0bGV0IGdyYW50ZWQgPSB0cnVlO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgYWxsRGV2aWNlcyA9IGF3YWl0IG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCk7XG5cdFx0XHRcdGNvbnN0IGhhc0NhbWVyYSA9IGFsbERldmljZXMuc29tZSgoZGV2aWNlKSA9PiBkZXZpY2Uua2luZCA9PT0gXCJ2aWRlb2lucHV0XCIpO1xuXHRcdFx0XHRjb25zdCBoYXNNaWNyb3Bob25lID0gYWxsRGV2aWNlcy5zb21lKChkZXZpY2UpID0+IGRldmljZS5raW5kID09PSBcImF1ZGlvaW5wdXRcIiB8fCBkZXZpY2Uua2luZCA9PT0gXCJhdWRpb291dHB1dFwiKTtcblx0XHRcdFx0Y29uc3RyYWludHMudmlkZW8gPSBoYXNDYW1lcmEgPyBjb25zdHJhaW50cy52aWRlbyA6IGZhbHNlO1xuXHRcdFx0XHRjb25zdHJhaW50cy5hdWRpbyA9IGhhc01pY3JvcGhvbmUgPyBjb25zdHJhaW50cy5hdWRpbyA6IGZhbHNlO1xuXHRcdFx0XHRzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKTtcblx0XHRcdH0gY2F0Y2ggKF91bnVzZWQpIHtcblx0XHRcdFx0c3RyZWFtID0gbnVsbDtcblx0XHRcdFx0Z3JhbnRlZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dXBkYXRlKCk7XG5cdFx0XHRwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IGdyYW50ZWQ7XG5cdFx0fSBlbHNlIHBlcm1pc3Npb25HcmFudGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRyZXR1cm4gcGVybWlzc2lvbkdyYW50ZWQudmFsdWU7XG5cdH1cblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0aWYgKHJlcXVlc3RQZXJtaXNzaW9ucykgZW5zdXJlUGVybWlzc2lvbnMoKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcywgXCJkZXZpY2VjaGFuZ2VcIiwgdXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0dXBkYXRlKCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRkZXZpY2VzLFxuXHRcdGVuc3VyZVBlcm1pc3Npb25zLFxuXHRcdHBlcm1pc3Npb25HcmFudGVkLFxuXHRcdHZpZGVvSW5wdXRzLFxuXHRcdGF1ZGlvSW5wdXRzLFxuXHRcdGF1ZGlvT3V0cHV0cyxcblx0XHRpc1N1cHBvcnRlZFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEaXNwbGF5TWVkaWEvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgbWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYWAgc3RyZWFtaW5nXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURpc3BsYXlNZWRpYVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZURpc3BsYXlNZWRpYShvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGVuYWJsZWQ7XG5cdGNvbnN0IGVuYWJsZWQgPSBzaGFsbG93UmVmKChfb3B0aW9ucyRlbmFibGVkID0gb3B0aW9ucy5lbmFibGVkKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRlbmFibGVkICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRlbmFibGVkIDogZmFsc2UpO1xuXHRjb25zdCB2aWRlbyA9IG9wdGlvbnMudmlkZW87XG5cdGNvbnN0IGF1ZGlvID0gb3B0aW9ucy5hdWRpbztcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHtcblx0XHR2YXIgX25hdmlnYXRvciRtZWRpYURldmljO1xuXHRcdHJldHVybiBuYXZpZ2F0b3IkMSA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IkMSA9PT0gdm9pZCAwIHx8IChfbmF2aWdhdG9yJG1lZGlhRGV2aWMgPSBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMpID09PSBudWxsIHx8IF9uYXZpZ2F0b3IkbWVkaWFEZXZpYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX25hdmlnYXRvciRtZWRpYURldmljLmdldERpc3BsYXlNZWRpYTtcblx0fSk7XG5cdGNvbnN0IGNvbnN0cmFpbnQgPSB7XG5cdFx0YXVkaW8sXG5cdFx0dmlkZW9cblx0fTtcblx0Y29uc3Qgc3RyZWFtID0gc2hhbGxvd1JlZigpO1xuXHRhc3luYyBmdW5jdGlvbiBfc3RhcnQoKSB7XG5cdFx0dmFyIF9zdHJlYW0kdmFsdWU7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCBzdHJlYW0udmFsdWUpIHJldHVybjtcblx0XHRzdHJlYW0udmFsdWUgPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZ2V0RGlzcGxheU1lZGlhKGNvbnN0cmFpbnQpO1xuXHRcdChfc3RyZWFtJHZhbHVlID0gc3RyZWFtLnZhbHVlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJHZhbHVlID09PSB2b2lkIDAgfHwgX3N0cmVhbSR2YWx1ZS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB1c2VFdmVudExpc3RlbmVyKHQsIFwiZW5kZWRcIiwgc3RvcCwgeyBwYXNzaXZlOiB0cnVlIH0pKTtcblx0XHRyZXR1cm4gc3RyZWFtLnZhbHVlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIF9zdG9wKCkge1xuXHRcdHZhciBfc3RyZWFtJHZhbHVlMjtcblx0XHQoX3N0cmVhbSR2YWx1ZTIgPSBzdHJlYW0udmFsdWUpID09PSBudWxsIHx8IF9zdHJlYW0kdmFsdWUyID09PSB2b2lkIDAgfHwgX3N0cmVhbSR2YWx1ZTIuZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuXHRcdHN0cmVhbS52YWx1ZSA9IHZvaWQgMDtcblx0fVxuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdF9zdG9wKCk7XG5cdFx0ZW5hYmxlZC52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuXHRcdGF3YWl0IF9zdGFydCgpO1xuXHRcdGlmIChzdHJlYW0udmFsdWUpIGVuYWJsZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBzdHJlYW0udmFsdWU7XG5cdH1cblx0d2F0Y2goZW5hYmxlZCwgKHYpID0+IHtcblx0XHRpZiAodikgX3N0YXJ0KCk7XG5cdFx0ZWxzZSBfc3RvcCgpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdHJlYW0sXG5cdFx0c3RhcnQsXG5cdFx0c3RvcCxcblx0XHRlbmFibGVkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURvY3VtZW50VmlzaWJpbGl0eS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgdHJhY2sgYGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZWAuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURvY3VtZW50VmlzaWJpbGl0eVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZURvY3VtZW50VmlzaWJpbGl0eShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCB9ID0gb3B0aW9ucztcblx0aWYgKCFkb2N1bWVudCQxKSByZXR1cm4gc2hhbGxvd1JlZihcInZpc2libGVcIik7XG5cdGNvbnN0IHZpc2liaWxpdHkgPSBzaGFsbG93UmVmKGRvY3VtZW50JDEudmlzaWJpbGl0eVN0YXRlKTtcblx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInZpc2liaWxpdHljaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdHZpc2liaWxpdHkudmFsdWUgPSBkb2N1bWVudCQxLnZpc2liaWxpdHlTdGF0ZTtcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4gdmlzaWJpbGl0eTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRHJhZ2dhYmxlL2luZGV4LnRzXG5jb25zdCBkZWZhdWx0U2Nyb2xsQ29uZmlnID0ge1xuXHRzcGVlZDogMixcblx0bWFyZ2luOiAzMCxcblx0ZGlyZWN0aW9uOiBcImJvdGhcIlxufTtcbmZ1bmN0aW9uIGNsYW1wQ29udGFpbmVyU2Nyb2xsKGNvbnRhaW5lcikge1xuXHRpZiAoY29udGFpbmVyLnNjcm9sbExlZnQgPiBjb250YWluZXIuc2Nyb2xsV2lkdGggLSBjb250YWluZXIuY2xpZW50V2lkdGgpIGNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgY29udGFpbmVyLnNjcm9sbFdpZHRoIC0gY29udGFpbmVyLmNsaWVudFdpZHRoKTtcblx0aWYgKGNvbnRhaW5lci5zY3JvbGxUb3AgPiBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gY29udGFpbmVyLmNsaWVudEhlaWdodCkgY29udGFpbmVyLnNjcm9sbFRvcCA9IE1hdGgubWF4KDAsIGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSBjb250YWluZXIuY2xpZW50SGVpZ2h0KTtcbn1cbi8qKlxuKiBNYWtlIGVsZW1lbnRzIGRyYWdnYWJsZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRHJhZ2dhYmxlXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEcmFnZ2FibGUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0dmFyIF90b1ZhbHVlLCBfdG9WYWx1ZTIsIF90b1ZhbHVlMywgX3Njcm9sbENvbmZpZyRkaXJlY3RpO1xuXHRjb25zdCB7IHBvaW50ZXJUeXBlcywgcHJldmVudERlZmF1bHQ6IHByZXZlbnREZWZhdWx0JDEsIHN0b3BQcm9wYWdhdGlvbiwgZXhhY3QsIG9uTW92ZSwgb25FbmQsIG9uU3RhcnQsIGluaXRpYWxWYWx1ZSwgYXhpcyA9IFwiYm90aFwiLCBkcmFnZ2luZ0VsZW1lbnQgPSBkZWZhdWx0V2luZG93LCBjb250YWluZXJFbGVtZW50LCBoYW5kbGU6IGRyYWdnaW5nSGFuZGxlID0gdGFyZ2V0LCBidXR0b25zID0gWzBdLCByZXN0cmljdEluVmlldywgYXV0b1Njcm9sbCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBwb3NpdGlvbiA9IHJlZigoX3RvVmFsdWUgPSB0b1ZhbHVlKGluaXRpYWxWYWx1ZSkpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IHByZXNzZWREZWx0YSA9IHJlZigpO1xuXHRjb25zdCBmaWx0ZXJFdmVudCA9IChlKSA9PiB7XG5cdFx0aWYgKHBvaW50ZXJUeXBlcykgcmV0dXJuIHBvaW50ZXJUeXBlcy5pbmNsdWRlcyhlLnBvaW50ZXJUeXBlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblx0Y29uc3QgaGFuZGxlRXZlbnQgPSAoZSkgPT4ge1xuXHRcdGlmICh0b1ZhbHVlKHByZXZlbnREZWZhdWx0JDEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0aWYgKHRvVmFsdWUoc3RvcFByb3BhZ2F0aW9uKSkgZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblx0Y29uc3Qgc2Nyb2xsQ29uZmlnID0gdG9WYWx1ZShhdXRvU2Nyb2xsKTtcblx0Y29uc3Qgc2Nyb2xsU2V0dGluZ3MgPSB0eXBlb2Ygc2Nyb2xsQ29uZmlnID09PSBcIm9iamVjdFwiID8ge1xuXHRcdHNwZWVkOiAoX3RvVmFsdWUyID0gdG9WYWx1ZShzY3JvbGxDb25maWcuc3BlZWQpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZTIgIT09IHZvaWQgMCA/IF90b1ZhbHVlMiA6IGRlZmF1bHRTY3JvbGxDb25maWcuc3BlZWQsXG5cdFx0bWFyZ2luOiAoX3RvVmFsdWUzID0gdG9WYWx1ZShzY3JvbGxDb25maWcubWFyZ2luKSkgIT09IG51bGwgJiYgX3RvVmFsdWUzICE9PSB2b2lkIDAgPyBfdG9WYWx1ZTMgOiBkZWZhdWx0U2Nyb2xsQ29uZmlnLm1hcmdpbixcblx0XHRkaXJlY3Rpb246IChfc2Nyb2xsQ29uZmlnJGRpcmVjdGkgPSBzY3JvbGxDb25maWcuZGlyZWN0aW9uKSAhPT0gbnVsbCAmJiBfc2Nyb2xsQ29uZmlnJGRpcmVjdGkgIT09IHZvaWQgMCA/IF9zY3JvbGxDb25maWckZGlyZWN0aSA6IGRlZmF1bHRTY3JvbGxDb25maWcuZGlyZWN0aW9uXG5cdH0gOiBkZWZhdWx0U2Nyb2xsQ29uZmlnO1xuXHRjb25zdCBnZXRTY3JvbGxBeGlzVmFsdWVzID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyBbdmFsdWUsIHZhbHVlXSA6IFt2YWx1ZS54LCB2YWx1ZS55XTtcblx0Y29uc3QgaGFuZGxlQXV0b1Njcm9sbCA9IChjb250YWluZXIsIHRhcmdldFJlY3QsIHBvc2l0aW9uJDEpID0+IHtcblx0XHRjb25zdCB7IGNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQsIHNjcm9sbExlZnQsIHNjcm9sbFRvcCwgc2Nyb2xsV2lkdGgsIHNjcm9sbEhlaWdodCB9ID0gY29udGFpbmVyO1xuXHRcdGNvbnN0IFttYXJnaW5YLCBtYXJnaW5ZXSA9IGdldFNjcm9sbEF4aXNWYWx1ZXMoc2Nyb2xsU2V0dGluZ3MubWFyZ2luKTtcblx0XHRjb25zdCBbc3BlZWRYLCBzcGVlZFldID0gZ2V0U2Nyb2xsQXhpc1ZhbHVlcyhzY3JvbGxTZXR0aW5ncy5zcGVlZCk7XG5cdFx0bGV0IGRlbHRhWCA9IDA7XG5cdFx0bGV0IGRlbHRhWSA9IDA7XG5cdFx0aWYgKHNjcm9sbFNldHRpbmdzLmRpcmVjdGlvbiA9PT0gXCJ4XCIgfHwgc2Nyb2xsU2V0dGluZ3MuZGlyZWN0aW9uID09PSBcImJvdGhcIikge1xuXHRcdFx0aWYgKHBvc2l0aW9uJDEueCA8IG1hcmdpblggJiYgc2Nyb2xsTGVmdCA+IDApIGRlbHRhWCA9IC1zcGVlZFg7XG5cdFx0XHRlbHNlIGlmIChwb3NpdGlvbiQxLnggKyB0YXJnZXRSZWN0LndpZHRoID4gY2xpZW50V2lkdGggLSBtYXJnaW5YICYmIHNjcm9sbExlZnQgPCBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoKSBkZWx0YVggPSBzcGVlZFg7XG5cdFx0fVxuXHRcdGlmIChzY3JvbGxTZXR0aW5ncy5kaXJlY3Rpb24gPT09IFwieVwiIHx8IHNjcm9sbFNldHRpbmdzLmRpcmVjdGlvbiA9PT0gXCJib3RoXCIpIHtcblx0XHRcdGlmIChwb3NpdGlvbiQxLnkgPCBtYXJnaW5ZICYmIHNjcm9sbFRvcCA+IDApIGRlbHRhWSA9IC1zcGVlZFk7XG5cdFx0XHRlbHNlIGlmIChwb3NpdGlvbiQxLnkgKyB0YXJnZXRSZWN0LmhlaWdodCA+IGNsaWVudEhlaWdodCAtIG1hcmdpblkgJiYgc2Nyb2xsVG9wIDwgc2Nyb2xsSGVpZ2h0IC0gY2xpZW50SGVpZ2h0KSBkZWx0YVkgPSBzcGVlZFk7XG5cdFx0fVxuXHRcdGlmIChkZWx0YVggfHwgZGVsdGFZKSBjb250YWluZXIuc2Nyb2xsQnkoe1xuXHRcdFx0bGVmdDogZGVsdGFYLFxuXHRcdFx0dG9wOiBkZWx0YVksXG5cdFx0XHRiZWhhdmlvcjogXCJhdXRvXCJcblx0XHR9KTtcblx0fTtcblx0bGV0IGF1dG9TY3JvbGxJbnRlcnZhbCA9IG51bGw7XG5cdGNvbnN0IHN0YXJ0QXV0b1Njcm9sbCA9ICgpID0+IHtcblx0XHRjb25zdCBjb250YWluZXIgPSB0b1ZhbHVlKGNvbnRhaW5lckVsZW1lbnQpO1xuXHRcdGlmIChjb250YWluZXIgJiYgIWF1dG9TY3JvbGxJbnRlcnZhbCkgYXV0b1Njcm9sbEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0Y29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdGNvbnN0IHsgeCwgeSB9ID0gcG9zaXRpb24udmFsdWU7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVBvc2l0aW9uID0ge1xuXHRcdFx0XHR4OiB4IC0gY29udGFpbmVyLnNjcm9sbExlZnQsXG5cdFx0XHRcdHk6IHkgLSBjb250YWluZXIuc2Nyb2xsVG9wXG5cdFx0XHR9O1xuXHRcdFx0aWYgKHJlbGF0aXZlUG9zaXRpb24ueCA+PSAwICYmIHJlbGF0aXZlUG9zaXRpb24ueSA+PSAwKSB7XG5cdFx0XHRcdGhhbmRsZUF1dG9TY3JvbGwoY29udGFpbmVyLCB0YXJnZXRSZWN0LCByZWxhdGl2ZVBvc2l0aW9uKTtcblx0XHRcdFx0cmVsYXRpdmVQb3NpdGlvbi54ICs9IGNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuXHRcdFx0XHRyZWxhdGl2ZVBvc2l0aW9uLnkgKz0gY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHRcdFx0cG9zaXRpb24udmFsdWUgPSByZWxhdGl2ZVBvc2l0aW9uO1xuXHRcdFx0fVxuXHRcdH0sIDFlMyAvIDYwKTtcblx0fTtcblx0Y29uc3Qgc3RvcEF1dG9TY3JvbGwgPSAoKSA9PiB7XG5cdFx0aWYgKGF1dG9TY3JvbGxJbnRlcnZhbCkge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsSW50ZXJ2YWwpO1xuXHRcdFx0YXV0b1Njcm9sbEludGVydmFsID0gbnVsbDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGlzUG9pbnRlck5lYXJFZGdlID0gKHBvaW50ZXIsIGNvbnRhaW5lciwgbWFyZ2luLCB0YXJnZXRSZWN0KSA9PiB7XG5cdFx0Y29uc3QgW21hcmdpblgsIG1hcmdpblldID0gdHlwZW9mIG1hcmdpbiA9PT0gXCJudW1iZXJcIiA/IFttYXJnaW4sIG1hcmdpbl0gOiBbbWFyZ2luLngsIG1hcmdpbi55XTtcblx0XHRjb25zdCB7IGNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQgfSA9IGNvbnRhaW5lcjtcblx0XHRyZXR1cm4gcG9pbnRlci54IDwgbWFyZ2luWCB8fCBwb2ludGVyLnggKyB0YXJnZXRSZWN0LndpZHRoID4gY2xpZW50V2lkdGggLSBtYXJnaW5YIHx8IHBvaW50ZXIueSA8IG1hcmdpblkgfHwgcG9pbnRlci55ICsgdGFyZ2V0UmVjdC5oZWlnaHQgPiBjbGllbnRIZWlnaHQgLSBtYXJnaW5ZO1xuXHR9O1xuXHRjb25zdCBjaGVja0F1dG9TY3JvbGwgPSAoKSA9PiB7XG5cdFx0aWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgfHwgIXByZXNzZWREZWx0YS52YWx1ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IGNvbnRhaW5lciA9IHRvVmFsdWUoY29udGFpbmVyRWxlbWVudCk7XG5cdFx0aWYgKCFjb250YWluZXIpIHJldHVybjtcblx0XHRjb25zdCB0YXJnZXRSZWN0ID0gdG9WYWx1ZSh0YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGNvbnN0IHsgeCwgeSB9ID0gcG9zaXRpb24udmFsdWU7XG5cdFx0aWYgKGlzUG9pbnRlck5lYXJFZGdlKHtcblx0XHRcdHg6IHggLSBjb250YWluZXIuc2Nyb2xsTGVmdCxcblx0XHRcdHk6IHkgLSBjb250YWluZXIuc2Nyb2xsVG9wXG5cdFx0fSwgY29udGFpbmVyLCBzY3JvbGxTZXR0aW5ncy5tYXJnaW4sIHRhcmdldFJlY3QpKSBzdGFydEF1dG9TY3JvbGwoKTtcblx0XHRlbHNlIHN0b3BBdXRvU2Nyb2xsKCk7XG5cdH07XG5cdGlmICh0b1ZhbHVlKGF1dG9TY3JvbGwpKSB3YXRjaChwb3NpdGlvbiwgY2hlY2tBdXRvU2Nyb2xsKTtcblx0Y29uc3Qgc3RhcnQgPSAoZSkgPT4ge1xuXHRcdHZhciBfY29udGFpbmVyJGdldEJvdW5kaW47XG5cdFx0aWYgKCF0b1ZhbHVlKGJ1dHRvbnMpLmluY2x1ZGVzKGUuYnV0dG9uKSkgcmV0dXJuO1xuXHRcdGlmICh0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpIHx8ICFmaWx0ZXJFdmVudChlKSkgcmV0dXJuO1xuXHRcdGlmICh0b1ZhbHVlKGV4YWN0KSAmJiBlLnRhcmdldCAhPT0gdG9WYWx1ZSh0YXJnZXQpKSByZXR1cm47XG5cdFx0Y29uc3QgY29udGFpbmVyID0gdG9WYWx1ZShjb250YWluZXJFbGVtZW50KTtcblx0XHRjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyID09PSBudWxsIHx8IGNvbnRhaW5lciA9PT0gdm9pZCAwIHx8IChfY29udGFpbmVyJGdldEJvdW5kaW4gPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSA9PT0gbnVsbCB8fCBfY29udGFpbmVyJGdldEJvdW5kaW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jb250YWluZXIkZ2V0Qm91bmRpbi5jYWxsKGNvbnRhaW5lcik7XG5cdFx0Y29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCBwb3MgPSB7XG5cdFx0XHR4OiBlLmNsaWVudFggLSAoY29udGFpbmVyID8gdGFyZ2V0UmVjdC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0ICsgKGF1dG9TY3JvbGwgPyAwIDogY29udGFpbmVyLnNjcm9sbExlZnQpIDogdGFyZ2V0UmVjdC5sZWZ0KSxcblx0XHRcdHk6IGUuY2xpZW50WSAtIChjb250YWluZXIgPyB0YXJnZXRSZWN0LnRvcCAtIGNvbnRhaW5lclJlY3QudG9wICsgKGF1dG9TY3JvbGwgPyAwIDogY29udGFpbmVyLnNjcm9sbFRvcCkgOiB0YXJnZXRSZWN0LnRvcClcblx0XHR9O1xuXHRcdGlmICgob25TdGFydCA9PT0gbnVsbCB8fCBvblN0YXJ0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblN0YXJ0KHBvcywgZSkpID09PSBmYWxzZSkgcmV0dXJuO1xuXHRcdHByZXNzZWREZWx0YS52YWx1ZSA9IHBvcztcblx0XHRoYW5kbGVFdmVudChlKTtcblx0fTtcblx0Y29uc3QgbW92ZSA9IChlKSA9PiB7XG5cdFx0aWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgfHwgIWZpbHRlckV2ZW50KGUpKSByZXR1cm47XG5cdFx0aWYgKCFwcmVzc2VkRGVsdGEudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBjb250YWluZXIgPSB0b1ZhbHVlKGNvbnRhaW5lckVsZW1lbnQpO1xuXHRcdGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgY2xhbXBDb250YWluZXJTY3JvbGwoY29udGFpbmVyKTtcblx0XHRjb25zdCB0YXJnZXRSZWN0ID0gdG9WYWx1ZSh0YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGxldCB7IHgsIHkgfSA9IHBvc2l0aW9uLnZhbHVlO1xuXHRcdGlmIChheGlzID09PSBcInhcIiB8fCBheGlzID09PSBcImJvdGhcIikge1xuXHRcdFx0eCA9IGUuY2xpZW50WCAtIHByZXNzZWREZWx0YS52YWx1ZS54O1xuXHRcdFx0aWYgKGNvbnRhaW5lcikgeCA9IE1hdGgubWluKE1hdGgubWF4KDAsIHgpLCBjb250YWluZXIuc2Nyb2xsV2lkdGggLSB0YXJnZXRSZWN0LndpZHRoKTtcblx0XHR9XG5cdFx0aWYgKGF4aXMgPT09IFwieVwiIHx8IGF4aXMgPT09IFwiYm90aFwiKSB7XG5cdFx0XHR5ID0gZS5jbGllbnRZIC0gcHJlc3NlZERlbHRhLnZhbHVlLnk7XG5cdFx0XHRpZiAoY29udGFpbmVyKSB5ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgeSksIGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSB0YXJnZXRSZWN0LmhlaWdodCk7XG5cdFx0fVxuXHRcdGlmICh0b1ZhbHVlKGF1dG9TY3JvbGwpICYmIGNvbnRhaW5lcikge1xuXHRcdFx0aWYgKGF1dG9TY3JvbGxJbnRlcnZhbCA9PT0gbnVsbCkgaGFuZGxlQXV0b1Njcm9sbChjb250YWluZXIsIHRhcmdldFJlY3QsIHtcblx0XHRcdFx0eCxcblx0XHRcdFx0eVxuXHRcdFx0fSk7XG5cdFx0XHR4ICs9IGNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuXHRcdFx0eSArPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuXHRcdH1cblx0XHRpZiAoY29udGFpbmVyICYmIChyZXN0cmljdEluVmlldyB8fCBhdXRvU2Nyb2xsKSkge1xuXHRcdFx0aWYgKGF4aXMgIT09IFwieVwiKSB7XG5cdFx0XHRcdGNvbnN0IHJlbGF0aXZlWCA9IHggLSBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdFx0aWYgKHJlbGF0aXZlWCA8IDApIHggPSBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdFx0ZWxzZSBpZiAocmVsYXRpdmVYID4gY29udGFpbmVyLmNsaWVudFdpZHRoIC0gdGFyZ2V0UmVjdC53aWR0aCkgeCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIHRhcmdldFJlY3Qud2lkdGggKyBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdH1cblx0XHRcdGlmIChheGlzICE9PSBcInhcIikge1xuXHRcdFx0XHRjb25zdCByZWxhdGl2ZVkgPSB5IC0gY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHRcdFx0aWYgKHJlbGF0aXZlWSA8IDApIHkgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuXHRcdFx0XHRlbHNlIGlmIChyZWxhdGl2ZVkgPiBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdGFyZ2V0UmVjdC5oZWlnaHQpIHkgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdGFyZ2V0UmVjdC5oZWlnaHQgKyBjb250YWluZXIuc2Nyb2xsVG9wO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRwb3NpdGlvbi52YWx1ZSA9IHtcblx0XHRcdHgsXG5cdFx0XHR5XG5cdFx0fTtcblx0XHRvbk1vdmUgPT09IG51bGwgfHwgb25Nb3ZlID09PSB2b2lkIDAgfHwgb25Nb3ZlKHBvc2l0aW9uLnZhbHVlLCBlKTtcblx0XHRoYW5kbGVFdmVudChlKTtcblx0fTtcblx0Y29uc3QgZW5kID0gKGUpID0+IHtcblx0XHRpZiAodG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSB8fCAhZmlsdGVyRXZlbnQoZSkpIHJldHVybjtcblx0XHRpZiAoIXByZXNzZWREZWx0YS52YWx1ZSkgcmV0dXJuO1xuXHRcdHByZXNzZWREZWx0YS52YWx1ZSA9IHZvaWQgMDtcblx0XHRpZiAoYXV0b1Njcm9sbCkgc3RvcEF1dG9TY3JvbGwoKTtcblx0XHRvbkVuZCA9PT0gbnVsbCB8fCBvbkVuZCA9PT0gdm9pZCAwIHx8IG9uRW5kKHBvc2l0aW9uLnZhbHVlLCBlKTtcblx0XHRoYW5kbGVFdmVudChlKTtcblx0fTtcblx0aWYgKGlzQ2xpZW50KSB7XG5cdFx0Y29uc3QgY29uZmlnID0gKCkgPT4ge1xuXHRcdFx0dmFyIF9vcHRpb25zJGNhcHR1cmU7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjYXB0dXJlOiAoX29wdGlvbnMkY2FwdHVyZSA9IG9wdGlvbnMuY2FwdHVyZSkgIT09IG51bGwgJiYgX29wdGlvbnMkY2FwdHVyZSAhPT0gdm9pZCAwID8gX29wdGlvbnMkY2FwdHVyZSA6IHRydWUsXG5cdFx0XHRcdHBhc3NpdmU6ICF0b1ZhbHVlKHByZXZlbnREZWZhdWx0JDEpXG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkcmFnZ2luZ0hhbmRsZSwgXCJwb2ludGVyZG93blwiLCBzdGFydCwgY29uZmlnKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGRyYWdnaW5nRWxlbWVudCwgXCJwb2ludGVybW92ZVwiLCBtb3ZlLCBjb25maWcpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZHJhZ2dpbmdFbGVtZW50LCBcInBvaW50ZXJ1cFwiLCBlbmQsIGNvbmZpZyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHQuLi50b1JlZnMocG9zaXRpb24pLFxuXHRcdHBvc2l0aW9uLFxuXHRcdGlzRHJhZ2dpbmc6IGNvbXB1dGVkKCgpID0+ICEhcHJlc3NlZERlbHRhLnZhbHVlKSxcblx0XHRzdHlsZTogY29tcHV0ZWQoKCkgPT4gYFxuICAgICAgbGVmdDogJHtwb3NpdGlvbi52YWx1ZS54fXB4O1xuICAgICAgdG9wOiAke3Bvc2l0aW9uLnZhbHVlLnl9cHg7XG4gICAgICAke2F1dG9TY3JvbGwgPyBcInRleHQtd3JhcDogbm93cmFwO1wiIDogXCJcIn1cbiAgICBgKVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEcm9wWm9uZS9pbmRleC50c1xuZnVuY3Rpb24gdXNlRHJvcFpvbmUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgaXNPdmVyRHJvcFpvbmUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZmlsZXMgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRsZXQgY291bnRlciA9IDA7XG5cdGxldCBpc1ZhbGlkID0gdHJ1ZTtcblx0aWYgKGlzQ2xpZW50KSB7XG5cdFx0dmFyIF9vcHRpb25zJG11bHRpcGxlLCBfb3B0aW9ucyRwcmV2ZW50RGVmYXU7XG5cdFx0Y29uc3QgX29wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8geyBvbkRyb3A6IG9wdGlvbnMgfSA6IG9wdGlvbnM7XG5cdFx0Y29uc3QgbXVsdGlwbGUgPSAoX29wdGlvbnMkbXVsdGlwbGUgPSBfb3B0aW9ucy5tdWx0aXBsZSkgIT09IG51bGwgJiYgX29wdGlvbnMkbXVsdGlwbGUgIT09IHZvaWQgMCA/IF9vcHRpb25zJG11bHRpcGxlIDogdHJ1ZTtcblx0XHRjb25zdCBwcmV2ZW50RGVmYXVsdEZvclVuaGFuZGxlZCA9IChfb3B0aW9ucyRwcmV2ZW50RGVmYXUgPSBfb3B0aW9ucy5wcmV2ZW50RGVmYXVsdEZvclVuaGFuZGxlZCkgIT09IG51bGwgJiYgX29wdGlvbnMkcHJldmVudERlZmF1ICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRwcmV2ZW50RGVmYXUgOiBmYWxzZTtcblx0XHRjb25zdCBnZXRGaWxlcyA9IChldmVudCkgPT4ge1xuXHRcdFx0dmFyIF9ldmVudCRkYXRhVHJhbnNmZXIkZiwgX2V2ZW50JGRhdGFUcmFuc2Zlcjtcblx0XHRcdGNvbnN0IGxpc3QgPSBBcnJheS5mcm9tKChfZXZlbnQkZGF0YVRyYW5zZmVyJGYgPSAoX2V2ZW50JGRhdGFUcmFuc2ZlciA9IGV2ZW50LmRhdGFUcmFuc2ZlcikgPT09IG51bGwgfHwgX2V2ZW50JGRhdGFUcmFuc2ZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGRhdGFUcmFuc2Zlci5maWxlcykgIT09IG51bGwgJiYgX2V2ZW50JGRhdGFUcmFuc2ZlciRmICE9PSB2b2lkIDAgPyBfZXZlbnQkZGF0YVRyYW5zZmVyJGYgOiBbXSk7XG5cdFx0XHRyZXR1cm4gbGlzdC5sZW5ndGggPT09IDAgPyBudWxsIDogbXVsdGlwbGUgPyBsaXN0IDogW2xpc3RbMF1dO1xuXHRcdH07XG5cdFx0Y29uc3QgY2hlY2tEYXRhVHlwZXMgPSAodHlwZXMpID0+IHtcblx0XHRcdGNvbnN0IGRhdGFUeXBlcyA9IHVucmVmKF9vcHRpb25zLmRhdGFUeXBlcyk7XG5cdFx0XHRpZiAodHlwZW9mIGRhdGFUeXBlcyA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZGF0YVR5cGVzKHR5cGVzKTtcblx0XHRcdGlmICghKGRhdGFUeXBlcyA9PT0gbnVsbCB8fCBkYXRhVHlwZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGFUeXBlcy5sZW5ndGgpKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGlmICh0eXBlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblx0XHRcdHJldHVybiB0eXBlcy5ldmVyeSgodHlwZSkgPT4gZGF0YVR5cGVzLnNvbWUoKGFsbG93ZWRUeXBlKSA9PiB0eXBlLmluY2x1ZGVzKGFsbG93ZWRUeXBlKSkpO1xuXHRcdH07XG5cdFx0Y29uc3QgY2hlY2tWYWxpZGl0eSA9IChpdGVtcykgPT4ge1xuXHRcdFx0aWYgKF9vcHRpb25zLmNoZWNrVmFsaWRpdHkpIHJldHVybiBfb3B0aW9ucy5jaGVja1ZhbGlkaXR5KGl0ZW1zKTtcblx0XHRcdGNvbnN0IGRhdGFUeXBlc1ZhbGlkID0gY2hlY2tEYXRhVHlwZXMoQXJyYXkuZnJvbShpdGVtcyAhPT0gbnVsbCAmJiBpdGVtcyAhPT0gdm9pZCAwID8gaXRlbXMgOiBbXSkubWFwKChpdGVtKSA9PiBpdGVtLnR5cGUpKTtcblx0XHRcdGNvbnN0IG11bHRpcGxlRmlsZXNWYWxpZCA9IG11bHRpcGxlIHx8IGl0ZW1zLmxlbmd0aCA8PSAxO1xuXHRcdFx0cmV0dXJuIGRhdGFUeXBlc1ZhbGlkICYmIG11bHRpcGxlRmlsZXNWYWxpZDtcblx0XHR9O1xuXHRcdGNvbnN0IGlzU2FmYXJpID0gKCkgPT4gL14oPzooPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEoXCJjaHJvbWVcIiBpbiB3aW5kb3cpO1xuXHRcdGNvbnN0IGhhbmRsZURyYWdFdmVudCA9IChldmVudCwgZXZlbnRUeXBlKSA9PiB7XG5cdFx0XHR2YXIgX2V2ZW50JGRhdGFUcmFuc2ZlcjIsIF9yZWY7XG5cdFx0XHRjb25zdCBkYXRhVHJhbnNmZXJJdGVtTGlzdCA9IChfZXZlbnQkZGF0YVRyYW5zZmVyMiA9IGV2ZW50LmRhdGFUcmFuc2ZlcikgPT09IG51bGwgfHwgX2V2ZW50JGRhdGFUcmFuc2ZlcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRkYXRhVHJhbnNmZXIyLml0ZW1zO1xuXHRcdFx0aXNWYWxpZCA9IChfcmVmID0gZGF0YVRyYW5zZmVySXRlbUxpc3QgJiYgY2hlY2tWYWxpZGl0eShkYXRhVHJhbnNmZXJJdGVtTGlzdCkpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBmYWxzZTtcblx0XHRcdGlmIChwcmV2ZW50RGVmYXVsdEZvclVuaGFuZGxlZCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmICghaXNTYWZhcmkoKSAmJiAhaXNWYWxpZCkge1xuXHRcdFx0XHRpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwibm9uZVwiO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKGV2ZW50LmRhdGFUcmFuc2ZlcikgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcImNvcHlcIjtcblx0XHRcdGNvbnN0IGN1cnJlbnRGaWxlcyA9IGdldEZpbGVzKGV2ZW50KTtcblx0XHRcdHN3aXRjaCAoZXZlbnRUeXBlKSB7XG5cdFx0XHRcdGNhc2UgXCJlbnRlclwiOlxuXHRcdFx0XHRcdHZhciBfb3B0aW9ucyRvbkVudGVyO1xuXHRcdFx0XHRcdGNvdW50ZXIgKz0gMTtcblx0XHRcdFx0XHRpc092ZXJEcm9wWm9uZS52YWx1ZSA9IHRydWU7XG5cdFx0XHRcdFx0KF9vcHRpb25zJG9uRW50ZXIgPSBfb3B0aW9ucy5vbkVudGVyKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkVudGVyID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25FbnRlci5jYWxsKF9vcHRpb25zLCBudWxsLCBldmVudCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJvdmVyXCI6XG5cdFx0XHRcdFx0dmFyIF9vcHRpb25zJG9uT3Zlcjtcblx0XHRcdFx0XHQoX29wdGlvbnMkb25PdmVyID0gX29wdGlvbnMub25PdmVyKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbk92ZXIgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvbk92ZXIuY2FsbChfb3B0aW9ucywgbnVsbCwgZXZlbnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwibGVhdmVcIjpcblx0XHRcdFx0XHR2YXIgX29wdGlvbnMkb25MZWF2ZTtcblx0XHRcdFx0XHRjb3VudGVyIC09IDE7XG5cdFx0XHRcdFx0aWYgKGNvdW50ZXIgPT09IDApIGlzT3ZlckRyb3Bab25lLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdFx0KF9vcHRpb25zJG9uTGVhdmUgPSBfb3B0aW9ucy5vbkxlYXZlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkxlYXZlID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25MZWF2ZS5jYWxsKF9vcHRpb25zLCBudWxsLCBldmVudCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJkcm9wXCI6XG5cdFx0XHRcdFx0Y291bnRlciA9IDA7XG5cdFx0XHRcdFx0aXNPdmVyRHJvcFpvbmUudmFsdWUgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAoaXNWYWxpZCkge1xuXHRcdFx0XHRcdFx0dmFyIF9vcHRpb25zJG9uRHJvcDtcblx0XHRcdFx0XHRcdGZpbGVzLnZhbHVlID0gY3VycmVudEZpbGVzO1xuXHRcdFx0XHRcdFx0KF9vcHRpb25zJG9uRHJvcCA9IF9vcHRpb25zLm9uRHJvcCkgPT09IG51bGwgfHwgX29wdGlvbnMkb25Ecm9wID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25Ecm9wLmNhbGwoX29wdGlvbnMsIGN1cnJlbnRGaWxlcywgZXZlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImRyYWdlbnRlclwiLCAoZXZlbnQpID0+IGhhbmRsZURyYWdFdmVudChldmVudCwgXCJlbnRlclwiKSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJhZ292ZXJcIiwgKGV2ZW50KSA9PiBoYW5kbGVEcmFnRXZlbnQoZXZlbnQsIFwib3ZlclwiKSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJhZ2xlYXZlXCIsIChldmVudCkgPT4gaGFuZGxlRHJhZ0V2ZW50KGV2ZW50LCBcImxlYXZlXCIpKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkcm9wXCIsIChldmVudCkgPT4gaGFuZGxlRHJhZ0V2ZW50KGV2ZW50LCBcImRyb3BcIikpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0ZmlsZXMsXG5cdFx0aXNPdmVyRHJvcFpvbmVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUmVzaXplT2JzZXJ2ZXIvaW5kZXgudHNcbi8qKlxuKiBSZXBvcnRzIGNoYW5nZXMgdG8gdGhlIGRpbWVuc2lvbnMgb2YgYW4gRWxlbWVudCdzIGNvbnRlbnQgb3IgdGhlIGJvcmRlci1ib3hcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmVzaXplT2JzZXJ2ZXJcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gY2FsbGJhY2tcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VSZXNpemVPYnNlcnZlcih0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywuLi5vYnNlcnZlck9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGxldCBvYnNlcnZlcjtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG5cdFx0aWYgKG9ic2VydmVyKSB7XG5cdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHRvYnNlcnZlciA9IHZvaWQgMDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHN0b3BXYXRjaCA9IHdhdGNoKGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBfdGFyZ2V0cyA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShfdGFyZ2V0cykgPyBfdGFyZ2V0cy5tYXAoKGVsKSA9PiB1bnJlZkVsZW1lbnQoZWwpKSA6IFt1bnJlZkVsZW1lbnQoX3RhcmdldHMpXTtcblx0fSksIChlbHMpID0+IHtcblx0XHRjbGVhbnVwKCk7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHdpbmRvdyQxKSB7XG5cdFx0XHRvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihjYWxsYmFjayk7XG5cdFx0XHRmb3IgKGNvbnN0IF9lbCBvZiBlbHMpIGlmIChfZWwpIG9ic2VydmVyLm9ic2VydmUoX2VsLCBvYnNlcnZlck9wdGlvbnMpO1xuXHRcdH1cblx0fSwge1xuXHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRmbHVzaDogXCJwb3N0XCJcblx0fSk7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0Y2xlYW51cCgpO1xuXHRcdHN0b3BXYXRjaCgpO1xuXHR9O1xuXHR0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUVsZW1lbnRCb3VuZGluZy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGJvdW5kaW5nIGJveCBvZiBhbiBIVE1MIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRCb3VuZGluZ1xuKiBAcGFyYW0gdGFyZ2V0XG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudEJvdW5kaW5nKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgcmVzZXQgPSB0cnVlLCB3aW5kb3dSZXNpemUgPSB0cnVlLCB3aW5kb3dTY3JvbGwgPSB0cnVlLCBpbW1lZGlhdGUgPSB0cnVlLCB1cGRhdGVUaW1pbmcgPSBcInN5bmNcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaGVpZ2h0ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgYm90dG9tID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgbGVmdCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHJpZ2h0ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgdG9wID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3Qgd2lkdGggPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCB4ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgeSA9IHNoYWxsb3dSZWYoMCk7XG5cdGZ1bmN0aW9uIHJlY2FsY3VsYXRlKCkge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKCFlbCkge1xuXHRcdFx0aWYgKHJlc2V0KSB7XG5cdFx0XHRcdGhlaWdodC52YWx1ZSA9IDA7XG5cdFx0XHRcdGJvdHRvbS52YWx1ZSA9IDA7XG5cdFx0XHRcdGxlZnQudmFsdWUgPSAwO1xuXHRcdFx0XHRyaWdodC52YWx1ZSA9IDA7XG5cdFx0XHRcdHRvcC52YWx1ZSA9IDA7XG5cdFx0XHRcdHdpZHRoLnZhbHVlID0gMDtcblx0XHRcdFx0eC52YWx1ZSA9IDA7XG5cdFx0XHRcdHkudmFsdWUgPSAwO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0aGVpZ2h0LnZhbHVlID0gcmVjdC5oZWlnaHQ7XG5cdFx0Ym90dG9tLnZhbHVlID0gcmVjdC5ib3R0b207XG5cdFx0bGVmdC52YWx1ZSA9IHJlY3QubGVmdDtcblx0XHRyaWdodC52YWx1ZSA9IHJlY3QucmlnaHQ7XG5cdFx0dG9wLnZhbHVlID0gcmVjdC50b3A7XG5cdFx0d2lkdGgudmFsdWUgPSByZWN0LndpZHRoO1xuXHRcdHgudmFsdWUgPSByZWN0Lng7XG5cdFx0eS52YWx1ZSA9IHJlY3QueTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGUoKSB7XG5cdFx0aWYgKHVwZGF0ZVRpbWluZyA9PT0gXCJzeW5jXCIpIHJlY2FsY3VsYXRlKCk7XG5cdFx0ZWxzZSBpZiAodXBkYXRlVGltaW5nID09PSBcIm5leHQtZnJhbWVcIikgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlY2FsY3VsYXRlKCkpO1xuXHR9XG5cdHVzZVJlc2l6ZU9ic2VydmVyKHRhcmdldCwgdXBkYXRlKTtcblx0d2F0Y2goKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCksIChlbGUpID0+ICFlbGUgJiYgdXBkYXRlKCkpO1xuXHR1c2VNdXRhdGlvbk9ic2VydmVyKHRhcmdldCwgdXBkYXRlLCB7IGF0dHJpYnV0ZUZpbHRlcjogW1wic3R5bGVcIiwgXCJjbGFzc1wiXSB9KTtcblx0aWYgKHdpbmRvd1Njcm9sbCkgdXNlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB1cGRhdGUsIHtcblx0XHRjYXB0dXJlOiB0cnVlLFxuXHRcdHBhc3NpdmU6IHRydWVcblx0fSk7XG5cdGlmICh3aW5kb3dSZXNpemUpIHVzZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0aWYgKGltbWVkaWF0ZSkgdXBkYXRlKCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGhlaWdodCxcblx0XHRib3R0b20sXG5cdFx0bGVmdCxcblx0XHRyaWdodCxcblx0XHR0b3AsXG5cdFx0d2lkdGgsXG5cdFx0eCxcblx0XHR5LFxuXHRcdHVwZGF0ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50QnlQb2ludC9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ3KG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiBpbnRlcnZhbCA9PT0gXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiA/IChjYikgPT4gdXNlUmFmRm4oY2IsIHsgaW1tZWRpYXRlIH0pIDogKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCBpbnRlcnZhbCwgeyBpbW1lZGlhdGUgfSk7XG5cdH1cblx0cmV0dXJuIHVzZVJhZkZuO1xufVxuLyoqXG4qIFJlYWN0aXZlIGVsZW1lbnQgYnkgcG9pbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRCeVBvaW50XG4qIEBwYXJhbSBvcHRpb25zIC0gVXNlRWxlbWVudEJ5UG9pbnRPcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudEJ5UG9pbnQob3B0aW9ucykge1xuXHRjb25zdCB7IHgsIHksIGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50LCBtdWx0aXBsZSwgc2NoZWR1bGVyID0gZ2V0RGVmYXVsdFNjaGVkdWxlciQ3KG9wdGlvbnMpIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4ge1xuXHRcdGlmICh0b1ZhbHVlKG11bHRpcGxlKSkgcmV0dXJuIGRvY3VtZW50JDEgJiYgXCJlbGVtZW50c0Zyb21Qb2ludFwiIGluIGRvY3VtZW50JDE7XG5cdFx0cmV0dXJuIGRvY3VtZW50JDEgJiYgXCJlbGVtZW50RnJvbVBvaW50XCIgaW4gZG9jdW1lbnQkMTtcblx0fSk7XG5cdGNvbnN0IGVsZW1lbnQgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGVsZW1lbnQsXG5cdFx0Li4uc2NoZWR1bGVyKCgpID0+IHtcblx0XHRcdHZhciBfZG9jdW1lbnQkZWxlbWVudHNGcm8sIF9kb2N1bWVudCRlbGVtZW50RnJvbTtcblx0XHRcdGVsZW1lbnQudmFsdWUgPSB0b1ZhbHVlKG11bHRpcGxlKSA/IChfZG9jdW1lbnQkZWxlbWVudHNGcm8gPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuZWxlbWVudHNGcm9tUG9pbnQodG9WYWx1ZSh4KSwgdG9WYWx1ZSh5KSkpICE9PSBudWxsICYmIF9kb2N1bWVudCRlbGVtZW50c0ZybyAhPT0gdm9pZCAwID8gX2RvY3VtZW50JGVsZW1lbnRzRnJvIDogW10gOiAoX2RvY3VtZW50JGVsZW1lbnRGcm9tID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmVsZW1lbnRGcm9tUG9pbnQodG9WYWx1ZSh4KSwgdG9WYWx1ZSh5KSkpICE9PSBudWxsICYmIF9kb2N1bWVudCRlbGVtZW50RnJvbSAhPT0gdm9pZCAwID8gX2RvY3VtZW50JGVsZW1lbnRGcm9tIDogbnVsbDtcblx0XHR9KVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50SG92ZXIvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZUVsZW1lbnRIb3ZlcihlbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZGVsYXlFbnRlciA9IDAsIGRlbGF5TGVhdmUgPSAwLCB0cmlnZ2VyT25SZW1vdmFsID0gZmFsc2UsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0hvdmVyZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHRpbWVyO1xuXHRjb25zdCB0b2dnbGUgPSAoZW50ZXJpbmcpID0+IHtcblx0XHRjb25zdCBkZWxheSA9IGVudGVyaW5nID8gZGVsYXlFbnRlciA6IGRlbGF5TGVhdmU7XG5cdFx0aWYgKHRpbWVyKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0dGltZXIgPSB2b2lkIDA7XG5cdFx0fVxuXHRcdGlmIChkZWxheSkgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGlzSG92ZXJlZC52YWx1ZSA9IGVudGVyaW5nLCBkZWxheSk7XG5cdFx0ZWxzZSBpc0hvdmVyZWQudmFsdWUgPSBlbnRlcmluZztcblx0fTtcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIGlzSG92ZXJlZDtcblx0dXNlRXZlbnRMaXN0ZW5lcihlbCwgXCJtb3VzZWVudGVyXCIsICgpID0+IHRvZ2dsZSh0cnVlKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKGVsLCBcIm1vdXNlbGVhdmVcIiwgKCkgPT4gdG9nZ2xlKGZhbHNlKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRpZiAodHJpZ2dlck9uUmVtb3ZhbCkgb25FbGVtZW50UmVtb3ZhbChjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQoZWwpKSwgKCkgPT4gdG9nZ2xlKGZhbHNlKSk7XG5cdHJldHVybiBpc0hvdmVyZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUVsZW1lbnRTaXplL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgc2l6ZSBvZiBhbiBIVE1MIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRTaXplXG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudFNpemUodGFyZ2V0LCBpbml0aWFsU2l6ZSA9IHtcblx0d2lkdGg6IDAsXG5cdGhlaWdodDogMFxufSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGJveCA9IFwiY29udGVudC1ib3hcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTVkcgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF91bnJlZkVsZW1lbnQ7XG5cdFx0cmV0dXJuIChfdW5yZWZFbGVtZW50ID0gdW5yZWZFbGVtZW50KHRhcmdldCkpID09PSBudWxsIHx8IF91bnJlZkVsZW1lbnQgPT09IHZvaWQgMCB8fCAoX3VucmVmRWxlbWVudCA9IF91bnJlZkVsZW1lbnQubmFtZXNwYWNlVVJJKSA9PT0gbnVsbCB8fCBfdW5yZWZFbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdW5yZWZFbGVtZW50LmluY2x1ZGVzKFwic3ZnXCIpO1xuXHR9KTtcblx0Y29uc3Qgd2lkdGggPSBzaGFsbG93UmVmKGluaXRpYWxTaXplLndpZHRoKTtcblx0Y29uc3QgaGVpZ2h0ID0gc2hhbGxvd1JlZihpbml0aWFsU2l6ZS5oZWlnaHQpO1xuXHRjb25zdCB7IHN0b3A6IHN0b3AxIH0gPSB1c2VSZXNpemVPYnNlcnZlcih0YXJnZXQsIChbZW50cnldKSA9PiB7XG5cdFx0Y29uc3QgYm94U2l6ZSA9IGJveCA9PT0gXCJib3JkZXItYm94XCIgPyBlbnRyeS5ib3JkZXJCb3hTaXplIDogYm94ID09PSBcImNvbnRlbnQtYm94XCIgPyBlbnRyeS5jb250ZW50Qm94U2l6ZSA6IGVudHJ5LmRldmljZVBpeGVsQ29udGVudEJveFNpemU7XG5cdFx0aWYgKHdpbmRvdyQxICYmIGlzU1ZHLnZhbHVlKSB7XG5cdFx0XHRjb25zdCAkZWxlbSA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdFx0aWYgKCRlbGVtKSB7XG5cdFx0XHRcdGNvbnN0IHJlY3QgPSAkZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdFx0d2lkdGgudmFsdWUgPSByZWN0LndpZHRoO1xuXHRcdFx0XHRoZWlnaHQudmFsdWUgPSByZWN0LmhlaWdodDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGJveFNpemUpIHtcblx0XHRcdGNvbnN0IGZvcm1hdEJveFNpemUgPSB0b0FycmF5KGJveFNpemUpO1xuXHRcdFx0d2lkdGgudmFsdWUgPSBmb3JtYXRCb3hTaXplLnJlZHVjZSgoYWNjLCB7IGlubGluZVNpemUgfSkgPT4gYWNjICsgaW5saW5lU2l6ZSwgMCk7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSBmb3JtYXRCb3hTaXplLnJlZHVjZSgoYWNjLCB7IGJsb2NrU2l6ZSB9KSA9PiBhY2MgKyBibG9ja1NpemUsIDApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aWR0aC52YWx1ZSA9IGVudHJ5LmNvbnRlbnRSZWN0LndpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gZW50cnkuY29udGVudFJlY3QuaGVpZ2h0O1xuXHRcdH1cblx0fSwgb3B0aW9ucyk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgZWxlID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKGVsZSkge1xuXHRcdFx0d2lkdGgudmFsdWUgPSBcIm9mZnNldFdpZHRoXCIgaW4gZWxlID8gZWxlLm9mZnNldFdpZHRoIDogaW5pdGlhbFNpemUud2lkdGg7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSBcIm9mZnNldEhlaWdodFwiIGluIGVsZSA/IGVsZS5vZmZzZXRIZWlnaHQgOiBpbml0aWFsU2l6ZS5oZWlnaHQ7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3Qgc3RvcDIgPSB3YXRjaCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSwgKGVsZSkgPT4ge1xuXHRcdHdpZHRoLnZhbHVlID0gZWxlID8gaW5pdGlhbFNpemUud2lkdGggOiAwO1xuXHRcdGhlaWdodC52YWx1ZSA9IGVsZSA/IGluaXRpYWxTaXplLmhlaWdodCA6IDA7XG5cdH0pO1xuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdHN0b3AxKCk7XG5cdFx0c3RvcDIoKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHdpZHRoLFxuXHRcdGhlaWdodCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUludGVyc2VjdGlvbk9ic2VydmVyL2luZGV4LnRzXG4vKipcbiogRGV0ZWN0cyB0aGF0IGEgdGFyZ2V0IGVsZW1lbnQncyB2aXNpYmlsaXR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VJbnRlcnNlY3Rpb25PYnNlcnZlclxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBjYWxsYmFja1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUludGVyc2VjdGlvbk9ic2VydmVyKHRhcmdldCwgY2FsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHJvb3QsIHJvb3RNYXJnaW4sIHRocmVzaG9sZCA9IDAsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJJbnRlcnNlY3Rpb25PYnNlcnZlclwiIGluIHdpbmRvdyQxKTtcblx0Y29uc3QgdGFyZ2V0cyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gdG9BcnJheSh0b1ZhbHVlKHRhcmdldCkpLm1hcCh1bnJlZkVsZW1lbnQpLmZpbHRlcihub3ROdWxsaXNoKTtcblx0fSk7XG5cdGxldCBjbGVhbnVwID0gbm9vcDtcblx0Y29uc3QgaXNBY3RpdmUgPSBzaGFsbG93UmVmKGltbWVkaWF0ZSk7XG5cdGNvbnN0IHN0b3BXYXRjaCA9IGlzU3VwcG9ydGVkLnZhbHVlID8gd2F0Y2goKCkgPT4gW1xuXHRcdHRhcmdldHMudmFsdWUsXG5cdFx0dW5yZWZFbGVtZW50KHJvb3QpLFxuXHRcdHRvVmFsdWUocm9vdE1hcmdpbiksXG5cdFx0aXNBY3RpdmUudmFsdWVcblx0XSwgKFt0YXJnZXRzJDEsIHJvb3QkMSwgcm9vdE1hcmdpbiQxXSkgPT4ge1xuXHRcdGNsZWFudXAoKTtcblx0XHRpZiAoIWlzQWN0aXZlLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKCF0YXJnZXRzJDEubGVuZ3RoKSByZXR1cm47XG5cdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIHtcblx0XHRcdHJvb3Q6IHVucmVmRWxlbWVudChyb290JDEpLFxuXHRcdFx0cm9vdE1hcmdpbjogcm9vdE1hcmdpbiQxLFxuXHRcdFx0dGhyZXNob2xkXG5cdFx0fSk7XG5cdFx0dGFyZ2V0cyQxLmZvckVhY2goKGVsKSA9PiBlbCAmJiBvYnNlcnZlci5vYnNlcnZlKGVsKSk7XG5cdFx0Y2xlYW51cCA9ICgpID0+IHtcblx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdGNsZWFudXAgPSBub29wO1xuXHRcdH07XG5cdH0sIHtcblx0XHRpbW1lZGlhdGUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pIDogbm9vcDtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRjbGVhbnVwKCk7XG5cdFx0c3RvcFdhdGNoKCk7XG5cdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNBY3RpdmUsXG5cdFx0cGF1c2UoKSB7XG5cdFx0XHRjbGVhbnVwKCk7XG5cdFx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHRcdH0sXG5cdFx0cmVzdW1lKCkge1xuXHRcdFx0aXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuXHRcdH0sXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50VmlzaWJpbGl0eS9pbmRleC50c1xuLyoqXG4qIFRyYWNrcyB0aGUgdmlzaWJpbGl0eSBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgdmlld3BvcnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUVsZW1lbnRWaXNpYmlsaXR5XG4qL1xuZnVuY3Rpb24gdXNlRWxlbWVudFZpc2liaWxpdHkoZWxlbWVudCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHNjcm9sbFRhcmdldCwgdGhyZXNob2xkID0gMCwgcm9vdE1hcmdpbiwgb25jZSA9IGZhbHNlLCBpbml0aWFsVmFsdWUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZWxlbWVudElzVmlzaWJsZSA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgeyBzdG9wIH0gPSB1c2VJbnRlcnNlY3Rpb25PYnNlcnZlcihlbGVtZW50LCAoaW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyaWVzKSA9PiB7XG5cdFx0bGV0IGlzSW50ZXJzZWN0aW5nID0gZWxlbWVudElzVmlzaWJsZS52YWx1ZTtcblx0XHRsZXQgbGF0ZXN0VGltZSA9IDA7XG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiBpbnRlcnNlY3Rpb25PYnNlcnZlckVudHJpZXMpIGlmIChlbnRyeS50aW1lID49IGxhdGVzdFRpbWUpIHtcblx0XHRcdGxhdGVzdFRpbWUgPSBlbnRyeS50aW1lO1xuXHRcdFx0aXNJbnRlcnNlY3RpbmcgPSBlbnRyeS5pc0ludGVyc2VjdGluZztcblx0XHR9XG5cdFx0ZWxlbWVudElzVmlzaWJsZS52YWx1ZSA9IGlzSW50ZXJzZWN0aW5nO1xuXHRcdGlmIChvbmNlKSB3YXRjaE9uY2UoZWxlbWVudElzVmlzaWJsZSwgKCkgPT4ge1xuXHRcdFx0c3RvcCgpO1xuXHRcdH0pO1xuXHR9LCB7XG5cdFx0cm9vdDogc2Nyb2xsVGFyZ2V0LFxuXHRcdHdpbmRvdzogd2luZG93JDEsXG5cdFx0dGhyZXNob2xkLFxuXHRcdHJvb3RNYXJnaW5cblx0fSk7XG5cdHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFdmVudEJ1cy9pbnRlcm5hbC50c1xuY29uc3QgZXZlbnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRXZlbnRCdXMvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VFdmVudEJ1cyhrZXkpIHtcblx0Y29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50U2NvcGUoKTtcblx0ZnVuY3Rpb24gb24obGlzdGVuZXIpIHtcblx0XHR2YXIgX3Njb3BlJGNsZWFudXBzO1xuXHRcdGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50cy5nZXQoa2V5KSB8fCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuXHRcdGV2ZW50cy5zZXQoa2V5LCBsaXN0ZW5lcnMpO1xuXHRcdGNvbnN0IF9vZmYgPSAoKSA9PiBvZmYobGlzdGVuZXIpO1xuXHRcdHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB2b2lkIDAgfHwgKF9zY29wZSRjbGVhbnVwcyA9IHNjb3BlLmNsZWFudXBzKSA9PT0gbnVsbCB8fCBfc2NvcGUkY2xlYW51cHMgPT09IHZvaWQgMCB8fCBfc2NvcGUkY2xlYW51cHMucHVzaChfb2ZmKTtcblx0XHRyZXR1cm4gX29mZjtcblx0fVxuXHRmdW5jdGlvbiBvbmNlKGxpc3RlbmVyKSB7XG5cdFx0ZnVuY3Rpb24gX2xpc3RlbmVyKC4uLmFyZ3MpIHtcblx0XHRcdG9mZihfbGlzdGVuZXIpO1xuXHRcdFx0bGlzdGVuZXIoLi4uYXJncyk7XG5cdFx0fVxuXHRcdHJldHVybiBvbihfbGlzdGVuZXIpO1xuXHR9XG5cdGZ1bmN0aW9uIG9mZihsaXN0ZW5lcikge1xuXHRcdGNvbnN0IGxpc3RlbmVycyA9IGV2ZW50cy5nZXQoa2V5KTtcblx0XHRpZiAoIWxpc3RlbmVycykgcmV0dXJuO1xuXHRcdGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuXHRcdGlmICghbGlzdGVuZXJzLnNpemUpIHJlc2V0KCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cdFx0ZXZlbnRzLmRlbGV0ZShrZXkpO1xuXHR9XG5cdGZ1bmN0aW9uIGVtaXQoZXZlbnQsIHBheWxvYWQpIHtcblx0XHR2YXIgX2V2ZW50cyRnZXQ7XG5cdFx0KF9ldmVudHMkZ2V0ID0gZXZlbnRzLmdldChrZXkpKSA9PT0gbnVsbCB8fCBfZXZlbnRzJGdldCA9PT0gdm9pZCAwIHx8IF9ldmVudHMkZ2V0LmZvckVhY2goKHYpID0+IHYoZXZlbnQsIHBheWxvYWQpKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdG9uLFxuXHRcdG9uY2UsXG5cdFx0b2ZmLFxuXHRcdGVtaXQsXG5cdFx0cmVzZXRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRXZlbnRTb3VyY2UvaW5kZXgudHNcbmZ1bmN0aW9uIHJlc29sdmVOZXN0ZWRPcHRpb25zJDEob3B0aW9ucykge1xuXHRpZiAob3B0aW9ucyA9PT0gdHJ1ZSkgcmV0dXJuIHt9O1xuXHRyZXR1cm4gb3B0aW9ucztcbn1cbi8qKlxuKiBSZWFjdGl2ZSB3cmFwcGVyIGZvciBFdmVudFNvdXJjZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRXZlbnRTb3VyY2VcbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRTb3VyY2UvRXZlbnRTb3VyY2UgRXZlbnRTb3VyY2VcbiogQHBhcmFtIHVybFxuKiBAcGFyYW0gZXZlbnRzXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRXZlbnRTb3VyY2UodXJsLCBldmVudHMkMSA9IFtdLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgZXZlbnQgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBkYXRhID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3Qgc3RhdHVzID0gc2hhbGxvd1JlZihcIkNPTk5FQ1RJTkdcIik7XG5cdGNvbnN0IGV2ZW50U291cmNlID0gcmVmKG51bGwpO1xuXHRjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHVybFJlZiA9IHRvUmVmKHVybCk7XG5cdGNvbnN0IGxhc3RFdmVudElkID0gc2hhbGxvd1JlZihudWxsKTtcblx0bGV0IGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcblx0bGV0IHJldHJpZWQgPSAwO1xuXHRjb25zdCB7IHdpdGhDcmVkZW50aWFscyA9IGZhbHNlLCBpbW1lZGlhdGUgPSB0cnVlLCBhdXRvQ29ubmVjdCA9IHRydWUsIGF1dG9SZWNvbm5lY3QsIHNlcmlhbGl6ZXIgPSB7IHJlYWQ6ICh2KSA9PiB2IH0gfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNsb3NlID0gKCkgPT4ge1xuXHRcdGlmIChpc0NsaWVudCAmJiBldmVudFNvdXJjZS52YWx1ZSkge1xuXHRcdFx0ZXZlbnRTb3VyY2UudmFsdWUuY2xvc2UoKTtcblx0XHRcdGV2ZW50U291cmNlLnZhbHVlID0gbnVsbDtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwiQ0xPU0VEXCI7XG5cdFx0XHRleHBsaWNpdGx5Q2xvc2VkID0gdHJ1ZTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IF9pbml0ID0gKCkgPT4ge1xuXHRcdGlmIChleHBsaWNpdGx5Q2xvc2VkIHx8IHR5cGVvZiB1cmxSZWYudmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblx0XHRjb25zdCBlcyA9IG5ldyBFdmVudFNvdXJjZSh1cmxSZWYudmFsdWUsIHsgd2l0aENyZWRlbnRpYWxzIH0pO1xuXHRcdHN0YXR1cy52YWx1ZSA9IFwiQ09OTkVDVElOR1wiO1xuXHRcdGV2ZW50U291cmNlLnZhbHVlID0gZXM7XG5cdFx0ZXMub25vcGVuID0gKCkgPT4ge1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJPUEVOXCI7XG5cdFx0XHRlcnJvci52YWx1ZSA9IG51bGw7XG5cdFx0fTtcblx0XHRlcy5vbmVycm9yID0gKGUpID0+IHtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwiQ0xPU0VEXCI7XG5cdFx0XHRlcnJvci52YWx1ZSA9IGU7XG5cdFx0XHRpZiAoZXMucmVhZHlTdGF0ZSA9PT0gMiAmJiAhZXhwbGljaXRseUNsb3NlZCAmJiBhdXRvUmVjb25uZWN0KSB7XG5cdFx0XHRcdGVzLmNsb3NlKCk7XG5cdFx0XHRcdGNvbnN0IHsgcmV0cmllcyA9IC0xLCBkZWxheSA9IDFlMywgb25GYWlsZWQgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zJDEoYXV0b1JlY29ubmVjdCk7XG5cdFx0XHRcdHJldHJpZWQgKz0gMTtcblx0XHRcdFx0aWYgKHR5cGVvZiByZXRyaWVzID09PSBcIm51bWJlclwiICYmIChyZXRyaWVzIDwgMCB8fCByZXRyaWVkIDwgcmV0cmllcykpIHNldFRpbWVvdXQoX2luaXQsIGRlbGF5KTtcblx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIHJldHJpZXMgPT09IFwiZnVuY3Rpb25cIiAmJiByZXRyaWVzKCkpIHNldFRpbWVvdXQoX2luaXQsIGRlbGF5KTtcblx0XHRcdFx0ZWxzZSBvbkZhaWxlZCA9PT0gbnVsbCB8fCBvbkZhaWxlZCA9PT0gdm9pZCAwIHx8IG9uRmFpbGVkKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRlcy5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuXHRcdFx0dmFyIF9zZXJpYWxpemVyJHJlYWQ7XG5cdFx0XHRldmVudC52YWx1ZSA9IG51bGw7XG5cdFx0XHRkYXRhLnZhbHVlID0gKF9zZXJpYWxpemVyJHJlYWQgPSBzZXJpYWxpemVyLnJlYWQoZS5kYXRhKSkgIT09IG51bGwgJiYgX3NlcmlhbGl6ZXIkcmVhZCAhPT0gdm9pZCAwID8gX3NlcmlhbGl6ZXIkcmVhZCA6IG51bGw7XG5cdFx0XHRsYXN0RXZlbnRJZC52YWx1ZSA9IGUubGFzdEV2ZW50SWQ7XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IGV2ZW50X25hbWUgb2YgZXZlbnRzJDEpIHVzZUV2ZW50TGlzdGVuZXIoZXMsIGV2ZW50X25hbWUsIChlKSA9PiB7XG5cdFx0XHR2YXIgX3NlcmlhbGl6ZXIkcmVhZDIsIF9lJGxhc3RFdmVudElkO1xuXHRcdFx0ZXZlbnQudmFsdWUgPSBldmVudF9uYW1lO1xuXHRcdFx0ZGF0YS52YWx1ZSA9IChfc2VyaWFsaXplciRyZWFkMiA9IHNlcmlhbGl6ZXIucmVhZChlLmRhdGEpKSAhPT0gbnVsbCAmJiBfc2VyaWFsaXplciRyZWFkMiAhPT0gdm9pZCAwID8gX3NlcmlhbGl6ZXIkcmVhZDIgOiBudWxsO1xuXHRcdFx0bGFzdEV2ZW50SWQudmFsdWUgPSAoX2UkbGFzdEV2ZW50SWQgPSBlLmxhc3RFdmVudElkKSAhPT0gbnVsbCAmJiBfZSRsYXN0RXZlbnRJZCAhPT0gdm9pZCAwID8gX2UkbGFzdEV2ZW50SWQgOiBudWxsO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fTtcblx0Y29uc3Qgb3BlbiA9ICgpID0+IHtcblx0XHRpZiAoIWlzQ2xpZW50KSByZXR1cm47XG5cdFx0Y2xvc2UoKTtcblx0XHRleHBsaWNpdGx5Q2xvc2VkID0gZmFsc2U7XG5cdFx0cmV0cmllZCA9IDA7XG5cdFx0X2luaXQoKTtcblx0fTtcblx0aWYgKGltbWVkaWF0ZSkgb3BlbigpO1xuXHRpZiAoYXV0b0Nvbm5lY3QpIHdhdGNoKHVybFJlZiwgb3Blbik7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKGNsb3NlKTtcblx0cmV0dXJuIHtcblx0XHRldmVudFNvdXJjZSxcblx0XHRldmVudCxcblx0XHRkYXRhLFxuXHRcdHN0YXR1cyxcblx0XHRlcnJvcixcblx0XHRvcGVuLFxuXHRcdGNsb3NlLFxuXHRcdGxhc3RFdmVudElkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUV5ZURyb3BwZXIvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBbRXllRHJvcHBlciBBUEldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FeWVEcm9wcGVyX0FQSSlcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRXllRHJvcHBlclxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUV5ZURyb3BwZXIob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFZhbHVlID0gXCJcIiB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgXCJFeWVEcm9wcGVyXCIgaW4gd2luZG93KTtcblx0Y29uc3Qgc1JHQkhleCA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0YXN5bmMgZnVuY3Rpb24gb3BlbihvcGVuT3B0aW9ucykge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBuZXcgd2luZG93LkV5ZURyb3BwZXIoKS5vcGVuKG9wZW5PcHRpb25zKTtcblx0XHRzUkdCSGV4LnZhbHVlID0gcmVzdWx0LnNSR0JIZXg7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHNSR0JIZXgsXG5cdFx0b3BlblxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGYXZpY29uL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VGYXZpY29uKG5ld0ljb24gPSBudWxsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBiYXNlVXJsID0gXCJcIiwgcmVsID0gXCJpY29uXCIsIGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBmYXZpY29uID0gdG9SZWYobmV3SWNvbik7XG5cdGNvbnN0IGFwcGx5SWNvbiA9IChpY29uKSA9PiB7XG5cdFx0Y29uc3QgZWxlbWVudHMgPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuaGVhZC5xdWVyeVNlbGVjdG9yQWxsKGBsaW5rW3JlbCo9XCIke3JlbH1cIl1gKTtcblx0XHRpZiAoIWVsZW1lbnRzIHx8IGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29uc3QgbGluayA9IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcblx0XHRcdGlmIChsaW5rKSB7XG5cdFx0XHRcdGxpbmsucmVsID0gcmVsO1xuXHRcdFx0XHRsaW5rLmhyZWYgPSBgJHtiYXNlVXJsfSR7aWNvbn1gO1xuXHRcdFx0XHRsaW5rLnR5cGUgPSBgaW1hZ2UvJHtpY29uLnNwbGl0KFwiLlwiKS5wb3AoKX1gO1xuXHRcdFx0XHRkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCB8fCBkb2N1bWVudCQxLmhlYWQuYXBwZW5kKGxpbmspO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbGVtZW50cyA9PT0gbnVsbCB8fCBlbGVtZW50cyA9PT0gdm9pZCAwIHx8IGVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiBlbC5ocmVmID0gYCR7YmFzZVVybH0ke2ljb259YCk7XG5cdH07XG5cdHdhdGNoKGZhdmljb24sIChpLCBvKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpID09PSBcInN0cmluZ1wiICYmIGkgIT09IG8pIGFwcGx5SWNvbihpKTtcblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHJldHVybiBmYXZpY29uO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGZXRjaC9pbmRleC50c1xuY29uc3QgcGF5bG9hZE1hcHBpbmcgPSB7XG5cdGpzb246IFwiYXBwbGljYXRpb24vanNvblwiLFxuXHR0ZXh0OiBcInRleHQvcGxhaW5cIlxufTtcbi8qKlxuKiAhISFJTVBPUlRBTlQhISFcbipcbiogSWYgeW91IHVwZGF0ZSB0aGUgVXNlRmV0Y2hPcHRpb25zIGludGVyZmFjZSwgYmUgc3VyZSB0byB1cGRhdGUgdGhpcyBvYmplY3RcbiogdG8gaW5jbHVkZSB0aGUgbmV3IG9wdGlvbnNcbiovXG5mdW5jdGlvbiBpc0ZldGNoT3B0aW9ucyhvYmopIHtcblx0cmV0dXJuIG9iaiAmJiBjb250YWluc1Byb3Aob2JqLCBcImltbWVkaWF0ZVwiLCBcInJlZmV0Y2hcIiwgXCJpbml0aWFsRGF0YVwiLCBcInRpbWVvdXRcIiwgXCJiZWZvcmVGZXRjaFwiLCBcImFmdGVyRmV0Y2hcIiwgXCJvbkZldGNoRXJyb3JcIiwgXCJmZXRjaFwiLCBcInVwZGF0ZURhdGFPbkVycm9yXCIpO1xufVxuY29uc3QgcmVBYnNvbHV0ZSA9IC9eKD86W2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pO1xuZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcblx0cmV0dXJuIHJlQWJzb2x1dGUudGVzdCh1cmwpO1xufVxuZnVuY3Rpb24gaGVhZGVyc1RvT2JqZWN0KGhlYWRlcnMpIHtcblx0aWYgKHR5cGVvZiBIZWFkZXJzICE9PSBcInVuZGVmaW5lZFwiICYmIGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGhlYWRlcnMuZW50cmllcygpKTtcblx0cmV0dXJuIGhlYWRlcnM7XG59XG5mdW5jdGlvbiBjb21iaW5lQ2FsbGJhY2tzKGNvbWJpbmF0aW9uLCAuLi5jYWxsYmFja3MpIHtcblx0aWYgKGNvbWJpbmF0aW9uID09PSBcIm92ZXJ3cml0ZVwiKSByZXR1cm4gYXN5bmMgKGN0eCkgPT4ge1xuXHRcdGxldCBjYWxsYmFjaztcblx0XHRmb3IgKGxldCBpID0gY2FsbGJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoY2FsbGJhY2tzW2ldICE9IG51bGwpIHtcblx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2tzW2ldO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmIChjYWxsYmFjaykgcmV0dXJuIHtcblx0XHRcdC4uLmN0eCxcblx0XHRcdC4uLmF3YWl0IGNhbGxiYWNrKGN0eClcblx0XHR9O1xuXHRcdHJldHVybiBjdHg7XG5cdH07XG5cdGVsc2UgcmV0dXJuIGFzeW5jIChjdHgpID0+IHtcblx0XHRmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykgaWYgKGNhbGxiYWNrKSBjdHggPSB7XG5cdFx0XHQuLi5jdHgsXG5cdFx0XHQuLi5hd2FpdCBjYWxsYmFjayhjdHgpXG5cdFx0fTtcblx0XHRyZXR1cm4gY3R4O1xuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlRmV0Y2goY29uZmlnID0ge30pIHtcblx0Y29uc3QgX2NvbWJpbmF0aW9uID0gY29uZmlnLmNvbWJpbmF0aW9uIHx8IFwiY2hhaW5cIjtcblx0Y29uc3QgX29wdGlvbnMgPSBjb25maWcub3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgX2ZldGNoT3B0aW9ucyA9IGNvbmZpZy5mZXRjaE9wdGlvbnMgfHwge307XG5cdGZ1bmN0aW9uIHVzZUZhY3RvcnlGZXRjaCh1cmwsIC4uLmFyZ3MpIHtcblx0XHRjb25zdCBjb21wdXRlZFVybCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdGNvbnN0IGJhc2VVcmwgPSB0b1ZhbHVlKGNvbmZpZy5iYXNlVXJsKTtcblx0XHRcdGNvbnN0IHRhcmdldFVybCA9IHRvVmFsdWUodXJsKTtcblx0XHRcdHJldHVybiBiYXNlVXJsICYmICFpc0Fic29sdXRlVVJMKHRhcmdldFVybCkgPyBqb2luUGF0aHMoYmFzZVVybCwgdGFyZ2V0VXJsKSA6IHRhcmdldFVybDtcblx0XHR9KTtcblx0XHRsZXQgb3B0aW9ucyA9IF9vcHRpb25zO1xuXHRcdGxldCBmZXRjaE9wdGlvbnMgPSBfZmV0Y2hPcHRpb25zO1xuXHRcdGlmIChhcmdzLmxlbmd0aCA+IDApIGlmIChpc0ZldGNoT3B0aW9ucyhhcmdzWzBdKSkgb3B0aW9ucyA9IHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5hcmdzWzBdLFxuXHRcdFx0YmVmb3JlRmV0Y2g6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5iZWZvcmVGZXRjaCwgYXJnc1swXS5iZWZvcmVGZXRjaCksXG5cdFx0XHRhZnRlckZldGNoOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMuYWZ0ZXJGZXRjaCwgYXJnc1swXS5hZnRlckZldGNoKSxcblx0XHRcdG9uRmV0Y2hFcnJvcjogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLm9uRmV0Y2hFcnJvciwgYXJnc1swXS5vbkZldGNoRXJyb3IpXG5cdFx0fTtcblx0XHRlbHNlIGZldGNoT3B0aW9ucyA9IHtcblx0XHRcdC4uLmZldGNoT3B0aW9ucyxcblx0XHRcdC4uLmFyZ3NbMF0sXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdC4uLmhlYWRlcnNUb09iamVjdChmZXRjaE9wdGlvbnMuaGVhZGVycykgfHwge30sXG5cdFx0XHRcdC4uLmhlYWRlcnNUb09iamVjdChhcmdzWzBdLmhlYWRlcnMpIHx8IHt9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpZiAoYXJncy5sZW5ndGggPiAxICYmIGlzRmV0Y2hPcHRpb25zKGFyZ3NbMV0pKSBvcHRpb25zID0ge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLmFyZ3NbMV0sXG5cdFx0XHRiZWZvcmVGZXRjaDogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLmJlZm9yZUZldGNoLCBhcmdzWzFdLmJlZm9yZUZldGNoKSxcblx0XHRcdGFmdGVyRmV0Y2g6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5hZnRlckZldGNoLCBhcmdzWzFdLmFmdGVyRmV0Y2gpLFxuXHRcdFx0b25GZXRjaEVycm9yOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMub25GZXRjaEVycm9yLCBhcmdzWzFdLm9uRmV0Y2hFcnJvcilcblx0XHR9O1xuXHRcdHJldHVybiB1c2VGZXRjaChjb21wdXRlZFVybCwgZmV0Y2hPcHRpb25zLCBvcHRpb25zKTtcblx0fVxuXHRyZXR1cm4gdXNlRmFjdG9yeUZldGNoO1xufVxuZnVuY3Rpb24gdXNlRmV0Y2godXJsLCAuLi5hcmdzKSB7XG5cdHZhciBfZGVmYXVsdFdpbmRvdyRmZXRjaCwgX2dsb2JhbFRoaXM7XG5cdGNvbnN0IHN1cHBvcnRzQWJvcnQgPSB0eXBlb2YgQWJvcnRDb250cm9sbGVyID09PSBcImZ1bmN0aW9uXCI7XG5cdGxldCBmZXRjaE9wdGlvbnMgPSB7fTtcblx0bGV0IG9wdGlvbnMgPSB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdHJlZmV0Y2g6IGZhbHNlLFxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0dXBkYXRlRGF0YU9uRXJyb3I6IGZhbHNlXG5cdH07XG5cdGNvbnN0IGNvbmZpZyA9IHtcblx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0cGF5bG9hZDogdm9pZCAwXG5cdH07XG5cdGlmIChhcmdzLmxlbmd0aCA+IDApIGlmIChpc0ZldGNoT3B0aW9ucyhhcmdzWzBdKSkgb3B0aW9ucyA9IHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdC4uLmFyZ3NbMF1cblx0fTtcblx0ZWxzZSBmZXRjaE9wdGlvbnMgPSBhcmdzWzBdO1xuXHRpZiAoYXJncy5sZW5ndGggPiAxKSB7XG5cdFx0aWYgKGlzRmV0Y2hPcHRpb25zKGFyZ3NbMV0pKSBvcHRpb25zID0ge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLmFyZ3NbMV1cblx0XHR9O1xuXHR9XG5cdGNvbnN0IHsgZmV0Y2ggPSAoX2RlZmF1bHRXaW5kb3ckZmV0Y2ggPSBkZWZhdWx0V2luZG93ID09PSBudWxsIHx8IGRlZmF1bHRXaW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlZmF1bHRXaW5kb3cuZmV0Y2gpICE9PSBudWxsICYmIF9kZWZhdWx0V2luZG93JGZldGNoICE9PSB2b2lkIDAgPyBfZGVmYXVsdFdpbmRvdyRmZXRjaCA6IChfZ2xvYmFsVGhpcyA9IGdsb2JhbFRoaXMpID09PSBudWxsIHx8IF9nbG9iYWxUaGlzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZ2xvYmFsVGhpcy5mZXRjaCwgaW5pdGlhbERhdGEsIHRpbWVvdXQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJlc3BvbnNlRXZlbnQgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgZXJyb3JFdmVudCA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBmaW5hbGx5RXZlbnQgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgaXNGaW5pc2hlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBpc0ZldGNoaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGFib3J0ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgc3RhdHVzQ29kZSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHJlc3BvbnNlID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBkYXRhID0gc2hhbGxvd1JlZihpbml0aWFsRGF0YSB8fCBudWxsKTtcblx0Y29uc3QgY2FuQWJvcnQgPSBjb21wdXRlZCgoKSA9PiBzdXBwb3J0c0Fib3J0ICYmIGlzRmV0Y2hpbmcudmFsdWUpO1xuXHRsZXQgY29udHJvbGxlcjtcblx0bGV0IHRpbWVyO1xuXHRjb25zdCBhYm9ydCA9IChyZWFzb24pID0+IHtcblx0XHRpZiAoc3VwcG9ydHNBYm9ydCkge1xuXHRcdFx0Y29udHJvbGxlciA9PT0gbnVsbCB8fCBjb250cm9sbGVyID09PSB2b2lkIDAgfHwgY29udHJvbGxlci5hYm9ydChyZWFzb24pO1xuXHRcdFx0Y29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblx0XHRcdGNvbnRyb2xsZXIuc2lnbmFsLm9uYWJvcnQgPSAoKSA9PiBhYm9ydGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGZldGNoT3B0aW9ucyA9IHtcblx0XHRcdFx0Li4uZmV0Y2hPcHRpb25zLFxuXHRcdFx0XHRzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblx0Y29uc3QgbG9hZGluZyA9IChpc0xvYWRpbmcpID0+IHtcblx0XHRpc0ZldGNoaW5nLnZhbHVlID0gaXNMb2FkaW5nO1xuXHRcdGlzRmluaXNoZWQudmFsdWUgPSAhaXNMb2FkaW5nO1xuXHR9O1xuXHRpZiAodGltZW91dCkgdGltZXIgPSB1c2VUaW1lb3V0Rm4oYWJvcnQsIHRpbWVvdXQsIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcblx0bGV0IGV4ZWN1dGVDb3VudGVyID0gMDtcblx0Y29uc3QgZXhlY3V0ZSA9IGFzeW5jICh0aHJvd09uRmFpbGVkID0gZmFsc2UpID0+IHtcblx0XHR2YXIgX2NvbnRleHQkb3B0aW9ucztcblx0XHRhYm9ydCgpO1xuXHRcdGxvYWRpbmcodHJ1ZSk7XG5cdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdHN0YXR1c0NvZGUudmFsdWUgPSBudWxsO1xuXHRcdGFib3J0ZWQudmFsdWUgPSBmYWxzZTtcblx0XHRleGVjdXRlQ291bnRlciArPSAxO1xuXHRcdGNvbnN0IGN1cnJlbnRFeGVjdXRlQ291bnRlciA9IGV4ZWN1dGVDb3VudGVyO1xuXHRcdGNvbnN0IGRlZmF1bHRGZXRjaE9wdGlvbnMgPSB7XG5cdFx0XHRtZXRob2Q6IGNvbmZpZy5tZXRob2QsXG5cdFx0XHRoZWFkZXJzOiB7fVxuXHRcdH07XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHRvVmFsdWUoY29uZmlnLnBheWxvYWQpO1xuXHRcdGlmIChwYXlsb2FkKSB7XG5cdFx0XHR2YXIgX3BheWxvYWRNYXBwaW5nJGNvbmZpO1xuXHRcdFx0Y29uc3QgaGVhZGVycyA9IGhlYWRlcnNUb09iamVjdChkZWZhdWx0RmV0Y2hPcHRpb25zLmhlYWRlcnMpO1xuXHRcdFx0Y29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGF5bG9hZCk7XG5cdFx0XHRpZiAoIWNvbmZpZy5wYXlsb2FkVHlwZSAmJiBwYXlsb2FkICYmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBBcnJheS5pc0FycmF5KHByb3RvKSkgJiYgIShwYXlsb2FkIGluc3RhbmNlb2YgRm9ybURhdGEpKSBjb25maWcucGF5bG9hZFR5cGUgPSBcImpzb25cIjtcblx0XHRcdGlmIChjb25maWcucGF5bG9hZFR5cGUpIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSAoX3BheWxvYWRNYXBwaW5nJGNvbmZpID0gcGF5bG9hZE1hcHBpbmdbY29uZmlnLnBheWxvYWRUeXBlXSkgIT09IG51bGwgJiYgX3BheWxvYWRNYXBwaW5nJGNvbmZpICE9PSB2b2lkIDAgPyBfcGF5bG9hZE1hcHBpbmckY29uZmkgOiBjb25maWcucGF5bG9hZFR5cGU7XG5cdFx0XHRkZWZhdWx0RmV0Y2hPcHRpb25zLmJvZHkgPSBjb25maWcucGF5bG9hZFR5cGUgPT09IFwianNvblwiID8gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkgOiBwYXlsb2FkO1xuXHRcdH1cblx0XHRsZXQgaXNDYW5jZWxlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNvbnRleHQgPSB7XG5cdFx0XHR1cmw6IHRvVmFsdWUodXJsKSxcblx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0Li4uZGVmYXVsdEZldGNoT3B0aW9ucyxcblx0XHRcdFx0Li4uZmV0Y2hPcHRpb25zXG5cdFx0XHR9LFxuXHRcdFx0Y2FuY2VsOiAoKSA9PiB7XG5cdFx0XHRcdGlzQ2FuY2VsZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0aWYgKG9wdGlvbnMuYmVmb3JlRmV0Y2gpIE9iamVjdC5hc3NpZ24oY29udGV4dCwgYXdhaXQgb3B0aW9ucy5iZWZvcmVGZXRjaChjb250ZXh0KSk7XG5cdFx0aWYgKGlzQ2FuY2VsZWQgfHwgIWZldGNoKSB7XG5cdFx0XHRsb2FkaW5nKGZhbHNlKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0fVxuXHRcdGxldCByZXNwb25zZURhdGEgPSBudWxsO1xuXHRcdGlmICh0aW1lcikgdGltZXIuc3RhcnQoKTtcblx0XHRyZXR1cm4gZmV0Y2goY29udGV4dC51cmwsIHtcblx0XHRcdC4uLmRlZmF1bHRGZXRjaE9wdGlvbnMsXG5cdFx0XHQuLi5jb250ZXh0Lm9wdGlvbnMsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdC4uLmhlYWRlcnNUb09iamVjdChkZWZhdWx0RmV0Y2hPcHRpb25zLmhlYWRlcnMpLFxuXHRcdFx0XHQuLi5oZWFkZXJzVG9PYmplY3QoKF9jb250ZXh0JG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnMpID09PSBudWxsIHx8IF9jb250ZXh0JG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jb250ZXh0JG9wdGlvbnMuaGVhZGVycylcblx0XHRcdH1cblx0XHR9KS50aGVuKGFzeW5jIChmZXRjaFJlc3BvbnNlKSA9PiB7XG5cdFx0XHRyZXNwb25zZS52YWx1ZSA9IGZldGNoUmVzcG9uc2U7XG5cdFx0XHRzdGF0dXNDb2RlLnZhbHVlID0gZmV0Y2hSZXNwb25zZS5zdGF0dXM7XG5cdFx0XHRyZXNwb25zZURhdGEgPSBhd2FpdCBmZXRjaFJlc3BvbnNlLmNsb25lKClbY29uZmlnLnR5cGVdKCk7XG5cdFx0XHRpZiAoIWZldGNoUmVzcG9uc2Uub2spIHtcblx0XHRcdFx0ZGF0YS52YWx1ZSA9IGluaXRpYWxEYXRhIHx8IG51bGw7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihmZXRjaFJlc3BvbnNlLnN0YXR1c1RleHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9wdGlvbnMuYWZ0ZXJGZXRjaCkgKHtkYXRhOiByZXNwb25zZURhdGF9ID0gYXdhaXQgb3B0aW9ucy5hZnRlckZldGNoKHtcblx0XHRcdFx0ZGF0YTogcmVzcG9uc2VEYXRhLFxuXHRcdFx0XHRyZXNwb25zZTogZmV0Y2hSZXNwb25zZSxcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0ZXhlY3V0ZVxuXHRcdFx0fSkpO1xuXHRcdFx0ZGF0YS52YWx1ZSA9IHJlc3BvbnNlRGF0YTtcblx0XHRcdHJlc3BvbnNlRXZlbnQudHJpZ2dlcihmZXRjaFJlc3BvbnNlKTtcblx0XHRcdHJldHVybiBmZXRjaFJlc3BvbnNlO1xuXHRcdH0pLmNhdGNoKGFzeW5jIChmZXRjaEVycm9yKSA9PiB7XG5cdFx0XHRsZXQgZXJyb3JEYXRhID0gZmV0Y2hFcnJvci5tZXNzYWdlIHx8IGZldGNoRXJyb3IubmFtZTtcblx0XHRcdGlmIChvcHRpb25zLm9uRmV0Y2hFcnJvcikgKHtlcnJvcjogZXJyb3JEYXRhLCBkYXRhOiByZXNwb25zZURhdGF9ID0gYXdhaXQgb3B0aW9ucy5vbkZldGNoRXJyb3Ioe1xuXHRcdFx0XHRkYXRhOiByZXNwb25zZURhdGEsXG5cdFx0XHRcdGVycm9yOiBmZXRjaEVycm9yLFxuXHRcdFx0XHRyZXNwb25zZTogcmVzcG9uc2UudmFsdWUsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdGV4ZWN1dGVcblx0XHRcdH0pKTtcblx0XHRcdGVycm9yLnZhbHVlID0gZXJyb3JEYXRhO1xuXHRcdFx0aWYgKG9wdGlvbnMudXBkYXRlRGF0YU9uRXJyb3IpIGRhdGEudmFsdWUgPSByZXNwb25zZURhdGE7XG5cdFx0XHRlcnJvckV2ZW50LnRyaWdnZXIoZmV0Y2hFcnJvcik7XG5cdFx0XHRpZiAodGhyb3dPbkZhaWxlZCkgdGhyb3cgZmV0Y2hFcnJvcjtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0pLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0aWYgKGN1cnJlbnRFeGVjdXRlQ291bnRlciA9PT0gZXhlY3V0ZUNvdW50ZXIpIGxvYWRpbmcoZmFsc2UpO1xuXHRcdFx0aWYgKHRpbWVyKSB0aW1lci5zdG9wKCk7XG5cdFx0XHRmaW5hbGx5RXZlbnQudHJpZ2dlcihudWxsKTtcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgcmVmZXRjaCA9IHRvUmVmKG9wdGlvbnMucmVmZXRjaCk7XG5cdHdhdGNoKFtyZWZldGNoLCB0b1JlZih1cmwpXSwgKFtyZWZldGNoJDFdKSA9PiByZWZldGNoJDEgJiYgZXhlY3V0ZSgpLCB7IGRlZXA6IHRydWUgfSk7XG5cdGNvbnN0IHNoZWxsID0ge1xuXHRcdGlzRmluaXNoZWQ6IHJlYWRvbmx5KGlzRmluaXNoZWQpLFxuXHRcdGlzRmV0Y2hpbmc6IHJlYWRvbmx5KGlzRmV0Y2hpbmcpLFxuXHRcdHN0YXR1c0NvZGUsXG5cdFx0cmVzcG9uc2UsXG5cdFx0ZXJyb3IsXG5cdFx0ZGF0YSxcblx0XHRjYW5BYm9ydCxcblx0XHRhYm9ydGVkLFxuXHRcdGFib3J0LFxuXHRcdGV4ZWN1dGUsXG5cdFx0b25GZXRjaFJlc3BvbnNlOiByZXNwb25zZUV2ZW50Lm9uLFxuXHRcdG9uRmV0Y2hFcnJvcjogZXJyb3JFdmVudC5vbixcblx0XHRvbkZldGNoRmluYWxseTogZmluYWxseUV2ZW50Lm9uLFxuXHRcdGdldDogc2V0TWV0aG9kKFwiR0VUXCIpLFxuXHRcdHB1dDogc2V0TWV0aG9kKFwiUFVUXCIpLFxuXHRcdHBvc3Q6IHNldE1ldGhvZChcIlBPU1RcIiksXG5cdFx0ZGVsZXRlOiBzZXRNZXRob2QoXCJERUxFVEVcIiksXG5cdFx0cGF0Y2g6IHNldE1ldGhvZChcIlBBVENIXCIpLFxuXHRcdGhlYWQ6IHNldE1ldGhvZChcIkhFQURcIiksXG5cdFx0b3B0aW9uczogc2V0TWV0aG9kKFwiT1BUSU9OU1wiKSxcblx0XHRqc29uOiBzZXRUeXBlKFwianNvblwiKSxcblx0XHR0ZXh0OiBzZXRUeXBlKFwidGV4dFwiKSxcblx0XHRibG9iOiBzZXRUeXBlKFwiYmxvYlwiKSxcblx0XHRhcnJheUJ1ZmZlcjogc2V0VHlwZShcImFycmF5QnVmZmVyXCIpLFxuXHRcdGZvcm1EYXRhOiBzZXRUeXBlKFwiZm9ybURhdGFcIilcblx0fTtcblx0ZnVuY3Rpb24gc2V0TWV0aG9kKG1ldGhvZCkge1xuXHRcdHJldHVybiAocGF5bG9hZCwgcGF5bG9hZFR5cGUpID0+IHtcblx0XHRcdGlmICghaXNGZXRjaGluZy52YWx1ZSkge1xuXHRcdFx0XHRjb25maWcubWV0aG9kID0gbWV0aG9kO1xuXHRcdFx0XHRjb25maWcucGF5bG9hZCA9IHBheWxvYWQ7XG5cdFx0XHRcdGNvbmZpZy5wYXlsb2FkVHlwZSA9IHBheWxvYWRUeXBlO1xuXHRcdFx0XHRpZiAoaXNSZWYoY29uZmlnLnBheWxvYWQpKSB3YXRjaChbcmVmZXRjaCwgdG9SZWYoY29uZmlnLnBheWxvYWQpXSwgKFtyZWZldGNoJDFdKSA9PiByZWZldGNoJDEgJiYgZXhlY3V0ZSgpLCB7IGRlZXA6IHRydWUgfSk7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0Li4uc2hlbGwsXG5cdFx0XHRcdFx0dGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHdhaXRVbnRpbEZpbmlzaGVkKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0ZnVuY3Rpb24gd2FpdFVudGlsRmluaXNoZWQoKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHVudGlsKGlzRmluaXNoZWQpLnRvQmUodHJ1ZSkudGhlbigoKSA9PiByZXNvbHZlKHNoZWxsKSkuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fVxuXHRmdW5jdGlvbiBzZXRUeXBlKHR5cGUpIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0aWYgKCFpc0ZldGNoaW5nLnZhbHVlKSB7XG5cdFx0XHRcdGNvbmZpZy50eXBlID0gdHlwZTtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHQuLi5zaGVsbCxcblx0XHRcdFx0XHR0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gd2FpdFVudGlsRmluaXNoZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRpZiAob3B0aW9ucy5pbW1lZGlhdGUpIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gZXhlY3V0ZSgpKTtcblx0cmV0dXJuIHtcblx0XHQuLi5zaGVsbCxcblx0XHR0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdFx0XHRyZXR1cm4gd2FpdFVudGlsRmluaXNoZWQoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0XHR9XG5cdH07XG59XG5mdW5jdGlvbiBqb2luUGF0aHMoc3RhcnQsIGVuZCkge1xuXHRpZiAoIXN0YXJ0LmVuZHNXaXRoKFwiL1wiKSAmJiAhZW5kLnN0YXJ0c1dpdGgoXCIvXCIpKSByZXR1cm4gYCR7c3RhcnR9LyR7ZW5kfWA7XG5cdGlmIChzdGFydC5lbmRzV2l0aChcIi9cIikgJiYgZW5kLnN0YXJ0c1dpdGgoXCIvXCIpKSByZXR1cm4gYCR7c3RhcnQuc2xpY2UoMCwgLTEpfSR7ZW5kfWA7XG5cdHJldHVybiBgJHtzdGFydH0ke2VuZH1gO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGaWxlRGlhbG9nL2luZGV4LnRzXG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG5cdG11bHRpcGxlOiB0cnVlLFxuXHRhY2NlcHQ6IFwiKlwiLFxuXHRyZXNldDogZmFsc2UsXG5cdGRpcmVjdG9yeTogZmFsc2Vcbn07XG5mdW5jdGlvbiBwcmVwYXJlSW5pdGlhbEZpbGVzKGZpbGVzKSB7XG5cdGlmICghZmlsZXMpIHJldHVybiBudWxsO1xuXHRpZiAoZmlsZXMgaW5zdGFuY2VvZiBGaWxlTGlzdCkgcmV0dXJuIGZpbGVzO1xuXHRjb25zdCBkdCA9IG5ldyBEYXRhVHJhbnNmZXIoKTtcblx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSBkdC5pdGVtcy5hZGQoZmlsZSk7XG5cdHJldHVybiBkdC5maWxlcztcbn1cbi8qKlxuKiBPcGVuIGZpbGUgZGlhbG9nIHdpdGggZWFzZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRmlsZURpYWxvZ1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUZpbGVEaWFsb2cob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGZpbGVzID0gcmVmKHByZXBhcmVJbml0aWFsRmlsZXMob3B0aW9ucy5pbml0aWFsRmlsZXMpKTtcblx0Y29uc3QgeyBvbjogb25DaGFuZ2UsIHRyaWdnZXI6IGNoYW5nZVRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCB7IG9uOiBvbkNhbmNlbCwgdHJpZ2dlcjogY2FuY2VsVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IGlucHV0UmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfdW5yZWZFbGVtZW50O1xuXHRcdGNvbnN0IGlucHV0ID0gKF91bnJlZkVsZW1lbnQgPSB1bnJlZkVsZW1lbnQob3B0aW9ucy5pbnB1dCkpICE9PSBudWxsICYmIF91bnJlZkVsZW1lbnQgIT09IHZvaWQgMCA/IF91bnJlZkVsZW1lbnQgOiBkb2N1bWVudCQxID8gZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikgOiB2b2lkIDA7XG5cdFx0aWYgKGlucHV0KSB7XG5cdFx0XHRpbnB1dC50eXBlID0gXCJmaWxlXCI7XG5cdFx0XHRpbnB1dC5vbmNoYW5nZSA9IChldmVudCkgPT4ge1xuXHRcdFx0XHRmaWxlcy52YWx1ZSA9IGV2ZW50LnRhcmdldC5maWxlcztcblx0XHRcdFx0Y2hhbmdlVHJpZ2dlcihmaWxlcy52YWx1ZSk7XG5cdFx0XHR9O1xuXHRcdFx0aW5wdXQub25jYW5jZWwgPSAoKSA9PiB7XG5cdFx0XHRcdGNhbmNlbFRyaWdnZXIoKTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiBpbnB1dDtcblx0fSk7XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdGZpbGVzLnZhbHVlID0gbnVsbDtcblx0XHRpZiAoaW5wdXRSZWYudmFsdWUgJiYgaW5wdXRSZWYudmFsdWUudmFsdWUpIHtcblx0XHRcdGlucHV0UmVmLnZhbHVlLnZhbHVlID0gXCJcIjtcblx0XHRcdGNoYW5nZVRyaWdnZXIobnVsbCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBhcHBseU9wdGlvbnMgPSAob3B0aW9ucyQxKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSBpbnB1dFJlZi52YWx1ZTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwubXVsdGlwbGUgPSB0b1ZhbHVlKG9wdGlvbnMkMS5tdWx0aXBsZSk7XG5cdFx0ZWwuYWNjZXB0ID0gdG9WYWx1ZShvcHRpb25zJDEuYWNjZXB0KTtcblx0XHRlbC53ZWJraXRkaXJlY3RvcnkgPSB0b1ZhbHVlKG9wdGlvbnMkMS5kaXJlY3RvcnkpO1xuXHRcdGlmIChoYXNPd24ob3B0aW9ucyQxLCBcImNhcHR1cmVcIikpIGVsLmNhcHR1cmUgPSB0b1ZhbHVlKG9wdGlvbnMkMS5jYXB0dXJlKTtcblx0fTtcblx0Y29uc3Qgb3BlbiA9IChsb2NhbE9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBlbCA9IGlucHV0UmVmLnZhbHVlO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRjb25zdCBtZXJnZWRPcHRpb25zID0ge1xuXHRcdFx0Li4uREVGQVVMVF9PUFRJT05TLFxuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLmxvY2FsT3B0aW9uc1xuXHRcdH07XG5cdFx0YXBwbHlPcHRpb25zKG1lcmdlZE9wdGlvbnMpO1xuXHRcdGlmICh0b1ZhbHVlKG1lcmdlZE9wdGlvbnMucmVzZXQpKSByZXNldCgpO1xuXHRcdGVsLmNsaWNrKCk7XG5cdH07XG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRhcHBseU9wdGlvbnMob3B0aW9ucyk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGZpbGVzOiByZWFkb25seShmaWxlcyksXG5cdFx0b3Blbixcblx0XHRyZXNldCxcblx0XHRvbkNhbmNlbCxcblx0XHRvbkNoYW5nZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGaWxlU3lzdGVtQWNjZXNzL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VGaWxlU3lzdGVtQWNjZXNzKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogX3dpbmRvdyA9IGRlZmF1bHRXaW5kb3csIGRhdGFUeXBlID0gXCJUZXh0XCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHdpbmRvdyQxID0gX3dpbmRvdztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwic2hvd1NhdmVGaWxlUGlja2VyXCIgaW4gd2luZG93JDEgJiYgXCJzaG93T3BlbkZpbGVQaWNrZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGNvbnN0IGZpbGVIYW5kbGUgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGRhdGEgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGZpbGUgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGZpbGVOYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfZmlsZSR2YWx1ZSRuYW1lLCBfZmlsZSR2YWx1ZTtcblx0XHRyZXR1cm4gKF9maWxlJHZhbHVlJG5hbWUgPSAoX2ZpbGUkdmFsdWUgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWUubmFtZSkgIT09IG51bGwgJiYgX2ZpbGUkdmFsdWUkbmFtZSAhPT0gdm9pZCAwID8gX2ZpbGUkdmFsdWUkbmFtZSA6IFwiXCI7XG5cdH0pO1xuXHRjb25zdCBmaWxlTUlNRSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX2ZpbGUkdmFsdWUkdHlwZSwgX2ZpbGUkdmFsdWUyO1xuXHRcdHJldHVybiAoX2ZpbGUkdmFsdWUkdHlwZSA9IChfZmlsZSR2YWx1ZTIgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlMi50eXBlKSAhPT0gbnVsbCAmJiBfZmlsZSR2YWx1ZSR0eXBlICE9PSB2b2lkIDAgPyBfZmlsZSR2YWx1ZSR0eXBlIDogXCJcIjtcblx0fSk7XG5cdGNvbnN0IGZpbGVTaXplID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfZmlsZSR2YWx1ZSRzaXplLCBfZmlsZSR2YWx1ZTM7XG5cdFx0cmV0dXJuIChfZmlsZSR2YWx1ZSRzaXplID0gKF9maWxlJHZhbHVlMyA9IGZpbGUudmFsdWUpID09PSBudWxsIHx8IF9maWxlJHZhbHVlMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWUzLnNpemUpICE9PSBudWxsICYmIF9maWxlJHZhbHVlJHNpemUgIT09IHZvaWQgMCA/IF9maWxlJHZhbHVlJHNpemUgOiAwO1xuXHR9KTtcblx0Y29uc3QgZmlsZUxhc3RNb2RpZmllZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX2ZpbGUkdmFsdWUkbGFzdE1vZGlmLCBfZmlsZSR2YWx1ZTQ7XG5cdFx0cmV0dXJuIChfZmlsZSR2YWx1ZSRsYXN0TW9kaWYgPSAoX2ZpbGUkdmFsdWU0ID0gZmlsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGUkdmFsdWU0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsZSR2YWx1ZTQubGFzdE1vZGlmaWVkKSAhPT0gbnVsbCAmJiBfZmlsZSR2YWx1ZSRsYXN0TW9kaWYgIT09IHZvaWQgMCA/IF9maWxlJHZhbHVlJGxhc3RNb2RpZiA6IDA7XG5cdH0pO1xuXHRhc3luYyBmdW5jdGlvbiBvcGVuKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgW2hhbmRsZV0gPSBhd2FpdCB3aW5kb3ckMS5zaG93T3BlbkZpbGVQaWNrZXIoe1xuXHRcdFx0Li4udG9WYWx1ZShvcHRpb25zKSxcblx0XHRcdC4uLl9vcHRpb25zXG5cdFx0fSk7XG5cdFx0ZmlsZUhhbmRsZS52YWx1ZSA9IGhhbmRsZTtcblx0XHRhd2FpdCB1cGRhdGVEYXRhKCk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gY3JlYXRlKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0ZmlsZUhhbmRsZS52YWx1ZSA9IGF3YWl0IHdpbmRvdyQxLnNob3dTYXZlRmlsZVBpY2tlcih7XG5cdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0Li4uX29wdGlvbnNcblx0XHR9KTtcblx0XHRkYXRhLnZhbHVlID0gdm9pZCAwO1xuXHRcdGF3YWl0IHVwZGF0ZURhdGEoKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBzYXZlKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKCFmaWxlSGFuZGxlLnZhbHVlKSByZXR1cm4gc2F2ZUFzKF9vcHRpb25zKTtcblx0XHRpZiAoZGF0YS52YWx1ZSkge1xuXHRcdFx0Y29uc3Qgd3JpdGFibGVTdHJlYW0gPSBhd2FpdCBmaWxlSGFuZGxlLnZhbHVlLmNyZWF0ZVdyaXRhYmxlKCk7XG5cdFx0XHRhd2FpdCB3cml0YWJsZVN0cmVhbS53cml0ZShkYXRhLnZhbHVlKTtcblx0XHRcdGF3YWl0IHdyaXRhYmxlU3RyZWFtLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHVwZGF0ZUZpbGUoKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBzYXZlQXMoX29wdGlvbnMgPSB7fSkge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRmaWxlSGFuZGxlLnZhbHVlID0gYXdhaXQgd2luZG93JDEuc2hvd1NhdmVGaWxlUGlja2VyKHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5fb3B0aW9uc1xuXHRcdH0pO1xuXHRcdGlmIChkYXRhLnZhbHVlKSB7XG5cdFx0XHRjb25zdCB3cml0YWJsZVN0cmVhbSA9IGF3YWl0IGZpbGVIYW5kbGUudmFsdWUuY3JlYXRlV3JpdGFibGUoKTtcblx0XHRcdGF3YWl0IHdyaXRhYmxlU3RyZWFtLndyaXRlKGRhdGEudmFsdWUpO1xuXHRcdFx0YXdhaXQgd3JpdGFibGVTdHJlYW0uY2xvc2UoKTtcblx0XHR9XG5cdFx0YXdhaXQgdXBkYXRlRmlsZSgpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGUoKSB7XG5cdFx0dmFyIF9maWxlSGFuZGxlJHZhbHVlO1xuXHRcdGZpbGUudmFsdWUgPSBhd2FpdCAoKF9maWxlSGFuZGxlJHZhbHVlID0gZmlsZUhhbmRsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGVIYW5kbGUkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlSGFuZGxlJHZhbHVlLmdldEZpbGUoKSk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gdXBkYXRlRGF0YSgpIHtcblx0XHR2YXIgX2ZpbGUkdmFsdWU1LCBfZmlsZSR2YWx1ZTY7XG5cdFx0YXdhaXQgdXBkYXRlRmlsZSgpO1xuXHRcdGNvbnN0IHR5cGUgPSB0b1ZhbHVlKGRhdGFUeXBlKTtcblx0XHRpZiAodHlwZSA9PT0gXCJUZXh0XCIpIGRhdGEudmFsdWUgPSBhd2FpdCAoKF9maWxlJHZhbHVlNSA9IGZpbGUudmFsdWUpID09PSBudWxsIHx8IF9maWxlJHZhbHVlNSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWU1LnRleHQoKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJBcnJheUJ1ZmZlclwiKSBkYXRhLnZhbHVlID0gYXdhaXQgKChfZmlsZSR2YWx1ZTYgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZTYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlNi5hcnJheUJ1ZmZlcigpKTtcblx0XHRlbHNlIGlmICh0eXBlID09PSBcIkJsb2JcIikgZGF0YS52YWx1ZSA9IGZpbGUudmFsdWU7XG5cdH1cblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShkYXRhVHlwZSksIHVwZGF0ZURhdGEpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGRhdGEsXG5cdFx0ZmlsZSxcblx0XHRmaWxlTmFtZSxcblx0XHRmaWxlTUlNRSxcblx0XHRmaWxlU2l6ZSxcblx0XHRmaWxlTGFzdE1vZGlmaWVkLFxuXHRcdG9wZW4sXG5cdFx0Y3JlYXRlLFxuXHRcdHNhdmUsXG5cdFx0c2F2ZUFzLFxuXHRcdHVwZGF0ZURhdGFcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRm9jdXMvaW5kZXgudHNcbi8qKlxuKiBUcmFjayBvciBzZXQgdGhlIGZvY3VzIHN0YXRlIG9mIGEgRE9NIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZvY3VzXG4qIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50IGZvciB0aGUgZm9jdXMgYW5kIGJsdXIgZXZlbnRzLlxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUZvY3VzKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFZhbHVlID0gZmFsc2UsIGZvY3VzVmlzaWJsZSA9IGZhbHNlLCBwcmV2ZW50U2Nyb2xsID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlubmVyRm9jdXNlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCB0YXJnZXRFbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCkpO1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBcImZvY3VzXCIsIChldmVudCkgPT4ge1xuXHRcdHZhciBfbWF0Y2hlcywgX3JlZjtcblx0XHRpZiAoIWZvY3VzVmlzaWJsZSB8fCAoKF9tYXRjaGVzID0gKF9yZWYgPSBldmVudC50YXJnZXQpLm1hdGNoZXMpID09PSBudWxsIHx8IF9tYXRjaGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWF0Y2hlcy5jYWxsKF9yZWYsIFwiOmZvY3VzLXZpc2libGVcIikpKSBpbm5lckZvY3VzZWQudmFsdWUgPSB0cnVlO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIFwiYmx1clwiLCAoKSA9PiBpbm5lckZvY3VzZWQudmFsdWUgPSBmYWxzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0Y29uc3QgZm9jdXNlZCA9IGNvbXB1dGVkKHtcblx0XHRnZXQ6ICgpID0+IGlubmVyRm9jdXNlZC52YWx1ZSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHZhciBfdGFyZ2V0RWxlbWVudCR2YWx1ZSwgX3RhcmdldEVsZW1lbnQkdmFsdWUyO1xuXHRcdFx0aWYgKCF2YWx1ZSAmJiBpbm5lckZvY3VzZWQudmFsdWUpIChfdGFyZ2V0RWxlbWVudCR2YWx1ZSA9IHRhcmdldEVsZW1lbnQudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlID09PSB2b2lkIDAgfHwgX3RhcmdldEVsZW1lbnQkdmFsdWUuYmx1cigpO1xuXHRcdFx0ZWxzZSBpZiAodmFsdWUgJiYgIWlubmVyRm9jdXNlZC52YWx1ZSkgKF90YXJnZXRFbGVtZW50JHZhbHVlMiA9IHRhcmdldEVsZW1lbnQudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlMiA9PT0gdm9pZCAwIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlMi5mb2N1cyh7IHByZXZlbnRTY3JvbGwgfSk7XG5cdFx0fVxuXHR9KTtcblx0d2F0Y2godGFyZ2V0RWxlbWVudCwgKCkgPT4ge1xuXHRcdGZvY3VzZWQudmFsdWUgPSBpbml0aWFsVmFsdWU7XG5cdH0sIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pO1xuXHRyZXR1cm4geyBmb2N1c2VkIH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUZvY3VzV2l0aGluL2luZGV4LnRzXG5jb25zdCBFVkVOVF9GT0NVU19JTiA9IFwiZm9jdXNpblwiO1xuY29uc3QgRVZFTlRfRk9DVVNfT1VUID0gXCJmb2N1c291dFwiO1xuY29uc3QgUFNFVURPX0NMQVNTX0ZPQ1VTX1dJVEhJTiA9IFwiOmZvY3VzLXdpdGhpblwiO1xuLyoqXG4qIFRyYWNrIGlmIGZvY3VzIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHRhcmdldCBlbGVtZW50XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZvY3VzV2l0aGluXG4qIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50IHRvIHRyYWNrXG4qIEBwYXJhbSBvcHRpb25zIEZvY3VzIHdpdGhpbiBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRm9jdXNXaXRoaW4odGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgdGFyZ2V0RWxlbWVudCA9IGNvbXB1dGVkKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpKTtcblx0Y29uc3QgX2ZvY3VzZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZm9jdXNlZCA9IGNvbXB1dGVkKCgpID0+IF9mb2N1c2VkLnZhbHVlKTtcblx0Y29uc3QgYWN0aXZlRWxlbWVudCA9IHVzZUFjdGl2ZUVsZW1lbnQob3B0aW9ucyk7XG5cdGlmICghd2luZG93JDEgfHwgIWFjdGl2ZUVsZW1lbnQudmFsdWUpIHJldHVybiB7IGZvY3VzZWQgfTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgRVZFTlRfRk9DVVNfSU4sICgpID0+IF9mb2N1c2VkLnZhbHVlID0gdHJ1ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBFVkVOVF9GT0NVU19PVVQsICgpID0+IHtcblx0XHR2YXIgX3RhcmdldEVsZW1lbnQkdmFsdWUkLCBfdGFyZ2V0RWxlbWVudCR2YWx1ZSwgX3RhcmdldEVsZW1lbnQkdmFsdWUkMjtcblx0XHRyZXR1cm4gX2ZvY3VzZWQudmFsdWUgPSAoX3RhcmdldEVsZW1lbnQkdmFsdWUkID0gKF90YXJnZXRFbGVtZW50JHZhbHVlID0gdGFyZ2V0RWxlbWVudC52YWx1ZSkgPT09IG51bGwgfHwgX3RhcmdldEVsZW1lbnQkdmFsdWUgPT09IHZvaWQgMCB8fCAoX3RhcmdldEVsZW1lbnQkdmFsdWUkMiA9IF90YXJnZXRFbGVtZW50JHZhbHVlLm1hdGNoZXMpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlJDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YXJnZXRFbGVtZW50JHZhbHVlJDIuY2FsbChfdGFyZ2V0RWxlbWVudCR2YWx1ZSwgUFNFVURPX0NMQVNTX0ZPQ1VTX1dJVEhJTikpICE9PSBudWxsICYmIF90YXJnZXRFbGVtZW50JHZhbHVlJCAhPT0gdm9pZCAwID8gX3RhcmdldEVsZW1lbnQkdmFsdWUkIDogZmFsc2U7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHJldHVybiB7IGZvY3VzZWQgfTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRnBzL2luZGV4LnRzXG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlRnBzKG9wdGlvbnMpIHtcblx0dmFyIF9vcHRpb25zJGV2ZXJ5O1xuXHRjb25zdCBmcHMgPSBzaGFsbG93UmVmKDApO1xuXHRpZiAodHlwZW9mIHBlcmZvcm1hbmNlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZnBzO1xuXHRjb25zdCBldmVyeSA9IChfb3B0aW9ucyRldmVyeSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ldmVyeSkgIT09IG51bGwgJiYgX29wdGlvbnMkZXZlcnkgIT09IHZvaWQgMCA/IF9vcHRpb25zJGV2ZXJ5IDogMTA7XG5cdGxldCBsYXN0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cdGxldCB0aWNrcyA9IDA7XG5cdHVzZVJhZkZuKCgpID0+IHtcblx0XHR0aWNrcyArPSAxO1xuXHRcdGlmICh0aWNrcyA+PSBldmVyeSkge1xuXHRcdFx0Y29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cdFx0XHRjb25zdCBkaWZmID0gbm93IC0gbGFzdDtcblx0XHRcdGZwcy52YWx1ZSA9IE1hdGgucm91bmQoMWUzIC8gKGRpZmYgLyB0aWNrcykpO1xuXHRcdFx0bGFzdCA9IG5vdztcblx0XHRcdHRpY2tzID0gMDtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZnBzO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGdWxsc2NyZWVuL2luZGV4LnRzXG5jb25zdCBldmVudEhhbmRsZXJzID0gW1xuXHRcImZ1bGxzY3JlZW5jaGFuZ2VcIixcblx0XCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFwid2Via2l0ZW5kZnVsbHNjcmVlblwiLFxuXHRcIm1vemZ1bGxzY3JlZW5jaGFuZ2VcIixcblx0XCJNU0Z1bGxzY3JlZW5DaGFuZ2VcIlxuXTtcbi8qKlxuKiBSZWFjdGl2ZSBGdWxsc2NyZWVuIEFQSS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRnVsbHNjcmVlblxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRnVsbHNjcmVlbih0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50LCBhdXRvRXhpdCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB0YXJnZXRSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF91bnJlZkVsZW1lbnQ7XG5cdFx0cmV0dXJuIChfdW5yZWZFbGVtZW50ID0gdW5yZWZFbGVtZW50KHRhcmdldCkpICE9PSBudWxsICYmIF91bnJlZkVsZW1lbnQgIT09IHZvaWQgMCA/IF91bnJlZkVsZW1lbnQgOiBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuZG9jdW1lbnRFbGVtZW50O1xuXHR9KTtcblx0Y29uc3QgaXNGdWxsc2NyZWVuID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHJlcXVlc3RNZXRob2QgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdFwicmVxdWVzdEZ1bGxzY3JlZW5cIixcblx0XHRcdFwid2Via2l0UmVxdWVzdEZ1bGxzY3JlZW5cIixcblx0XHRcdFwid2Via2l0RW50ZXJGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEVudGVyRnVsbFNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtb3pSZXF1ZXN0RnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtc1JlcXVlc3RGdWxsc2NyZWVuXCJcblx0XHRdLmZpbmQoKG0pID0+IGRvY3VtZW50JDEgJiYgbSBpbiBkb2N1bWVudCQxIHx8IHRhcmdldFJlZi52YWx1ZSAmJiBtIGluIHRhcmdldFJlZi52YWx1ZSk7XG5cdH0pO1xuXHRjb25zdCBleGl0TWV0aG9kID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiBbXG5cdFx0XHRcImV4aXRGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEV4aXRGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEV4aXRGdWxsU2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdENhbmNlbEZ1bGxTY3JlZW5cIixcblx0XHRcdFwibW96Q2FuY2VsRnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtc0V4aXRGdWxsc2NyZWVuXCJcblx0XHRdLmZpbmQoKG0pID0+IGRvY3VtZW50JDEgJiYgbSBpbiBkb2N1bWVudCQxIHx8IHRhcmdldFJlZi52YWx1ZSAmJiBtIGluIHRhcmdldFJlZi52YWx1ZSk7XG5cdH0pO1xuXHRjb25zdCBmdWxsc2NyZWVuRW5hYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0XCJmdWxsU2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdElzRnVsbFNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlblwiLFxuXHRcdFx0XCJtb3pGdWxsU2NyZWVuXCIsXG5cdFx0XHRcIm1zRnVsbHNjcmVlbkVsZW1lbnRcIlxuXHRcdF0uZmluZCgobSkgPT4gZG9jdW1lbnQkMSAmJiBtIGluIGRvY3VtZW50JDEgfHwgdGFyZ2V0UmVmLnZhbHVlICYmIG0gaW4gdGFyZ2V0UmVmLnZhbHVlKTtcblx0fSk7XG5cdGNvbnN0IGZ1bGxzY3JlZW5FbGVtZW50TWV0aG9kID0gW1xuXHRcdFwiZnVsbHNjcmVlbkVsZW1lbnRcIixcblx0XHRcIndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50XCIsXG5cdFx0XCJtb3pGdWxsU2NyZWVuRWxlbWVudFwiLFxuXHRcdFwibXNGdWxsc2NyZWVuRWxlbWVudFwiXG5cdF0uZmluZCgobSkgPT4gZG9jdW1lbnQkMSAmJiBtIGluIGRvY3VtZW50JDEpO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gdGFyZ2V0UmVmLnZhbHVlICYmIGRvY3VtZW50JDEgJiYgcmVxdWVzdE1ldGhvZC52YWx1ZSAhPT0gdm9pZCAwICYmIGV4aXRNZXRob2QudmFsdWUgIT09IHZvaWQgMCAmJiBmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZSAhPT0gdm9pZCAwKTtcblx0Y29uc3QgaXNDdXJyZW50RWxlbWVudEZ1bGxTY3JlZW4gPSAoKSA9PiB7XG5cdFx0aWYgKGZ1bGxzY3JlZW5FbGVtZW50TWV0aG9kKSByZXR1cm4gKGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMVtmdWxsc2NyZWVuRWxlbWVudE1ldGhvZF0pID09PSB0YXJnZXRSZWYudmFsdWU7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXHRjb25zdCBpc0VsZW1lbnRGdWxsU2NyZWVuID0gKCkgPT4ge1xuXHRcdGlmIChmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZSkgaWYgKGRvY3VtZW50JDEgJiYgZG9jdW1lbnQkMVtmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZV0gIT0gbnVsbCkgcmV0dXJuIGRvY3VtZW50JDFbZnVsbHNjcmVlbkVuYWJsZWQudmFsdWVdO1xuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3QgdGFyZ2V0JDEgPSB0YXJnZXRSZWYudmFsdWU7XG5cdFx0XHRpZiAoKHRhcmdldCQxID09PSBudWxsIHx8IHRhcmdldCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQkMVtmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZV0pICE9IG51bGwpIHJldHVybiBCb29sZWFuKHRhcmdldCQxW2Z1bGxzY3JlZW5FbmFibGVkLnZhbHVlXSk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0YXN5bmMgZnVuY3Rpb24gZXhpdCgpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8ICFpc0Z1bGxzY3JlZW4udmFsdWUpIHJldHVybjtcblx0XHRpZiAoZXhpdE1ldGhvZC52YWx1ZSkgaWYgKChkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDFbZXhpdE1ldGhvZC52YWx1ZV0pICE9IG51bGwpIGF3YWl0IGRvY3VtZW50JDFbZXhpdE1ldGhvZC52YWx1ZV0oKTtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHRhcmdldCQxID0gdGFyZ2V0UmVmLnZhbHVlO1xuXHRcdFx0aWYgKCh0YXJnZXQkMSA9PT0gbnVsbCB8fCB0YXJnZXQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0JDFbZXhpdE1ldGhvZC52YWx1ZV0pICE9IG51bGwpIGF3YWl0IHRhcmdldCQxW2V4aXRNZXRob2QudmFsdWVdKCk7XG5cdFx0fVxuXHRcdGlzRnVsbHNjcmVlbi52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGVudGVyKCkge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUgfHwgaXNGdWxsc2NyZWVuLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKGlzRWxlbWVudEZ1bGxTY3JlZW4oKSkgYXdhaXQgZXhpdCgpO1xuXHRcdGNvbnN0IHRhcmdldCQxID0gdGFyZ2V0UmVmLnZhbHVlO1xuXHRcdGlmIChyZXF1ZXN0TWV0aG9kLnZhbHVlICYmICh0YXJnZXQkMSA9PT0gbnVsbCB8fCB0YXJnZXQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0JDFbcmVxdWVzdE1ldGhvZC52YWx1ZV0pICE9IG51bGwpIHtcblx0XHRcdGF3YWl0IHRhcmdldCQxW3JlcXVlc3RNZXRob2QudmFsdWVdKCk7XG5cdFx0XHRpc0Z1bGxzY3JlZW4udmFsdWUgPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRhc3luYyBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdFx0YXdhaXQgKGlzRnVsbHNjcmVlbi52YWx1ZSA/IGV4aXQoKSA6IGVudGVyKCkpO1xuXHR9XG5cdGNvbnN0IGhhbmRsZXJDYWxsYmFjayA9ICgpID0+IHtcblx0XHRjb25zdCBpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWUgPSBpc0VsZW1lbnRGdWxsU2NyZWVuKCk7XG5cdFx0aWYgKCFpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWUgfHwgaXNFbGVtZW50RnVsbFNjcmVlblZhbHVlICYmIGlzQ3VycmVudEVsZW1lbnRGdWxsU2NyZWVuKCkpIGlzRnVsbHNjcmVlbi52YWx1ZSA9IGlzRWxlbWVudEZ1bGxTY3JlZW5WYWx1ZTtcblx0fTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdGNhcHR1cmU6IGZhbHNlLFxuXHRcdHBhc3NpdmU6IHRydWVcblx0fTtcblx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBldmVudEhhbmRsZXJzLCBoYW5kbGVyQ2FsbGJhY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldFJlZiksIGV2ZW50SGFuZGxlcnMsIGhhbmRsZXJDYWxsYmFjaywgbGlzdGVuZXJPcHRpb25zKTtcblx0dHJ5T25Nb3VudGVkKGhhbmRsZXJDYWxsYmFjaywgZmFsc2UpO1xuXHRpZiAoYXV0b0V4aXQpIHRyeU9uU2NvcGVEaXNwb3NlKGV4aXQpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzRnVsbHNjcmVlbixcblx0XHRlbnRlcixcblx0XHRleGl0LFxuXHRcdHRvZ2dsZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VHYW1lcGFkL2luZGV4LnRzXG4vKipcbiogTWFwcyBhIHN0YW5kYXJkIHN0YW5kYXJkIGdhbWVwYWQgdG8gYW4gWGJveCAzNjAgQ29udHJvbGxlci5cbiovXG5mdW5jdGlvbiBtYXBHYW1lcGFkVG9YYm94MzYwQ29udHJvbGxlcihnYW1lcGFkKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGdhbWVwYWQudmFsdWUpIHJldHVybiB7XG5cdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdGE6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1swXSxcblx0XHRcdFx0YjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzFdLFxuXHRcdFx0XHR4OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMl0sXG5cdFx0XHRcdHk6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1szXVxuXHRcdFx0fSxcblx0XHRcdGJ1bXBlcjoge1xuXHRcdFx0XHRsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNF0sXG5cdFx0XHRcdHJpZ2h0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNV1cblx0XHRcdH0sXG5cdFx0XHR0cmlnZ2Vyczoge1xuXHRcdFx0XHRsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbNl0sXG5cdFx0XHRcdHJpZ2h0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbN11cblx0XHRcdH0sXG5cdFx0XHRzdGljazoge1xuXHRcdFx0XHRsZWZ0OiB7XG5cdFx0XHRcdFx0aG9yaXpvbnRhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzBdLFxuXHRcdFx0XHRcdHZlcnRpY2FsOiBnYW1lcGFkLnZhbHVlLmF4ZXNbMV0sXG5cdFx0XHRcdFx0YnV0dG9uOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTBdXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJpZ2h0OiB7XG5cdFx0XHRcdFx0aG9yaXpvbnRhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzJdLFxuXHRcdFx0XHRcdHZlcnRpY2FsOiBnYW1lcGFkLnZhbHVlLmF4ZXNbM10sXG5cdFx0XHRcdFx0YnV0dG9uOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTFdXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkcGFkOiB7XG5cdFx0XHRcdHVwOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTJdLFxuXHRcdFx0XHRkb3duOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTNdLFxuXHRcdFx0XHRsZWZ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMTRdLFxuXHRcdFx0XHRyaWdodDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzE1XVxuXHRcdFx0fSxcblx0XHRcdGJhY2s6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1s4XSxcblx0XHRcdHN0YXJ0OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbOV1cblx0XHR9O1xuXHRcdHJldHVybiBudWxsO1xuXHR9KTtcbn1cbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VHYW1lcGFkKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJnZXRHYW1lcGFkc1wiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgZ2FtZXBhZHMgPSByZWYoW10pO1xuXHRjb25zdCBvbkNvbm5lY3RlZEhvb2sgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3Qgb25EaXNjb25uZWN0ZWRIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHN0YXRlRnJvbUdhbWVwYWQgPSAoZ2FtZXBhZCkgPT4ge1xuXHRcdGNvbnN0IGhhcHRpY0FjdHVhdG9ycyA9IFtdO1xuXHRcdGNvbnN0IHZpYnJhdGlvbkFjdHVhdG9yID0gXCJ2aWJyYXRpb25BY3R1YXRvclwiIGluIGdhbWVwYWQgPyBnYW1lcGFkLnZpYnJhdGlvbkFjdHVhdG9yIDogbnVsbDtcblx0XHRpZiAodmlicmF0aW9uQWN0dWF0b3IpIGhhcHRpY0FjdHVhdG9ycy5wdXNoKHZpYnJhdGlvbkFjdHVhdG9yKTtcblx0XHRpZiAoZ2FtZXBhZC5oYXB0aWNBY3R1YXRvcnMpIGhhcHRpY0FjdHVhdG9ycy5wdXNoKC4uLmdhbWVwYWQuaGFwdGljQWN0dWF0b3JzKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWQ6IGdhbWVwYWQuaWQsXG5cdFx0XHRpbmRleDogZ2FtZXBhZC5pbmRleCxcblx0XHRcdGNvbm5lY3RlZDogZ2FtZXBhZC5jb25uZWN0ZWQsXG5cdFx0XHRtYXBwaW5nOiBnYW1lcGFkLm1hcHBpbmcsXG5cdFx0XHR0aW1lc3RhbXA6IGdhbWVwYWQudGltZXN0YW1wLFxuXHRcdFx0dmlicmF0aW9uQWN0dWF0b3I6IGdhbWVwYWQudmlicmF0aW9uQWN0dWF0b3IsXG5cdFx0XHRoYXB0aWNBY3R1YXRvcnMsXG5cdFx0XHRheGVzOiBnYW1lcGFkLmF4ZXMubWFwKChheGVzKSA9PiBheGVzKSxcblx0XHRcdGJ1dHRvbnM6IGdhbWVwYWQuYnV0dG9ucy5tYXAoKGJ1dHRvbikgPT4gKHtcblx0XHRcdFx0cHJlc3NlZDogYnV0dG9uLnByZXNzZWQsXG5cdFx0XHRcdHRvdWNoZWQ6IGJ1dHRvbi50b3VjaGVkLFxuXHRcdFx0XHR2YWx1ZTogYnV0dG9uLnZhbHVlXG5cdFx0XHR9KSlcblx0XHR9O1xuXHR9O1xuXHRjb25zdCB1cGRhdGVHYW1lcGFkU3RhdGUgPSAoKSA9PiB7XG5cdFx0Y29uc3QgX2dhbWVwYWRzID0gKG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IkMS5nZXRHYW1lcGFkcygpKSB8fCBbXTtcblx0XHRmb3IgKGNvbnN0IGdhbWVwYWQgb2YgX2dhbWVwYWRzKSBpZiAoZ2FtZXBhZCAmJiBnYW1lcGFkcy52YWx1ZVtnYW1lcGFkLmluZGV4XSkgZ2FtZXBhZHMudmFsdWVbZ2FtZXBhZC5pbmRleF0gPSBzdGF0ZUZyb21HYW1lcGFkKGdhbWVwYWQpO1xuXHR9O1xuXHRjb25zdCB7IGlzQWN0aXZlLCBwYXVzZSwgcmVzdW1lIH0gPSB1c2VSYWZGbih1cGRhdGVHYW1lcGFkU3RhdGUpO1xuXHRjb25zdCBvbkdhbWVwYWRDb25uZWN0ZWQgPSAoZ2FtZXBhZCkgPT4ge1xuXHRcdGlmICghZ2FtZXBhZHMudmFsdWUuc29tZSgoeyBpbmRleCB9KSA9PiBpbmRleCA9PT0gZ2FtZXBhZC5pbmRleCkpIHtcblx0XHRcdGdhbWVwYWRzLnZhbHVlLnB1c2goc3RhdGVGcm9tR2FtZXBhZChnYW1lcGFkKSk7XG5cdFx0XHRvbkNvbm5lY3RlZEhvb2sudHJpZ2dlcihnYW1lcGFkLmluZGV4KTtcblx0XHR9XG5cdFx0cmVzdW1lKCk7XG5cdH07XG5cdGNvbnN0IG9uR2FtZXBhZERpc2Nvbm5lY3RlZCA9IChnYW1lcGFkKSA9PiB7XG5cdFx0Z2FtZXBhZHMudmFsdWUgPSBnYW1lcGFkcy52YWx1ZS5maWx0ZXIoKHgpID0+IHguaW5kZXggIT09IGdhbWVwYWQuaW5kZXgpO1xuXHRcdG9uRGlzY29ubmVjdGVkSG9vay50cmlnZ2VyKGdhbWVwYWQuaW5kZXgpO1xuXHR9O1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0dXNlRXZlbnRMaXN0ZW5lcihcImdhbWVwYWRjb25uZWN0ZWRcIiwgKGUpID0+IG9uR2FtZXBhZENvbm5lY3RlZChlLmdhbWVwYWQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKFwiZ2FtZXBhZGRpc2Nvbm5lY3RlZFwiLCAoZSkgPT4gb25HYW1lcGFkRGlzY29ubmVjdGVkKGUuZ2FtZXBhZCksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgX2dhbWVwYWRzID0gKG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IkMS5nZXRHYW1lcGFkcygpKSB8fCBbXTtcblx0XHRmb3IgKGNvbnN0IGdhbWVwYWQgb2YgX2dhbWVwYWRzKSBpZiAoZ2FtZXBhZCAmJiBnYW1lcGFkcy52YWx1ZVtnYW1lcGFkLmluZGV4XSkgb25HYW1lcGFkQ29ubmVjdGVkKGdhbWVwYWQpO1xuXHR9KTtcblx0cGF1c2UoKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRvbkNvbm5lY3RlZDogb25Db25uZWN0ZWRIb29rLm9uLFxuXHRcdG9uRGlzY29ubmVjdGVkOiBvbkRpc2Nvbm5lY3RlZEhvb2sub24sXG5cdFx0Z2FtZXBhZHMsXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGlzQWN0aXZlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUdlb2xvY2F0aW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgR2VvbG9jYXRpb24gQVBJLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VHZW9sb2NhdGlvblxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUdlb2xvY2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGVuYWJsZUhpZ2hBY2N1cmFjeSA9IHRydWUsIG1heGltdW1BZ2UgPSAzZTQsIHRpbWVvdXQgPSAyN2UzLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciwgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiZ2VvbG9jYXRpb25cIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IGxvY2F0ZWRBdCA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgY29vcmRzID0gcmVmKHtcblx0XHRhY2N1cmFjeTogMCxcblx0XHRsYXRpdHVkZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRcdGxvbmdpdHVkZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRcdGFsdGl0dWRlOiBudWxsLFxuXHRcdGFsdGl0dWRlQWNjdXJhY3k6IG51bGwsXG5cdFx0aGVhZGluZzogbnVsbCxcblx0XHRzcGVlZDogbnVsbFxuXHR9KTtcblx0ZnVuY3Rpb24gdXBkYXRlUG9zaXRpb24ocG9zaXRpb24pIHtcblx0XHRsb2NhdGVkQXQudmFsdWUgPSBwb3NpdGlvbi50aW1lc3RhbXA7XG5cdFx0Y29vcmRzLnZhbHVlID0gcG9zaXRpb24uY29vcmRzO1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0fVxuXHRsZXQgd2F0Y2hlcjtcblx0ZnVuY3Rpb24gcmVzdW1lKCkge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgd2F0Y2hlciA9IG5hdmlnYXRvciQxLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24odXBkYXRlUG9zaXRpb24sIChlcnIpID0+IGVycm9yLnZhbHVlID0gZXJyLCB7XG5cdFx0XHRlbmFibGVIaWdoQWNjdXJhY3ksXG5cdFx0XHRtYXhpbXVtQWdlLFxuXHRcdFx0dGltZW91dFxuXHRcdH0pO1xuXHR9XG5cdGlmIChpbW1lZGlhdGUpIHJlc3VtZSgpO1xuXHRmdW5jdGlvbiBwYXVzZSgpIHtcblx0XHRpZiAod2F0Y2hlciAmJiBuYXZpZ2F0b3IkMSkgbmF2aWdhdG9yJDEuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh3YXRjaGVyKTtcblx0fVxuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0cGF1c2UoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y29vcmRzLFxuXHRcdGxvY2F0ZWRBdCxcblx0XHRlcnJvcixcblx0XHRyZXN1bWUsXG5cdFx0cGF1c2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlSWRsZS9pbmRleC50c1xuY29uc3QgZGVmYXVsdEV2ZW50cyQxID0gW1xuXHRcIm1vdXNlbW92ZVwiLFxuXHRcIm1vdXNlZG93blwiLFxuXHRcInJlc2l6ZVwiLFxuXHRcImtleWRvd25cIixcblx0XCJ0b3VjaHN0YXJ0XCIsXG5cdFwid2hlZWxcIlxuXTtcbmNvbnN0IG9uZU1pbnV0ZSA9IDZlNDtcbi8qKlxuKiBUcmFja3Mgd2hldGhlciB0aGUgdXNlciBpcyBiZWluZyBpbmFjdGl2ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSWRsZVxuKiBAcGFyYW0gdGltZW91dCBkZWZhdWx0IHRvIDEgbWludXRlXG4qIEBwYXJhbSBvcHRpb25zIElkbGVPcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlSWRsZSh0aW1lb3V0ID0gb25lTWludXRlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbml0aWFsU3RhdGUgPSBmYWxzZSwgbGlzdGVuRm9yVmlzaWJpbGl0eUNoYW5nZSA9IHRydWUsIGV2ZW50czogZXZlbnRzJDEgPSBkZWZhdWx0RXZlbnRzJDEsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBldmVudEZpbHRlciA9IHRocm90dGxlRmlsdGVyKDUwKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaWRsZSA9IHNoYWxsb3dSZWYoaW5pdGlhbFN0YXRlKTtcblx0Y29uc3QgbGFzdEFjdGl2ZSA9IHNoYWxsb3dSZWYodGltZXN0YW1wKCkpO1xuXHRjb25zdCBpc1BlbmRpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHRpbWVyO1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHRpZGxlLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHR0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gaWRsZS52YWx1ZSA9IHRydWUsIHRpbWVvdXQpO1xuXHR9O1xuXHRjb25zdCBvbkV2ZW50ID0gY3JlYXRlRmlsdGVyV3JhcHBlcihldmVudEZpbHRlciwgKCkgPT4ge1xuXHRcdGxhc3RBY3RpdmUudmFsdWUgPSB0aW1lc3RhbXAoKTtcblx0XHRyZXNldCgpO1xuXHR9KTtcblx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0Y29uc3QgZG9jdW1lbnQkMSA9IHdpbmRvdyQxLmRvY3VtZW50O1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzJDEpIHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIGV2ZW50LCAoKSA9PiB7XG5cdFx0XHRpZiAoIWlzUGVuZGluZy52YWx1ZSkgcmV0dXJuO1xuXHRcdFx0b25FdmVudCgpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0aWYgKGxpc3RlbkZvclZpc2liaWxpdHlDaGFuZ2UpIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsICgpID0+IHtcblx0XHRcdGlmIChkb2N1bWVudCQxLmhpZGRlbiB8fCAhaXNQZW5kaW5nLnZhbHVlKSByZXR1cm47XG5cdFx0XHRvbkV2ZW50KCk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHRzdGFydCgpO1xuXHR9XG5cdGZ1bmN0aW9uIHN0YXJ0KCkge1xuXHRcdGlmIChpc1BlbmRpbmcudmFsdWUpIHJldHVybjtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlmICghaW5pdGlhbFN0YXRlKSByZXNldCgpO1xuXHR9XG5cdGZ1bmN0aW9uIHN0b3AoKSB7XG5cdFx0aWRsZS52YWx1ZSA9IGluaXRpYWxTdGF0ZTtcblx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdGlzUGVuZGluZy52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0aWRsZSxcblx0XHRsYXN0QWN0aXZlLFxuXHRcdHJlc2V0LFxuXHRcdHN0b3AsXG5cdFx0c3RhcnQsXG5cdFx0aXNQZW5kaW5nOiBzaGFsbG93UmVhZG9ubHkoaXNQZW5kaW5nKVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VJbWFnZS9pbmRleC50c1xuYXN5bmMgZnVuY3Rpb24gbG9hZEltYWdlKG9wdGlvbnMpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcblx0XHRjb25zdCB7IHNyYywgc3Jjc2V0LCBzaXplcywgY2xhc3M6IGNsYXp6LCBsb2FkaW5nLCBjcm9zc29yaWdpbiwgcmVmZXJyZXJQb2xpY3ksIHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nLCBmZXRjaFByaW9yaXR5LCBpc21hcCwgdXNlbWFwIH0gPSBvcHRpb25zO1xuXHRcdGltZy5zcmMgPSBzcmM7XG5cdFx0aWYgKHNyY3NldCAhPSBudWxsKSBpbWcuc3Jjc2V0ID0gc3Jjc2V0O1xuXHRcdGlmIChzaXplcyAhPSBudWxsKSBpbWcuc2l6ZXMgPSBzaXplcztcblx0XHRpZiAoY2xhenogIT0gbnVsbCkgaW1nLmNsYXNzTmFtZSA9IGNsYXp6O1xuXHRcdGlmIChsb2FkaW5nICE9IG51bGwpIGltZy5sb2FkaW5nID0gbG9hZGluZztcblx0XHRpZiAoY3Jvc3NvcmlnaW4gIT0gbnVsbCkgaW1nLmNyb3NzT3JpZ2luID0gY3Jvc3NvcmlnaW47XG5cdFx0aWYgKHJlZmVycmVyUG9saWN5ICE9IG51bGwpIGltZy5yZWZlcnJlclBvbGljeSA9IHJlZmVycmVyUG9saWN5O1xuXHRcdGlmICh3aWR0aCAhPSBudWxsKSBpbWcud2lkdGggPSB3aWR0aDtcblx0XHRpZiAoaGVpZ2h0ICE9IG51bGwpIGltZy5oZWlnaHQgPSBoZWlnaHQ7XG5cdFx0aWYgKGRlY29kaW5nICE9IG51bGwpIGltZy5kZWNvZGluZyA9IGRlY29kaW5nO1xuXHRcdGlmIChmZXRjaFByaW9yaXR5ICE9IG51bGwpIGltZy5mZXRjaFByaW9yaXR5ID0gZmV0Y2hQcmlvcml0eTtcblx0XHRpZiAoaXNtYXAgIT0gbnVsbCkgaW1nLmlzTWFwID0gaXNtYXA7XG5cdFx0aWYgKHVzZW1hcCAhPSBudWxsKSBpbWcudXNlTWFwID0gdXNlbWFwO1xuXHRcdGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltZyk7XG5cdFx0aW1nLm9uZXJyb3IgPSByZWplY3Q7XG5cdH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIGxvYWQgYW4gaW1hZ2UgaW4gdGhlIGJyb3dzZXIsIHlvdSBjYW4gd2FpdCB0aGUgcmVzdWx0IHRvIGRpc3BsYXkgaXQgb3Igc2hvdyBhIGZhbGxiYWNrLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VJbWFnZVxuKiBAcGFyYW0gb3B0aW9ucyBJbWFnZSBhdHRyaWJ1dGVzLCBhcyB1c2VkIGluIHRoZSA8aW1nPiB0YWdcbiogQHBhcmFtIGFzeW5jU3RhdGVPcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlSW1hZ2Uob3B0aW9ucywgYXN5bmNTdGF0ZU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBzdGF0ZSA9IHVzZUFzeW5jU3RhdGUoKCkgPT4gbG9hZEltYWdlKHRvVmFsdWUob3B0aW9ucykpLCB2b2lkIDAsIHtcblx0XHRyZXNldE9uRXhlY3V0ZTogdHJ1ZSxcblx0XHQuLi5hc3luY1N0YXRlT3B0aW9uc1xuXHR9KTtcblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShvcHRpb25zKSwgKCkgPT4gc3RhdGUuZXhlY3V0ZShhc3luY1N0YXRlT3B0aW9ucy5kZWxheSksIHsgZGVlcDogdHJ1ZSB9KTtcblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBfcmVzb2x2ZS1lbGVtZW50LnRzXG4vKipcbiogUmVzb2x2ZXMgYW4gZWxlbWVudCBmcm9tIGEgZ2l2ZW4gZWxlbWVudCwgd2luZG93LCBvciBkb2N1bWVudC5cbipcbiogQGludGVybmFsXG4qL1xuZnVuY3Rpb24gcmVzb2x2ZUVsZW1lbnQoZWwpIHtcblx0aWYgKHR5cGVvZiBXaW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgZWwgaW5zdGFuY2VvZiBXaW5kb3cpIHJldHVybiBlbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdGlmICh0eXBlb2YgRG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgZWwgaW5zdGFuY2VvZiBEb2N1bWVudCkgcmV0dXJuIGVsLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGVsO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTY3JvbGwvaW5kZXgudHNcbi8qKlxuKiBXZSBoYXZlIHRvIGNoZWNrIGlmIHRoZSBzY3JvbGwgYW1vdW50IGlzIGNsb3NlIGVub3VnaCB0byBzb21lIHRocmVzaG9sZCBpbiBvcmRlciB0b1xuKiBtb3JlIGFjY3VyYXRlbHkgY2FsY3VsYXRlIGFycml2ZWRTdGF0ZS4gVGhpcyBpcyBiZWNhdXNlIHNjcm9sbFRvcC9zY3JvbGxMZWZ0IGFyZSBub24tcm91bmRlZFxuKiBudW1iZXJzLCB3aGlsZSBzY3JvbGxIZWlnaHQvc2Nyb2xsV2lkdGggYW5kIGNsaWVudEhlaWdodC9jbGllbnRXaWR0aCBhcmUgcm91bmRlZC5cbiogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvc2Nyb2xsSGVpZ2h0I2RldGVybWluZV9pZl9hbl9lbGVtZW50X2hhc19iZWVuX3RvdGFsbHlfc2Nyb2xsZWRcbiovXG5jb25zdCBBUlJJVkVEX1NUQVRFX1RIUkVTSE9MRF9QSVhFTFMgPSAxO1xuLyoqXG4qIFJlYWN0aXZlIHNjcm9sbC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2Nyb2xsXG4qIEBwYXJhbSBlbGVtZW50XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU2Nyb2xsKGVsZW1lbnQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocm90dGxlID0gMCwgaWRsZSA9IDIwMCwgb25TdG9wID0gbm9vcCwgb25TY3JvbGwgPSBub29wLCBvZmZzZXQgPSB7XG5cdFx0bGVmdDogMCxcblx0XHRyaWdodDogMCxcblx0XHR0b3A6IDAsXG5cdFx0Ym90dG9tOiAwXG5cdH0sIG9ic2VydmU6IF9vYnNlcnZlID0geyBtdXRhdGlvbjogZmFsc2UgfSwgZXZlbnRMaXN0ZW5lck9wdGlvbnMgPSB7XG5cdFx0Y2FwdHVyZTogZmFsc2UsXG5cdFx0cGFzc2l2ZTogdHJ1ZVxuXHR9LCBiZWhhdmlvciA9IFwiYXV0b1wiLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgb25FcnJvciA9IChlKSA9PiB7XG5cdFx0Y29uc29sZS5lcnJvcihlKTtcblx0fSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgb2JzZXJ2ZSA9IHR5cGVvZiBfb2JzZXJ2ZSA9PT0gXCJib29sZWFuXCIgPyB7IG11dGF0aW9uOiBfb2JzZXJ2ZSB9IDogX29ic2VydmU7XG5cdGNvbnN0IGludGVybmFsWCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGludGVybmFsWSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHggPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGludGVybmFsWC52YWx1ZTtcblx0XHR9LFxuXHRcdHNldCh4JDEpIHtcblx0XHRcdHNjcm9sbFRvKHgkMSwgdm9pZCAwKTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCB5ID0gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpbnRlcm5hbFkudmFsdWU7XG5cdFx0fSxcblx0XHRzZXQoeSQxKSB7XG5cdFx0XHRzY3JvbGxUbyh2b2lkIDAsIHkkMSk7XG5cdFx0fVxuXHR9KTtcblx0ZnVuY3Rpb24gc2Nyb2xsVG8oX3gsIF95KSB7XG5cdFx0dmFyIF9yZWYsIF90b1ZhbHVlLCBfdG9WYWx1ZTIsIF9kb2N1bWVudDtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0Y29uc3QgX2VsZW1lbnQgPSB0b1ZhbHVlKGVsZW1lbnQpO1xuXHRcdGlmICghX2VsZW1lbnQpIHJldHVybjtcblx0XHQoX3JlZiA9IF9lbGVtZW50IGluc3RhbmNlb2YgRG9jdW1lbnQgPyB3aW5kb3ckMS5kb2N1bWVudC5ib2R5IDogX2VsZW1lbnQpID09PSBudWxsIHx8IF9yZWYgPT09IHZvaWQgMCB8fCBfcmVmLnNjcm9sbFRvKHtcblx0XHRcdHRvcDogKF90b1ZhbHVlID0gdG9WYWx1ZShfeSkpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHkudmFsdWUsXG5cdFx0XHRsZWZ0OiAoX3RvVmFsdWUyID0gdG9WYWx1ZShfeCkpICE9PSBudWxsICYmIF90b1ZhbHVlMiAhPT0gdm9pZCAwID8gX3RvVmFsdWUyIDogeC52YWx1ZSxcblx0XHRcdGJlaGF2aW9yOiB0b1ZhbHVlKGJlaGF2aW9yKVxuXHRcdH0pO1xuXHRcdGNvbnN0IHNjcm9sbENvbnRhaW5lciA9IChfZWxlbWVudCA9PT0gbnVsbCB8fCBfZWxlbWVudCA9PT0gdm9pZCAwIHx8IChfZG9jdW1lbnQgPSBfZWxlbWVudC5kb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB8fCAoX2VsZW1lbnQgPT09IG51bGwgfHwgX2VsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lbGVtZW50LmRvY3VtZW50RWxlbWVudCkgfHwgX2VsZW1lbnQ7XG5cdFx0aWYgKHggIT0gbnVsbCkgaW50ZXJuYWxYLnZhbHVlID0gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbExlZnQ7XG5cdFx0aWYgKHkgIT0gbnVsbCkgaW50ZXJuYWxZLnZhbHVlID0gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcDtcblx0fVxuXHRjb25zdCBpc1Njcm9sbGluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBhcnJpdmVkU3RhdGUgPSByZWFjdGl2ZSh7XG5cdFx0bGVmdDogdHJ1ZSxcblx0XHRyaWdodDogZmFsc2UsXG5cdFx0dG9wOiB0cnVlLFxuXHRcdGJvdHRvbTogZmFsc2Vcblx0fSk7XG5cdGNvbnN0IGRpcmVjdGlvbnMgPSByZWFjdGl2ZSh7XG5cdFx0bGVmdDogZmFsc2UsXG5cdFx0cmlnaHQ6IGZhbHNlLFxuXHRcdHRvcDogZmFsc2UsXG5cdFx0Ym90dG9tOiBmYWxzZVxuXHR9KTtcblx0Y29uc3Qgb25TY3JvbGxFbmQgPSAoZSkgPT4ge1xuXHRcdGlmICghaXNTY3JvbGxpbmcudmFsdWUpIHJldHVybjtcblx0XHRpc1Njcm9sbGluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdGRpcmVjdGlvbnMubGVmdCA9IGZhbHNlO1xuXHRcdGRpcmVjdGlvbnMucmlnaHQgPSBmYWxzZTtcblx0XHRkaXJlY3Rpb25zLnRvcCA9IGZhbHNlO1xuXHRcdGRpcmVjdGlvbnMuYm90dG9tID0gZmFsc2U7XG5cdFx0b25TdG9wKGUpO1xuXHR9O1xuXHRjb25zdCBvblNjcm9sbEVuZERlYm91bmNlZCA9IHVzZURlYm91bmNlRm4ob25TY3JvbGxFbmQsIHRocm90dGxlICsgaWRsZSk7XG5cdGNvbnN0IHNldEFycml2ZWRTdGF0ZSA9ICh0YXJnZXQpID0+IHtcblx0XHR2YXIgX2RvY3VtZW50Mjtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0Y29uc3QgZWwgPSAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwIHx8IChfZG9jdW1lbnQyID0gdGFyZ2V0LmRvY3VtZW50KSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZG9jdW1lbnQyLmRvY3VtZW50RWxlbWVudCkgfHwgKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldC5kb2N1bWVudEVsZW1lbnQpIHx8IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdGNvbnN0IHsgZGlzcGxheSwgZmxleERpcmVjdGlvbiwgZGlyZWN0aW9uIH0gPSB3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKGVsKTtcblx0XHRjb25zdCBkaXJlY3Rpb25NdWx0aXBsZXIgPSBkaXJlY3Rpb24gPT09IFwicnRsXCIgPyAtMSA6IDE7XG5cdFx0Y29uc3Qgc2Nyb2xsTGVmdCA9IGVsLnNjcm9sbExlZnQ7XG5cdFx0ZGlyZWN0aW9ucy5sZWZ0ID0gc2Nyb2xsTGVmdCA8IGludGVybmFsWC52YWx1ZTtcblx0XHRkaXJlY3Rpb25zLnJpZ2h0ID0gc2Nyb2xsTGVmdCA+IGludGVybmFsWC52YWx1ZTtcblx0XHRjb25zdCBsZWZ0ID0gTWF0aC5hYnMoc2Nyb2xsTGVmdCAqIGRpcmVjdGlvbk11bHRpcGxlcikgPD0gKG9mZnNldC5sZWZ0IHx8IDApO1xuXHRcdGNvbnN0IHJpZ2h0ID0gTWF0aC5hYnMoc2Nyb2xsTGVmdCAqIGRpcmVjdGlvbk11bHRpcGxlcikgKyBlbC5jbGllbnRXaWR0aCA+PSBlbC5zY3JvbGxXaWR0aCAtIChvZmZzZXQucmlnaHQgfHwgMCkgLSBBUlJJVkVEX1NUQVRFX1RIUkVTSE9MRF9QSVhFTFM7XG5cdFx0aWYgKGRpc3BsYXkgPT09IFwiZmxleFwiICYmIGZsZXhEaXJlY3Rpb24gPT09IFwicm93LXJldmVyc2VcIikge1xuXHRcdFx0YXJyaXZlZFN0YXRlLmxlZnQgPSByaWdodDtcblx0XHRcdGFycml2ZWRTdGF0ZS5yaWdodCA9IGxlZnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFycml2ZWRTdGF0ZS5sZWZ0ID0gbGVmdDtcblx0XHRcdGFycml2ZWRTdGF0ZS5yaWdodCA9IHJpZ2h0O1xuXHRcdH1cblx0XHRpbnRlcm5hbFgudmFsdWUgPSBzY3JvbGxMZWZ0O1xuXHRcdGxldCBzY3JvbGxUb3AgPSBlbC5zY3JvbGxUb3A7XG5cdFx0aWYgKHRhcmdldCA9PT0gd2luZG93JDEuZG9jdW1lbnQgJiYgIXNjcm9sbFRvcCkgc2Nyb2xsVG9wID0gd2luZG93JDEuZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG5cdFx0ZGlyZWN0aW9ucy50b3AgPSBzY3JvbGxUb3AgPCBpbnRlcm5hbFkudmFsdWU7XG5cdFx0ZGlyZWN0aW9ucy5ib3R0b20gPSBzY3JvbGxUb3AgPiBpbnRlcm5hbFkudmFsdWU7XG5cdFx0Y29uc3QgdG9wID0gTWF0aC5hYnMoc2Nyb2xsVG9wKSA8PSAob2Zmc2V0LnRvcCB8fCAwKTtcblx0XHRjb25zdCBib3R0b20gPSBNYXRoLmFicyhzY3JvbGxUb3ApICsgZWwuY2xpZW50SGVpZ2h0ID49IGVsLnNjcm9sbEhlaWdodCAtIChvZmZzZXQuYm90dG9tIHx8IDApIC0gQVJSSVZFRF9TVEFURV9USFJFU0hPTERfUElYRUxTO1xuXHRcdC8qKlxuXHRcdCogcmV2ZXJzZSBjb2x1bW5zIGFuZCByb3dzIGJlaGF2ZSBleGFjdGx5IHRoZSBvdGhlciB3YXkgYXJvdW5kLFxuXHRcdCogYm90dG9tIGlzIHRyZWF0ZWQgYXMgdG9wIGFuZCB0b3AgaXMgdHJlYXRlZCBhcyB0aGUgbmVnYXRpdmUgdmVyc2lvbiBvZiBib3R0b21cblx0XHQqL1xuXHRcdGlmIChkaXNwbGF5ID09PSBcImZsZXhcIiAmJiBmbGV4RGlyZWN0aW9uID09PSBcImNvbHVtbi1yZXZlcnNlXCIpIHtcblx0XHRcdGFycml2ZWRTdGF0ZS50b3AgPSBib3R0b207XG5cdFx0XHRhcnJpdmVkU3RhdGUuYm90dG9tID0gdG9wO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhcnJpdmVkU3RhdGUudG9wID0gdG9wO1xuXHRcdFx0YXJyaXZlZFN0YXRlLmJvdHRvbSA9IGJvdHRvbTtcblx0XHR9XG5cdFx0aW50ZXJuYWxZLnZhbHVlID0gc2Nyb2xsVG9wO1xuXHR9O1xuXHRjb25zdCBvblNjcm9sbEhhbmRsZXIgPSAoZSkgPT4ge1xuXHRcdHZhciBfZG9jdW1lbnRFbGVtZW50O1xuXHRcdGlmICghd2luZG93JDEpIHJldHVybjtcblx0XHRzZXRBcnJpdmVkU3RhdGUoKF9kb2N1bWVudEVsZW1lbnQgPSBlLnRhcmdldC5kb2N1bWVudEVsZW1lbnQpICE9PSBudWxsICYmIF9kb2N1bWVudEVsZW1lbnQgIT09IHZvaWQgMCA/IF9kb2N1bWVudEVsZW1lbnQgOiBlLnRhcmdldCk7XG5cdFx0aXNTY3JvbGxpbmcudmFsdWUgPSB0cnVlO1xuXHRcdG9uU2Nyb2xsRW5kRGVib3VuY2VkKGUpO1xuXHRcdG9uU2Nyb2xsKGUpO1xuXHR9O1xuXHR1c2VFdmVudExpc3RlbmVyKGVsZW1lbnQsIFwic2Nyb2xsXCIsIHRocm90dGxlID8gdXNlVGhyb3R0bGVGbihvblNjcm9sbEhhbmRsZXIsIHRocm90dGxlLCB0cnVlLCBmYWxzZSkgOiBvblNjcm9sbEhhbmRsZXIsIGV2ZW50TGlzdGVuZXJPcHRpb25zKTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgX2VsZW1lbnQgPSB0b1ZhbHVlKGVsZW1lbnQpO1xuXHRcdFx0aWYgKCFfZWxlbWVudCkgcmV0dXJuO1xuXHRcdFx0c2V0QXJyaXZlZFN0YXRlKF9lbGVtZW50KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fSk7XG5cdGlmICgob2JzZXJ2ZSA9PT0gbnVsbCB8fCBvYnNlcnZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvYnNlcnZlLm11dGF0aW9uKSAmJiBlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCAhPT0gd2luZG93JDEgJiYgZWxlbWVudCAhPT0gZG9jdW1lbnQpIHVzZU11dGF0aW9uT2JzZXJ2ZXIoZWxlbWVudCwgKCkgPT4ge1xuXHRcdGNvbnN0IF9lbGVtZW50ID0gdG9WYWx1ZShlbGVtZW50KTtcblx0XHRpZiAoIV9lbGVtZW50KSByZXR1cm47XG5cdFx0c2V0QXJyaXZlZFN0YXRlKF9lbGVtZW50KTtcblx0fSwge1xuXHRcdGF0dHJpYnV0ZXM6IHRydWUsXG5cdFx0Y2hpbGRMaXN0OiB0cnVlLFxuXHRcdHN1YnRyZWU6IHRydWVcblx0fSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgXCJzY3JvbGxlbmRcIiwgb25TY3JvbGxFbmQsIGV2ZW50TGlzdGVuZXJPcHRpb25zKTtcblx0cmV0dXJuIHtcblx0XHR4LFxuXHRcdHksXG5cdFx0aXNTY3JvbGxpbmcsXG5cdFx0YXJyaXZlZFN0YXRlLFxuXHRcdGRpcmVjdGlvbnMsXG5cdFx0bWVhc3VyZSgpIHtcblx0XHRcdGNvbnN0IF9lbGVtZW50ID0gdG9WYWx1ZShlbGVtZW50KTtcblx0XHRcdGlmICh3aW5kb3ckMSAmJiBfZWxlbWVudCkgc2V0QXJyaXZlZFN0YXRlKF9lbGVtZW50KTtcblx0XHR9XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUluZmluaXRlU2Nyb2xsL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgaW5maW5pdGUgc2Nyb2xsLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VJbmZpbml0ZVNjcm9sbFxuKi9cbmZ1bmN0aW9uIHVzZUluZmluaXRlU2Nyb2xsKGVsZW1lbnQsIG9uTG9hZE1vcmUsIG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkZGlzdGFuY2U7XG5cdGNvbnN0IHsgZGlyZWN0aW9uID0gXCJib3R0b21cIiwgaW50ZXJ2YWwgPSAxMDAsIGNhbkxvYWRNb3JlID0gKCkgPT4gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgc3RhdGUgPSByZWFjdGl2ZSh1c2VTY3JvbGwoZWxlbWVudCwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0b2Zmc2V0OiB7XG5cdFx0XHRbZGlyZWN0aW9uXTogKF9vcHRpb25zJGRpc3RhbmNlID0gb3B0aW9ucy5kaXN0YW5jZSkgIT09IG51bGwgJiYgX29wdGlvbnMkZGlzdGFuY2UgIT09IHZvaWQgMCA/IF9vcHRpb25zJGRpc3RhbmNlIDogMCxcblx0XHRcdC4uLm9wdGlvbnMub2Zmc2V0XG5cdFx0fVxuXHR9KSk7XG5cdGNvbnN0IHByb21pc2UgPSByZWYoKTtcblx0Y29uc3QgaXNMb2FkaW5nID0gY29tcHV0ZWQoKCkgPT4gISFwcm9taXNlLnZhbHVlKTtcblx0Y29uc3Qgb2JzZXJ2ZWRFbGVtZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsZW1lbnQpKTtcblx0fSk7XG5cdGNvbnN0IGlzRWxlbWVudFZpc2libGUgPSB1c2VFbGVtZW50VmlzaWJpbGl0eShvYnNlcnZlZEVsZW1lbnQpO1xuXHRjb25zdCBjYW5Mb2FkID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmICghb2JzZXJ2ZWRFbGVtZW50LnZhbHVlKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIGNhbkxvYWRNb3JlKG9ic2VydmVkRWxlbWVudC52YWx1ZSk7XG5cdH0pO1xuXHRmdW5jdGlvbiBjaGVja0FuZExvYWQoKSB7XG5cdFx0c3RhdGUubWVhc3VyZSgpO1xuXHRcdGlmICghb2JzZXJ2ZWRFbGVtZW50LnZhbHVlIHx8ICFpc0VsZW1lbnRWaXNpYmxlLnZhbHVlIHx8ICFjYW5Mb2FkLnZhbHVlIHx8IHByb21pc2UudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCB7IHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0LCBzY3JvbGxXaWR0aCwgY2xpZW50V2lkdGggfSA9IG9ic2VydmVkRWxlbWVudC52YWx1ZTtcblx0XHRjb25zdCBpc05hcnJvd2VyID0gZGlyZWN0aW9uID09PSBcImJvdHRvbVwiIHx8IGRpcmVjdGlvbiA9PT0gXCJ0b3BcIiA/IHNjcm9sbEhlaWdodCA8PSBjbGllbnRIZWlnaHQgOiBzY3JvbGxXaWR0aCA8PSBjbGllbnRXaWR0aDtcblx0XHRpZiAoc3RhdGUuYXJyaXZlZFN0YXRlW2RpcmVjdGlvbl0gfHwgaXNOYXJyb3dlcikgcHJvbWlzZS52YWx1ZSA9IFByb21pc2UuYWxsKFtvbkxvYWRNb3JlKHN0YXRlKSwgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgaW50ZXJ2YWwpKV0pLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0cHJvbWlzZS52YWx1ZSA9IG51bGw7XG5cdFx0XHRuZXh0VGljaygoKSA9PiBjaGVja0FuZExvYWQoKSk7XG5cdFx0fSk7XG5cdH1cblx0dHJ5T25Vbm1vdW50ZWQod2F0Y2goKCkgPT4gW1xuXHRcdHN0YXRlLmFycml2ZWRTdGF0ZVtkaXJlY3Rpb25dLFxuXHRcdGlzRWxlbWVudFZpc2libGUudmFsdWUsXG5cdFx0Y2FuTG9hZC52YWx1ZVxuXHRdLCBjaGVja0FuZExvYWQsIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pKTtcblx0cmV0dXJuIHtcblx0XHRpc0xvYWRpbmcsXG5cdFx0cmVzZXQoKSB7XG5cdFx0XHRuZXh0VGljaygoKSA9PiBjaGVja0FuZExvYWQoKSk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VLZXlNb2RpZmllci9pbmRleC50c1xuY29uc3QgZGVmYXVsdEV2ZW50cyA9IFtcblx0XCJtb3VzZWRvd25cIixcblx0XCJtb3VzZXVwXCIsXG5cdFwia2V5ZG93blwiLFxuXHRcImtleXVwXCJcbl07XG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlS2V5TW9kaWZpZXIobW9kaWZpZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50czogZXZlbnRzJDEgPSBkZWZhdWx0RXZlbnRzLCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgaW5pdGlhbCA9IG51bGwgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHN0YXRlID0gc2hhbGxvd1JlZihpbml0aWFsKTtcblx0aWYgKGRvY3VtZW50JDEpIGV2ZW50cyQxLmZvckVhY2goKGxpc3RlbmVyRXZlbnQpID0+IHtcblx0XHR1c2VFdmVudExpc3RlbmVyKGRvY3VtZW50JDEsIGxpc3RlbmVyRXZlbnQsIChldnQpID0+IHtcblx0XHRcdGlmICh0eXBlb2YgZXZ0LmdldE1vZGlmaWVyU3RhdGUgPT09IFwiZnVuY3Rpb25cIikgc3RhdGUudmFsdWUgPSBldnQuZ2V0TW9kaWZpZXJTdGF0ZShtb2RpZmllcik7XG5cdFx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR9KTtcblx0cmV0dXJuIHN0YXRlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VMb2NhbFN0b3JhZ2UvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBMb2NhbFN0b3JhZ2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUxvY2FsU3RvcmFnZVxuKiBAcGFyYW0ga2V5XG4qIEBwYXJhbSBpbml0aWFsVmFsdWVcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VMb2NhbFN0b3JhZ2Uoa2V5LCBpbml0aWFsVmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gdXNlU3RvcmFnZShrZXksIGluaXRpYWxWYWx1ZSwgd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmxvY2FsU3RvcmFnZSwgb3B0aW9ucyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1hZ2ljS2V5cy9hbGlhc01hcC50c1xuY29uc3QgRGVmYXVsdE1hZ2ljS2V5c0FsaWFzTWFwID0ge1xuXHRjdHJsOiBcImNvbnRyb2xcIixcblx0Y29tbWFuZDogXCJtZXRhXCIsXG5cdGNtZDogXCJtZXRhXCIsXG5cdG9wdGlvbjogXCJhbHRcIixcblx0dXA6IFwiYXJyb3d1cFwiLFxuXHRkb3duOiBcImFycm93ZG93blwiLFxuXHRsZWZ0OiBcImFycm93bGVmdFwiLFxuXHRyaWdodDogXCJhcnJvd3JpZ2h0XCJcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1hZ2ljS2V5cy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGtleXMgcHJlc3NlZCBzdGF0ZSwgd2l0aCBtYWdpY2FsIGtleXMgY29tYmluYXRpb24gc3VwcG9ydC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWFnaWNLZXlzXG4qL1xuZnVuY3Rpb24gdXNlTWFnaWNLZXlzKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHJlYWN0aXZlOiB1c2VSZWFjdGl2ZSA9IGZhbHNlLCB0YXJnZXQgPSBkZWZhdWx0V2luZG93LCBhbGlhc01hcCA9IERlZmF1bHRNYWdpY0tleXNBbGlhc01hcCwgcGFzc2l2ZSA9IHRydWUsIG9uRXZlbnRGaXJlZCA9IG5vb3AgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGN1cnJlbnQgPSByZWFjdGl2ZSgvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKTtcblx0Y29uc3Qgb2JqID0ge1xuXHRcdHRvSlNPTigpIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9LFxuXHRcdGN1cnJlbnRcblx0fTtcblx0Y29uc3QgcmVmcyA9IHVzZVJlYWN0aXZlID8gcmVhY3RpdmUob2JqKSA6IG9iajtcblx0Y29uc3QgbWV0YURlcHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRjb25zdCBkZXBzTWFwID0gbmV3IE1hcChbXG5cdFx0W1wiTWV0YVwiLCBtZXRhRGVwc10sXG5cdFx0W1wiU2hpZnRcIiwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKV0sXG5cdFx0W1wiQWx0XCIsIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCldXG5cdF0pO1xuXHRjb25zdCB1c2VkS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdGZ1bmN0aW9uIHNldFJlZnMoa2V5LCB2YWx1ZSkge1xuXHRcdGlmIChrZXkgaW4gcmVmcykgaWYgKHVzZVJlYWN0aXZlKSByZWZzW2tleV0gPSB2YWx1ZTtcblx0XHRlbHNlIHJlZnNba2V5XS52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXHRcdGN1cnJlbnQuY2xlYXIoKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiB1c2VkS2V5cykgc2V0UmVmcyhrZXksIGZhbHNlKTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGVEZXBzKHZhbHVlLCBlLCBrZXlzJDEpIHtcblx0XHRpZiAoIXZhbHVlIHx8IHR5cGVvZiBlLmdldE1vZGlmaWVyU3RhdGUgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgW21vZGlmaWVyLCBkZXBzU2V0XSBvZiBkZXBzTWFwKSBpZiAoZS5nZXRNb2RpZmllclN0YXRlKG1vZGlmaWVyKSkge1xuXHRcdFx0a2V5cyQxLmZvckVhY2goKGtleSkgPT4gZGVwc1NldC5hZGQoa2V5KSk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0ZnVuY3Rpb24gY2xlYXJEZXBzKHZhbHVlLCBrZXkpIHtcblx0XHRpZiAodmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBkZXBzTWFwS2V5ID0gYCR7a2V5WzBdLnRvVXBwZXJDYXNlKCl9JHtrZXkuc2xpY2UoMSl9YDtcblx0XHRjb25zdCBkZXBzID0gZGVwc01hcC5nZXQoZGVwc01hcEtleSk7XG5cdFx0aWYgKCFbXCJzaGlmdFwiLCBcImFsdFwiXS5pbmNsdWRlcyhrZXkpIHx8ICFkZXBzKSByZXR1cm47XG5cdFx0Y29uc3QgZGVwc0FycmF5ID0gQXJyYXkuZnJvbShkZXBzKTtcblx0XHRjb25zdCBkZXBzSW5kZXggPSBkZXBzQXJyYXkuaW5kZXhPZihrZXkpO1xuXHRcdGRlcHNBcnJheS5mb3JFYWNoKChrZXkkMSwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCA+PSBkZXBzSW5kZXgpIHtcblx0XHRcdFx0Y3VycmVudC5kZWxldGUoa2V5JDEpO1xuXHRcdFx0XHRzZXRSZWZzKGtleSQxLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0ZGVwcy5jbGVhcigpO1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZVJlZnMoZSwgdmFsdWUpIHtcblx0XHR2YXIgX2Uka2V5LCBfZSRjb2RlO1xuXHRcdGNvbnN0IGtleSA9IChfZSRrZXkgPSBlLmtleSkgPT09IG51bGwgfHwgX2Uka2V5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZSRrZXkudG9Mb3dlckNhc2UoKTtcblx0XHRjb25zdCB2YWx1ZXMgPSBbKF9lJGNvZGUgPSBlLmNvZGUpID09PSBudWxsIHx8IF9lJGNvZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lJGNvZGUudG9Mb3dlckNhc2UoKSwga2V5XS5maWx0ZXIoQm9vbGVhbik7XG5cdFx0aWYgKCFrZXkpIHJldHVybjtcblx0XHRpZiAoa2V5KSBpZiAodmFsdWUpIGN1cnJlbnQuYWRkKGtleSk7XG5cdFx0ZWxzZSBjdXJyZW50LmRlbGV0ZShrZXkpO1xuXHRcdGZvciAoY29uc3Qga2V5JDEgb2YgdmFsdWVzKSB7XG5cdFx0XHR1c2VkS2V5cy5hZGQoa2V5JDEpO1xuXHRcdFx0c2V0UmVmcyhrZXkkMSwgdmFsdWUpO1xuXHRcdH1cblx0XHR1cGRhdGVEZXBzKHZhbHVlLCBlLCBbLi4uY3VycmVudCwgLi4udmFsdWVzXSk7XG5cdFx0Y2xlYXJEZXBzKHZhbHVlLCBrZXkpO1xuXHRcdGlmIChrZXkgPT09IFwibWV0YVwiICYmICF2YWx1ZSkge1xuXHRcdFx0bWV0YURlcHMuZm9yRWFjaCgoa2V5JDEpID0+IHtcblx0XHRcdFx0Y3VycmVudC5kZWxldGUoa2V5JDEpO1xuXHRcdFx0XHRzZXRSZWZzKGtleSQxLCBmYWxzZSk7XG5cdFx0XHR9KTtcblx0XHRcdG1ldGFEZXBzLmNsZWFyKCk7XG5cdFx0fVxuXHR9XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImtleWRvd25cIiwgKGUpID0+IHtcblx0XHR1cGRhdGVSZWZzKGUsIHRydWUpO1xuXHRcdHJldHVybiBvbkV2ZW50RmlyZWQoZSk7XG5cdH0sIHsgcGFzc2l2ZSB9KTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwia2V5dXBcIiwgKGUpID0+IHtcblx0XHR1cGRhdGVSZWZzKGUsIGZhbHNlKTtcblx0XHRyZXR1cm4gb25FdmVudEZpcmVkKGUpO1xuXHR9LCB7IHBhc3NpdmUgfSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHJlc2V0LCB7IHBhc3NpdmUgfSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCByZXNldCwgeyBwYXNzaXZlIH0pO1xuXHRjb25zdCBwcm94eSA9IG5ldyBQcm94eShyZWZzLCB7IGdldCh0YXJnZXQkMSwgcHJvcCwgcmVjKSB7XG5cdFx0aWYgKHR5cGVvZiBwcm9wICE9PSBcInN0cmluZ1wiKSByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0JDEsIHByb3AsIHJlYyk7XG5cdFx0cHJvcCA9IHByb3AudG9Mb3dlckNhc2UoKTtcblx0XHRpZiAocHJvcCBpbiBhbGlhc01hcCkgcHJvcCA9IGFsaWFzTWFwW3Byb3BdO1xuXHRcdGlmICghKHByb3AgaW4gcmVmcykpIGlmICgvWytfLV0vLnRlc3QocHJvcCkpIHtcblx0XHRcdGNvbnN0IGtleXMkMSA9IHByb3Auc3BsaXQoL1srXy1dL2cpLm1hcCgoaSkgPT4gaS50cmltKCkpO1xuXHRcdFx0cmVmc1twcm9wXSA9IGNvbXB1dGVkKCgpID0+IGtleXMkMS5tYXAoKGtleSkgPT4gdG9WYWx1ZShwcm94eVtrZXldKSkuZXZlcnkoQm9vbGVhbikpO1xuXHRcdH0gZWxzZSByZWZzW3Byb3BdID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdFx0Y29uc3QgciA9IFJlZmxlY3QuZ2V0KHRhcmdldCQxLCBwcm9wLCByZWMpO1xuXHRcdHJldHVybiB1c2VSZWFjdGl2ZSA/IHRvVmFsdWUocikgOiByO1xuXHR9IH0pO1xuXHRyZXR1cm4gcHJveHk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1lZGlhQ29udHJvbHMvaW5kZXgudHNcbi8qKlxuKiBBdXRvbWF0aWNhbGx5IGNoZWNrIGlmIHRoZSByZWYgZXhpc3RzIGFuZCBpZiBpdCBkb2VzIHJ1biB0aGUgY2IgZm5cbiovXG5mdW5jdGlvbiB1c2luZ0VsUmVmKHNvdXJjZSwgY2IpIHtcblx0aWYgKHRvVmFsdWUoc291cmNlKSkgY2IodG9WYWx1ZShzb3VyY2UpKTtcbn1cbi8qKlxuKiBDb252ZXJ0cyBhIFRpbWVSYW5nZSBvYmplY3QgdG8gYW4gYXJyYXlcbiovXG5mdW5jdGlvbiB0aW1lUmFuZ2VUb0FycmF5KHRpbWVSYW5nZXMpIHtcblx0bGV0IHJhbmdlcyA9IFtdO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVSYW5nZXMubGVuZ3RoOyArK2kpIHJhbmdlcyA9IFsuLi5yYW5nZXMsIFt0aW1lUmFuZ2VzLnN0YXJ0KGkpLCB0aW1lUmFuZ2VzLmVuZChpKV1dO1xuXHRyZXR1cm4gcmFuZ2VzO1xufVxuLyoqXG4qIENvbnZlcnRzIGEgVGV4dFRyYWNrTGlzdCBvYmplY3QgdG8gYW4gYXJyYXkgb2YgYFVzZU1lZGlhVGV4dFRyYWNrYFxuKi9cbmZ1bmN0aW9uIHRyYWNrc1RvQXJyYXkodHJhY2tzKSB7XG5cdHJldHVybiBBcnJheS5mcm9tKHRyYWNrcykubWFwKCh7IGxhYmVsLCBraW5kLCBsYW5ndWFnZSwgbW9kZSwgYWN0aXZlQ3VlcywgY3VlcywgaW5CYW5kTWV0YWRhdGFUcmFja0Rpc3BhdGNoVHlwZSB9LCBpZCkgPT4gKHtcblx0XHRpZCxcblx0XHRsYWJlbCxcblx0XHRraW5kLFxuXHRcdGxhbmd1YWdlLFxuXHRcdG1vZGUsXG5cdFx0YWN0aXZlQ3Vlcyxcblx0XHRjdWVzLFxuXHRcdGluQmFuZE1ldGFkYXRhVHJhY2tEaXNwYXRjaFR5cGVcblx0fSkpO1xufVxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG5cdHNyYzogXCJcIixcblx0dHJhY2tzOiBbXVxufTtcbmZ1bmN0aW9uIHVzZU1lZGlhQ29udHJvbHModGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0dGFyZ2V0ID0gdG9SZWYodGFyZ2V0KTtcblx0b3B0aW9ucyA9IHtcblx0XHQuLi5kZWZhdWx0T3B0aW9ucyxcblx0XHQuLi5vcHRpb25zXG5cdH07XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRjb25zdCBjdXJyZW50VGltZSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGR1cmF0aW9uID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3Qgc2Vla2luZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCB2b2x1bWUgPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCB3YWl0aW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGVuZGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHBsYXlpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgcmF0ZSA9IHNoYWxsb3dSZWYoMSk7XG5cdGNvbnN0IHN0YWxsZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgYnVmZmVyZWQgPSByZWYoW10pO1xuXHRjb25zdCB0cmFja3MgPSByZWYoW10pO1xuXHRjb25zdCBzZWxlY3RlZFRyYWNrID0gc2hhbGxvd1JlZigtMSk7XG5cdGNvbnN0IGlzUGljdHVyZUluUGljdHVyZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBtdXRlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzdXBwb3J0c1BpY3R1cmVJblBpY3R1cmUgPSBCb29sZWFuKGRvY3VtZW50JDEgJiYgXCJwaWN0dXJlSW5QaWN0dXJlRW5hYmxlZFwiIGluIGRvY3VtZW50JDEpO1xuXHRjb25zdCBzb3VyY2VFcnJvckV2ZW50ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHBsYXliYWNrRXJyb3JFdmVudCA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHQvKipcblx0KiBEaXNhYmxlcyB0aGUgc3BlY2lmaWVkIHRyYWNrLiBJZiBubyB0cmFjayBpcyBzcGVjaWZpZWQgdGhlblxuXHQqIGFsbCB0cmFja3Mgd2lsbCBiZSBkaXNhYmxlZFxuXHQqXG5cdCogQHBhcmFtIHRyYWNrIFRoZSBpZCBvZiB0aGUgdHJhY2sgdG8gZGlzYWJsZVxuXHQqL1xuXHRjb25zdCBkaXNhYmxlVHJhY2sgPSAodHJhY2spID0+IHtcblx0XHR1c2luZ0VsUmVmKHRhcmdldCwgKGVsKSA9PiB7XG5cdFx0XHRpZiAodHJhY2spIHtcblx0XHRcdFx0Y29uc3QgaWQgPSB0eXBlb2YgdHJhY2sgPT09IFwibnVtYmVyXCIgPyB0cmFjayA6IHRyYWNrLmlkO1xuXHRcdFx0XHRlbC50ZXh0VHJhY2tzW2lkXS5tb2RlID0gXCJkaXNhYmxlZFwiO1xuXHRcdFx0fSBlbHNlIGZvciAobGV0IGkgPSAwOyBpIDwgZWwudGV4dFRyYWNrcy5sZW5ndGg7ICsraSkgZWwudGV4dFRyYWNrc1tpXS5tb2RlID0gXCJkaXNhYmxlZFwiO1xuXHRcdFx0c2VsZWN0ZWRUcmFjay52YWx1ZSA9IC0xO1xuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBFbmFibGVzIHRoZSBzcGVjaWZpZWQgdHJhY2sgYW5kIGRpc2FibGVzIHRoZVxuXHQqIG90aGVyIHRyYWNrcyB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZFxuXHQqXG5cdCogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayBvZiB0aGUgaWQgb2YgdGhlIHRyYWNrIHRvIGVuYWJsZVxuXHQqIEBwYXJhbSBkaXNhYmxlVHJhY2tzIERpc2FibGUgYWxsIG90aGVyIHRyYWNrc1xuXHQqL1xuXHRjb25zdCBlbmFibGVUcmFjayA9ICh0cmFjaywgZGlzYWJsZVRyYWNrcyA9IHRydWUpID0+IHtcblx0XHR1c2luZ0VsUmVmKHRhcmdldCwgKGVsKSA9PiB7XG5cdFx0XHRjb25zdCBpZCA9IHR5cGVvZiB0cmFjayA9PT0gXCJudW1iZXJcIiA/IHRyYWNrIDogdHJhY2suaWQ7XG5cdFx0XHRpZiAoZGlzYWJsZVRyYWNrcykgZGlzYWJsZVRyYWNrKCk7XG5cdFx0XHRlbC50ZXh0VHJhY2tzW2lkXS5tb2RlID0gXCJzaG93aW5nXCI7XG5cdFx0XHRzZWxlY3RlZFRyYWNrLnZhbHVlID0gaWQ7XG5cdFx0fSk7XG5cdH07XG5cdC8qKlxuXHQqIFRvZ2dsZSBwaWN0dXJlIGluIHBpY3R1cmUgbW9kZSBmb3IgdGhlIHBsYXllci5cblx0Ki9cblx0Y29uc3QgdG9nZ2xlUGljdHVyZUluUGljdHVyZSA9ICgpID0+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dXNpbmdFbFJlZih0YXJnZXQsIGFzeW5jIChlbCkgPT4ge1xuXHRcdFx0XHRpZiAoc3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlKSBpZiAoIWlzUGljdHVyZUluUGljdHVyZS52YWx1ZSkgZWwucmVxdWVzdFBpY3R1cmVJblBpY3R1cmUoKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG5cdFx0XHRcdGVsc2UgZG9jdW1lbnQkMS5leGl0UGljdHVyZUluUGljdHVyZSgpLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBpbmplY3Qgc291cmNlcyB0byB0aGUgbWVkaWEgZWxlbWVudC4gVGhlIHNvdXJjZXMgd2lsbCBiZVxuXHQqIGFwcGVuZGVkIGFzIGNoaWxkcmVuIHRvIHRoZSBtZWRpYSBlbGVtZW50IGFzIGA8c291cmNlPmAgZWxlbWVudHMuXG5cdCovXG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHJldHVybjtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0Y29uc3Qgc3JjID0gdG9WYWx1ZShvcHRpb25zLnNyYyk7XG5cdFx0bGV0IHNvdXJjZXMgPSBbXTtcblx0XHRpZiAoIXNyYykgcmV0dXJuO1xuXHRcdGlmICh0eXBlb2Ygc3JjID09PSBcInN0cmluZ1wiKSBzb3VyY2VzID0gW3sgc3JjIH1dO1xuXHRcdGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSkgc291cmNlcyA9IHNyYztcblx0XHRlbHNlIGlmIChpc09iamVjdChzcmMpKSBzb3VyY2VzID0gW3NyY107XG5cdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcInNvdXJjZVwiKS5mb3JFYWNoKChlKSA9PiB7XG5cdFx0XHRlLnJlbW92ZSgpO1xuXHRcdH0pO1xuXHRcdHNvdXJjZXMuZm9yRWFjaCgoeyBzcmM6IHNyYyQxLCB0eXBlLCBtZWRpYSB9KSA9PiB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoXCJzb3VyY2VcIik7XG5cdFx0XHRzb3VyY2Uuc2V0QXR0cmlidXRlKFwic3JjXCIsIHNyYyQxKTtcblx0XHRcdHNvdXJjZS5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIHR5cGUgfHwgXCJcIik7XG5cdFx0XHRzb3VyY2Uuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEgfHwgXCJcIik7XG5cdFx0XHR1c2VFdmVudExpc3RlbmVyKHNvdXJjZSwgXCJlcnJvclwiLCBzb3VyY2VFcnJvckV2ZW50LnRyaWdnZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0XHRlbC5hcHBlbmRDaGlsZChzb3VyY2UpO1xuXHRcdH0pO1xuXHRcdGVsLmxvYWQoKTtcblx0fSk7XG5cdC8qKlxuXHQqIEFwcGx5IGNvbXBvc2FibGUgc3RhdGUgdG8gdGhlIGVsZW1lbnQsIGFsc28gd2hlbiBlbGVtZW50IGlzIGNoYW5nZWRcblx0Ki9cblx0d2F0Y2goW3RhcmdldCwgdm9sdW1lXSwgKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRlbC52b2x1bWUgPSB2b2x1bWUudmFsdWU7XG5cdH0pO1xuXHR3YXRjaChbdGFyZ2V0LCBtdXRlZF0sICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwubXV0ZWQgPSBtdXRlZC52YWx1ZTtcblx0fSk7XG5cdHdhdGNoKFt0YXJnZXQsIHJhdGVdLCAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGVsLnBsYXliYWNrUmF0ZSA9IHJhdGUudmFsdWU7XG5cdH0pO1xuXHQvKipcblx0KiBMb2FkIFRyYWNrc1xuXHQqL1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKCFkb2N1bWVudCQxKSByZXR1cm47XG5cdFx0Y29uc3QgdGV4dFRyYWNrcyA9IHRvVmFsdWUob3B0aW9ucy50cmFja3MpO1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghdGV4dFRyYWNrcyB8fCAhdGV4dFRyYWNrcy5sZW5ndGggfHwgIWVsKSByZXR1cm47XG5cdFx0LyoqXG5cdFx0KiBUaGUgTWVkaWFBUEkgcHJvdmlkZXMgYW4gQVBJIGZvciBhZGRpbmcgdGV4dCB0cmFja3MsIGJ1dCB0aGV5IGRvbid0IGN1cnJlbnRseVxuXHRcdCogaGF2ZSBhbiBBUEkgZm9yIHJlbW92aW5nIHRleHQgdHJhY2tzLCBzbyBpbnN0ZWFkIHdlIHdpbGwganVzdCBjcmVhdGUgYW5kIHJlbW92ZVxuXHRcdCogdGhlIHRyYWNrcyBtYW51YWxseSB1c2luZyB0aGUgSFRNTCBhcGkuXG5cdFx0Ki9cblx0XHRlbC5xdWVyeVNlbGVjdG9yQWxsKFwidHJhY2tcIikuZm9yRWFjaCgoZSkgPT4gZS5yZW1vdmUoKSk7XG5cdFx0dGV4dFRyYWNrcy5mb3JFYWNoKCh7IGRlZmF1bHQ6IGlzRGVmYXVsdCwga2luZCwgbGFiZWwsIHNyYywgc3JjTGFuZyB9LCBpKSA9PiB7XG5cdFx0XHRjb25zdCB0cmFjayA9IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChcInRyYWNrXCIpO1xuXHRcdFx0dHJhY2suZGVmYXVsdCA9IGlzRGVmYXVsdCB8fCBmYWxzZTtcblx0XHRcdHRyYWNrLmtpbmQgPSBraW5kO1xuXHRcdFx0dHJhY2subGFiZWwgPSBsYWJlbDtcblx0XHRcdHRyYWNrLnNyYyA9IHNyYztcblx0XHRcdHRyYWNrLnNyY2xhbmcgPSBzcmNMYW5nO1xuXHRcdFx0aWYgKHRyYWNrLmRlZmF1bHQpIHNlbGVjdGVkVHJhY2sudmFsdWUgPSBpO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQodHJhY2spO1xuXHRcdH0pO1xuXHR9KTtcblx0LyoqXG5cdCogVGhpcyB3aWxsIGFsbG93IHVzIHRvIHVwZGF0ZSB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIHRpbWV1cGRhdGUgZXZlbnRcblx0KiB3aXRob3V0IHNldHRpbmcgdGhlIG1lZGlhcyBjdXJyZW50IHBvc2l0aW9uLCBidXQgaWYgdGhlIHVzZXIgY2hhbmdlcyB0aGVcblx0KiBjdXJyZW50IHRpbWUgdmlhIHRoZSByZWYsIHRoZW4gdGhlIG1lZGlhIHdpbGwgc2Vlay5cblx0KlxuXHQqIElmIHdlIGRpZCBub3QgdXNlIGFuIGlnbm9yYWJsZSB3YXRjaCwgdGhlbiB0aGUgY3VycmVudCB0aW1lIHVwZGF0ZSBmcm9tXG5cdCogdGhlIHRpbWV1cGRhdGUgZXZlbnQgd291bGQgY2F1c2UgdGhlIG1lZGlhIHRvIHN0dXR0ZXIuXG5cdCovXG5cdGNvbnN0IHsgaWdub3JlVXBkYXRlczogaWdub3JlQ3VycmVudFRpbWVVcGRhdGVzIH0gPSB3YXRjaElnbm9yYWJsZShjdXJyZW50VGltZSwgKHRpbWUpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwuY3VycmVudFRpbWUgPSB0aW1lO1xuXHR9KTtcblx0LyoqXG5cdCogVXNpbmcgYW4gaWdub3JhYmxlIHdhdGNoIHNvIHdlIGNhbiBjb250cm9sIHRoZSBwbGF5IHN0YXRlIHVzaW5nIGEgcmVmIGFuZCBub3Rcblx0KiBhIGZ1bmN0aW9uXG5cdCovXG5cdGNvbnN0IHsgaWdub3JlVXBkYXRlczogaWdub3JlUGxheWluZ1VwZGF0ZXMgfSA9IHdhdGNoSWdub3JhYmxlKHBsYXlpbmcsIChpc1BsYXlpbmcpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0aWYgKGlzUGxheWluZykgZWwucGxheSgpLmNhdGNoKChlKSA9PiB7XG5cdFx0XHRwbGF5YmFja0Vycm9yRXZlbnQudHJpZ2dlcihlKTtcblx0XHRcdHRocm93IGU7XG5cdFx0fSk7XG5cdFx0ZWxzZSBlbC5wYXVzZSgpO1xuXHR9KTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidGltZXVwZGF0ZVwiLCAoKSA9PiBpZ25vcmVDdXJyZW50VGltZVVwZGF0ZXMoKCkgPT4gY3VycmVudFRpbWUudmFsdWUgPSB0b1ZhbHVlKHRhcmdldCkuY3VycmVudFRpbWUpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkdXJhdGlvbmNoYW5nZVwiLCAoKSA9PiBkdXJhdGlvbi52YWx1ZSA9IHRvVmFsdWUodGFyZ2V0KS5kdXJhdGlvbiwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicHJvZ3Jlc3NcIiwgKCkgPT4gYnVmZmVyZWQudmFsdWUgPSB0aW1lUmFuZ2VUb0FycmF5KHRvVmFsdWUodGFyZ2V0KS5idWZmZXJlZCksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInNlZWtpbmdcIiwgKCkgPT4gc2Vla2luZy52YWx1ZSA9IHRydWUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInNlZWtlZFwiLCAoKSA9PiBzZWVraW5nLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXCJ3YWl0aW5nXCIsIFwibG9hZHN0YXJ0XCJdLCAoKSA9PiB7XG5cdFx0d2FpdGluZy52YWx1ZSA9IHRydWU7XG5cdFx0aWdub3JlUGxheWluZ1VwZGF0ZXMoKCkgPT4gcGxheWluZy52YWx1ZSA9IGZhbHNlKTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwibG9hZGVkZGF0YVwiLCAoKSA9PiB3YWl0aW5nLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBsYXlpbmdcIiwgKCkgPT4ge1xuXHRcdHdhaXRpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRlbmRlZC52YWx1ZSA9IGZhbHNlO1xuXHRcdGlnbm9yZVBsYXlpbmdVcGRhdGVzKCgpID0+IHBsYXlpbmcudmFsdWUgPSB0cnVlKTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicmF0ZWNoYW5nZVwiLCAoKSA9PiByYXRlLnZhbHVlID0gdG9WYWx1ZSh0YXJnZXQpLnBsYXliYWNrUmF0ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwic3RhbGxlZFwiLCAoKSA9PiBzdGFsbGVkLnZhbHVlID0gdHJ1ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZW5kZWRcIiwgKCkgPT4gZW5kZWQudmFsdWUgPSB0cnVlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwYXVzZVwiLCAoKSA9PiBpZ25vcmVQbGF5aW5nVXBkYXRlcygoKSA9PiBwbGF5aW5nLnZhbHVlID0gZmFsc2UpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwbGF5XCIsICgpID0+IGlnbm9yZVBsYXlpbmdVcGRhdGVzKCgpID0+IHBsYXlpbmcudmFsdWUgPSB0cnVlKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZW50ZXJwaWN0dXJlaW5waWN0dXJlXCIsICgpID0+IGlzUGljdHVyZUluUGljdHVyZS52YWx1ZSA9IHRydWUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImxlYXZlcGljdHVyZWlucGljdHVyZVwiLCAoKSA9PiBpc1BpY3R1cmVJblBpY3R1cmUudmFsdWUgPSBmYWxzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidm9sdW1lY2hhbmdlXCIsICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0dm9sdW1lLnZhbHVlID0gZWwudm9sdW1lO1xuXHRcdG11dGVkLnZhbHVlID0gZWwubXV0ZWQ7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdC8qKlxuXHQqIFRoZSBmb2xsb3dpbmcgbGlzdGVuZXJzIG5lZWQgdG8gbGlzdGVuIHRvIGEgbmVzdGVkXG5cdCogb2JqZWN0IG9uIHRoZSB0YXJnZXQsIHNvIHdlIHdpbGwgaGF2ZSB0byB1c2UgYSBuZXN0ZWRcblx0KiB3YXRjaCBhbmQgbWFudWFsbHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnNcblx0Ki9cblx0Y29uc3QgbGlzdGVuZXJzID0gW107XG5cdGNvbnN0IHN0b3AgPSB3YXRjaChbdGFyZ2V0XSwgKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRzdG9wKCk7XG5cdFx0bGlzdGVuZXJzWzBdID0gdXNlRXZlbnRMaXN0ZW5lcihlbC50ZXh0VHJhY2tzLCBcImFkZHRyYWNrXCIsICgpID0+IHRyYWNrcy52YWx1ZSA9IHRyYWNrc1RvQXJyYXkoZWwudGV4dFRyYWNrcyksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0bGlzdGVuZXJzWzFdID0gdXNlRXZlbnRMaXN0ZW5lcihlbC50ZXh0VHJhY2tzLCBcInJlbW92ZXRyYWNrXCIsICgpID0+IHRyYWNrcy52YWx1ZSA9IHRyYWNrc1RvQXJyYXkoZWwudGV4dFRyYWNrcyksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0bGlzdGVuZXJzWzJdID0gdXNlRXZlbnRMaXN0ZW5lcihlbC50ZXh0VHJhY2tzLCBcImNoYW5nZVwiLCAoKSA9PiB0cmFja3MudmFsdWUgPSB0cmFja3NUb0FycmF5KGVsLnRleHRUcmFja3MpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4gbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcigpKSk7XG5cdHJldHVybiB7XG5cdFx0Y3VycmVudFRpbWUsXG5cdFx0ZHVyYXRpb24sXG5cdFx0d2FpdGluZyxcblx0XHRzZWVraW5nLFxuXHRcdGVuZGVkLFxuXHRcdHN0YWxsZWQsXG5cdFx0YnVmZmVyZWQsXG5cdFx0cGxheWluZyxcblx0XHRyYXRlLFxuXHRcdHZvbHVtZSxcblx0XHRtdXRlZCxcblx0XHR0cmFja3MsXG5cdFx0c2VsZWN0ZWRUcmFjayxcblx0XHRlbmFibGVUcmFjayxcblx0XHRkaXNhYmxlVHJhY2ssXG5cdFx0c3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlLFxuXHRcdHRvZ2dsZVBpY3R1cmVJblBpY3R1cmUsXG5cdFx0aXNQaWN0dXJlSW5QaWN0dXJlLFxuXHRcdG9uU291cmNlRXJyb3I6IHNvdXJjZUVycm9yRXZlbnQub24sXG5cdFx0b25QbGF5YmFja0Vycm9yOiBwbGF5YmFja0Vycm9yRXZlbnQub25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTWVtb2l6ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGZ1bmN0aW9uIHJlc3VsdCBjYWNoZSBiYXNlZCBvbiBhcmd1bWVudHNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VNZW1vaXplKHJlc29sdmVyLCBvcHRpb25zKSB7XG5cdGNvbnN0IGluaXRDYWNoZSA9ICgpID0+IHtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhY2hlKSByZXR1cm4gc2hhbGxvd1JlYWN0aXZlKG9wdGlvbnMuY2FjaGUpO1xuXHRcdHJldHVybiBzaGFsbG93UmVhY3RpdmUoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7XG5cdH07XG5cdGNvbnN0IGNhY2hlID0gaW5pdENhY2hlKCk7XG5cdC8qKlxuXHQqIEdlbmVyYXRlIGtleSBmcm9tIGFyZ3Ncblx0Ki9cblx0Y29uc3QgZ2VuZXJhdGVLZXkgPSAoLi4uYXJncykgPT4gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5nZXRLZXkpID8gb3B0aW9ucy5nZXRLZXkoLi4uYXJncykgOiBKU09OLnN0cmluZ2lmeShhcmdzKTtcblx0LyoqXG5cdCogTG9hZCBkYXRhIGFuZCBzYXZlIGluIGNhY2hlXG5cdCovXG5cdGNvbnN0IF9sb2FkRGF0YSA9IChrZXksIC4uLmFyZ3MpID0+IHtcblx0XHRjYWNoZS5zZXQoa2V5LCByZXNvbHZlciguLi5hcmdzKSk7XG5cdFx0cmV0dXJuIGNhY2hlLmdldChrZXkpO1xuXHR9O1xuXHRjb25zdCBsb2FkRGF0YSA9ICguLi5hcmdzKSA9PiBfbG9hZERhdGEoZ2VuZXJhdGVLZXkoLi4uYXJncyksIC4uLmFyZ3MpO1xuXHQvKipcblx0KiBEZWxldGUga2V5IGZyb20gY2FjaGVcblx0Ki9cblx0Y29uc3QgZGVsZXRlRGF0YSA9ICguLi5hcmdzKSA9PiB7XG5cdFx0Y2FjaGUuZGVsZXRlKGdlbmVyYXRlS2V5KC4uLmFyZ3MpKTtcblx0fTtcblx0LyoqXG5cdCogQ2xlYXIgY2FjaGVkIGRhdGFcblx0Ki9cblx0Y29uc3QgY2xlYXJEYXRhID0gKCkgPT4ge1xuXHRcdGNhY2hlLmNsZWFyKCk7XG5cdH07XG5cdGNvbnN0IG1lbW9pemVkID0gKC4uLmFyZ3MpID0+IHtcblx0XHRjb25zdCBrZXkgPSBnZW5lcmF0ZUtleSguLi5hcmdzKTtcblx0XHRpZiAoY2FjaGUuaGFzKGtleSkpIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcblx0XHRyZXR1cm4gX2xvYWREYXRhKGtleSwgLi4uYXJncyk7XG5cdH07XG5cdG1lbW9pemVkLmxvYWQgPSBsb2FkRGF0YTtcblx0bWVtb2l6ZWQuZGVsZXRlID0gZGVsZXRlRGF0YTtcblx0bWVtb2l6ZWQuY2xlYXIgPSBjbGVhckRhdGE7XG5cdG1lbW9pemVkLmdlbmVyYXRlS2V5ID0gZ2VuZXJhdGVLZXk7XG5cdG1lbW9pemVkLmNhY2hlID0gY2FjaGU7XG5cdHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTWVtb3J5L2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDYob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlQ2FsbGJhY2tcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IDFlMywgaW1tZWRpYXRlLCBpbW1lZGlhdGVDYWxsYmFjayB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCBpbnRlcnZhbCwge1xuXHRcdFx0aW1tZWRpYXRlLFxuXHRcdFx0aW1tZWRpYXRlQ2FsbGJhY2tcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gdXNlSW50ZXJ2YWxGbjtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBNZW1vcnkgSW5mby5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWVtb3J5XG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTWVtb3J5KG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBtZW1vcnkgPSByZWYoKTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBcIm1lbW9yeVwiIGluIHBlcmZvcm1hbmNlKTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0Y29uc3QgeyBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDYgfSA9IG9wdGlvbnM7XG5cdFx0c2NoZWR1bGVyKCgpID0+IHtcblx0XHRcdG1lbW9yeS52YWx1ZSA9IHBlcmZvcm1hbmNlLm1lbW9yeTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdG1lbW9yeVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNb3VzZS9pbmRleC50c1xuY29uc3QgVXNlTW91c2VCdWlsdGluRXh0cmFjdG9ycyA9IHtcblx0cGFnZTogKGV2ZW50KSA9PiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXSxcblx0Y2xpZW50OiAoZXZlbnQpID0+IFtldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZXSxcblx0c2NyZWVuOiAoZXZlbnQpID0+IFtldmVudC5zY3JlZW5YLCBldmVudC5zY3JlZW5ZXSxcblx0bW92ZW1lbnQ6IChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ID8gW2V2ZW50Lm1vdmVtZW50WCwgZXZlbnQubW92ZW1lbnRZXSA6IG51bGxcbn07XG4vKipcbiogUmVhY3RpdmUgbW91c2UgcG9zaXRpb24uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1vdXNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTW91c2Uob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdHlwZSA9IFwicGFnZVwiLCB0b3VjaCA9IHRydWUsIHJlc2V0T25Ub3VjaEVuZHMgPSBmYWxzZSwgaW5pdGlhbFZhbHVlID0ge1xuXHRcdHg6IDAsXG5cdFx0eTogMFxuXHR9LCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgdGFyZ2V0ID0gd2luZG93JDEsIHNjcm9sbCA9IHRydWUsIGV2ZW50RmlsdGVyIH0gPSBvcHRpb25zO1xuXHRsZXQgX3ByZXZNb3VzZUV2ZW50ID0gbnVsbDtcblx0bGV0IF9wcmV2U2Nyb2xsWCA9IDA7XG5cdGxldCBfcHJldlNjcm9sbFkgPSAwO1xuXHRjb25zdCB4ID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUueCk7XG5cdGNvbnN0IHkgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZS55KTtcblx0Y29uc3Qgc291cmNlVHlwZSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGV4dHJhY3RvciA9IHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIgPyB0eXBlIDogVXNlTW91c2VCdWlsdGluRXh0cmFjdG9yc1t0eXBlXTtcblx0Y29uc3QgbW91c2VIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZXh0cmFjdG9yKGV2ZW50KTtcblx0XHRfcHJldk1vdXNlRXZlbnQgPSBldmVudDtcblx0XHRpZiAocmVzdWx0KSB7XG5cdFx0XHRbeC52YWx1ZSwgeS52YWx1ZV0gPSByZXN1bHQ7XG5cdFx0XHRzb3VyY2VUeXBlLnZhbHVlID0gXCJtb3VzZVwiO1xuXHRcdH1cblx0XHRpZiAod2luZG93JDEpIHtcblx0XHRcdF9wcmV2U2Nyb2xsWCA9IHdpbmRvdyQxLnNjcm9sbFg7XG5cdFx0XHRfcHJldlNjcm9sbFkgPSB3aW5kb3ckMS5zY3JvbGxZO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgdG91Y2hIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0aWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gZXh0cmFjdG9yKGV2ZW50LnRvdWNoZXNbMF0pO1xuXHRcdFx0aWYgKHJlc3VsdCkge1xuXHRcdFx0XHRbeC52YWx1ZSwgeS52YWx1ZV0gPSByZXN1bHQ7XG5cdFx0XHRcdHNvdXJjZVR5cGUudmFsdWUgPSBcInRvdWNoXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzY3JvbGxIYW5kbGVyID0gKCkgPT4ge1xuXHRcdGlmICghX3ByZXZNb3VzZUV2ZW50IHx8ICF3aW5kb3ckMSkgcmV0dXJuO1xuXHRcdGNvbnN0IHBvcyA9IGV4dHJhY3RvcihfcHJldk1vdXNlRXZlbnQpO1xuXHRcdGlmIChfcHJldk1vdXNlRXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ICYmIHBvcykge1xuXHRcdFx0eC52YWx1ZSA9IHBvc1swXSArIHdpbmRvdyQxLnNjcm9sbFggLSBfcHJldlNjcm9sbFg7XG5cdFx0XHR5LnZhbHVlID0gcG9zWzFdICsgd2luZG93JDEuc2Nyb2xsWSAtIF9wcmV2U2Nyb2xsWTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdHgudmFsdWUgPSBpbml0aWFsVmFsdWUueDtcblx0XHR5LnZhbHVlID0gaW5pdGlhbFZhbHVlLnk7XG5cdH07XG5cdGNvbnN0IG1vdXNlSGFuZGxlcldyYXBwZXIgPSBldmVudEZpbHRlciA/IChldmVudCkgPT4gZXZlbnRGaWx0ZXIoKCkgPT4gbW91c2VIYW5kbGVyKGV2ZW50KSwge30pIDogKGV2ZW50KSA9PiBtb3VzZUhhbmRsZXIoZXZlbnQpO1xuXHRjb25zdCB0b3VjaEhhbmRsZXJXcmFwcGVyID0gZXZlbnRGaWx0ZXIgPyAoZXZlbnQpID0+IGV2ZW50RmlsdGVyKCgpID0+IHRvdWNoSGFuZGxlcihldmVudCksIHt9KSA6IChldmVudCkgPT4gdG91Y2hIYW5kbGVyKGV2ZW50KTtcblx0Y29uc3Qgc2Nyb2xsSGFuZGxlcldyYXBwZXIgPSBldmVudEZpbHRlciA/ICgpID0+IGV2ZW50RmlsdGVyKCgpID0+IHNjcm9sbEhhbmRsZXIoKSwge30pIDogKCkgPT4gc2Nyb2xsSGFuZGxlcigpO1xuXHRpZiAodGFyZ2V0KSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcIm1vdXNlbW92ZVwiLCBcImRyYWdvdmVyXCJdLCBtb3VzZUhhbmRsZXJXcmFwcGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGlmICh0b3VjaCAmJiB0eXBlICE9PSBcIm1vdmVtZW50XCIpIHtcblx0XHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXCJ0b3VjaHN0YXJ0XCIsIFwidG91Y2htb3ZlXCJdLCB0b3VjaEhhbmRsZXJXcmFwcGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdFx0aWYgKHJlc2V0T25Ub3VjaEVuZHMpIHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRvdWNoZW5kXCIsIHJlc2V0LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdH1cblx0XHRpZiAoc2Nyb2xsICYmIHR5cGUgPT09IFwicGFnZVwiKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInNjcm9sbFwiLCBzY3JvbGxIYW5kbGVyV3JhcHBlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHgsXG5cdFx0eSxcblx0XHRzb3VyY2VUeXBlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1vdXNlSW5FbGVtZW50L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgbW91c2UgcG9zaXRpb24gcmVsYXRlZCB0byBhbiBlbGVtZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNb3VzZUluRWxlbWVudFxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTW91c2VJbkVsZW1lbnQodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3dSZXNpemUgPSB0cnVlLCB3aW5kb3dTY3JvbGwgPSB0cnVlLCBoYW5kbGVPdXRzaWRlID0gdHJ1ZSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHR5cGUgPSBvcHRpb25zLnR5cGUgfHwgXCJwYWdlXCI7XG5cdGNvbnN0IHsgeCwgeSwgc291cmNlVHlwZSB9ID0gdXNlTW91c2Uob3B0aW9ucyk7XG5cdGNvbnN0IHRhcmdldFJlZiA9IHNoYWxsb3dSZWYodGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmRvY3VtZW50LmJvZHkpO1xuXHRjb25zdCBlbGVtZW50WCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGVsZW1lbnRZID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZWxlbWVudFBvc2l0aW9uWCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGVsZW1lbnRQb3NpdGlvblkgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBlbGVtZW50SGVpZ2h0ID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZWxlbWVudFdpZHRoID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgaXNPdXRzaWRlID0gc2hhbGxvd1JlZih0cnVlKTtcblx0ZnVuY3Rpb24gdXBkYXRlKCkge1xuXHRcdGlmICghd2luZG93JDEpIHJldHVybjtcblx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXRSZWYpO1xuXHRcdGlmICghZWwgfHwgIShlbCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XG5cdFx0Zm9yIChjb25zdCByZWN0IG9mIGVsLmdldENsaWVudFJlY3RzKCkpIHtcblx0XHRcdGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSByZWN0O1xuXHRcdFx0ZWxlbWVudFBvc2l0aW9uWC52YWx1ZSA9IGxlZnQgKyAodHlwZSA9PT0gXCJwYWdlXCIgPyB3aW5kb3ckMS5wYWdlWE9mZnNldCA6IDApO1xuXHRcdFx0ZWxlbWVudFBvc2l0aW9uWS52YWx1ZSA9IHRvcCArICh0eXBlID09PSBcInBhZ2VcIiA/IHdpbmRvdyQxLnBhZ2VZT2Zmc2V0IDogMCk7XG5cdFx0XHRlbGVtZW50SGVpZ2h0LnZhbHVlID0gaGVpZ2h0O1xuXHRcdFx0ZWxlbWVudFdpZHRoLnZhbHVlID0gd2lkdGg7XG5cdFx0XHRjb25zdCBlbFggPSB4LnZhbHVlIC0gZWxlbWVudFBvc2l0aW9uWC52YWx1ZTtcblx0XHRcdGNvbnN0IGVsWSA9IHkudmFsdWUgLSBlbGVtZW50UG9zaXRpb25ZLnZhbHVlO1xuXHRcdFx0aXNPdXRzaWRlLnZhbHVlID0gd2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwIHx8IGVsWCA8IDAgfHwgZWxZIDwgMCB8fCBlbFggPiB3aWR0aCB8fCBlbFkgPiBoZWlnaHQ7XG5cdFx0XHRpZiAoaGFuZGxlT3V0c2lkZSB8fCAhaXNPdXRzaWRlLnZhbHVlKSB7XG5cdFx0XHRcdGVsZW1lbnRYLnZhbHVlID0gZWxYO1xuXHRcdFx0XHRlbGVtZW50WS52YWx1ZSA9IGVsWTtcblx0XHRcdH1cblx0XHRcdGlmICghaXNPdXRzaWRlLnZhbHVlKSBicmVhaztcblx0XHR9XG5cdH1cblx0Y29uc3Qgc3RvcEZuTGlzdCA9IFtdO1xuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdHN0b3BGbkxpc3QuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRcdHN0b3BGbkxpc3QubGVuZ3RoID0gMDtcblx0fVxuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdHVwZGF0ZSgpO1xuXHR9KTtcblx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0Y29uc3QgeyBzdG9wOiBzdG9wUmVzaXplT2JzZXJ2ZXIgfSA9IHVzZVJlc2l6ZU9ic2VydmVyKHRhcmdldFJlZiwgdXBkYXRlKTtcblx0XHRjb25zdCB7IHN0b3A6IHN0b3BNdXRhdGlvbk9ic2VydmVyIH0gPSB1c2VNdXRhdGlvbk9ic2VydmVyKHRhcmdldFJlZiwgdXBkYXRlLCB7IGF0dHJpYnV0ZUZpbHRlcjogW1wic3R5bGVcIiwgXCJjbGFzc1wiXSB9KTtcblx0XHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaChbXG5cdFx0XHR0YXJnZXRSZWYsXG5cdFx0XHR4LFxuXHRcdFx0eVxuXHRcdF0sIHVwZGF0ZSk7XG5cdFx0c3RvcEZuTGlzdC5wdXNoKHN0b3BSZXNpemVPYnNlcnZlciwgc3RvcE11dGF0aW9uT2JzZXJ2ZXIsIHN0b3BXYXRjaCk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJtb3VzZWxlYXZlXCIsICgpID0+IGlzT3V0c2lkZS52YWx1ZSA9IHRydWUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHRpZiAod2luZG93U2Nyb2xsKSBzdG9wRm5MaXN0LnB1c2godXNlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB1cGRhdGUsIHtcblx0XHRcdGNhcHR1cmU6IHRydWUsXG5cdFx0XHRwYXNzaXZlOiB0cnVlXG5cdFx0fSkpO1xuXHRcdGlmICh3aW5kb3dSZXNpemUpIHN0b3BGbkxpc3QucHVzaCh1c2VFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHgsXG5cdFx0eSxcblx0XHRzb3VyY2VUeXBlLFxuXHRcdGVsZW1lbnRYLFxuXHRcdGVsZW1lbnRZLFxuXHRcdGVsZW1lbnRQb3NpdGlvblgsXG5cdFx0ZWxlbWVudFBvc2l0aW9uWSxcblx0XHRlbGVtZW50SGVpZ2h0LFxuXHRcdGVsZW1lbnRXaWR0aCxcblx0XHRpc091dHNpZGUsXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNb3VzZVByZXNzZWQvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBtb3VzZSBwcmVzc2luZyBzdGF0ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTW91c2VQcmVzc2VkXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTW91c2VQcmVzc2VkKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRvdWNoID0gdHJ1ZSwgZHJhZyA9IHRydWUsIGNhcHR1cmUgPSBmYWxzZSwgaW5pdGlhbFZhbHVlID0gZmFsc2UsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBwcmVzc2VkID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBzb3VyY2VUeXBlID0gc2hhbGxvd1JlZihudWxsKTtcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHtcblx0XHRwcmVzc2VkLFxuXHRcdHNvdXJjZVR5cGVcblx0fTtcblx0Y29uc3Qgb25QcmVzc2VkID0gKHNyY1R5cGUpID0+IChldmVudCkgPT4ge1xuXHRcdHZhciBfb3B0aW9ucyRvblByZXNzZWQ7XG5cdFx0cHJlc3NlZC52YWx1ZSA9IHRydWU7XG5cdFx0c291cmNlVHlwZS52YWx1ZSA9IHNyY1R5cGU7XG5cdFx0KF9vcHRpb25zJG9uUHJlc3NlZCA9IG9wdGlvbnMub25QcmVzc2VkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblByZXNzZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvblByZXNzZWQuY2FsbChvcHRpb25zLCBldmVudCk7XG5cdH07XG5cdGNvbnN0IG9uUmVsZWFzZWQgPSAoZXZlbnQpID0+IHtcblx0XHR2YXIgX29wdGlvbnMkb25SZWxlYXNlZDtcblx0XHRwcmVzc2VkLnZhbHVlID0gZmFsc2U7XG5cdFx0c291cmNlVHlwZS52YWx1ZSA9IG51bGw7XG5cdFx0KF9vcHRpb25zJG9uUmVsZWFzZWQgPSBvcHRpb25zLm9uUmVsZWFzZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uUmVsZWFzZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvblJlbGVhc2VkLmNhbGwob3B0aW9ucywgZXZlbnQpO1xuXHR9O1xuXHRjb25zdCB0YXJnZXQgPSBjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQob3B0aW9ucy50YXJnZXQpIHx8IHdpbmRvdyQxKTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdHBhc3NpdmU6IHRydWUsXG5cdFx0Y2FwdHVyZVxuXHR9O1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJtb3VzZWRvd25cIiwgb25QcmVzc2VkKFwibW91c2VcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwibW91c2VsZWF2ZVwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm1vdXNldXBcIiwgb25SZWxlYXNlZCwgbGlzdGVuZXJPcHRpb25zKTtcblx0aWYgKGRyYWcpIHtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkcmFnc3RhcnRcIiwgb25QcmVzc2VkKFwibW91c2VcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkcm9wXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkcmFnZW5kXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0aWYgKHRvdWNoKSB7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidG91Y2hzdGFydFwiLCBvblByZXNzZWQoXCJ0b3VjaFwiKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInRvdWNoZW5kXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJ0b3VjaGNhbmNlbFwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0cHJlc3NlZCxcblx0XHRzb3VyY2VUeXBlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU5hdmlnYXRvckxhbmd1YWdlL2luZGV4LnRzXG4vKipcbipcbiogUmVhY3RpdmUgdXNlTmF2aWdhdG9yTGFuZ3VhZ2VcbipcbiogRGV0ZWN0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHVzZXIgbGFuZ3VhZ2UgYW5kIHJldHVybnMgYSByZWFjdGl2ZSBsYW5ndWFnZVxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VOYXZpZ2F0b3JMYW5ndWFnZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZU5hdmlnYXRvckxhbmd1YWdlKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBuYXZpZ2F0b3IkMSA9IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5uYXZpZ2F0b3I7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImxhbmd1YWdlXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBsYW5ndWFnZSA9IHNoYWxsb3dSZWYobmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvciQxLmxhbmd1YWdlKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJsYW5ndWFnZWNoYW5nZVwiLCAoKSA9PiB7XG5cdFx0aWYgKG5hdmlnYXRvciQxKSBsYW5ndWFnZS52YWx1ZSA9IG5hdmlnYXRvciQxLmxhbmd1YWdlO1xuXHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0bGFuZ3VhZ2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTmV0d29yay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIE5ldHdvcmsgc3RhdHVzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VOZXR3b3JrXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTmV0d29yayhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgbmF2aWdhdG9yJDEgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEubmF2aWdhdG9yO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJjb25uZWN0aW9uXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBpc09ubGluZSA9IHNoYWxsb3dSZWYodHJ1ZSk7XG5cdGNvbnN0IHNhdmVEYXRhID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IG9mZmxpbmVBdCA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3Qgb25saW5lQXQgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IGRvd25saW5rID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCBkb3dubGlua01heCA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3QgcnR0ID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCBlZmZlY3RpdmVUeXBlID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCB0eXBlID0gc2hhbGxvd1JlZihcInVua25vd25cIik7XG5cdGNvbnN0IGNvbm5lY3Rpb24gPSBpc1N1cHBvcnRlZC52YWx1ZSAmJiBuYXZpZ2F0b3IkMS5jb25uZWN0aW9uO1xuXHRmdW5jdGlvbiB1cGRhdGVOZXR3b3JrSW5mb3JtYXRpb24oKSB7XG5cdFx0aWYgKCFuYXZpZ2F0b3IkMSkgcmV0dXJuO1xuXHRcdGlzT25saW5lLnZhbHVlID0gbmF2aWdhdG9yJDEub25MaW5lO1xuXHRcdG9mZmxpbmVBdC52YWx1ZSA9IGlzT25saW5lLnZhbHVlID8gdm9pZCAwIDogRGF0ZS5ub3coKTtcblx0XHRvbmxpbmVBdC52YWx1ZSA9IGlzT25saW5lLnZhbHVlID8gRGF0ZS5ub3coKSA6IHZvaWQgMDtcblx0XHRpZiAoY29ubmVjdGlvbikge1xuXHRcdFx0ZG93bmxpbmsudmFsdWUgPSBjb25uZWN0aW9uLmRvd25saW5rO1xuXHRcdFx0ZG93bmxpbmtNYXgudmFsdWUgPSBjb25uZWN0aW9uLmRvd25saW5rTWF4O1xuXHRcdFx0ZWZmZWN0aXZlVHlwZS52YWx1ZSA9IGNvbm5lY3Rpb24uZWZmZWN0aXZlVHlwZTtcblx0XHRcdHJ0dC52YWx1ZSA9IGNvbm5lY3Rpb24ucnR0O1xuXHRcdFx0c2F2ZURhdGEudmFsdWUgPSBjb25uZWN0aW9uLnNhdmVEYXRhO1xuXHRcdFx0dHlwZS52YWx1ZSA9IGNvbm5lY3Rpb24udHlwZTtcblx0XHR9XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwib2ZmbGluZVwiLCAoKSA9PiB7XG5cdFx0XHRpc09ubGluZS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0b2ZmbGluZUF0LnZhbHVlID0gRGF0ZS5ub3coKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwib25saW5lXCIsICgpID0+IHtcblx0XHRcdGlzT25saW5lLnZhbHVlID0gdHJ1ZTtcblx0XHRcdG9ubGluZUF0LnZhbHVlID0gRGF0ZS5ub3coKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGlmIChjb25uZWN0aW9uKSB1c2VFdmVudExpc3RlbmVyKGNvbm5lY3Rpb24sIFwiY2hhbmdlXCIsIHVwZGF0ZU5ldHdvcmtJbmZvcm1hdGlvbiwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXBkYXRlTmV0d29ya0luZm9ybWF0aW9uKCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNPbmxpbmU6IHJlYWRvbmx5KGlzT25saW5lKSxcblx0XHRzYXZlRGF0YTogcmVhZG9ubHkoc2F2ZURhdGEpLFxuXHRcdG9mZmxpbmVBdDogcmVhZG9ubHkob2ZmbGluZUF0KSxcblx0XHRvbmxpbmVBdDogcmVhZG9ubHkob25saW5lQXQpLFxuXHRcdGRvd25saW5rOiByZWFkb25seShkb3dubGluayksXG5cdFx0ZG93bmxpbmtNYXg6IHJlYWRvbmx5KGRvd25saW5rTWF4KSxcblx0XHRlZmZlY3RpdmVUeXBlOiByZWFkb25seShlZmZlY3RpdmVUeXBlKSxcblx0XHRydHQ6IHJlYWRvbmx5KHJ0dCksXG5cdFx0dHlwZTogcmVhZG9ubHkodHlwZSlcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTm93L2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDUob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIsIGltbWVkaWF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIGludGVydmFsID09PSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiID8gKGZuKSA9PiB1c2VSYWZGbihmbiwgeyBpbW1lZGlhdGUgfSkgOiAoZm4pID0+IHVzZUludGVydmFsRm4oZm4sIGludGVydmFsLCBvcHRpb25zKTtcblx0fVxuXHRyZXR1cm4gdXNlUmFmRm47XG59XG4vKipcbiogUmVhY3RpdmUgY3VycmVudCBEYXRlIGluc3RhbmNlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VOb3dcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VOb3cob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkNShvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgbm93ID0gcmVmKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4gbm93LnZhbHVlID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG5cdGNvbnN0IGNvbnRyb2xzID0gc2NoZWR1bGVyKHVwZGF0ZSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHRub3csXG5cdFx0Li4uY29udHJvbHNcblx0fTtcblx0ZWxzZSByZXR1cm4gbm93O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VPYmplY3RVcmwvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBVUkwgcmVwcmVzZW50aW5nIGFuIG9iamVjdC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlT2JqZWN0VXJsXG4qIEBwYXJhbSBvYmplY3RcbiovXG5mdW5jdGlvbiB1c2VPYmplY3RVcmwob2JqZWN0KSB7XG5cdGNvbnN0IHVybCA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgcmVsZWFzZSA9ICgpID0+IHtcblx0XHRpZiAodXJsLnZhbHVlKSBVUkwucmV2b2tlT2JqZWN0VVJMKHVybC52YWx1ZSk7XG5cdFx0dXJsLnZhbHVlID0gdm9pZCAwO1xuXHR9O1xuXHR3YXRjaCgoKSA9PiB0b1ZhbHVlKG9iamVjdCksIChuZXdPYmplY3QpID0+IHtcblx0XHRyZWxlYXNlKCk7XG5cdFx0aWYgKG5ld09iamVjdCkgdXJsLnZhbHVlID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXdPYmplY3QpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UocmVsZWFzZSk7XG5cdHJldHVybiByZWFkb25seSh1cmwpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi9tYXRoL3VzZUNsYW1wL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBjbGFtcCBhIHZhbHVlIGJldHdlZW4gdHdvIG90aGVyIHZhbHVlcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQ2xhbXBcbiogQHBhcmFtIHZhbHVlIG51bWJlclxuKiBAcGFyYW0gbWluXG4qIEBwYXJhbSBtYXhcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VDbGFtcCh2YWx1ZSwgbWluLCBtYXgpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiIHx8IGlzUmVhZG9ubHkodmFsdWUpKSByZXR1cm4gY29tcHV0ZWQoKCkgPT4gY2xhbXAodG9WYWx1ZSh2YWx1ZSksIHRvVmFsdWUobWluKSwgdG9WYWx1ZShtYXgpKSk7XG5cdGNvbnN0IF92YWx1ZSA9IHJlZih2YWx1ZSk7XG5cdHJldHVybiBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIF92YWx1ZS52YWx1ZSA9IGNsYW1wKF92YWx1ZS52YWx1ZSwgdG9WYWx1ZShtaW4pLCB0b1ZhbHVlKG1heCkpO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlJDEpIHtcblx0XHRcdF92YWx1ZS52YWx1ZSA9IGNsYW1wKHZhbHVlJDEsIHRvVmFsdWUobWluKSwgdG9WYWx1ZShtYXgpKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VPZmZzZXRQYWdpbmF0aW9uL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VPZmZzZXRQYWdpbmF0aW9uKG9wdGlvbnMpIHtcblx0Y29uc3QgeyB0b3RhbCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgcGFnZVNpemUgPSAxMCwgcGFnZSA9IDEsIG9uUGFnZUNoYW5nZSA9IG5vb3AsIG9uUGFnZVNpemVDaGFuZ2UgPSBub29wLCBvblBhZ2VDb3VudENoYW5nZSA9IG5vb3AgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGN1cnJlbnRQYWdlU2l6ZSA9IHVzZUNsYW1wKHBhZ2VTaXplLCAxLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXHRjb25zdCBwYWdlQ291bnQgPSBjb21wdXRlZCgoKSA9PiBNYXRoLm1heCgxLCBNYXRoLmNlaWwodG9WYWx1ZSh0b3RhbCkgLyB0b1ZhbHVlKGN1cnJlbnRQYWdlU2l6ZSkpKSk7XG5cdGNvbnN0IGN1cnJlbnRQYWdlID0gdXNlQ2xhbXAocGFnZSwgMSwgcGFnZUNvdW50KTtcblx0Y29uc3QgaXNGaXJzdFBhZ2UgPSBjb21wdXRlZCgoKSA9PiBjdXJyZW50UGFnZS52YWx1ZSA9PT0gMSk7XG5cdGNvbnN0IGlzTGFzdFBhZ2UgPSBjb21wdXRlZCgoKSA9PiBjdXJyZW50UGFnZS52YWx1ZSA9PT0gcGFnZUNvdW50LnZhbHVlKTtcblx0aWYgKGlzUmVmKHBhZ2UpKSBzeW5jUmVmKHBhZ2UsIGN1cnJlbnRQYWdlLCB7IGRpcmVjdGlvbjogaXNSZWFkb25seShwYWdlKSA/IFwibHRyXCIgOiBcImJvdGhcIiB9KTtcblx0aWYgKGlzUmVmKHBhZ2VTaXplKSkgc3luY1JlZihwYWdlU2l6ZSwgY3VycmVudFBhZ2VTaXplLCB7IGRpcmVjdGlvbjogaXNSZWFkb25seShwYWdlU2l6ZSkgPyBcImx0clwiIDogXCJib3RoXCIgfSk7XG5cdGZ1bmN0aW9uIHByZXYoKSB7XG5cdFx0Y3VycmVudFBhZ2UudmFsdWUtLTtcblx0fVxuXHRmdW5jdGlvbiBuZXh0KCkge1xuXHRcdGN1cnJlbnRQYWdlLnZhbHVlKys7XG5cdH1cblx0Y29uc3QgcmV0dXJuVmFsdWUgPSB7XG5cdFx0Y3VycmVudFBhZ2UsXG5cdFx0Y3VycmVudFBhZ2VTaXplLFxuXHRcdHBhZ2VDb3VudCxcblx0XHRpc0ZpcnN0UGFnZSxcblx0XHRpc0xhc3RQYWdlLFxuXHRcdHByZXYsXG5cdFx0bmV4dFxuXHR9O1xuXHR3YXRjaChjdXJyZW50UGFnZSwgKCkgPT4ge1xuXHRcdG9uUGFnZUNoYW5nZShyZWFjdGl2ZShyZXR1cm5WYWx1ZSkpO1xuXHR9KTtcblx0d2F0Y2goY3VycmVudFBhZ2VTaXplLCAoKSA9PiB7XG5cdFx0b25QYWdlU2l6ZUNoYW5nZShyZWFjdGl2ZShyZXR1cm5WYWx1ZSkpO1xuXHR9KTtcblx0d2F0Y2gocGFnZUNvdW50LCAoKSA9PiB7XG5cdFx0b25QYWdlQ291bnRDaGFuZ2UocmVhY3RpdmUocmV0dXJuVmFsdWUpKTtcblx0fSk7XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlT25saW5lL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgb25saW5lIHN0YXRlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VPbmxpbmVcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VPbmxpbmUob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaXNPbmxpbmUgfSA9IHVzZU5ldHdvcmsob3B0aW9ucyk7XG5cdHJldHVybiBpc09ubGluZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUGFnZUxlYXZlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgc3RhdGUgdG8gc2hvdyB3aGV0aGVyIG1vdXNlIGxlYXZlcyB0aGUgcGFnZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUGFnZUxlYXZlXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlUGFnZUxlYXZlKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0xlZnQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdGlmICghd2luZG93JDEpIHJldHVybjtcblx0XHRldmVudCA9IGV2ZW50IHx8IHdpbmRvdyQxLmV2ZW50O1xuXHRcdGlzTGVmdC52YWx1ZSA9ICEoZXZlbnQucmVsYXRlZFRhcmdldCB8fCBldmVudC50b0VsZW1lbnQpO1xuXHR9O1xuXHRpZiAod2luZG93JDEpIHtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm1vdXNlb3V0XCIsIGhhbmRsZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMS5kb2N1bWVudCwgXCJtb3VzZWxlYXZlXCIsIGhhbmRsZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMS5kb2N1bWVudCwgXCJtb3VzZWVudGVyXCIsIGhhbmRsZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIGlzTGVmdDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2NyZWVuT3JpZW50YXRpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBzY3JlZW4gb3JpZW50YXRpb25cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2NyZWVuT3JpZW50YXRpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VTY3JlZW5PcmllbnRhdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwic2NyZWVuXCIgaW4gd2luZG93JDEgJiYgXCJvcmllbnRhdGlvblwiIGluIHdpbmRvdyQxLnNjcmVlbik7XG5cdGNvbnN0IHNjcmVlbk9yaWVudGF0aW9uID0gaXNTdXBwb3J0ZWQudmFsdWUgPyB3aW5kb3ckMS5zY3JlZW4ub3JpZW50YXRpb24gOiB7fTtcblx0Y29uc3Qgb3JpZW50YXRpb24gPSByZWYoc2NyZWVuT3JpZW50YXRpb24udHlwZSk7XG5cdGNvbnN0IGFuZ2xlID0gc2hhbGxvd1JlZihzY3JlZW5PcmllbnRhdGlvbi5hbmdsZSB8fCAwKTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm9yaWVudGF0aW9uY2hhbmdlXCIsICgpID0+IHtcblx0XHRvcmllbnRhdGlvbi52YWx1ZSA9IHNjcmVlbk9yaWVudGF0aW9uLnR5cGU7XG5cdFx0YW5nbGUudmFsdWUgPSBzY3JlZW5PcmllbnRhdGlvbi5hbmdsZTtcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRjb25zdCBsb2NrT3JpZW50YXRpb24gPSAodHlwZSkgPT4ge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiB0eXBlb2Ygc2NyZWVuT3JpZW50YXRpb24ubG9jayA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gc2NyZWVuT3JpZW50YXRpb24ubG9jayh0eXBlKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoLyogQF9fUFVSRV9fICovIG5ldyBFcnJvcihcIk5vdCBzdXBwb3J0ZWRcIikpO1xuXHR9O1xuXHRjb25zdCB1bmxvY2tPcmllbnRhdGlvbiA9ICgpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdHlwZW9mIHNjcmVlbk9yaWVudGF0aW9uLnVubG9jayA9PT0gXCJmdW5jdGlvblwiKSBzY3JlZW5PcmllbnRhdGlvbi51bmxvY2soKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRvcmllbnRhdGlvbixcblx0XHRhbmdsZSxcblx0XHRsb2NrT3JpZW50YXRpb24sXG5cdFx0dW5sb2NrT3JpZW50YXRpb25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUGFyYWxsYXgvaW5kZXgudHNcbi8qKlxuKiBDcmVhdGUgcGFyYWxsYXggZWZmZWN0IGVhc2lseS4gSXQgdXNlcyBgdXNlRGV2aWNlT3JpZW50YXRpb25gIGFuZCBmYWxsYmFjayB0byBgdXNlTW91c2VgXG4qIGlmIG9yaWVudGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4qXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VQYXJhbGxheCh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRldmljZU9yaWVudGF0aW9uVGlsdEFkanVzdCA9IChpKSA9PiBpLCBkZXZpY2VPcmllbnRhdGlvblJvbGxBZGp1c3QgPSAoaSkgPT4gaSwgbW91c2VUaWx0QWRqdXN0ID0gKGkpID0+IGksIG1vdXNlUm9sbEFkanVzdCA9IChpKSA9PiBpLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3Qgb3JpZW50YXRpb24gPSByZWFjdGl2ZSh1c2VEZXZpY2VPcmllbnRhdGlvbih7IHdpbmRvdzogd2luZG93JDEgfSkpO1xuXHRjb25zdCBzY3JlZW5PcmllbnRhdGlvbiA9IHJlYWN0aXZlKHVzZVNjcmVlbk9yaWVudGF0aW9uKHsgd2luZG93OiB3aW5kb3ckMSB9KSk7XG5cdGNvbnN0IHsgZWxlbWVudFg6IHgsIGVsZW1lbnRZOiB5LCBlbGVtZW50V2lkdGg6IHdpZHRoLCBlbGVtZW50SGVpZ2h0OiBoZWlnaHQgfSA9IHVzZU1vdXNlSW5FbGVtZW50KHRhcmdldCwge1xuXHRcdGhhbmRsZU91dHNpZGU6IGZhbHNlLFxuXHRcdHdpbmRvdzogd2luZG93JDFcblx0fSk7XG5cdGNvbnN0IHNvdXJjZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRpZiAob3JpZW50YXRpb24uaXNTdXBwb3J0ZWQgJiYgKG9yaWVudGF0aW9uLmFscGhhICE9IG51bGwgJiYgb3JpZW50YXRpb24uYWxwaGEgIT09IDAgfHwgb3JpZW50YXRpb24uZ2FtbWEgIT0gbnVsbCAmJiBvcmllbnRhdGlvbi5nYW1tYSAhPT0gMCkpIHJldHVybiBcImRldmljZU9yaWVudGF0aW9uXCI7XG5cdFx0cmV0dXJuIFwibW91c2VcIjtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0cm9sbDogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0aWYgKHNvdXJjZS52YWx1ZSA9PT0gXCJkZXZpY2VPcmllbnRhdGlvblwiKSB7XG5cdFx0XHRcdGxldCB2YWx1ZTtcblx0XHRcdFx0c3dpdGNoIChzY3JlZW5PcmllbnRhdGlvbi5vcmllbnRhdGlvbikge1xuXHRcdFx0XHRcdGNhc2UgXCJsYW5kc2NhcGUtcHJpbWFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSBvcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcImxhbmRzY2FwZS1zZWNvbmRhcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gLW9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwicG9ydHJhaXQtcHJpbWFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSAtb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInBvcnRyYWl0LXNlY29uZGFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSBvcmllbnRhdGlvbi5iZXRhIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiB2YWx1ZSA9IC1vcmllbnRhdGlvbi5iZXRhIC8gOTA7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGRldmljZU9yaWVudGF0aW9uUm9sbEFkanVzdCh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgcmV0dXJuIG1vdXNlUm9sbEFkanVzdCgtKHkudmFsdWUgLSBoZWlnaHQudmFsdWUgLyAyKSAvIGhlaWdodC52YWx1ZSk7XG5cdFx0fSksXG5cdFx0dGlsdDogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0aWYgKHNvdXJjZS52YWx1ZSA9PT0gXCJkZXZpY2VPcmllbnRhdGlvblwiKSB7XG5cdFx0XHRcdGxldCB2YWx1ZTtcblx0XHRcdFx0c3dpdGNoIChzY3JlZW5PcmllbnRhdGlvbi5vcmllbnRhdGlvbikge1xuXHRcdFx0XHRcdGNhc2UgXCJsYW5kc2NhcGUtcHJpbWFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSBvcmllbnRhdGlvbi5iZXRhIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwibGFuZHNjYXBlLXNlY29uZGFyeVwiOlxuXHRcdFx0XHRcdFx0dmFsdWUgPSAtb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInBvcnRyYWl0LXByaW1hcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gb3JpZW50YXRpb24uZ2FtbWEgLyA5MDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJwb3J0cmFpdC1zZWNvbmRhcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gLW9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OiB2YWx1ZSA9IG9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGRldmljZU9yaWVudGF0aW9uVGlsdEFkanVzdCh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgcmV0dXJuIG1vdXNlVGlsdEFkanVzdCgoeC52YWx1ZSAtIHdpZHRoLnZhbHVlIC8gMikgLyB3aWR0aC52YWx1ZSk7XG5cdFx0fSksXG5cdFx0c291cmNlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBhcmVudEVsZW1lbnQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVBhcmVudEVsZW1lbnQoZWxlbWVudCA9IHVzZUN1cnJlbnRFbGVtZW50KCkpIHtcblx0Y29uc3QgcGFyZW50RWxlbWVudCA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KGVsZW1lbnQpO1xuXHRcdGlmIChlbCkgcGFyZW50RWxlbWVudC52YWx1ZSA9IGVsLnBhcmVudEVsZW1lbnQ7XG5cdH07XG5cdHRyeU9uTW91bnRlZCh1cGRhdGUpO1xuXHR3YXRjaCgoKSA9PiB0b1ZhbHVlKGVsZW1lbnQpLCB1cGRhdGUpO1xuXHRyZXR1cm4gcGFyZW50RWxlbWVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUGVyZm9ybWFuY2VPYnNlcnZlci9pbmRleC50c1xuLyoqXG4qIE9ic2VydmUgcGVyZm9ybWFuY2UgbWV0cmljcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUGVyZm9ybWFuY2VPYnNlcnZlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVBlcmZvcm1hbmNlT2JzZXJ2ZXIob3B0aW9ucywgY2FsbGJhY2spIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaW1tZWRpYXRlID0gdHJ1ZSwuLi5wZXJmb3JtYW5jZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcIlBlcmZvcm1hbmNlT2JzZXJ2ZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGxldCBvYnNlcnZlcjtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRvYnNlcnZlciA9PT0gbnVsbCB8fCBvYnNlcnZlciA9PT0gdm9pZCAwIHx8IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0fTtcblx0Y29uc3Qgc3RhcnQgPSAoKSA9PiB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0XHRzdG9wKCk7XG5cdFx0XHRvYnNlcnZlciA9IG5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGNhbGxiYWNrKTtcblx0XHRcdG9ic2VydmVyLm9ic2VydmUocGVyZm9ybWFuY2VPcHRpb25zKTtcblx0XHR9XG5cdH07XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHN0b3ApO1xuXHRpZiAoaW1tZWRpYXRlKSBzdGFydCgpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUG9pbnRlci9pbmRleC50c1xuY29uc3QgZGVmYXVsdFN0YXRlID0ge1xuXHR4OiAwLFxuXHR5OiAwLFxuXHRwb2ludGVySWQ6IDAsXG5cdHByZXNzdXJlOiAwLFxuXHR0aWx0WDogMCxcblx0dGlsdFk6IDAsXG5cdHdpZHRoOiAwLFxuXHRoZWlnaHQ6IDAsXG5cdHR3aXN0OiAwLFxuXHRwb2ludGVyVHlwZTogbnVsbFxufTtcbmNvbnN0IGtleXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmtleXMoZGVmYXVsdFN0YXRlKTtcbi8qKlxuKiBSZWFjdGl2ZSBwb2ludGVyIHN0YXRlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQb2ludGVyXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlUG9pbnRlcihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0YXJnZXQgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc0luc2lkZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzdGF0ZSA9IHNoYWxsb3dSZWYob3B0aW9ucy5pbml0aWFsVmFsdWUgfHwge30pO1xuXHRPYmplY3QuYXNzaWduKHN0YXRlLnZhbHVlLCBkZWZhdWx0U3RhdGUsIHN0YXRlLnZhbHVlKTtcblx0Y29uc3QgaGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdGlzSW5zaWRlLnZhbHVlID0gdHJ1ZTtcblx0XHRpZiAob3B0aW9ucy5wb2ludGVyVHlwZXMgJiYgIW9wdGlvbnMucG9pbnRlclR5cGVzLmluY2x1ZGVzKGV2ZW50LnBvaW50ZXJUeXBlKSkgcmV0dXJuO1xuXHRcdHN0YXRlLnZhbHVlID0gb2JqZWN0UGljayhldmVudCwga2V5cywgZmFsc2UpO1xuXHR9O1xuXHRpZiAodGFyZ2V0KSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcblx0XHRcdFwicG9pbnRlcmRvd25cIixcblx0XHRcdFwicG9pbnRlcm1vdmVcIixcblx0XHRcdFwicG9pbnRlcnVwXCJcblx0XHRdLCBoYW5kbGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBvaW50ZXJsZWF2ZVwiLCAoKSA9PiBpc0luc2lkZS52YWx1ZSA9IGZhbHNlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0Li4udG9SZWZzKHN0YXRlKSxcblx0XHRpc0luc2lkZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQb2ludGVyTG9jay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHBvaW50ZXIgbG9jay5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUG9pbnRlckxvY2tcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVBvaW50ZXJMb2NrKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBkb2N1bWVudCQxICYmIFwicG9pbnRlckxvY2tFbGVtZW50XCIgaW4gZG9jdW1lbnQkMSk7XG5cdGNvbnN0IGVsZW1lbnQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHRyaWdnZXJFbGVtZW50ID0gc2hhbGxvd1JlZigpO1xuXHRsZXQgdGFyZ2V0RWxlbWVudDtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInBvaW50ZXJsb2NrY2hhbmdlXCIsICgpID0+IHtcblx0XHRcdHZhciBfcG9pbnRlckxvY2tFbGVtZW50O1xuXHRcdFx0Y29uc3QgY3VycmVudEVsZW1lbnQgPSAoX3BvaW50ZXJMb2NrRWxlbWVudCA9IGRvY3VtZW50JDEucG9pbnRlckxvY2tFbGVtZW50KSAhPT0gbnVsbCAmJiBfcG9pbnRlckxvY2tFbGVtZW50ICE9PSB2b2lkIDAgPyBfcG9pbnRlckxvY2tFbGVtZW50IDogZWxlbWVudC52YWx1ZTtcblx0XHRcdGlmICh0YXJnZXRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ID09PSB0YXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdGVsZW1lbnQudmFsdWUgPSBkb2N1bWVudCQxLnBvaW50ZXJMb2NrRWxlbWVudDtcblx0XHRcdFx0aWYgKCFlbGVtZW50LnZhbHVlKSB0YXJnZXRFbGVtZW50ID0gdHJpZ2dlckVsZW1lbnQudmFsdWUgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInBvaW50ZXJsb2NrZXJyb3JcIiwgKCkgPT4ge1xuXHRcdFx0dmFyIF9wb2ludGVyTG9ja0VsZW1lbnQyO1xuXHRcdFx0Y29uc3QgY3VycmVudEVsZW1lbnQgPSAoX3BvaW50ZXJMb2NrRWxlbWVudDIgPSBkb2N1bWVudCQxLnBvaW50ZXJMb2NrRWxlbWVudCkgIT09IG51bGwgJiYgX3BvaW50ZXJMb2NrRWxlbWVudDIgIT09IHZvaWQgMCA/IF9wb2ludGVyTG9ja0VsZW1lbnQyIDogZWxlbWVudC52YWx1ZTtcblx0XHRcdGlmICh0YXJnZXRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ID09PSB0YXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdGNvbnN0IGFjdGlvbiA9IGRvY3VtZW50JDEucG9pbnRlckxvY2tFbGVtZW50ID8gXCJyZWxlYXNlXCIgOiBcImFjcXVpcmVcIjtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gJHthY3Rpb259IHBvaW50ZXIgbG9jay5gKTtcblx0XHRcdH1cblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGxvY2soZSkge1xuXHRcdHZhciBfdW5yZWZFbGVtZW50O1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHRocm93IG5ldyBFcnJvcihcIlBvaW50ZXIgTG9jayBBUEkgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuXCIpO1xuXHRcdHRyaWdnZXJFbGVtZW50LnZhbHVlID0gZSBpbnN0YW5jZW9mIEV2ZW50ID8gZS5jdXJyZW50VGFyZ2V0IDogbnVsbDtcblx0XHR0YXJnZXRFbGVtZW50ID0gZSBpbnN0YW5jZW9mIEV2ZW50ID8gKF91bnJlZkVsZW1lbnQgPSB1bnJlZkVsZW1lbnQodGFyZ2V0KSkgIT09IG51bGwgJiYgX3VucmVmRWxlbWVudCAhPT0gdm9pZCAwID8gX3VucmVmRWxlbWVudCA6IHRyaWdnZXJFbGVtZW50LnZhbHVlIDogdW5yZWZFbGVtZW50KGUpO1xuXHRcdGlmICghdGFyZ2V0RWxlbWVudCkgdGhyb3cgbmV3IEVycm9yKFwiVGFyZ2V0IGVsZW1lbnQgdW5kZWZpbmVkLlwiKTtcblx0XHR0YXJnZXRFbGVtZW50LnJlcXVlc3RQb2ludGVyTG9jaygpO1xuXHRcdHJldHVybiBhd2FpdCB1bnRpbChlbGVtZW50KS50b0JlKHRhcmdldEVsZW1lbnQpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHVubG9jaygpIHtcblx0XHRpZiAoIWVsZW1lbnQudmFsdWUpIHJldHVybiBmYWxzZTtcblx0XHRkb2N1bWVudCQxLmV4aXRQb2ludGVyTG9jaygpO1xuXHRcdGF3YWl0IHVudGlsKGVsZW1lbnQpLnRvQmVOdWxsKCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRlbGVtZW50LFxuXHRcdHRyaWdnZXJFbGVtZW50LFxuXHRcdGxvY2ssXG5cdFx0dW5sb2NrXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBvaW50ZXJTd2lwZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHN3aXBlIGRldGVjdGlvbiBiYXNlZCBvbiBQb2ludGVyRXZlbnRzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQb2ludGVyU3dpcGVcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVBvaW50ZXJTd2lwZSh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB0YXJnZXRSZWYgPSB0b1JlZih0YXJnZXQpO1xuXHRjb25zdCB7IHRocmVzaG9sZCA9IDUwLCBvblN3aXBlLCBvblN3aXBlRW5kLCBvblN3aXBlU3RhcnQsIGRpc2FibGVUZXh0U2VsZWN0ID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHBvc1N0YXJ0ID0gcmVhY3RpdmUoe1xuXHRcdHg6IDAsXG5cdFx0eTogMFxuXHR9KTtcblx0Y29uc3QgdXBkYXRlUG9zU3RhcnQgPSAoeCwgeSkgPT4ge1xuXHRcdHBvc1N0YXJ0LnggPSB4O1xuXHRcdHBvc1N0YXJ0LnkgPSB5O1xuXHR9O1xuXHRjb25zdCBwb3NFbmQgPSByZWFjdGl2ZSh7XG5cdFx0eDogMCxcblx0XHR5OiAwXG5cdH0pO1xuXHRjb25zdCB1cGRhdGVQb3NFbmQgPSAoeCwgeSkgPT4ge1xuXHRcdHBvc0VuZC54ID0geDtcblx0XHRwb3NFbmQueSA9IHk7XG5cdH07XG5cdGNvbnN0IGRpc3RhbmNlWCA9IGNvbXB1dGVkKCgpID0+IHBvc1N0YXJ0LnggLSBwb3NFbmQueCk7XG5cdGNvbnN0IGRpc3RhbmNlWSA9IGNvbXB1dGVkKCgpID0+IHBvc1N0YXJ0LnkgLSBwb3NFbmQueSk7XG5cdGNvbnN0IHsgbWF4LCBhYnMgfSA9IE1hdGg7XG5cdGNvbnN0IGlzVGhyZXNob2xkRXhjZWVkZWQgPSBjb21wdXRlZCgoKSA9PiBtYXgoYWJzKGRpc3RhbmNlWC52YWx1ZSksIGFicyhkaXN0YW5jZVkudmFsdWUpKSA+PSB0aHJlc2hvbGQpO1xuXHRjb25zdCBpc1N3aXBpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaXNQb2ludGVyRG93biA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBkaXJlY3Rpb24gPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKCFpc1RocmVzaG9sZEV4Y2VlZGVkLnZhbHVlKSByZXR1cm4gXCJub25lXCI7XG5cdFx0aWYgKGFicyhkaXN0YW5jZVgudmFsdWUpID4gYWJzKGRpc3RhbmNlWS52YWx1ZSkpIHJldHVybiBkaXN0YW5jZVgudmFsdWUgPiAwID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCI7XG5cdFx0ZWxzZSByZXR1cm4gZGlzdGFuY2VZLnZhbHVlID4gMCA/IFwidXBcIiA6IFwiZG93blwiO1xuXHR9KTtcblx0Y29uc3QgZXZlbnRJc0FsbG93ZWQgPSAoZSkgPT4ge1xuXHRcdHZhciBfcmVmLCBfb3B0aW9ucyRwb2ludGVyVHlwZXMsIF9vcHRpb25zJHBvaW50ZXJUeXBlczI7XG5cdFx0Y29uc3QgaXNSZWxlYXNpbmdCdXR0b24gPSBlLmJ1dHRvbnMgPT09IDA7XG5cdFx0Y29uc3QgaXNQcmltYXJ5QnV0dG9uID0gZS5idXR0b25zID09PSAxO1xuXHRcdHJldHVybiAoX3JlZiA9IChfb3B0aW9ucyRwb2ludGVyVHlwZXMgPSAoX29wdGlvbnMkcG9pbnRlclR5cGVzMiA9IG9wdGlvbnMucG9pbnRlclR5cGVzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRwb2ludGVyVHlwZXMyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRwb2ludGVyVHlwZXMyLmluY2x1ZGVzKGUucG9pbnRlclR5cGUpKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRwb2ludGVyVHlwZXMgIT09IHZvaWQgMCA/IF9vcHRpb25zJHBvaW50ZXJUeXBlcyA6IGlzUmVsZWFzaW5nQnV0dG9uIHx8IGlzUHJpbWFyeUJ1dHRvbikgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IHRydWU7XG5cdH07XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRjb25zdCBzdG9wcyA9IFtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwb2ludGVyZG93blwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKCFldmVudElzQWxsb3dlZChlKSkgcmV0dXJuO1xuXHRcdFx0aXNQb2ludGVyRG93bi52YWx1ZSA9IHRydWU7XG5cdFx0XHRjb25zdCBldmVudFRhcmdldCA9IGUudGFyZ2V0O1xuXHRcdFx0ZXZlbnRUYXJnZXQgPT09IG51bGwgfHwgZXZlbnRUYXJnZXQgPT09IHZvaWQgMCB8fCBldmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG5cdFx0XHRjb25zdCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSA9IGU7XG5cdFx0XHR1cGRhdGVQb3NTdGFydCh4LCB5KTtcblx0XHRcdHVwZGF0ZVBvc0VuZCh4LCB5KTtcblx0XHRcdG9uU3dpcGVTdGFydCA9PT0gbnVsbCB8fCBvblN3aXBlU3RhcnQgPT09IHZvaWQgMCB8fCBvblN3aXBlU3RhcnQoZSk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwb2ludGVybW92ZVwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKCFldmVudElzQWxsb3dlZChlKSkgcmV0dXJuO1xuXHRcdFx0aWYgKCFpc1BvaW50ZXJEb3duLnZhbHVlKSByZXR1cm47XG5cdFx0XHRjb25zdCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSA9IGU7XG5cdFx0XHR1cGRhdGVQb3NFbmQoeCwgeSk7XG5cdFx0XHRpZiAoIWlzU3dpcGluZy52YWx1ZSAmJiBpc1RocmVzaG9sZEV4Y2VlZGVkLnZhbHVlKSBpc1N3aXBpbmcudmFsdWUgPSB0cnVlO1xuXHRcdFx0aWYgKGlzU3dpcGluZy52YWx1ZSkgb25Td2lwZSA9PT0gbnVsbCB8fCBvblN3aXBlID09PSB2b2lkIDAgfHwgb25Td2lwZShlKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInBvaW50ZXJ1cFwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKCFldmVudElzQWxsb3dlZChlKSkgcmV0dXJuO1xuXHRcdFx0aWYgKGlzU3dpcGluZy52YWx1ZSkgb25Td2lwZUVuZCA9PT0gbnVsbCB8fCBvblN3aXBlRW5kID09PSB2b2lkIDAgfHwgb25Td2lwZUVuZChlLCBkaXJlY3Rpb24udmFsdWUpO1xuXHRcdFx0aXNQb2ludGVyRG93bi52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0aXNTd2lwaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKVxuXHRdO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdHZhciBfdGFyZ2V0UmVmJHZhbHVlO1xuXHRcdChfdGFyZ2V0UmVmJHZhbHVlID0gdGFyZ2V0UmVmLnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWUgPSBfdGFyZ2V0UmVmJHZhbHVlLnN0eWxlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZS5zZXRQcm9wZXJ0eShcInRvdWNoLWFjdGlvblwiLCBcInBhbi15XCIpO1xuXHRcdGlmIChkaXNhYmxlVGV4dFNlbGVjdCkge1xuXHRcdFx0dmFyIF90YXJnZXRSZWYkdmFsdWUyLCBfdGFyZ2V0UmVmJHZhbHVlMywgX3RhcmdldFJlZiR2YWx1ZTQ7XG5cdFx0XHQoX3RhcmdldFJlZiR2YWx1ZTIgPSB0YXJnZXRSZWYudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWUyID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWUyID0gX3RhcmdldFJlZiR2YWx1ZTIuc3R5bGUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWUyID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZTIuc2V0UHJvcGVydHkoXCItd2Via2l0LXVzZXItc2VsZWN0XCIsIFwibm9uZVwiKTtcblx0XHRcdChfdGFyZ2V0UmVmJHZhbHVlMyA9IHRhcmdldFJlZi52YWx1ZSkgPT09IG51bGwgfHwgX3RhcmdldFJlZiR2YWx1ZTMgPT09IHZvaWQgMCB8fCAoX3RhcmdldFJlZiR2YWx1ZTMgPSBfdGFyZ2V0UmVmJHZhbHVlMy5zdHlsZSkgPT09IG51bGwgfHwgX3RhcmdldFJlZiR2YWx1ZTMgPT09IHZvaWQgMCB8fCBfdGFyZ2V0UmVmJHZhbHVlMy5zZXRQcm9wZXJ0eShcIi1tcy11c2VyLXNlbGVjdFwiLCBcIm5vbmVcIik7XG5cdFx0XHQoX3RhcmdldFJlZiR2YWx1ZTQgPSB0YXJnZXRSZWYudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWU0ID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWU0ID0gX3RhcmdldFJlZiR2YWx1ZTQuc3R5bGUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWU0ID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZTQuc2V0UHJvcGVydHkoXCJ1c2VyLXNlbGVjdFwiLCBcIm5vbmVcIik7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHN0b3BzLmZvckVhY2goKHMpID0+IHMoKSk7XG5cdHJldHVybiB7XG5cdFx0aXNTd2lwaW5nOiByZWFkb25seShpc1N3aXBpbmcpLFxuXHRcdGRpcmVjdGlvbjogcmVhZG9ubHkoZGlyZWN0aW9uKSxcblx0XHRwb3NTdGFydDogcmVhZG9ubHkocG9zU3RhcnQpLFxuXHRcdHBvc0VuZDogcmVhZG9ubHkocG9zRW5kKSxcblx0XHRkaXN0YW5jZVgsXG5cdFx0ZGlzdGFuY2VZLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkQ29sb3JTY2hlbWUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBwcmVmZXJzLWNvbG9yLXNjaGVtZSBtZWRpYSBxdWVyeS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUHJlZmVycmVkQ29sb3JTY2hlbWVcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZENvbG9yU2NoZW1lKG9wdGlvbnMpIHtcblx0Y29uc3QgaXNMaWdodCA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KVwiLCBvcHRpb25zKTtcblx0Y29uc3QgaXNEYXJrID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzRGFyay52YWx1ZSkgcmV0dXJuIFwiZGFya1wiO1xuXHRcdGlmIChpc0xpZ2h0LnZhbHVlKSByZXR1cm4gXCJsaWdodFwiO1xuXHRcdHJldHVybiBcIm5vLXByZWZlcmVuY2VcIjtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZENvbnRyYXN0L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgcHJlZmVycy1jb250cmFzdCBtZWRpYSBxdWVyeS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUHJlZmVycmVkQ29udHJhc3RcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZENvbnRyYXN0KG9wdGlvbnMpIHtcblx0Y29uc3QgaXNNb3JlID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbnRyYXN0OiBtb3JlKVwiLCBvcHRpb25zKTtcblx0Y29uc3QgaXNMZXNzID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbnRyYXN0OiBsZXNzKVwiLCBvcHRpb25zKTtcblx0Y29uc3QgaXNDdXN0b20gPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtY29udHJhc3Q6IGN1c3RvbSlcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzTW9yZS52YWx1ZSkgcmV0dXJuIFwibW9yZVwiO1xuXHRcdGlmIChpc0xlc3MudmFsdWUpIHJldHVybiBcImxlc3NcIjtcblx0XHRpZiAoaXNDdXN0b20udmFsdWUpIHJldHVybiBcImN1c3RvbVwiO1xuXHRcdHJldHVybiBcIm5vLXByZWZlcmVuY2VcIjtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZExhbmd1YWdlcy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIE5hdmlnYXRvciBMYW5ndWFnZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZExhbmd1YWdlc1xuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZExhbmd1YWdlcyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHNoYWxsb3dSZWYoW1wiZW5cIl0pO1xuXHRjb25zdCBuYXZpZ2F0b3IkMSA9IHdpbmRvdyQxLm5hdmlnYXRvcjtcblx0Y29uc3QgdmFsdWUgPSBzaGFsbG93UmVmKG5hdmlnYXRvciQxLmxhbmd1YWdlcyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwibGFuZ3VhZ2VjaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdHZhbHVlLnZhbHVlID0gbmF2aWdhdG9yJDEubGFuZ3VhZ2VzO1xuXHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkUmVkdWNlZE1vdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHByZWZlcnMtcmVkdWNlZC1tb3Rpb24gbWVkaWEgcXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZFJlZHVjZWRNb3Rpb25cbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZFJlZHVjZWRNb3Rpb24ob3B0aW9ucykge1xuXHRjb25zdCBpc1JlZHVjZWQgPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSlcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzUmVkdWNlZC52YWx1ZSkgcmV0dXJuIFwicmVkdWNlXCI7XG5cdFx0cmV0dXJuIFwibm8tcHJlZmVyZW5jZVwiO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJlZmVycmVkUmVkdWNlZFRyYW5zcGFyZW5jeS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHByZWZlcnMtcmVkdWNlZC10cmFuc3BhcmVuY3kgbWVkaWEgcXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZFJlZHVjZWRUcmFuc3BhcmVuY3lcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZFJlZHVjZWRUcmFuc3BhcmVuY3kob3B0aW9ucykge1xuXHRjb25zdCBpc1JlZHVjZWQgPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtcmVkdWNlZC10cmFuc3BhcmVuY3k6IHJlZHVjZSlcIiwgb3B0aW9ucyk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKGlzUmVkdWNlZC52YWx1ZSkgcmV0dXJuIFwicmVkdWNlXCI7XG5cdFx0cmV0dXJuIFwibm8tcHJlZmVyZW5jZVwiO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUHJldmlvdXMvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVByZXZpb3VzKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcblx0Y29uc3QgcHJldmlvdXMgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdHdhdGNoKHRvUmVmKHZhbHVlKSwgKF8sIG9sZFZhbHVlKSA9PiB7XG5cdFx0cHJldmlvdXMudmFsdWUgPSBvbGRWYWx1ZTtcblx0fSwgeyBmbHVzaDogXCJzeW5jXCIgfSk7XG5cdHJldHVybiByZWFkb25seShwcmV2aW91cyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNjcmVlblNhZmVBcmVhL2luZGV4LnRzXG5jb25zdCB0b3BWYXJOYW1lID0gXCItLXZ1ZXVzZS1zYWZlLWFyZWEtdG9wXCI7XG5jb25zdCByaWdodFZhck5hbWUgPSBcIi0tdnVldXNlLXNhZmUtYXJlYS1yaWdodFwiO1xuY29uc3QgYm90dG9tVmFyTmFtZSA9IFwiLS12dWV1c2Utc2FmZS1hcmVhLWJvdHRvbVwiO1xuY29uc3QgbGVmdFZhck5hbWUgPSBcIi0tdnVldXNlLXNhZmUtYXJlYS1sZWZ0XCI7XG4vKipcbiogUmVhY3RpdmUgYGVudihzYWZlLWFyZWEtaW5zZXQtKilgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcmVlblNhZmVBcmVhXG4qL1xuZnVuY3Rpb24gdXNlU2NyZWVuU2FmZUFyZWEoKSB7XG5cdGNvbnN0IHRvcCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IHJpZ2h0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgYm90dG9tID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgbGVmdCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGlmIChpc0NsaWVudCkge1xuXHRcdGNvbnN0IHRvcENzc1ZhciA9IHVzZUNzc1Zhcih0b3BWYXJOYW1lKTtcblx0XHRjb25zdCByaWdodENzc1ZhciA9IHVzZUNzc1ZhcihyaWdodFZhck5hbWUpO1xuXHRcdGNvbnN0IGJvdHRvbUNzc1ZhciA9IHVzZUNzc1Zhcihib3R0b21WYXJOYW1lKTtcblx0XHRjb25zdCBsZWZ0Q3NzVmFyID0gdXNlQ3NzVmFyKGxlZnRWYXJOYW1lKTtcblx0XHR0b3BDc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtdG9wLCAwcHgpXCI7XG5cdFx0cmlnaHRDc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtcmlnaHQsIDBweClcIjtcblx0XHRib3R0b21Dc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwcHgpXCI7XG5cdFx0bGVmdENzc1Zhci52YWx1ZSA9IFwiZW52KHNhZmUtYXJlYS1pbnNldC1sZWZ0LCAwcHgpXCI7XG5cdFx0dHJ5T25Nb3VudGVkKHVwZGF0ZSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1c2VEZWJvdW5jZUZuKHVwZGF0ZSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGUoKSB7XG5cdFx0dG9wLnZhbHVlID0gZ2V0VmFsdWUodG9wVmFyTmFtZSk7XG5cdFx0cmlnaHQudmFsdWUgPSBnZXRWYWx1ZShyaWdodFZhck5hbWUpO1xuXHRcdGJvdHRvbS52YWx1ZSA9IGdldFZhbHVlKGJvdHRvbVZhck5hbWUpO1xuXHRcdGxlZnQudmFsdWUgPSBnZXRWYWx1ZShsZWZ0VmFyTmFtZSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR0b3AsXG5cdFx0cmlnaHQsXG5cdFx0Ym90dG9tLFxuXHRcdGxlZnQsXG5cdFx0dXBkYXRlXG5cdH07XG59XG5mdW5jdGlvbiBnZXRWYWx1ZShwb3NpdGlvbikge1xuXHRyZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUocG9zaXRpb24pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTY3JpcHRUYWcvaW5kZXgudHNcbi8qKlxuKiBBc3luYyBzY3JpcHQgdGFnIGxvYWRpbmcuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcmlwdFRhZ1xuKiBAcGFyYW0gc3JjXG4qIEBwYXJhbSBvbkxvYWRlZFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVNjcmlwdFRhZyhzcmMsIG9uTG9hZGVkID0gbm9vcCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW1tZWRpYXRlID0gdHJ1ZSwgbWFudWFsID0gZmFsc2UsIHR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiLCBhc3luYyA9IHRydWUsIGNyb3NzT3JpZ2luLCByZWZlcnJlclBvbGljeSwgbm9Nb2R1bGUsIGRlZmVyLCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgYXR0cnMgPSB7fSwgbm9uY2UgPSB2b2lkIDAgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHNjcmlwdFRhZyA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGxldCBfcHJvbWlzZSA9IG51bGw7XG5cdC8qKlxuXHQqIExvYWQgdGhlIHNjcmlwdCBzcGVjaWZpZWQgdmlhIGBzcmNgLlxuXHQqXG5cdCogQHBhcmFtIHdhaXRGb3JTY3JpcHRMb2FkIFdoZXRoZXIgaWYgdGhlIFByb21pc2Ugc2hvdWxkIHJlc29sdmUgb25jZSB0aGUgXCJsb2FkXCIgZXZlbnQgaXMgZW1pdHRlZCBieSB0aGUgPHNjcmlwdD4gYXR0cmlidXRlLCBvciByaWdodCBhZnRlciBhcHBlbmRpbmcgaXQgdG8gdGhlIERPTS5cblx0KiBAcmV0dXJucyBQcm9taXNlPEhUTUxTY3JpcHRFbGVtZW50PlxuXHQqL1xuXHRjb25zdCBsb2FkU2NyaXB0ID0gKHdhaXRGb3JTY3JpcHRMb2FkKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Y29uc3QgcmVzb2x2ZVdpdGhFbGVtZW50ID0gKGVsJDEpID0+IHtcblx0XHRcdHNjcmlwdFRhZy52YWx1ZSA9IGVsJDE7XG5cdFx0XHRyZXNvbHZlKGVsJDEpO1xuXHRcdFx0cmV0dXJuIGVsJDE7XG5cdFx0fTtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHtcblx0XHRcdHJlc29sdmUoZmFsc2UpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZXQgc2hvdWxkQXBwZW5kID0gZmFsc2U7XG5cdFx0bGV0IGVsID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHt0b1ZhbHVlKHNyYyl9XCJdYCk7XG5cdFx0aWYgKCFlbCkge1xuXHRcdFx0ZWwgPSBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdFx0XHRlbC50eXBlID0gdHlwZTtcblx0XHRcdGVsLmFzeW5jID0gYXN5bmM7XG5cdFx0XHRlbC5zcmMgPSB0b1ZhbHVlKHNyYyk7XG5cdFx0XHRpZiAoZGVmZXIpIGVsLmRlZmVyID0gZGVmZXI7XG5cdFx0XHRpZiAoY3Jvc3NPcmlnaW4pIGVsLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47XG5cdFx0XHRpZiAobm9Nb2R1bGUpIGVsLm5vTW9kdWxlID0gbm9Nb2R1bGU7XG5cdFx0XHRpZiAocmVmZXJyZXJQb2xpY3kpIGVsLnJlZmVycmVyUG9saWN5ID0gcmVmZXJyZXJQb2xpY3k7XG5cdFx0XHRpZiAobm9uY2UpIGVsLm5vbmNlID0gbm9uY2U7XG5cdFx0XHRPYmplY3QuZW50cmllcyhhdHRycykuZm9yRWFjaCgoW25hbWUsIHZhbHVlXSkgPT4gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpO1xuXHRcdFx0c2hvdWxkQXBwZW5kID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKGVsLmhhc0F0dHJpYnV0ZShcImRhdGEtbG9hZGVkXCIpKSByZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwiZXJyb3JcIiwgKGV2ZW50KSA9PiByZWplY3QoZXZlbnQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwiYWJvcnRcIiwgKGV2ZW50KSA9PiByZWplY3QoZXZlbnQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwibG9hZFwiLCAoKSA9PiB7XG5cdFx0XHRlbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxvYWRlZFwiLCBcInRydWVcIik7XG5cdFx0XHRvbkxvYWRlZChlbCk7XG5cdFx0XHRyZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0aWYgKHNob3VsZEFwcGVuZCkgZWwgPSBkb2N1bWVudCQxLmhlYWQuYXBwZW5kQ2hpbGQoZWwpO1xuXHRcdGlmICghd2FpdEZvclNjcmlwdExvYWQpIHJlc29sdmVXaXRoRWxlbWVudChlbCk7XG5cdH0pO1xuXHQvKipcblx0KiBFeHBvc2VkIHNpbmdsZXRvbiB3cmFwcGVyIGZvciBgbG9hZFNjcmlwdGAsIGF2b2lkaW5nIGNhbGxpbmcgaXQgdHdpY2UuXG5cdCpcblx0KiBAcGFyYW0gd2FpdEZvclNjcmlwdExvYWQgV2hldGhlciBpZiB0aGUgUHJvbWlzZSBzaG91bGQgcmVzb2x2ZSBvbmNlIHRoZSBcImxvYWRcIiBldmVudCBpcyBlbWl0dGVkIGJ5IHRoZSA8c2NyaXB0PiBhdHRyaWJ1dGUsIG9yIHJpZ2h0IGFmdGVyIGFwcGVuZGluZyBpdCB0byB0aGUgRE9NLlxuXHQqIEByZXR1cm5zIFByb21pc2U8SFRNTFNjcmlwdEVsZW1lbnQ+XG5cdCovXG5cdGNvbnN0IGxvYWQgPSAod2FpdEZvclNjcmlwdExvYWQgPSB0cnVlKSA9PiB7XG5cdFx0aWYgKCFfcHJvbWlzZSkgX3Byb21pc2UgPSBsb2FkU2NyaXB0KHdhaXRGb3JTY3JpcHRMb2FkKTtcblx0XHRyZXR1cm4gX3Byb21pc2U7XG5cdH07XG5cdC8qKlxuXHQqIFVubG9hZCB0aGUgc2NyaXB0IHNwZWNpZmllZCBieSBgc3JjYC5cblx0Ki9cblx0Y29uc3QgdW5sb2FkID0gKCkgPT4ge1xuXHRcdGlmICghZG9jdW1lbnQkMSkgcmV0dXJuO1xuXHRcdF9wcm9taXNlID0gbnVsbDtcblx0XHRpZiAoc2NyaXB0VGFnLnZhbHVlKSBzY3JpcHRUYWcudmFsdWUgPSBudWxsO1xuXHRcdGNvbnN0IGVsID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHt0b1ZhbHVlKHNyYyl9XCJdYCk7XG5cdFx0aWYgKGVsKSBkb2N1bWVudCQxLmhlYWQucmVtb3ZlQ2hpbGQoZWwpO1xuXHR9O1xuXHRpZiAoaW1tZWRpYXRlICYmICFtYW51YWwpIHRyeU9uTW91bnRlZChsb2FkKTtcblx0aWYgKCFtYW51YWwpIHRyeU9uVW5tb3VudGVkKHVubG9hZCk7XG5cdHJldHVybiB7XG5cdFx0c2NyaXB0VGFnLFxuXHRcdGxvYWQsXG5cdFx0dW5sb2FkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNjcm9sbExvY2svaW5kZXgudHNcbmZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3dTY3JvbGwoZWxlKSB7XG5cdGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlKTtcblx0aWYgKHN0eWxlLm92ZXJmbG93WCA9PT0gXCJzY3JvbGxcIiB8fCBzdHlsZS5vdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHwgc3R5bGUub3ZlcmZsb3dYID09PSBcImF1dG9cIiAmJiBlbGUuY2xpZW50V2lkdGggPCBlbGUuc2Nyb2xsV2lkdGggfHwgc3R5bGUub3ZlcmZsb3dZID09PSBcImF1dG9cIiAmJiBlbGUuY2xpZW50SGVpZ2h0IDwgZWxlLnNjcm9sbEhlaWdodCkgcmV0dXJuIHRydWU7XG5cdGVsc2Uge1xuXHRcdGNvbnN0IHBhcmVudCA9IGVsZS5wYXJlbnROb2RlO1xuXHRcdGlmICghcGFyZW50IHx8IHBhcmVudC50YWdOYW1lID09PSBcIkJPRFlcIikgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjaGVja092ZXJmbG93U2Nyb2xsKHBhcmVudCk7XG5cdH1cbn1cbmZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KHJhd0V2ZW50KSB7XG5cdGNvbnN0IGUgPSByYXdFdmVudCB8fCB3aW5kb3cuZXZlbnQ7XG5cdGNvbnN0IF90YXJnZXQgPSBlLnRhcmdldDtcblx0aWYgKGNoZWNrT3ZlcmZsb3dTY3JvbGwoX3RhcmdldCkpIHJldHVybiBmYWxzZTtcblx0aWYgKGUudG91Y2hlcy5sZW5ndGggPiAxKSByZXR1cm4gdHJ1ZTtcblx0aWYgKGUucHJldmVudERlZmF1bHQpIGUucHJldmVudERlZmF1bHQoKTtcblx0cmV0dXJuIGZhbHNlO1xufVxuY29uc3QgZWxJbml0aWFsT3ZlcmZsb3cgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbi8qKlxuKiBMb2NrIHNjcm9sbGluZyBvZiB0aGUgZWxlbWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2Nyb2xsTG9ja1xuKiBAcGFyYW0gZWxlbWVudFxuKi9cbmZ1bmN0aW9uIHVzZVNjcm9sbExvY2soZWxlbWVudCwgaW5pdGlhbFN0YXRlID0gZmFsc2UpIHtcblx0Y29uc3QgaXNMb2NrZWQgPSBzaGFsbG93UmVmKGluaXRpYWxTdGF0ZSk7XG5cdGxldCBzdG9wVG91Y2hNb3ZlTGlzdGVuZXIgPSBudWxsO1xuXHRsZXQgaW5pdGlhbE92ZXJmbG93ID0gXCJcIjtcblx0d2F0Y2godG9SZWYoZWxlbWVudCksIChlbCkgPT4ge1xuXHRcdGNvbnN0IHRhcmdldCA9IHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWwpKTtcblx0XHRpZiAodGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBlbGUgPSB0YXJnZXQ7XG5cdFx0XHRpZiAoIWVsSW5pdGlhbE92ZXJmbG93LmdldChlbGUpKSBlbEluaXRpYWxPdmVyZmxvdy5zZXQoZWxlLCBlbGUuc3R5bGUub3ZlcmZsb3cpO1xuXHRcdFx0aWYgKGVsZS5zdHlsZS5vdmVyZmxvdyAhPT0gXCJoaWRkZW5cIikgaW5pdGlhbE92ZXJmbG93ID0gZWxlLnN0eWxlLm92ZXJmbG93O1xuXHRcdFx0aWYgKGVsZS5zdHlsZS5vdmVyZmxvdyA9PT0gXCJoaWRkZW5cIikgcmV0dXJuIGlzTG9ja2VkLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpc0xvY2tlZC52YWx1ZSkgcmV0dXJuIGVsZS5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0fVxuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0Y29uc3QgbG9jayA9ICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWxlbWVudCkpO1xuXHRcdGlmICghZWwgfHwgaXNMb2NrZWQudmFsdWUpIHJldHVybjtcblx0XHRpZiAoaXNJT1MpIHN0b3BUb3VjaE1vdmVMaXN0ZW5lciA9IHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwidG91Y2htb3ZlXCIsIChlKSA9PiB7XG5cdFx0XHRwcmV2ZW50RGVmYXVsdChlKTtcblx0XHR9LCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXHRcdGVsLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcblx0XHRpc0xvY2tlZC52YWx1ZSA9IHRydWU7XG5cdH07XG5cdGNvbnN0IHVubG9jayA9ICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHJlc29sdmVFbGVtZW50KHRvVmFsdWUoZWxlbWVudCkpO1xuXHRcdGlmICghZWwgfHwgIWlzTG9ja2VkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKGlzSU9TKSBzdG9wVG91Y2hNb3ZlTGlzdGVuZXIgPT09IG51bGwgfHwgc3RvcFRvdWNoTW92ZUxpc3RlbmVyID09PSB2b2lkIDAgfHwgc3RvcFRvdWNoTW92ZUxpc3RlbmVyKCk7XG5cdFx0ZWwuc3R5bGUub3ZlcmZsb3cgPSBpbml0aWFsT3ZlcmZsb3c7XG5cdFx0ZWxJbml0aWFsT3ZlcmZsb3cuZGVsZXRlKGVsKTtcblx0XHRpc0xvY2tlZC52YWx1ZSA9IGZhbHNlO1xuXHR9O1xuXHR0cnlPblNjb3BlRGlzcG9zZSh1bmxvY2spO1xuXHRyZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpc0xvY2tlZC52YWx1ZTtcblx0XHR9LFxuXHRcdHNldCh2KSB7XG5cdFx0XHRpZiAodikgbG9jaygpO1xuXHRcdFx0ZWxzZSB1bmxvY2soKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTZXNzaW9uU3RvcmFnZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFNlc3Npb25TdG9yYWdlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTZXNzaW9uU3RvcmFnZVxuKiBAcGFyYW0ga2V5XG4qIEBwYXJhbSBpbml0aWFsVmFsdWVcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTZXNzaW9uU3RvcmFnZShrZXksIGluaXRpYWxWYWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB1c2VTdG9yYWdlKGtleSwgaW5pdGlhbFZhbHVlLCB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEuc2Vzc2lvblN0b3JhZ2UsIG9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTaGFyZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFdlYiBTaGFyZSBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNoYXJlXG4qIEBwYXJhbSBzaGFyZU9wdGlvbnNcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VTaGFyZShzaGFyZU9wdGlvbnMgPSB7fSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IF9uYXZpZ2F0b3IgPSBuYXZpZ2F0b3IkMTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IF9uYXZpZ2F0b3IgJiYgXCJjYW5TaGFyZVwiIGluIF9uYXZpZ2F0b3IpO1xuXHRjb25zdCBzaGFyZSA9IGFzeW5jIChvdmVycmlkZU9wdGlvbnMgPSB7fSkgPT4ge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdFx0Li4udG9WYWx1ZShzaGFyZU9wdGlvbnMpLFxuXHRcdFx0XHQuLi50b1ZhbHVlKG92ZXJyaWRlT3B0aW9ucylcblx0XHRcdH07XG5cdFx0XHRsZXQgZ3JhbnRlZCA9IGZhbHNlO1xuXHRcdFx0aWYgKF9uYXZpZ2F0b3IuY2FuU2hhcmUpIGdyYW50ZWQgPSBfbmF2aWdhdG9yLmNhblNoYXJlKGRhdGEpO1xuXHRcdFx0aWYgKGdyYW50ZWQpIHJldHVybiBfbmF2aWdhdG9yLnNoYXJlKGRhdGEpO1xuXHRcdH1cblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzaGFyZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTb3J0ZWQvaW5kZXgudHNcbmNvbnN0IGRlZmF1bHRTb3J0Rm4gPSAoc291cmNlLCBjb21wYXJlRm4pID0+IHNvdXJjZS5zb3J0KGNvbXBhcmVGbik7XG5jb25zdCBkZWZhdWx0Q29tcGFyZSA9IChhLCBiKSA9PiBhIC0gYjtcbmZ1bmN0aW9uIHVzZVNvcnRlZCguLi5hcmdzKSB7XG5cdGNvbnN0IFtzb3VyY2VdID0gYXJncztcblx0bGV0IGNvbXBhcmVGbiA9IGRlZmF1bHRDb21wYXJlO1xuXHRsZXQgb3B0aW9ucyA9IHt9O1xuXHRpZiAoYXJncy5sZW5ndGggPT09IDIpIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdHZhciBfb3B0aW9ucyRjb21wYXJlRm47XG5cdFx0b3B0aW9ucyA9IGFyZ3NbMV07XG5cdFx0Y29tcGFyZUZuID0gKF9vcHRpb25zJGNvbXBhcmVGbiA9IG9wdGlvbnMuY29tcGFyZUZuKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRjb21wYXJlRm4gIT09IHZvaWQgMCA/IF9vcHRpb25zJGNvbXBhcmVGbiA6IGRlZmF1bHRDb21wYXJlO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBfYXJncyQ7XG5cdFx0Y29tcGFyZUZuID0gKF9hcmdzJCA9IGFyZ3NbMV0pICE9PSBudWxsICYmIF9hcmdzJCAhPT0gdm9pZCAwID8gX2FyZ3MkIDogZGVmYXVsdENvbXBhcmU7XG5cdH1cblx0ZWxzZSBpZiAoYXJncy5sZW5ndGggPiAyKSB7XG5cdFx0dmFyIF9hcmdzJDIsIF9hcmdzJDM7XG5cdFx0Y29tcGFyZUZuID0gKF9hcmdzJDIgPSBhcmdzWzFdKSAhPT0gbnVsbCAmJiBfYXJncyQyICE9PSB2b2lkIDAgPyBfYXJncyQyIDogZGVmYXVsdENvbXBhcmU7XG5cdFx0b3B0aW9ucyA9IChfYXJncyQzID0gYXJnc1syXSkgIT09IG51bGwgJiYgX2FyZ3MkMyAhPT0gdm9pZCAwID8gX2FyZ3MkMyA6IHt9O1xuXHR9XG5cdGNvbnN0IHsgZGlydHkgPSBmYWxzZSwgc29ydEZuID0gZGVmYXVsdFNvcnRGbiB9ID0gb3B0aW9ucztcblx0aWYgKCFkaXJ0eSkgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHNvcnRGbihbLi4udG9WYWx1ZShzb3VyY2UpXSwgY29tcGFyZUZuKSk7XG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRjb25zdCByZXN1bHQgPSBzb3J0Rm4odG9WYWx1ZShzb3VyY2UpLCBjb21wYXJlRm4pO1xuXHRcdGlmIChpc1JlZihzb3VyY2UpKSBzb3VyY2UudmFsdWUgPSByZXN1bHQ7XG5cdFx0ZWxzZSBzb3VyY2Uuc3BsaWNlKDAsIHNvdXJjZS5sZW5ndGgsIC4uLnJlc3VsdCk7XG5cdH0pO1xuXHRyZXR1cm4gc291cmNlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTcGVlY2hSZWNvZ25pdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFNwZWVjaFJlY29nbml0aW9uLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTcGVlY2hSZWNvZ25pdGlvblxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TcGVlY2hSZWNvZ25pdGlvbiBTcGVlY2hSZWNvZ25pdGlvblxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVNwZWVjaFJlY29nbml0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGludGVyaW1SZXN1bHRzID0gdHJ1ZSwgY29udGludW91cyA9IHRydWUsIG1heEFsdGVybmF0aXZlcyA9IDEsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBsYW5nID0gdG9SZWYob3B0aW9ucy5sYW5nIHx8IFwiZW4tVVNcIik7XG5cdGNvbnN0IGlzTGlzdGVuaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGlzRmluYWwgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgcmVzdWx0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGxldCByZWNvZ25pdGlvbjtcblx0Y29uc3Qgc3RhcnQgPSAoKSA9PiB7XG5cdFx0aXNMaXN0ZW5pbmcudmFsdWUgPSB0cnVlO1xuXHR9O1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdGlzTGlzdGVuaW5nLnZhbHVlID0gZmFsc2U7XG5cdH07XG5cdGNvbnN0IHRvZ2dsZSA9ICh2YWx1ZSA9ICFpc0xpc3RlbmluZy52YWx1ZSkgPT4ge1xuXHRcdGlmICh2YWx1ZSkgc3RhcnQoKTtcblx0XHRlbHNlIHN0b3AoKTtcblx0fTtcblx0Y29uc3QgU3BlZWNoUmVjb2duaXRpb24gPSB3aW5kb3ckMSAmJiAod2luZG93JDEuU3BlZWNoUmVjb2duaXRpb24gfHwgd2luZG93JDEud2Via2l0U3BlZWNoUmVjb2duaXRpb24pO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gU3BlZWNoUmVjb2duaXRpb24pO1xuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcblx0XHRyZWNvZ25pdGlvbiA9IG5ldyBTcGVlY2hSZWNvZ25pdGlvbigpO1xuXHRcdHJlY29nbml0aW9uLmNvbnRpbnVvdXMgPSBjb250aW51b3VzO1xuXHRcdHJlY29nbml0aW9uLmludGVyaW1SZXN1bHRzID0gaW50ZXJpbVJlc3VsdHM7XG5cdFx0cmVjb2duaXRpb24ubGFuZyA9IHRvVmFsdWUobGFuZyk7XG5cdFx0cmVjb2duaXRpb24ubWF4QWx0ZXJuYXRpdmVzID0gbWF4QWx0ZXJuYXRpdmVzO1xuXHRcdHJlY29nbml0aW9uLm9uc3RhcnQgPSAoKSA9PiB7XG5cdFx0XHRpc0xpc3RlbmluZy52YWx1ZSA9IHRydWU7XG5cdFx0XHRpc0ZpbmFsLnZhbHVlID0gZmFsc2U7XG5cdFx0fTtcblx0XHR3YXRjaChsYW5nLCAobGFuZyQxKSA9PiB7XG5cdFx0XHRpZiAocmVjb2duaXRpb24gJiYgIWlzTGlzdGVuaW5nLnZhbHVlKSByZWNvZ25pdGlvbi5sYW5nID0gbGFuZyQxO1xuXHRcdH0pO1xuXHRcdHJlY29nbml0aW9uLm9ucmVzdWx0ID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRjb25zdCBjdXJyZW50UmVzdWx0ID0gZXZlbnQucmVzdWx0c1tldmVudC5yZXN1bHRJbmRleF07XG5cdFx0XHRjb25zdCB7IHRyYW5zY3JpcHQgfSA9IGN1cnJlbnRSZXN1bHRbMF07XG5cdFx0XHRpc0ZpbmFsLnZhbHVlID0gY3VycmVudFJlc3VsdC5pc0ZpbmFsO1xuXHRcdFx0cmVzdWx0LnZhbHVlID0gdHJhbnNjcmlwdDtcblx0XHRcdGVycm9yLnZhbHVlID0gdm9pZCAwO1xuXHRcdH07XG5cdFx0cmVjb2duaXRpb24ub25lcnJvciA9IChldmVudCkgPT4ge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBldmVudDtcblx0XHR9O1xuXHRcdHJlY29nbml0aW9uLm9uZW5kID0gKCkgPT4ge1xuXHRcdFx0aXNMaXN0ZW5pbmcudmFsdWUgPSBmYWxzZTtcblx0XHRcdHJlY29nbml0aW9uLmxhbmcgPSB0b1ZhbHVlKGxhbmcpO1xuXHRcdH07XG5cdFx0d2F0Y2goaXNMaXN0ZW5pbmcsIChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IHtcblx0XHRcdGlmIChuZXdWYWx1ZSA9PT0gb2xkVmFsdWUpIHJldHVybjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuZXdWYWx1ZSkgcmVjb2duaXRpb24uc3RhcnQoKTtcblx0XHRcdFx0ZWxzZSByZWNvZ25pdGlvbi5zdG9wKCk7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0ZXJyb3IudmFsdWUgPSBlcnI7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHN0b3AoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNMaXN0ZW5pbmcsXG5cdFx0aXNGaW5hbCxcblx0XHRyZWNvZ25pdGlvbixcblx0XHRyZXN1bHQsXG5cdFx0ZXJyb3IsXG5cdFx0dG9nZ2xlLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3BlZWNoU3ludGhlc2lzL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgU3BlZWNoU3ludGhlc2lzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTcGVlY2hTeW50aGVzaXNcbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU3BlZWNoU3ludGhlc2lzIFNwZWVjaFN5bnRoZXNpc1xuKi9cbmZ1bmN0aW9uIHVzZVNwZWVjaFN5bnRoZXNpcyh0ZXh0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBwaXRjaCA9IDEsIHJhdGUgPSAxLCB2b2x1bWUgPSAxLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgb25Cb3VuZGFyeSB9ID0gb3B0aW9ucztcblx0Y29uc3Qgc3ludGggPSB3aW5kb3ckMSAmJiB3aW5kb3ckMS5zcGVlY2hTeW50aGVzaXM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBzeW50aCk7XG5cdGNvbnN0IGlzUGxheWluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzdGF0dXMgPSBzaGFsbG93UmVmKFwiaW5pdFwiKTtcblx0Y29uc3Qgc3Bva2VuVGV4dCA9IHRvUmVmKHRleHQgfHwgXCJcIik7XG5cdGNvbnN0IGxhbmcgPSB0b1JlZihvcHRpb25zLmxhbmcgfHwgXCJlbi1VU1wiKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IHRvZ2dsZSA9ICh2YWx1ZSA9ICFpc1BsYXlpbmcudmFsdWUpID0+IHtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSB2YWx1ZTtcblx0fTtcblx0Y29uc3QgYmluZEV2ZW50c0ZvclV0dGVyYW5jZSA9ICh1dHRlcmFuY2UkMSkgPT4ge1xuXHRcdHV0dGVyYW5jZSQxLmxhbmcgPSB0b1ZhbHVlKGxhbmcpO1xuXHRcdHV0dGVyYW5jZSQxLnZvaWNlID0gdG9WYWx1ZShvcHRpb25zLnZvaWNlKSB8fCBudWxsO1xuXHRcdHV0dGVyYW5jZSQxLnBpdGNoID0gdG9WYWx1ZShwaXRjaCk7XG5cdFx0dXR0ZXJhbmNlJDEucmF0ZSA9IHRvVmFsdWUocmF0ZSk7XG5cdFx0dXR0ZXJhbmNlJDEudm9sdW1lID0gdG9WYWx1ZSh2b2x1bWUpO1xuXHRcdHV0dGVyYW5jZSQxLm9uc3RhcnQgPSAoKSA9PiB7XG5cdFx0XHRpc1BsYXlpbmcudmFsdWUgPSB0cnVlO1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJwbGF5XCI7XG5cdFx0fTtcblx0XHR1dHRlcmFuY2UkMS5vbnBhdXNlID0gKCkgPT4ge1xuXHRcdFx0aXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcInBhdXNlXCI7XG5cdFx0fTtcblx0XHR1dHRlcmFuY2UkMS5vbnJlc3VtZSA9ICgpID0+IHtcblx0XHRcdGlzUGxheWluZy52YWx1ZSA9IHRydWU7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcInBsYXlcIjtcblx0XHR9O1xuXHRcdHV0dGVyYW5jZSQxLm9uZW5kID0gKCkgPT4ge1xuXHRcdFx0aXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcImVuZFwiO1xuXHRcdH07XG5cdFx0dXR0ZXJhbmNlJDEub25lcnJvciA9IChldmVudCkgPT4ge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBldmVudDtcblx0XHR9O1xuXHRcdHV0dGVyYW5jZSQxLm9uYm91bmRhcnkgPSAoZXZlbnQpID0+IHtcblx0XHRcdG9uQm91bmRhcnkgPT09IG51bGwgfHwgb25Cb3VuZGFyeSA9PT0gdm9pZCAwIHx8IG9uQm91bmRhcnkoZXZlbnQpO1xuXHRcdH07XG5cdH07XG5cdGNvbnN0IHV0dGVyYW5jZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRzdGF0dXMudmFsdWUgPSBcImluaXRcIjtcblx0XHRjb25zdCBuZXdVdHRlcmFuY2UgPSBuZXcgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKHNwb2tlblRleHQudmFsdWUpO1xuXHRcdGJpbmRFdmVudHNGb3JVdHRlcmFuY2UobmV3VXR0ZXJhbmNlKTtcblx0XHRyZXR1cm4gbmV3VXR0ZXJhbmNlO1xuXHR9KTtcblx0Y29uc3Qgc3BlYWsgPSAoKSA9PiB7XG5cdFx0c3ludGguY2FuY2VsKCk7XG5cdFx0aWYgKHV0dGVyYW5jZSkgc3ludGguc3BlYWsodXR0ZXJhbmNlLnZhbHVlKTtcblx0fTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRzeW50aC5jYW5jZWwoKTtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0YmluZEV2ZW50c0ZvclV0dGVyYW5jZSh1dHRlcmFuY2UudmFsdWUpO1xuXHRcdHdhdGNoKGxhbmcsIChsYW5nJDEpID0+IHtcblx0XHRcdGlmICh1dHRlcmFuY2UudmFsdWUgJiYgIWlzUGxheWluZy52YWx1ZSkgdXR0ZXJhbmNlLnZhbHVlLmxhbmcgPSBsYW5nJDE7XG5cdFx0fSk7XG5cdFx0aWYgKG9wdGlvbnMudm9pY2UpIHdhdGNoKG9wdGlvbnMudm9pY2UsICgpID0+IHtcblx0XHRcdHN5bnRoLmNhbmNlbCgpO1xuXHRcdH0pO1xuXHRcdHdhdGNoKGlzUGxheWluZywgKCkgPT4ge1xuXHRcdFx0aWYgKGlzUGxheWluZy52YWx1ZSkgc3ludGgucmVzdW1lKCk7XG5cdFx0XHRlbHNlIHN5bnRoLnBhdXNlKCk7XG5cdFx0fSk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdGlzUGxheWluZy52YWx1ZSA9IGZhbHNlO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRpc1BsYXlpbmcsXG5cdFx0c3RhdHVzLFxuXHRcdHV0dGVyYW5jZSxcblx0XHRlcnJvcixcblx0XHRzdG9wLFxuXHRcdHRvZ2dsZSxcblx0XHRzcGVha1xuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTdGVwcGVyL2luZGV4LnRzXG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlU3RlcHBlcihzdGVwcywgaW5pdGlhbFN0ZXApIHtcblx0Y29uc3Qgc3RlcHNSZWYgPSByZWYoc3RlcHMpO1xuXHRjb25zdCBzdGVwTmFtZXMgPSBjb21wdXRlZCgoKSA9PiBBcnJheS5pc0FycmF5KHN0ZXBzUmVmLnZhbHVlKSA/IHN0ZXBzUmVmLnZhbHVlIDogT2JqZWN0LmtleXMoc3RlcHNSZWYudmFsdWUpKTtcblx0Y29uc3QgaW5kZXggPSByZWYoc3RlcE5hbWVzLnZhbHVlLmluZGV4T2YoaW5pdGlhbFN0ZXAgIT09IG51bGwgJiYgaW5pdGlhbFN0ZXAgIT09IHZvaWQgMCA/IGluaXRpYWxTdGVwIDogc3RlcE5hbWVzLnZhbHVlWzBdKSk7XG5cdGNvbnN0IGN1cnJlbnQgPSBjb21wdXRlZCgoKSA9PiBhdChpbmRleC52YWx1ZSkpO1xuXHRjb25zdCBpc0ZpcnN0ID0gY29tcHV0ZWQoKCkgPT4gaW5kZXgudmFsdWUgPT09IDApO1xuXHRjb25zdCBpc0xhc3QgPSBjb21wdXRlZCgoKSA9PiBpbmRleC52YWx1ZSA9PT0gc3RlcE5hbWVzLnZhbHVlLmxlbmd0aCAtIDEpO1xuXHRjb25zdCBuZXh0ID0gY29tcHV0ZWQoKCkgPT4gc3RlcE5hbWVzLnZhbHVlW2luZGV4LnZhbHVlICsgMV0pO1xuXHRjb25zdCBwcmV2aW91cyA9IGNvbXB1dGVkKCgpID0+IHN0ZXBOYW1lcy52YWx1ZVtpbmRleC52YWx1ZSAtIDFdKTtcblx0ZnVuY3Rpb24gYXQoaW5kZXgkMSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHN0ZXBzUmVmLnZhbHVlKSkgcmV0dXJuIHN0ZXBzUmVmLnZhbHVlW2luZGV4JDFdO1xuXHRcdHJldHVybiBzdGVwc1JlZi52YWx1ZVtzdGVwTmFtZXMudmFsdWVbaW5kZXgkMV1dO1xuXHR9XG5cdGZ1bmN0aW9uIGdldChzdGVwKSB7XG5cdFx0aWYgKCFzdGVwTmFtZXMudmFsdWUuaW5jbHVkZXMoc3RlcCkpIHJldHVybjtcblx0XHRyZXR1cm4gYXQoc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkpO1xuXHR9XG5cdGZ1bmN0aW9uIGdvVG8oc3RlcCkge1xuXHRcdGlmIChzdGVwTmFtZXMudmFsdWUuaW5jbHVkZXMoc3RlcCkpIGluZGV4LnZhbHVlID0gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCk7XG5cdH1cblx0ZnVuY3Rpb24gZ29Ub05leHQoKSB7XG5cdFx0aWYgKGlzTGFzdC52YWx1ZSkgcmV0dXJuO1xuXHRcdGluZGV4LnZhbHVlKys7XG5cdH1cblx0ZnVuY3Rpb24gZ29Ub1ByZXZpb3VzKCkge1xuXHRcdGlmIChpc0ZpcnN0LnZhbHVlKSByZXR1cm47XG5cdFx0aW5kZXgudmFsdWUtLTtcblx0fVxuXHRmdW5jdGlvbiBnb0JhY2tUbyhzdGVwKSB7XG5cdFx0aWYgKGlzQWZ0ZXIoc3RlcCkpIGdvVG8oc3RlcCk7XG5cdH1cblx0ZnVuY3Rpb24gaXNOZXh0KHN0ZXApIHtcblx0XHRyZXR1cm4gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkgPT09IGluZGV4LnZhbHVlICsgMTtcblx0fVxuXHRmdW5jdGlvbiBpc1ByZXZpb3VzKHN0ZXApIHtcblx0XHRyZXR1cm4gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkgPT09IGluZGV4LnZhbHVlIC0gMTtcblx0fVxuXHRmdW5jdGlvbiBpc0N1cnJlbnQoc3RlcCkge1xuXHRcdHJldHVybiBzdGVwTmFtZXMudmFsdWUuaW5kZXhPZihzdGVwKSA9PT0gaW5kZXgudmFsdWU7XG5cdH1cblx0ZnVuY3Rpb24gaXNCZWZvcmUoc3RlcCkge1xuXHRcdHJldHVybiBpbmRleC52YWx1ZSA8IHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApO1xuXHR9XG5cdGZ1bmN0aW9uIGlzQWZ0ZXIoc3RlcCkge1xuXHRcdHJldHVybiBpbmRleC52YWx1ZSA+IHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0c3RlcHM6IHN0ZXBzUmVmLFxuXHRcdHN0ZXBOYW1lcyxcblx0XHRpbmRleCxcblx0XHRjdXJyZW50LFxuXHRcdG5leHQsXG5cdFx0cHJldmlvdXMsXG5cdFx0aXNGaXJzdCxcblx0XHRpc0xhc3QsXG5cdFx0YXQsXG5cdFx0Z2V0LFxuXHRcdGdvVG8sXG5cdFx0Z29Ub05leHQsXG5cdFx0Z29Ub1ByZXZpb3VzLFxuXHRcdGdvQmFja1RvLFxuXHRcdGlzTmV4dCxcblx0XHRpc1ByZXZpb3VzLFxuXHRcdGlzQ3VycmVudCxcblx0XHRpc0JlZm9yZSxcblx0XHRpc0FmdGVyXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN0b3JhZ2VBc3luYy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFN0b3JhZ2UgaW4gd2l0aCBhc3luYyBzdXBwb3J0LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTdG9yYWdlQXN5bmNcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaW5pdGlhbFZhbHVlXG4qIEBwYXJhbSBzdG9yYWdlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU3RvcmFnZUFzeW5jKGtleSwgaW5pdGlhbFZhbHVlLCBzdG9yYWdlLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJHNlcmlhbGl6ZXI7XG5cdGNvbnN0IHsgZmx1c2ggPSBcInByZVwiLCBkZWVwID0gdHJ1ZSwgbGlzdGVuVG9TdG9yYWdlQ2hhbmdlcyA9IHRydWUsIHdyaXRlRGVmYXVsdHMgPSB0cnVlLCBtZXJnZURlZmF1bHRzID0gZmFsc2UsIHNoYWxsb3csIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBldmVudEZpbHRlciwgb25FcnJvciA9IChlKSA9PiB7XG5cdFx0Y29uc29sZS5lcnJvcihlKTtcblx0fSwgb25SZWFkeSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcmF3SW5pdCA9IHRvVmFsdWUoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgdHlwZSA9IGd1ZXNzU2VyaWFsaXplclR5cGUocmF3SW5pdCk7XG5cdGNvbnN0IGRhdGEgPSAoc2hhbGxvdyA/IHNoYWxsb3dSZWYgOiByZWYpKHRvVmFsdWUoaW5pdGlhbFZhbHVlKSk7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSAoX29wdGlvbnMkc2VyaWFsaXplciA9IG9wdGlvbnMuc2VyaWFsaXplcikgIT09IG51bGwgJiYgX29wdGlvbnMkc2VyaWFsaXplciAhPT0gdm9pZCAwID8gX29wdGlvbnMkc2VyaWFsaXplciA6IFN0b3JhZ2VTZXJpYWxpemVyc1t0eXBlXTtcblx0aWYgKCFzdG9yYWdlKSB0cnkge1xuXHRcdHN0b3JhZ2UgPSBnZXRTU1JIYW5kbGVyKFwiZ2V0RGVmYXVsdFN0b3JhZ2VBc3luY1wiLCAoKSA9PiBkZWZhdWx0V2luZG93ID09PSBudWxsIHx8IGRlZmF1bHRXaW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlZmF1bHRXaW5kb3cubG9jYWxTdG9yYWdlKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0b25FcnJvcihlKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZWFkKGV2ZW50KSB7XG5cdFx0aWYgKCFzdG9yYWdlIHx8IGV2ZW50ICYmIGV2ZW50LmtleSAhPT0ga2V5KSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJhd1ZhbHVlID0gZXZlbnQgPyBldmVudC5uZXdWYWx1ZSA6IGF3YWl0IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXHRcdFx0aWYgKHJhd1ZhbHVlID09IG51bGwpIHtcblx0XHRcdFx0ZGF0YS52YWx1ZSA9IHJhd0luaXQ7XG5cdFx0XHRcdGlmICh3cml0ZURlZmF1bHRzICYmIHJhd0luaXQgIT09IG51bGwpIGF3YWl0IHN0b3JhZ2Uuc2V0SXRlbShrZXksIGF3YWl0IHNlcmlhbGl6ZXIud3JpdGUocmF3SW5pdCkpO1xuXHRcdFx0fSBlbHNlIGlmIChtZXJnZURlZmF1bHRzKSB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gYXdhaXQgc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0XHRcdFx0aWYgKHR5cGVvZiBtZXJnZURlZmF1bHRzID09PSBcImZ1bmN0aW9uXCIpIGRhdGEudmFsdWUgPSBtZXJnZURlZmF1bHRzKHZhbHVlLCByYXdJbml0KTtcblx0XHRcdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIGRhdGEudmFsdWUgPSB7XG5cdFx0XHRcdFx0Li4ucmF3SW5pdCxcblx0XHRcdFx0XHQuLi52YWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRlbHNlIGRhdGEudmFsdWUgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBkYXRhLnZhbHVlID0gYXdhaXQgc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fVxuXHRjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRyZWFkKCkudGhlbigoKSA9PiB7XG5cdFx0XHRvblJlYWR5ID09PSBudWxsIHx8IG9uUmVhZHkgPT09IHZvaWQgMCB8fCBvblJlYWR5KGRhdGEudmFsdWUpO1xuXHRcdFx0cmVzb2x2ZShkYXRhKTtcblx0XHR9KTtcblx0fSk7XG5cdGlmICh3aW5kb3ckMSAmJiBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInN0b3JhZ2VcIiwgKGUpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gcmVhZChlKSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0aWYgKHN0b3JhZ2UpIHdhdGNoV2l0aEZpbHRlcihkYXRhLCBhc3luYyAoKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChkYXRhLnZhbHVlID09IG51bGwpIGF3YWl0IHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuXHRcdFx0ZWxzZSBhd2FpdCBzdG9yYWdlLnNldEl0ZW0oa2V5LCBhd2FpdCBzZXJpYWxpemVyLndyaXRlKGRhdGEudmFsdWUpKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fSwge1xuXHRcdGZsdXNoLFxuXHRcdGRlZXAsXG5cdFx0ZXZlbnRGaWx0ZXJcblx0fSk7XG5cdE9iamVjdC5hc3NpZ24oZGF0YSwge1xuXHRcdHRoZW46IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpLFxuXHRcdGNhdGNoOiBwcm9taXNlLmNhdGNoLmJpbmQocHJvbWlzZSlcblx0fSk7XG5cdHJldHVybiBkYXRhO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTdHlsZVRhZy9pbmRleC50c1xubGV0IF9pZCA9IDA7XG4vKipcbiogSW5qZWN0IDxzdHlsZT4gZWxlbWVudCBpbiBoZWFkLlxuKlxuKiBPdmVybG9hZDogT21pdHRlZCBpZFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTdHlsZVRhZ1xuKiBAcGFyYW0gY3NzXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU3R5bGVUYWcoY3NzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgaXNMb2FkZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgaW1tZWRpYXRlID0gdHJ1ZSwgbWFudWFsID0gZmFsc2UsIGlkID0gYHZ1ZXVzZV9zdHlsZXRhZ18keysrX2lkfWAgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGNzc1JlZiA9IHNoYWxsb3dSZWYoY3NzKTtcblx0bGV0IHN0b3AgPSAoKSA9PiB7fTtcblx0Y29uc3QgbG9hZCA9ICgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHJldHVybjtcblx0XHRjb25zdCBlbCA9IGRvY3VtZW50JDEuZ2V0RWxlbWVudEJ5SWQoaWQpIHx8IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdGlmICghZWwuaXNDb25uZWN0ZWQpIHtcblx0XHRcdGVsLmlkID0gaWQ7XG5cdFx0XHRpZiAob3B0aW9ucy5ub25jZSkgZWwubm9uY2UgPSBvcHRpb25zLm5vbmNlO1xuXHRcdFx0aWYgKG9wdGlvbnMubWVkaWEpIGVsLm1lZGlhID0gb3B0aW9ucy5tZWRpYTtcblx0XHRcdGRvY3VtZW50JDEuaGVhZC5hcHBlbmRDaGlsZChlbCk7XG5cdFx0fVxuXHRcdGlmIChpc0xvYWRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdHN0b3AgPSB3YXRjaChjc3NSZWYsICh2YWx1ZSkgPT4ge1xuXHRcdFx0ZWwudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0XHRpc0xvYWRlZC52YWx1ZSA9IHRydWU7XG5cdH07XG5cdGNvbnN0IHVubG9hZCA9ICgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEgfHwgIWlzTG9hZGVkLnZhbHVlKSByZXR1cm47XG5cdFx0c3RvcCgpO1xuXHRcdGRvY3VtZW50JDEuaGVhZC5yZW1vdmVDaGlsZChkb2N1bWVudCQxLmdldEVsZW1lbnRCeUlkKGlkKSk7XG5cdFx0aXNMb2FkZWQudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0aWYgKGltbWVkaWF0ZSAmJiAhbWFudWFsKSB0cnlPbk1vdW50ZWQobG9hZCk7XG5cdGlmICghbWFudWFsKSB0cnlPblNjb3BlRGlzcG9zZSh1bmxvYWQpO1xuXHRyZXR1cm4ge1xuXHRcdGlkLFxuXHRcdGNzczogY3NzUmVmLFxuXHRcdHVubG9hZCxcblx0XHRsb2FkLFxuXHRcdGlzTG9hZGVkOiByZWFkb25seShpc0xvYWRlZClcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3dpcGUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBzd2lwZSBkZXRlY3Rpb24uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVN3aXBlXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTd2lwZSh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocmVzaG9sZCA9IDUwLCBvblN3aXBlLCBvblN3aXBlRW5kLCBvblN3aXBlU3RhcnQsIHBhc3NpdmUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjb29yZHNTdGFydCA9IHJlYWN0aXZlKHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IGNvb3Jkc0VuZCA9IHJlYWN0aXZlKHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IGRpZmZYID0gY29tcHV0ZWQoKCkgPT4gY29vcmRzU3RhcnQueCAtIGNvb3Jkc0VuZC54KTtcblx0Y29uc3QgZGlmZlkgPSBjb21wdXRlZCgoKSA9PiBjb29yZHNTdGFydC55IC0gY29vcmRzRW5kLnkpO1xuXHRjb25zdCB7IG1heCwgYWJzIH0gPSBNYXRoO1xuXHRjb25zdCBpc1RocmVzaG9sZEV4Y2VlZGVkID0gY29tcHV0ZWQoKCkgPT4gbWF4KGFicyhkaWZmWC52YWx1ZSksIGFicyhkaWZmWS52YWx1ZSkpID49IHRocmVzaG9sZCk7XG5cdGNvbnN0IGlzU3dpcGluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBkaXJlY3Rpb24gPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKCFpc1RocmVzaG9sZEV4Y2VlZGVkLnZhbHVlKSByZXR1cm4gXCJub25lXCI7XG5cdFx0aWYgKGFicyhkaWZmWC52YWx1ZSkgPiBhYnMoZGlmZlkudmFsdWUpKSByZXR1cm4gZGlmZlgudmFsdWUgPiAwID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCI7XG5cdFx0ZWxzZSByZXR1cm4gZGlmZlkudmFsdWUgPiAwID8gXCJ1cFwiIDogXCJkb3duXCI7XG5cdH0pO1xuXHRjb25zdCBnZXRUb3VjaEV2ZW50Q29vcmRzID0gKGUpID0+IFtlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFldO1xuXHRjb25zdCB1cGRhdGVDb29yZHNTdGFydCA9ICh4LCB5KSA9PiB7XG5cdFx0Y29vcmRzU3RhcnQueCA9IHg7XG5cdFx0Y29vcmRzU3RhcnQueSA9IHk7XG5cdH07XG5cdGNvbnN0IHVwZGF0ZUNvb3Jkc0VuZCA9ICh4LCB5KSA9PiB7XG5cdFx0Y29vcmRzRW5kLnggPSB4O1xuXHRcdGNvb3Jkc0VuZC55ID0geTtcblx0fTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdHBhc3NpdmUsXG5cdFx0Y2FwdHVyZTogIXBhc3NpdmVcblx0fTtcblx0Y29uc3Qgb25Ub3VjaEVuZCA9IChlKSA9PiB7XG5cdFx0aWYgKGlzU3dpcGluZy52YWx1ZSkgb25Td2lwZUVuZCA9PT0gbnVsbCB8fCBvblN3aXBlRW5kID09PSB2b2lkIDAgfHwgb25Td2lwZUVuZChlLCBkaXJlY3Rpb24udmFsdWUpO1xuXHRcdGlzU3dpcGluZy52YWx1ZSA9IGZhbHNlO1xuXHR9O1xuXHRjb25zdCBzdG9wcyA9IFtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJ0b3VjaHN0YXJ0XCIsIChlKSA9PiB7XG5cdFx0XHRpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMSkgcmV0dXJuO1xuXHRcdFx0Y29uc3QgW3gsIHldID0gZ2V0VG91Y2hFdmVudENvb3JkcyhlKTtcblx0XHRcdHVwZGF0ZUNvb3Jkc1N0YXJ0KHgsIHkpO1xuXHRcdFx0dXBkYXRlQ29vcmRzRW5kKHgsIHkpO1xuXHRcdFx0b25Td2lwZVN0YXJ0ID09PSBudWxsIHx8IG9uU3dpcGVTdGFydCA9PT0gdm9pZCAwIHx8IG9uU3dpcGVTdGFydChlKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpLFxuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRvdWNobW92ZVwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKGUudG91Y2hlcy5sZW5ndGggIT09IDEpIHJldHVybjtcblx0XHRcdGNvbnN0IFt4LCB5XSA9IGdldFRvdWNoRXZlbnRDb29yZHMoZSk7XG5cdFx0XHR1cGRhdGVDb29yZHNFbmQoeCwgeSk7XG5cdFx0XHRpZiAobGlzdGVuZXJPcHRpb25zLmNhcHR1cmUgJiYgIWxpc3RlbmVyT3B0aW9ucy5wYXNzaXZlICYmIE1hdGguYWJzKGRpZmZYLnZhbHVlKSA+IE1hdGguYWJzKGRpZmZZLnZhbHVlKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKCFpc1N3aXBpbmcudmFsdWUgJiYgaXNUaHJlc2hvbGRFeGNlZWRlZC52YWx1ZSkgaXNTd2lwaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpc1N3aXBpbmcudmFsdWUpIG9uU3dpcGUgPT09IG51bGwgfHwgb25Td2lwZSA9PT0gdm9pZCAwIHx8IG9uU3dpcGUoZSk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgW1widG91Y2hlbmRcIiwgXCJ0b3VjaGNhbmNlbFwiXSwgb25Ub3VjaEVuZCwgbGlzdGVuZXJPcHRpb25zKVxuXHRdO1xuXHRjb25zdCBzdG9wID0gKCkgPT4gc3RvcHMuZm9yRWFjaCgocykgPT4gcygpKTtcblx0cmV0dXJuIHtcblx0XHRpc1N3aXBpbmcsXG5cdFx0ZGlyZWN0aW9uLFxuXHRcdGNvb3Jkc1N0YXJ0LFxuXHRcdGNvb3Jkc0VuZCxcblx0XHRsZW5ndGhYOiBkaWZmWCxcblx0XHRsZW5ndGhZOiBkaWZmWSxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRlbXBsYXRlUmVmc0xpc3QvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VUZW1wbGF0ZVJlZnNMaXN0KCkge1xuXHRjb25zdCByZWZzID0gcmVmKFtdKTtcblx0cmVmcy52YWx1ZS5zZXQgPSAoZWwpID0+IHtcblx0XHRpZiAoZWwpIHJlZnMudmFsdWUucHVzaChlbCk7XG5cdH07XG5cdG9uQmVmb3JlVXBkYXRlKCgpID0+IHtcblx0XHRyZWZzLnZhbHVlLmxlbmd0aCA9IDA7XG5cdH0pO1xuXHRyZXR1cm4gcmVmcztcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGV4dERpcmVjdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGRpciBvZiB0aGUgZWxlbWVudCdzIHRleHQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRleHREaXJlY3Rpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUZXh0RGlyZWN0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50LCBzZWxlY3RvciA9IFwiaHRtbFwiLCBvYnNlcnZlID0gZmFsc2UsIGluaXRpYWxWYWx1ZSA9IFwibHRyXCIgfSA9IG9wdGlvbnM7XG5cdGZ1bmN0aW9uIGdldFZhbHVlJDEoKSB7XG5cdFx0dmFyIF9yZWYsIF9kb2N1bWVudCRxdWVyeVNlbGVjdDtcblx0XHRyZXR1cm4gKF9yZWYgPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCB8fCAoX2RvY3VtZW50JHF1ZXJ5U2VsZWN0ID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkgPT09IG51bGwgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZG9jdW1lbnQkcXVlcnlTZWxlY3QuZ2V0QXR0cmlidXRlKFwiZGlyXCIpKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogaW5pdGlhbFZhbHVlO1xuXHR9XG5cdGNvbnN0IGRpciA9IHJlZihnZXRWYWx1ZSQxKCkpO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4gZGlyLnZhbHVlID0gZ2V0VmFsdWUkMSgpKTtcblx0aWYgKG9ic2VydmUgJiYgZG9jdW1lbnQkMSkgdXNlTXV0YXRpb25PYnNlcnZlcihkb2N1bWVudCQxLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLCAoKSA9PiBkaXIudmFsdWUgPSBnZXRWYWx1ZSQxKCksIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcblx0cmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZGlyLnZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KHYpIHtcblx0XHRcdHZhciBfZG9jdW1lbnQkcXVlcnlTZWxlY3QyLCBfZG9jdW1lbnQkcXVlcnlTZWxlY3QzO1xuXHRcdFx0ZGlyLnZhbHVlID0gdjtcblx0XHRcdGlmICghZG9jdW1lbnQkMSkgcmV0dXJuO1xuXHRcdFx0aWYgKGRpci52YWx1ZSkgKF9kb2N1bWVudCRxdWVyeVNlbGVjdDIgPSBkb2N1bWVudCQxLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkcXVlcnlTZWxlY3QyID09PSB2b2lkIDAgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0Mi5zZXRBdHRyaWJ1dGUoXCJkaXJcIiwgZGlyLnZhbHVlKTtcblx0XHRcdGVsc2UgKF9kb2N1bWVudCRxdWVyeVNlbGVjdDMgPSBkb2N1bWVudCQxLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkcXVlcnlTZWxlY3QzID09PSB2b2lkIDAgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0My5yZW1vdmVBdHRyaWJ1dGUoXCJkaXJcIik7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGV4dFNlbGVjdGlvbi9pbmRleC50c1xuZnVuY3Rpb24gZ2V0UmFuZ2VzRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pIHtcblx0dmFyIF9zZWxlY3Rpb24kcmFuZ2VDb3VudDtcblx0Y29uc3QgcmFuZ2VDb3VudCA9IChfc2VsZWN0aW9uJHJhbmdlQ291bnQgPSBzZWxlY3Rpb24ucmFuZ2VDb3VudCkgIT09IG51bGwgJiYgX3NlbGVjdGlvbiRyYW5nZUNvdW50ICE9PSB2b2lkIDAgPyBfc2VsZWN0aW9uJHJhbmdlQ291bnQgOiAwO1xuXHRyZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogcmFuZ2VDb3VudCB9LCAoXywgaSkgPT4gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSkpO1xufVxuLyoqXG4qIFJlYWN0aXZlbHkgdHJhY2sgdXNlciB0ZXh0IHNlbGVjdGlvbiBiYXNlZCBvbiBbYFdpbmRvdy5nZXRTZWxlY3Rpb25gXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldFNlbGVjdGlvbikuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRleHRTZWxlY3Rpb25cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUZXh0U2VsZWN0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX3dpbmRvdyRnZXRTZWxlY3Rpb247XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHNlbGVjdGlvbiA9IHNoYWxsb3dSZWYoKF93aW5kb3ckZ2V0U2VsZWN0aW9uID0gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmdldFNlbGVjdGlvbigpKSAhPT0gbnVsbCAmJiBfd2luZG93JGdldFNlbGVjdGlvbiAhPT0gdm9pZCAwID8gX3dpbmRvdyRnZXRTZWxlY3Rpb24gOiBudWxsKTtcblx0Y29uc3QgdGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX3NlbGVjdGlvbiR2YWx1ZSR0b1N0LCBfc2VsZWN0aW9uJHZhbHVlO1xuXHRcdHJldHVybiAoX3NlbGVjdGlvbiR2YWx1ZSR0b1N0ID0gKF9zZWxlY3Rpb24kdmFsdWUgPSBzZWxlY3Rpb24udmFsdWUpID09PSBudWxsIHx8IF9zZWxlY3Rpb24kdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZWxlY3Rpb24kdmFsdWUudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX3NlbGVjdGlvbiR2YWx1ZSR0b1N0ICE9PSB2b2lkIDAgPyBfc2VsZWN0aW9uJHZhbHVlJHRvU3QgOiBcIlwiO1xuXHR9KTtcblx0Y29uc3QgcmFuZ2VzID0gY29tcHV0ZWQoKCkgPT4gc2VsZWN0aW9uLnZhbHVlID8gZ2V0UmFuZ2VzRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24udmFsdWUpIDogW10pO1xuXHRjb25zdCByZWN0cyA9IGNvbXB1dGVkKCgpID0+IHJhbmdlcy52YWx1ZS5tYXAoKHJhbmdlKSA9PiByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpO1xuXHRmdW5jdGlvbiBvblNlbGVjdGlvbkNoYW5nZSgpIHtcblx0XHRzZWxlY3Rpb24udmFsdWUgPSBudWxsO1xuXHRcdGlmICh3aW5kb3ckMSkgc2VsZWN0aW9uLnZhbHVlID0gd2luZG93JDEuZ2V0U2VsZWN0aW9uKCk7XG5cdH1cblx0aWYgKHdpbmRvdyQxKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLmRvY3VtZW50LCBcInNlbGVjdGlvbmNoYW5nZVwiLCBvblNlbGVjdGlvbkNoYW5nZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4ge1xuXHRcdHRleHQsXG5cdFx0cmVjdHMsXG5cdFx0cmFuZ2VzLFxuXHRcdHNlbGVjdGlvblxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUZXh0YXJlYUF1dG9zaXplL2luZGV4LnRzXG4vKipcbiogQ2FsbCB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCksIGlmIG5vdCBhdmFpbGFibGUsIGp1c3QgY2FsbCB0aGUgZnVuY3Rpb25cbipcbiogQHBhcmFtIHdpbmRvd1xuKiBAcGFyYW0gZm5cbiovXG5mdW5jdGlvbiB0cnlSZXF1ZXN0QW5pbWF0aW9uRnJhbWUod2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBmbikge1xuXHRpZiAod2luZG93JDEgJiYgdHlwZW9mIHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gXCJmdW5jdGlvblwiKSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuXHRlbHNlIGZuKCk7XG59XG5mdW5jdGlvbiB1c2VUZXh0YXJlYUF1dG9zaXplKG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkaW5wdXQsIF9vcHRpb25zJHN0eWxlUHJvcDtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgdGV4dGFyZWEgPSB0b1JlZihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZWxlbWVudCk7XG5cdGNvbnN0IGlucHV0ID0gdG9SZWYoKF9vcHRpb25zJGlucHV0ID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmlucHV0KSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRpbnB1dCAhPT0gdm9pZCAwID8gX29wdGlvbnMkaW5wdXQgOiBcIlwiKTtcblx0Y29uc3Qgc3R5bGVQcm9wID0gKF9vcHRpb25zJHN0eWxlUHJvcCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zdHlsZVByb3ApICE9PSBudWxsICYmIF9vcHRpb25zJHN0eWxlUHJvcCAhPT0gdm9pZCAwID8gX29wdGlvbnMkc3R5bGVQcm9wIDogXCJoZWlnaHRcIjtcblx0Y29uc3QgdGV4dGFyZWFTY3JvbGxIZWlnaHQgPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCB0ZXh0YXJlYU9sZFdpZHRoID0gc2hhbGxvd1JlZigwKTtcblx0ZnVuY3Rpb24gdHJpZ2dlclJlc2l6ZSgpIHtcblx0XHR2YXIgX3RleHRhcmVhJHZhbHVlO1xuXHRcdGlmICghdGV4dGFyZWEudmFsdWUpIHJldHVybjtcblx0XHRsZXQgaGVpZ2h0ID0gXCJcIjtcblx0XHR0ZXh0YXJlYS52YWx1ZS5zdHlsZVtzdHlsZVByb3BdID0gXCIxcHhcIjtcblx0XHR0ZXh0YXJlYVNjcm9sbEhlaWdodC52YWx1ZSA9IChfdGV4dGFyZWEkdmFsdWUgPSB0ZXh0YXJlYS52YWx1ZSkgPT09IG51bGwgfHwgX3RleHRhcmVhJHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGV4dGFyZWEkdmFsdWUuc2Nyb2xsSGVpZ2h0O1xuXHRcdGNvbnN0IF9zdHlsZVRhcmdldCA9IHRvVmFsdWUob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnN0eWxlVGFyZ2V0KTtcblx0XHRpZiAoX3N0eWxlVGFyZ2V0KSBfc3R5bGVUYXJnZXQuc3R5bGVbc3R5bGVQcm9wXSA9IGAke3RleHRhcmVhU2Nyb2xsSGVpZ2h0LnZhbHVlfXB4YDtcblx0XHRlbHNlIGhlaWdodCA9IGAke3RleHRhcmVhU2Nyb2xsSGVpZ2h0LnZhbHVlfXB4YDtcblx0XHR0ZXh0YXJlYS52YWx1ZS5zdHlsZVtzdHlsZVByb3BdID0gaGVpZ2h0O1xuXHR9XG5cdHdhdGNoKFtpbnB1dCwgdGV4dGFyZWFdLCAoKSA9PiBuZXh0VGljayh0cmlnZ2VyUmVzaXplKSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHdhdGNoKHRleHRhcmVhU2Nyb2xsSGVpZ2h0LCAoKSA9PiB7XG5cdFx0dmFyIF9vcHRpb25zJG9uUmVzaXplO1xuXHRcdHJldHVybiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkb25SZXNpemUgPSBvcHRpb25zLm9uUmVzaXplKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblJlc2l6ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkb25SZXNpemUuY2FsbChvcHRpb25zKTtcblx0fSk7XG5cdHVzZVJlc2l6ZU9ic2VydmVyKHRleHRhcmVhLCAoW3sgY29udGVudFJlY3QgfV0pID0+IHtcblx0XHRpZiAodGV4dGFyZWFPbGRXaWR0aC52YWx1ZSA9PT0gY29udGVudFJlY3Qud2lkdGgpIHJldHVybjtcblx0XHR0cnlSZXF1ZXN0QW5pbWF0aW9uRnJhbWUod2luZG93JDEsICgpID0+IHtcblx0XHRcdHRleHRhcmVhT2xkV2lkdGgudmFsdWUgPSBjb250ZW50UmVjdC53aWR0aDtcblx0XHRcdHRyaWdnZXJSZXNpemUoKTtcblx0XHR9KTtcblx0fSk7XG5cdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2F0Y2gpIHdhdGNoKG9wdGlvbnMud2F0Y2gsIHRyaWdnZXJSZXNpemUsIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0ZGVlcDogdHJ1ZVxuXHR9KTtcblx0cmV0dXJuIHtcblx0XHR0ZXh0YXJlYSxcblx0XHRpbnB1dCxcblx0XHR0cmlnZ2VyUmVzaXplXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRocm90dGxlZFJlZkhpc3RvcnkvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIFt1c2VSZWZIaXN0b3J5XShodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmVmSGlzdG9yeSkgd2l0aCB0aHJvdHRsZWQgZmlsdGVyLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VUaHJvdHRsZWRSZWZIaXN0b3J5XG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VUaHJvdHRsZWRSZWZIaXN0b3J5KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdGhyb3R0bGUgPSAyMDAsIHRyYWlsaW5nID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZmlsdGVyID0gdGhyb3R0bGVGaWx0ZXIodGhyb3R0bGUsIHRyYWlsaW5nKTtcblx0cmV0dXJuIHsgLi4udXNlUmVmSGlzdG9yeShzb3VyY2UsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGV2ZW50RmlsdGVyOiBmaWx0ZXJcblx0fSkgfTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZUFnby9pbmRleC50c1xuY29uc3QgREVGQVVMVF9VTklUUyA9IFtcblx0e1xuXHRcdG1heDogNmU0LFxuXHRcdHZhbHVlOiAxZTMsXG5cdFx0bmFtZTogXCJzZWNvbmRcIlxuXHR9LFxuXHR7XG5cdFx0bWF4OiAyNzZlNCxcblx0XHR2YWx1ZTogNmU0LFxuXHRcdG5hbWU6IFwibWludXRlXCJcblx0fSxcblx0e1xuXHRcdG1heDogNzJlNixcblx0XHR2YWx1ZTogMzZlNSxcblx0XHRuYW1lOiBcImhvdXJcIlxuXHR9LFxuXHR7XG5cdFx0bWF4OiA1MTg0ZTUsXG5cdFx0dmFsdWU6IDg2NGU1LFxuXHRcdG5hbWU6IFwiZGF5XCJcblx0fSxcblx0e1xuXHRcdG1heDogMjQxOTJlNSxcblx0XHR2YWx1ZTogNjA0OGU1LFxuXHRcdG5hbWU6IFwid2Vla1wiXG5cdH0sXG5cdHtcblx0XHRtYXg6IDI4NTEyZTYsXG5cdFx0dmFsdWU6IDI1OTJlNixcblx0XHRuYW1lOiBcIm1vbnRoXCJcblx0fSxcblx0e1xuXHRcdG1heDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRcdHZhbHVlOiAzMTUzNmU2LFxuXHRcdG5hbWU6IFwieWVhclwiXG5cdH1cbl07XG5jb25zdCBERUZBVUxUX01FU1NBR0VTID0ge1xuXHRqdXN0Tm93OiBcImp1c3Qgbm93XCIsXG5cdHBhc3Q6IChuKSA9PiBuLm1hdGNoKC9cXGQvKSA/IGAke259IGFnb2AgOiBuLFxuXHRmdXR1cmU6IChuKSA9PiBuLm1hdGNoKC9cXGQvKSA/IGBpbiAke259YCA6IG4sXG5cdG1vbnRoOiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcImxhc3QgbW9udGhcIiA6IFwibmV4dCBtb250aFwiIDogYCR7bn0gbW9udGgke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdHllYXI6IChuLCBwYXN0KSA9PiBuID09PSAxID8gcGFzdCA/IFwibGFzdCB5ZWFyXCIgOiBcIm5leHQgeWVhclwiIDogYCR7bn0geWVhciR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcblx0ZGF5OiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcInllc3RlcmRheVwiIDogXCJ0b21vcnJvd1wiIDogYCR7bn0gZGF5JHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHR3ZWVrOiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcImxhc3Qgd2Vla1wiIDogXCJuZXh0IHdlZWtcIiA6IGAke259IHdlZWske24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdGhvdXI6IChuKSA9PiBgJHtufSBob3VyJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHRtaW51dGU6IChuKSA9PiBgJHtufSBtaW51dGUke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdHNlY29uZDogKG4pID0+IGAke259IHNlY29uZCR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcblx0aW52YWxpZDogXCJcIlxufTtcbmZ1bmN0aW9uIERFRkFVTFRfRk9STUFUVEVSKGRhdGUpIHtcblx0cmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDQob3B0aW9ucykge1xuXHRpZiAoXCJ1cGRhdGVJbnRlcnZhbFwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IHVwZGF0ZUludGVydmFsID0gM2U0IH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIHVwZGF0ZUludGVydmFsKTtcblx0fVxuXHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCAzZTQpO1xufVxuLyoqXG4qIFJlYWN0aXZlIHRpbWUgYWdvIGZvcm1hdHRlci5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVGltZUFnb1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVRpbWVBZ28odGltZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkNChvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBub3csLi4uY29udHJvbHMgfSA9IHVzZU5vdyh7XG5cdFx0c2NoZWR1bGVyLFxuXHRcdGNvbnRyb2xzOiB0cnVlXG5cdH0pO1xuXHRjb25zdCB0aW1lQWdvID0gY29tcHV0ZWQoKCkgPT4gZm9ybWF0VGltZUFnbyhuZXcgRGF0ZSh0b1ZhbHVlKHRpbWUpKSwgb3B0aW9ucywgdG9WYWx1ZShub3cpKSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHR0aW1lQWdvLFxuXHRcdC4uLmNvbnRyb2xzXG5cdH07XG5cdGVsc2UgcmV0dXJuIHRpbWVBZ287XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lQWdvKGZyb20sIG9wdGlvbnMgPSB7fSwgbm93ID0gRGF0ZS5ub3coKSkge1xuXHRjb25zdCB7IG1heCwgbWVzc2FnZXMgPSBERUZBVUxUX01FU1NBR0VTLCBmdWxsRGF0ZUZvcm1hdHRlciA9IERFRkFVTFRfRk9STUFUVEVSLCB1bml0cyA9IERFRkFVTFRfVU5JVFMsIHNob3dTZWNvbmQgPSBmYWxzZSwgcm91bmRpbmcgPSBcInJvdW5kXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJvdW5kRm4gPSB0eXBlb2Ygcm91bmRpbmcgPT09IFwibnVtYmVyXCIgPyAobikgPT4gK24udG9GaXhlZChyb3VuZGluZykgOiBNYXRoW3JvdW5kaW5nXTtcblx0Y29uc3QgZGlmZiA9ICtub3cgLSArZnJvbTtcblx0Y29uc3QgYWJzRGlmZiA9IE1hdGguYWJzKGRpZmYpO1xuXHRmdW5jdGlvbiBnZXRWYWx1ZSQxKGRpZmYkMSwgdW5pdCkge1xuXHRcdHJldHVybiByb3VuZEZuKE1hdGguYWJzKGRpZmYkMSkgLyB1bml0LnZhbHVlKTtcblx0fVxuXHRmdW5jdGlvbiBmb3JtYXQoZGlmZiQxLCB1bml0KSB7XG5cdFx0Y29uc3QgdmFsID0gZ2V0VmFsdWUkMShkaWZmJDEsIHVuaXQpO1xuXHRcdGNvbnN0IHBhc3QgPSBkaWZmJDEgPiAwO1xuXHRcdGNvbnN0IHN0ciA9IGFwcGx5Rm9ybWF0KHVuaXQubmFtZSwgdmFsLCBwYXN0KTtcblx0XHRyZXR1cm4gYXBwbHlGb3JtYXQocGFzdCA/IFwicGFzdFwiIDogXCJmdXR1cmVcIiwgc3RyLCBwYXN0KTtcblx0fVxuXHRmdW5jdGlvbiBhcHBseUZvcm1hdChuYW1lLCB2YWwsIGlzUGFzdCkge1xuXHRcdGNvbnN0IGZvcm1hdHRlciA9IG1lc3NhZ2VzW25hbWVdO1xuXHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmb3JtYXR0ZXIodmFsLCBpc1Bhc3QpO1xuXHRcdHJldHVybiBmb3JtYXR0ZXIucmVwbGFjZShcInswfVwiLCB2YWwudG9TdHJpbmcoKSk7XG5cdH1cblx0aWYgKGFic0RpZmYgPCA2ZTQgJiYgIXNob3dTZWNvbmQpIHJldHVybiBtZXNzYWdlcy5qdXN0Tm93O1xuXHRpZiAodHlwZW9mIG1heCA9PT0gXCJudW1iZXJcIiAmJiBhYnNEaWZmID4gbWF4KSByZXR1cm4gZnVsbERhdGVGb3JtYXR0ZXIobmV3IERhdGUoZnJvbSkpO1xuXHRpZiAodHlwZW9mIG1heCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHZhciBfdW5pdHMkZmluZDtcblx0XHRjb25zdCB1bml0TWF4ID0gKF91bml0cyRmaW5kID0gdW5pdHMuZmluZCgoaSkgPT4gaS5uYW1lID09PSBtYXgpKSA9PT0gbnVsbCB8fCBfdW5pdHMkZmluZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3VuaXRzJGZpbmQubWF4O1xuXHRcdGlmICh1bml0TWF4ICYmIGFic0RpZmYgPiB1bml0TWF4KSByZXR1cm4gZnVsbERhdGVGb3JtYXR0ZXIobmV3IERhdGUoZnJvbSkpO1xuXHR9XG5cdGZvciAoY29uc3QgW2lkeCwgdW5pdF0gb2YgdW5pdHMuZW50cmllcygpKSB7XG5cdFx0aWYgKGdldFZhbHVlJDEoZGlmZiwgdW5pdCkgPD0gMCAmJiB1bml0c1tpZHggLSAxXSkgcmV0dXJuIGZvcm1hdChkaWZmLCB1bml0c1tpZHggLSAxXSk7XG5cdFx0aWYgKGFic0RpZmYgPCB1bml0Lm1heCkgcmV0dXJuIGZvcm1hdChkaWZmLCB1bml0KTtcblx0fVxuXHRyZXR1cm4gbWVzc2FnZXMuaW52YWxpZDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZUFnb0ludGwvaW5kZXgudHNcbmNvbnN0IFVOSVRTID0gW1xuXHR7XG5cdFx0bmFtZTogXCJ5ZWFyXCIsXG5cdFx0bXM6IDMxNTM2ZTZcblx0fSxcblx0e1xuXHRcdG5hbWU6IFwibW9udGhcIixcblx0XHRtczogMjU5MmU2XG5cdH0sXG5cdHtcblx0XHRuYW1lOiBcIndlZWtcIixcblx0XHRtczogNjA0OGU1XG5cdH0sXG5cdHtcblx0XHRuYW1lOiBcImRheVwiLFxuXHRcdG1zOiA4NjRlNVxuXHR9LFxuXHR7XG5cdFx0bmFtZTogXCJob3VyXCIsXG5cdFx0bXM6IDM2ZTVcblx0fSxcblx0e1xuXHRcdG5hbWU6IFwibWludXRlXCIsXG5cdFx0bXM6IDZlNFxuXHR9LFxuXHR7XG5cdFx0bmFtZTogXCJzZWNvbmRcIixcblx0XHRtczogMWUzXG5cdH1cbl07XG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDMob3B0aW9ucykge1xuXHRpZiAoXCJ1cGRhdGVJbnRlcnZhbFwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IHVwZGF0ZUludGVydmFsID0gM2U0IH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIHVwZGF0ZUludGVydmFsKTtcblx0fVxuXHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCAzZTQpO1xufVxuZnVuY3Rpb24gdXNlVGltZUFnb0ludGwodGltZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkMyhvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBub3csLi4uY29udHJvbHMgfSA9IHVzZU5vdyh7XG5cdFx0c2NoZWR1bGVyLFxuXHRcdGNvbnRyb2xzOiB0cnVlXG5cdH0pO1xuXHRjb25zdCByZXN1bHQgPSBjb21wdXRlZCgoKSA9PiBnZXRUaW1lQWdvSW50bFJlc3VsdChuZXcgRGF0ZSh0b1ZhbHVlKHRpbWUpKSwgb3B0aW9ucywgdG9WYWx1ZShub3cpKSk7XG5cdGNvbnN0IHBhcnRzID0gY29tcHV0ZWQoKCkgPT4gcmVzdWx0LnZhbHVlLnBhcnRzKTtcblx0Y29uc3QgdGltZUFnb0ludGwgPSBjb21wdXRlZCgoKSA9PiBmb3JtYXRUaW1lQWdvSW50bFBhcnRzKHBhcnRzLnZhbHVlLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRsb2NhbGU6IHJlc3VsdC52YWx1ZS5yZXNvbHZlZExvY2FsZVxuXHR9KSk7XG5cdHJldHVybiBleHBvc2VDb250cm9scyA/IHtcblx0XHR0aW1lQWdvSW50bCxcblx0XHRwYXJ0cyxcblx0XHQuLi5jb250cm9sc1xuXHR9IDogdGltZUFnb0ludGw7XG59XG4vKipcbiogTm9uLXJlYWN0aXZlIHZlcnNpb24gb2YgdXNlVGltZUFnb0ludGxcbiovXG5mdW5jdGlvbiBmb3JtYXRUaW1lQWdvSW50bChmcm9tLCBvcHRpb25zID0ge30sIG5vdyA9IERhdGUubm93KCkpIHtcblx0Y29uc3QgeyBwYXJ0cywgcmVzb2x2ZWRMb2NhbGUgfSA9IGdldFRpbWVBZ29JbnRsUmVzdWx0KGZyb20sIG9wdGlvbnMsIG5vdyk7XG5cdHJldHVybiBmb3JtYXRUaW1lQWdvSW50bFBhcnRzKHBhcnRzLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRsb2NhbGU6IHJlc29sdmVkTG9jYWxlXG5cdH0pO1xufVxuLyoqXG4qIEdldCBwYXJ0cyBmcm9tIGBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzYC5cbiovXG5mdW5jdGlvbiBnZXRUaW1lQWdvSW50bFJlc3VsdChmcm9tLCBvcHRpb25zID0ge30sIG5vdyA9IERhdGUubm93KCkpIHtcblx0dmFyIF9vcHRpb25zJHVuaXRzO1xuXHRjb25zdCB7IGxvY2FsZSwgcmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgbnVtZXJpYzogXCJhdXRvXCIgfSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcnRmID0gbmV3IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0KGxvY2FsZSwgcmVsYXRpdmVUaW1lRm9ybWF0T3B0aW9ucyk7XG5cdGNvbnN0IHsgbG9jYWxlOiByZXNvbHZlZExvY2FsZSB9ID0gcnRmLnJlc29sdmVkT3B0aW9ucygpO1xuXHRjb25zdCBkaWZmID0gK2Zyb20gLSArbm93O1xuXHRjb25zdCBhYnNEaWZmID0gTWF0aC5hYnMoZGlmZik7XG5cdGNvbnN0IHVuaXRzID0gKF9vcHRpb25zJHVuaXRzID0gb3B0aW9ucy51bml0cykgIT09IG51bGwgJiYgX29wdGlvbnMkdW5pdHMgIT09IHZvaWQgMCA/IF9vcHRpb25zJHVuaXRzIDogVU5JVFM7XG5cdGZvciAoY29uc3QgeyBuYW1lLCBtcyB9IG9mIHVuaXRzKSBpZiAoYWJzRGlmZiA+PSBtcykgcmV0dXJuIHtcblx0XHRyZXNvbHZlZExvY2FsZSxcblx0XHRwYXJ0czogcnRmLmZvcm1hdFRvUGFydHMoTWF0aC5yb3VuZChkaWZmIC8gbXMpLCBuYW1lKVxuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHJlc29sdmVkTG9jYWxlLFxuXHRcdHBhcnRzOiBydGYuZm9ybWF0VG9QYXJ0cygwLCB1bml0c1t1bml0cy5sZW5ndGggLSAxXS5uYW1lKVxuXHR9O1xufVxuLyoqXG4qIEZvcm1hdCBwYXJ0cyBpbnRvIGEgc3RyaW5nXG4qL1xuZnVuY3Rpb24gZm9ybWF0VGltZUFnb0ludGxQYXJ0cyhwYXJ0cywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5zZXJ0U3BhY2UgPSB0cnVlLCBqb2luUGFydHMsIGxvY2FsZSB9ID0gb3B0aW9ucztcblx0aWYgKHR5cGVvZiBqb2luUGFydHMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGpvaW5QYXJ0cyhwYXJ0cywgbG9jYWxlKTtcblx0aWYgKCFpbnNlcnRTcGFjZSkgcmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZSkuam9pbihcIlwiKTtcblx0cmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZS50cmltKCkpLmpvaW4oXCIgXCIpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUaW1lb3V0UG9sbC9pbmRleC50c1xuZnVuY3Rpb24gdXNlVGltZW91dFBvbGwoZm4sIGludGVydmFsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBpbW1lZGlhdGVDYWxsYmFjayA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB7IHN0YXJ0IH0gPSB1c2VUaW1lb3V0Rm4obG9vcCwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlIH0pO1xuXHRjb25zdCBpc0FjdGl2ZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRhc3luYyBmdW5jdGlvbiBsb29wKCkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUpIHJldHVybjtcblx0XHRhd2FpdCBmbigpO1xuXHRcdHN0YXJ0KCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzdW1lKCkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUpIHtcblx0XHRcdGlzQWN0aXZlLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpbW1lZGlhdGVDYWxsYmFjaykgZm4oKTtcblx0XHRcdHN0YXJ0KCk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHBhdXNlKCkge1xuXHRcdGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG5cdH1cblx0aWYgKGltbWVkaWF0ZSAmJiBpc0NsaWVudCkgcmVzdW1lKCk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHBhdXNlKTtcblx0cmV0dXJuIHtcblx0XHRpc0FjdGl2ZSxcblx0XHRwYXVzZSxcblx0XHRyZXN1bWVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZXN0YW1wL2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDIob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMgfHwgXCJpbW1lZGlhdGVcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIsIGltbWVkaWF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIGludGVydmFsID09PSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiID8gKGNiKSA9PiB1c2VSYWZGbihjYiwgeyBpbW1lZGlhdGUgfSkgOiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIGludGVydmFsLCB7IGltbWVkaWF0ZSB9KTtcblx0fVxuXHRyZXR1cm4gdXNlUmFmRm47XG59XG5mdW5jdGlvbiB1c2VUaW1lc3RhbXAob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIG9mZnNldCA9IDAsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkMihvcHRpb25zKSwgY2FsbGJhY2sgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHRzID0gc2hhbGxvd1JlZih0aW1lc3RhbXAoKSArIG9mZnNldCk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHRzLnZhbHVlID0gdGltZXN0YW1wKCkgKyBvZmZzZXQ7XG5cdGNvbnN0IGNvbnRyb2xzID0gc2NoZWR1bGVyKGNhbGxiYWNrID8gKCkgPT4ge1xuXHRcdHVwZGF0ZSgpO1xuXHRcdGNhbGxiYWNrKHRzLnZhbHVlKTtcblx0fSA6IHVwZGF0ZSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHR0aW1lc3RhbXA6IHRzLFxuXHRcdC4uLmNvbnRyb2xzXG5cdH07XG5cdGVsc2UgcmV0dXJuIHRzO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUaXRsZS9pbmRleC50c1xuZnVuY3Rpb24gdXNlVGl0bGUobmV3VGl0bGUgPSBudWxsLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF9kb2N1bWVudCR0aXRsZSwgX3JlZjtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgcmVzdG9yZU9uVW5tb3VudCA9ICh0KSA9PiB0IH0gPSBvcHRpb25zO1xuXHRjb25zdCBvcmlnaW5hbFRpdGxlID0gKF9kb2N1bWVudCR0aXRsZSA9IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS50aXRsZSkgIT09IG51bGwgJiYgX2RvY3VtZW50JHRpdGxlICE9PSB2b2lkIDAgPyBfZG9jdW1lbnQkdGl0bGUgOiBcIlwiO1xuXHRjb25zdCB0aXRsZSA9IHRvUmVmKChfcmVmID0gbmV3VGl0bGUgIT09IG51bGwgJiYgbmV3VGl0bGUgIT09IHZvaWQgMCA/IG5ld1RpdGxlIDogZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLnRpdGxlKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogbnVsbCk7XG5cdGNvbnN0IGlzUmVhZG9ubHkkMSA9ICEhKG5ld1RpdGxlICYmIHR5cGVvZiBuZXdUaXRsZSA9PT0gXCJmdW5jdGlvblwiKTtcblx0ZnVuY3Rpb24gZm9ybWF0KHQpIHtcblx0XHRpZiAoIShcInRpdGxlVGVtcGxhdGVcIiBpbiBvcHRpb25zKSkgcmV0dXJuIHQ7XG5cdFx0Y29uc3QgdGVtcGxhdGUgPSBvcHRpb25zLnRpdGxlVGVtcGxhdGUgfHwgXCIlc1wiO1xuXHRcdHJldHVybiB0eXBlb2YgdGVtcGxhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHRlbXBsYXRlKHQpIDogdG9WYWx1ZSh0ZW1wbGF0ZSkucmVwbGFjZSgvJXMvZywgdCk7XG5cdH1cblx0d2F0Y2godGl0bGUsIChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IHtcblx0XHRpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlICYmIGRvY3VtZW50JDEpIGRvY3VtZW50JDEudGl0bGUgPSBmb3JtYXQobmV3VmFsdWUgIT09IG51bGwgJiYgbmV3VmFsdWUgIT09IHZvaWQgMCA/IG5ld1ZhbHVlIDogXCJcIik7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHRpZiAob3B0aW9ucy5vYnNlcnZlICYmICFvcHRpb25zLnRpdGxlVGVtcGxhdGUgJiYgZG9jdW1lbnQkMSAmJiAhaXNSZWFkb25seSQxKSB7XG5cdFx0dmFyIF9kb2N1bWVudCRoZWFkO1xuXHRcdHVzZU11dGF0aW9uT2JzZXJ2ZXIoKF9kb2N1bWVudCRoZWFkID0gZG9jdW1lbnQkMS5oZWFkKSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQkaGVhZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50JGhlYWQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpLCAoKSA9PiB7XG5cdFx0XHRpZiAoZG9jdW1lbnQkMSAmJiBkb2N1bWVudCQxLnRpdGxlICE9PSB0aXRsZS52YWx1ZSkgdGl0bGUudmFsdWUgPSBmb3JtYXQoZG9jdW1lbnQkMS50aXRsZSk7XG5cdFx0fSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdGlmIChyZXN0b3JlT25Vbm1vdW50KSB7XG5cdFx0XHRjb25zdCByZXN0b3JlZFRpdGxlID0gcmVzdG9yZU9uVW5tb3VudChvcmlnaW5hbFRpdGxlLCB0aXRsZS52YWx1ZSB8fCBcIlwiKTtcblx0XHRcdGlmIChyZXN0b3JlZFRpdGxlICE9IG51bGwgJiYgZG9jdW1lbnQkMSkgZG9jdW1lbnQkMS50aXRsZSA9IHJlc3RvcmVkVGl0bGU7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHRpdGxlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUcmFuc2l0aW9uL2luZGV4LnRzXG5jb25zdCBfVHJhbnNpdGlvblByZXNldHMgPSB7XG5cdGVhc2VJblNpbmU6IFtcblx0XHQuMTIsXG5cdFx0MCxcblx0XHQuMzksXG5cdFx0MFxuXHRdLFxuXHRlYXNlT3V0U2luZTogW1xuXHRcdC42MSxcblx0XHQxLFxuXHRcdC44OCxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dFNpbmU6IFtcblx0XHQuMzcsXG5cdFx0MCxcblx0XHQuNjMsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5RdWFkOiBbXG5cdFx0LjExLFxuXHRcdDAsXG5cdFx0LjUsXG5cdFx0MFxuXHRdLFxuXHRlYXNlT3V0UXVhZDogW1xuXHRcdC41LFxuXHRcdDEsXG5cdFx0Ljg5LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0UXVhZDogW1xuXHRcdC40NSxcblx0XHQwLFxuXHRcdC41NSxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbkN1YmljOiBbXG5cdFx0LjMyLFxuXHRcdDAsXG5cdFx0LjY3LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dEN1YmljOiBbXG5cdFx0LjMzLFxuXHRcdDEsXG5cdFx0LjY4LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0Q3ViaWM6IFtcblx0XHQuNjUsXG5cdFx0MCxcblx0XHQuMzUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5RdWFydDogW1xuXHRcdC41LFxuXHRcdDAsXG5cdFx0Ljc1LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dFF1YXJ0OiBbXG5cdFx0LjI1LFxuXHRcdDEsXG5cdFx0LjUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5PdXRRdWFydDogW1xuXHRcdC43Nixcblx0XHQwLFxuXHRcdC4yNCxcblx0XHQxXG5cdF0sXG5cdGVhc2VJblF1aW50OiBbXG5cdFx0LjY0LFxuXHRcdDAsXG5cdFx0Ljc4LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dFF1aW50OiBbXG5cdFx0LjIyLFxuXHRcdDEsXG5cdFx0LjM2LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0UXVpbnQ6IFtcblx0XHQuODMsXG5cdFx0MCxcblx0XHQuMTcsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5FeHBvOiBbXG5cdFx0LjcsXG5cdFx0MCxcblx0XHQuODQsXG5cdFx0MFxuXHRdLFxuXHRlYXNlT3V0RXhwbzogW1xuXHRcdC4xNixcblx0XHQxLFxuXHRcdC4zLFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0RXhwbzogW1xuXHRcdC44Nyxcblx0XHQwLFxuXHRcdC4xMyxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbkNpcmM6IFtcblx0XHQuNTUsXG5cdFx0MCxcblx0XHQxLFxuXHRcdC40NVxuXHRdLFxuXHRlYXNlT3V0Q2lyYzogW1xuXHRcdDAsXG5cdFx0LjU1LFxuXHRcdC40NSxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dENpcmM6IFtcblx0XHQuODUsXG5cdFx0MCxcblx0XHQuMTUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5CYWNrOiBbXG5cdFx0LjM2LFxuXHRcdDAsXG5cdFx0LjY2LFxuXHRcdC0uNTZcblx0XSxcblx0ZWFzZU91dEJhY2s6IFtcblx0XHQuMzQsXG5cdFx0MS41Nixcblx0XHQuNjQsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5PdXRCYWNrOiBbXG5cdFx0LjY4LFxuXHRcdC0uNixcblx0XHQuMzIsXG5cdFx0MS42XG5cdF1cbn07XG4vKipcbiogQ29tbW9uIHRyYW5zaXRpb25zXG4qXG4qIEBzZWUgaHR0cHM6Ly9lYXNpbmdzLm5ldFxuKi9cbmNvbnN0IFRyYW5zaXRpb25QcmVzZXRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5hc3NpZ24oe30sIHsgbGluZWFyOiBpZGVudGl0eSB9LCBfVHJhbnNpdGlvblByZXNldHMpO1xuLyoqXG4qIENyZWF0ZSBhbiBlYXNpbmcgZnVuY3Rpb24gZnJvbSBjdWJpYyBiZXppZXIgcG9pbnRzLlxuKi9cbmZ1bmN0aW9uIGNyZWF0ZUVhc2luZ0Z1bmN0aW9uKFtwMCwgcDEsIHAyLCBwM10pIHtcblx0Y29uc3QgYSA9IChhMSwgYTIpID0+IDEgLSAzICogYTIgKyAzICogYTE7XG5cdGNvbnN0IGIgPSAoYTEsIGEyKSA9PiAzICogYTIgLSA2ICogYTE7XG5cdGNvbnN0IGMgPSAoYTEpID0+IDMgKiBhMTtcblx0Y29uc3QgY2FsY0JlemllciA9ICh0LCBhMSwgYTIpID0+ICgoYShhMSwgYTIpICogdCArIGIoYTEsIGEyKSkgKiB0ICsgYyhhMSkpICogdDtcblx0Y29uc3QgZ2V0U2xvcGUgPSAodCwgYTEsIGEyKSA9PiAzICogYShhMSwgYTIpICogdCAqIHQgKyAyICogYihhMSwgYTIpICogdCArIGMoYTEpO1xuXHRjb25zdCBnZXRUZm9yWCA9ICh4KSA9PiB7XG5cdFx0bGV0IGFHdWVzc1QgPSB4O1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgNDsgKytpKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50U2xvcGUgPSBnZXRTbG9wZShhR3Vlc3NULCBwMCwgcDIpO1xuXHRcdFx0aWYgKGN1cnJlbnRTbG9wZSA9PT0gMCkgcmV0dXJuIGFHdWVzc1Q7XG5cdFx0XHRjb25zdCBjdXJyZW50WCA9IGNhbGNCZXppZXIoYUd1ZXNzVCwgcDAsIHAyKSAtIHg7XG5cdFx0XHRhR3Vlc3NUIC09IGN1cnJlbnRYIC8gY3VycmVudFNsb3BlO1xuXHRcdH1cblx0XHRyZXR1cm4gYUd1ZXNzVDtcblx0fTtcblx0cmV0dXJuICh4KSA9PiBwMCA9PT0gcDEgJiYgcDIgPT09IHAzID8geCA6IGNhbGNCZXppZXIoZ2V0VGZvclgoeCksIHAxLCBwMyk7XG59XG5mdW5jdGlvbiBsZXJwKGEsIGIsIGFscGhhKSB7XG5cdHJldHVybiBhICsgYWxwaGEgKiAoYiAtIGEpO1xufVxuZnVuY3Rpb24gZGVmYXVsdEludGVycG9sYXRpb24oYSwgYiwgdCkge1xuXHRjb25zdCBhVmFsID0gdG9WYWx1ZShhKTtcblx0Y29uc3QgYlZhbCA9IHRvVmFsdWUoYik7XG5cdGlmICh0eXBlb2YgYVZhbCA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGxlcnAoYVZhbCwgYlZhbCwgdCk7XG5cdGlmIChBcnJheS5pc0FycmF5KGFWYWwpICYmIEFycmF5LmlzQXJyYXkoYlZhbCkpIHJldHVybiBhVmFsLm1hcCgodiwgaSkgPT4gbGVycCh2LCB0b1ZhbHVlKGJWYWxbaV0pLCB0KSk7XG5cdHRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIHRyYW5zaXRpb24gdHlwZSwgc3BlY2lmeSBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLlwiKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVhc2luZyhlYXNpbmcpIHtcblx0dmFyIF90b1ZhbHVlO1xuXHRyZXR1cm4gdHlwZW9mIGVhc2luZyA9PT0gXCJmdW5jdGlvblwiID8gZWFzaW5nIDogKF90b1ZhbHVlID0gdG9WYWx1ZShlYXNpbmcpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZSAhPT0gdm9pZCAwID8gX3RvVmFsdWUgOiBpZGVudGl0eTtcbn1cbi8qKlxuKiBUcmFuc2l0aW9uIGZyb20gb25lIHZhbHVlIHRvIGFub3RoZXIuXG4qXG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIGZyb21cbiogQHBhcmFtIHRvXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdHJhbnNpdGlvbihzb3VyY2UsIGZyb20sIHRvLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF90b1ZhbHVlMjtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgZnJvbVZhbCA9IHRvVmFsdWUoZnJvbSk7XG5cdGNvbnN0IHRvVmFsID0gdG9WYWx1ZSh0byk7XG5cdGNvbnN0IGR1cmF0aW9uID0gKF90b1ZhbHVlMiA9IHRvVmFsdWUob3B0aW9ucy5kdXJhdGlvbikpICE9PSBudWxsICYmIF90b1ZhbHVlMiAhPT0gdm9pZCAwID8gX3RvVmFsdWUyIDogMWUzO1xuXHRjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXHRjb25zdCBlbmRBdCA9IERhdGUubm93KCkgKyBkdXJhdGlvbjtcblx0Y29uc3QgaW50ZXJwb2xhdGlvbiA9IHR5cGVvZiBvcHRpb25zLmludGVycG9sYXRpb24gPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaW50ZXJwb2xhdGlvbiA6IGRlZmF1bHRJbnRlcnBvbGF0aW9uO1xuXHRjb25zdCB0cmFucyA9IHR5cGVvZiBvcHRpb25zLmVhc2luZyAhPT0gXCJ1bmRlZmluZWRcIiA/IG5vcm1hbGl6ZUVhc2luZyhvcHRpb25zLmVhc2luZykgOiBub3JtYWxpemVFYXNpbmcob3B0aW9ucy50cmFuc2l0aW9uKTtcblx0Y29uc3QgZWFzZSA9IHR5cGVvZiB0cmFucyA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnMgOiBjcmVhdGVFYXNpbmdGdW5jdGlvbih0cmFucyk7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdHNvdXJjZS52YWx1ZSA9IGZyb21WYWw7XG5cdFx0Y29uc3QgdGljayA9ICgpID0+IHtcblx0XHRcdHZhciBfb3B0aW9ucyRhYm9ydDtcblx0XHRcdGlmICgoX29wdGlvbnMkYWJvcnQgPSBvcHRpb25zLmFib3J0KSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRhYm9ydCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkYWJvcnQuY2FsbChvcHRpb25zKSkge1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cdFx0XHRzb3VyY2UudmFsdWUgPSBpbnRlcnBvbGF0aW9uKGZyb21WYWwsIHRvVmFsLCBlYXNlKChub3cgLSBzdGFydGVkQXQpIC8gZHVyYXRpb24pKTtcblx0XHRcdGlmIChub3cgPCBlbmRBdCkgd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCB8fCB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0c291cmNlLnZhbHVlID0gdG9WYWw7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRpY2soKTtcblx0fSk7XG59XG4vKipcbiogVHJhbnNpdGlvbiBmcm9tIG9uZSB2YWx1ZSB0byBhbm90aGVyLlxuKiBAZGVwcmVjYXRlZCBUaGUgYGV4ZWN1dGVUcmFuc2l0aW9uYCBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgYHRyYW5zaXRpb25gIGluc3RlYWQuXG4qXG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIGZyb21cbiogQHBhcmFtIHRvXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gZXhlY3V0ZVRyYW5zaXRpb24oc291cmNlLCBmcm9tLCB0bywgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiB0cmFuc2l0aW9uKHNvdXJjZSwgZnJvbSwgdG8sIG9wdGlvbnMpO1xufVxuLyoqXG4qIEZvbGxvdyB2YWx1ZSB3aXRoIGEgdHJhbnNpdGlvbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVHJhbnNpdGlvblxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVHJhbnNpdGlvbihzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgY3VycmVudElkID0gMDtcblx0Y29uc3Qgc291cmNlVmFsID0gKCkgPT4ge1xuXHRcdGNvbnN0IHYgPSB0b1ZhbHVlKHNvdXJjZSk7XG5cdFx0cmV0dXJuIHR5cGVvZiBvcHRpb25zLmludGVycG9sYXRpb24gPT09IFwidW5kZWZpbmVkXCIgJiYgQXJyYXkuaXNBcnJheSh2KSA/IHYubWFwKHRvVmFsdWUpIDogdjtcblx0fTtcblx0Y29uc3Qgb3V0cHV0UmVmID0gc2hhbGxvd1JlZihzb3VyY2VWYWwoKSk7XG5cdHdhdGNoKHNvdXJjZVZhbCwgYXN5bmMgKHRvKSA9PiB7XG5cdFx0dmFyIF9vcHRpb25zJG9uU3RhcnRlZCwgX29wdGlvbnMkb25GaW5pc2hlZDtcblx0XHRpZiAodG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSkgcmV0dXJuO1xuXHRcdGNvbnN0IGlkID0gKytjdXJyZW50SWQ7XG5cdFx0aWYgKG9wdGlvbnMuZGVsYXkpIGF3YWl0IHByb21pc2VUaW1lb3V0KHRvVmFsdWUob3B0aW9ucy5kZWxheSkpO1xuXHRcdGlmIChpZCAhPT0gY3VycmVudElkKSByZXR1cm47XG5cdFx0KF9vcHRpb25zJG9uU3RhcnRlZCA9IG9wdGlvbnMub25TdGFydGVkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblN0YXJ0ZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvblN0YXJ0ZWQuY2FsbChvcHRpb25zKTtcblx0XHRhd2FpdCB0cmFuc2l0aW9uKG91dHB1dFJlZiwgb3V0cHV0UmVmLnZhbHVlLCB0bywge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdGFib3J0OiAoKSA9PiB7XG5cdFx0XHRcdHZhciBfb3B0aW9ucyRhYm9ydDI7XG5cdFx0XHRcdHJldHVybiBpZCAhPT0gY3VycmVudElkIHx8ICgoX29wdGlvbnMkYWJvcnQyID0gb3B0aW9ucy5hYm9ydCkgPT09IG51bGwgfHwgX29wdGlvbnMkYWJvcnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRhYm9ydDIuY2FsbChvcHRpb25zKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0KF9vcHRpb25zJG9uRmluaXNoZWQgPSBvcHRpb25zLm9uRmluaXNoZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uRmluaXNoZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvbkZpbmlzaGVkLmNhbGwob3B0aW9ucyk7XG5cdH0sIHsgZGVlcDogdHJ1ZSB9KTtcblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSwgKGRpc2FibGVkKSA9PiB7XG5cdFx0aWYgKGRpc2FibGVkKSB7XG5cdFx0XHRjdXJyZW50SWQrKztcblx0XHRcdG91dHB1dFJlZi52YWx1ZSA9IHNvdXJjZVZhbCgpO1xuXHRcdH1cblx0fSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRjdXJyZW50SWQrKztcblx0fSk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpID8gc291cmNlVmFsKCkgOiBvdXRwdXRSZWYudmFsdWUpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VVcmxTZWFyY2hQYXJhbXMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBVUkxTZWFyY2hQYXJhbXNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVXJsU2VhcmNoUGFyYW1zXG4qIEBwYXJhbSBtb2RlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVXJsU2VhcmNoUGFyYW1zKG1vZGUgPSBcImhpc3RvcnlcIiwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFZhbHVlID0ge30sIHJlbW92ZU51bGxpc2hWYWx1ZXMgPSB0cnVlLCByZW1vdmVGYWxzeVZhbHVlcyA9IGZhbHNlLCB3cml0ZTogZW5hYmxlV3JpdGUgPSB0cnVlLCB3cml0ZU1vZGUgPSBcInJlcGxhY2VcIiwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHN0cmluZ2lmeSA9IChwYXJhbXMpID0+IHBhcmFtcy50b1N0cmluZygpIH0gPSBvcHRpb25zO1xuXHRpZiAoIXdpbmRvdyQxKSByZXR1cm4gcmVhY3RpdmUoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3Qgc3RhdGUgPSByZWFjdGl2ZSh7fSk7XG5cdGZ1bmN0aW9uIGdldFJhd1BhcmFtcygpIHtcblx0XHRpZiAobW9kZSA9PT0gXCJoaXN0b3J5XCIpIHJldHVybiB3aW5kb3ckMS5sb2NhdGlvbi5zZWFyY2ggfHwgXCJcIjtcblx0XHRlbHNlIGlmIChtb2RlID09PSBcImhhc2hcIikge1xuXHRcdFx0Y29uc3QgaGFzaCA9IHdpbmRvdyQxLmxvY2F0aW9uLmhhc2ggfHwgXCJcIjtcblx0XHRcdGNvbnN0IGluZGV4ID0gaGFzaC5pbmRleE9mKFwiP1wiKTtcblx0XHRcdHJldHVybiBpbmRleCA+IDAgPyBoYXNoLnNsaWNlKGluZGV4KSA6IFwiXCI7XG5cdFx0fSBlbHNlIHJldHVybiAod2luZG93JDEubG9jYXRpb24uaGFzaCB8fCBcIlwiKS5yZXBsYWNlKC9eIy8sIFwiXCIpO1xuXHR9XG5cdGZ1bmN0aW9uIGNvbnN0cnVjdFF1ZXJ5KHBhcmFtcykge1xuXHRcdGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5KHBhcmFtcyk7XG5cdFx0aWYgKG1vZGUgPT09IFwiaGlzdG9yeVwiKSByZXR1cm4gYCR7c3RyaW5naWZpZWQgPyBgPyR7c3RyaW5naWZpZWR9YCA6IFwiXCJ9JHt3aW5kb3ckMS5sb2NhdGlvbi5oYXNoIHx8IFwiXCJ9YDtcblx0XHRpZiAobW9kZSA9PT0gXCJoYXNoLXBhcmFtc1wiKSByZXR1cm4gYCR7d2luZG93JDEubG9jYXRpb24uc2VhcmNoIHx8IFwiXCJ9JHtzdHJpbmdpZmllZCA/IGAjJHtzdHJpbmdpZmllZH1gIDogXCJcIn1gO1xuXHRcdGNvbnN0IGhhc2ggPSB3aW5kb3ckMS5sb2NhdGlvbi5oYXNoIHx8IFwiI1wiO1xuXHRcdGNvbnN0IGluZGV4ID0gaGFzaC5pbmRleE9mKFwiP1wiKTtcblx0XHRpZiAoaW5kZXggPiAwKSByZXR1cm4gYCR7d2luZG93JDEubG9jYXRpb24uc2VhcmNoIHx8IFwiXCJ9JHtoYXNoLnNsaWNlKDAsIGluZGV4KX0ke3N0cmluZ2lmaWVkID8gYD8ke3N0cmluZ2lmaWVkfWAgOiBcIlwifWA7XG5cdFx0cmV0dXJuIGAke3dpbmRvdyQxLmxvY2F0aW9uLnNlYXJjaCB8fCBcIlwifSR7aGFzaH0ke3N0cmluZ2lmaWVkID8gYD8ke3N0cmluZ2lmaWVkfWAgOiBcIlwifWA7XG5cdH1cblx0ZnVuY3Rpb24gcmVhZCgpIHtcblx0XHRyZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyhnZXRSYXdQYXJhbXMoKSk7XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlU3RhdGUocGFyYW1zKSB7XG5cdFx0Y29uc3QgdW51c2VkS2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoc3RhdGUpKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBwYXJhbXMua2V5cygpKSB7XG5cdFx0XHRjb25zdCBwYXJhbXNGb3JLZXkgPSBwYXJhbXMuZ2V0QWxsKGtleSk7XG5cdFx0XHRzdGF0ZVtrZXldID0gcGFyYW1zRm9yS2V5Lmxlbmd0aCA+IDEgPyBwYXJhbXNGb3JLZXkgOiBwYXJhbXMuZ2V0KGtleSkgfHwgXCJcIjtcblx0XHRcdHVudXNlZEtleXMuZGVsZXRlKGtleSk7XG5cdFx0fVxuXHRcdEFycmF5LmZyb20odW51c2VkS2V5cykuZm9yRWFjaCgoa2V5KSA9PiBkZWxldGUgc3RhdGVba2V5XSk7XG5cdH1cblx0Y29uc3QgeyBwYXVzZSwgcmVzdW1lIH0gPSB3YXRjaFBhdXNhYmxlKHN0YXRlLCAoKSA9PiB7XG5cdFx0Y29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhcIlwiKTtcblx0XHRPYmplY3Qua2V5cyhzdGF0ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG5cdFx0XHRjb25zdCBtYXBFbnRyeSA9IHN0YXRlW2tleV07XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShtYXBFbnRyeSkpIG1hcEVudHJ5LmZvckVhY2goKHZhbHVlKSA9PiBwYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpKTtcblx0XHRcdGVsc2UgaWYgKHJlbW92ZU51bGxpc2hWYWx1ZXMgJiYgbWFwRW50cnkgPT0gbnVsbCkgcGFyYW1zLmRlbGV0ZShrZXkpO1xuXHRcdFx0ZWxzZSBpZiAocmVtb3ZlRmFsc3lWYWx1ZXMgJiYgIW1hcEVudHJ5KSBwYXJhbXMuZGVsZXRlKGtleSk7XG5cdFx0XHRlbHNlIHBhcmFtcy5zZXQoa2V5LCBtYXBFbnRyeSk7XG5cdFx0fSk7XG5cdFx0d3JpdGUocGFyYW1zLCBmYWxzZSk7XG5cdH0sIHsgZGVlcDogdHJ1ZSB9KTtcblx0ZnVuY3Rpb24gd3JpdGUocGFyYW1zLCBzaG91bGRVcGRhdGUsIHNob3VsZFdyaXRlSGlzdG9yeSA9IHRydWUpIHtcblx0XHRwYXVzZSgpO1xuXHRcdGlmIChzaG91bGRVcGRhdGUpIHVwZGF0ZVN0YXRlKHBhcmFtcyk7XG5cdFx0aWYgKHdyaXRlTW9kZSA9PT0gXCJyZXBsYWNlXCIpIHdpbmRvdyQxLmhpc3RvcnkucmVwbGFjZVN0YXRlKHdpbmRvdyQxLmhpc3Rvcnkuc3RhdGUsIHdpbmRvdyQxLmRvY3VtZW50LnRpdGxlLCB3aW5kb3ckMS5sb2NhdGlvbi5wYXRobmFtZSArIGNvbnN0cnVjdFF1ZXJ5KHBhcmFtcykpO1xuXHRcdGVsc2UgaWYgKHNob3VsZFdyaXRlSGlzdG9yeSkgd2luZG93JDEuaGlzdG9yeS5wdXNoU3RhdGUod2luZG93JDEuaGlzdG9yeS5zdGF0ZSwgd2luZG93JDEuZG9jdW1lbnQudGl0bGUsIHdpbmRvdyQxLmxvY2F0aW9uLnBhdGhuYW1lICsgY29uc3RydWN0UXVlcnkocGFyYW1zKSk7XG5cdFx0bmV4dFRpY2soKCkgPT4gcmVzdW1lKCkpO1xuXHR9XG5cdGZ1bmN0aW9uIG9uQ2hhbmdlZCgpIHtcblx0XHRpZiAoIWVuYWJsZVdyaXRlKSByZXR1cm47XG5cdFx0d3JpdGUocmVhZCgpLCB0cnVlLCBmYWxzZSk7XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwicG9wc3RhdGVcIiwgb25DaGFuZ2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRpZiAobW9kZSAhPT0gXCJoaXN0b3J5XCIpIHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiaGFzaGNoYW5nZVwiLCBvbkNoYW5nZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGNvbnN0IGluaXRpYWwgPSByZWFkKCk7XG5cdGlmIChpbml0aWFsLmtleXMoKS5uZXh0KCkudmFsdWUpIHVwZGF0ZVN0YXRlKGluaXRpYWwpO1xuXHRlbHNlIE9iamVjdC5hc3NpZ24oc3RhdGUsIGluaXRpYWxWYWx1ZSk7XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVXNlck1lZGlhL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYG1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWFgIHN0cmVhbWluZ1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VVc2VyTWVkaWFcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VVc2VyTWVkaWEob3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRlbmFibGVkLCBfb3B0aW9ucyRhdXRvU3dpdGNoO1xuXHRjb25zdCBlbmFibGVkID0gc2hhbGxvd1JlZigoX29wdGlvbnMkZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCkgIT09IG51bGwgJiYgX29wdGlvbnMkZW5hYmxlZCAhPT0gdm9pZCAwID8gX29wdGlvbnMkZW5hYmxlZCA6IGZhbHNlKTtcblx0Y29uc3QgYXV0b1N3aXRjaCA9IHNoYWxsb3dSZWYoKF9vcHRpb25zJGF1dG9Td2l0Y2ggPSBvcHRpb25zLmF1dG9Td2l0Y2gpICE9PSBudWxsICYmIF9vcHRpb25zJGF1dG9Td2l0Y2ggIT09IHZvaWQgMCA/IF9vcHRpb25zJGF1dG9Td2l0Y2ggOiB0cnVlKTtcblx0Y29uc3QgY29uc3RyYWludHMgPSByZWYob3B0aW9ucy5jb25zdHJhaW50cyk7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB7XG5cdFx0dmFyIF9uYXZpZ2F0b3IkbWVkaWFEZXZpYztcblx0XHRyZXR1cm4gbmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCB8fCAoX25hdmlnYXRvciRtZWRpYURldmljID0gbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzKSA9PT0gbnVsbCB8fCBfbmF2aWdhdG9yJG1lZGlhRGV2aWMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uYXZpZ2F0b3IkbWVkaWFEZXZpYy5nZXRVc2VyTWVkaWE7XG5cdH0pO1xuXHRjb25zdCBzdHJlYW0gPSBzaGFsbG93UmVmKCk7XG5cdGZ1bmN0aW9uIGdldERldmljZU9wdGlvbnModHlwZSkge1xuXHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0Y2FzZSBcInZpZGVvXCI6XG5cdFx0XHRcdGlmIChjb25zdHJhaW50cy52YWx1ZSkgcmV0dXJuIGNvbnN0cmFpbnRzLnZhbHVlLnZpZGVvIHx8IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJhdWRpb1wiOlxuXHRcdFx0XHRpZiAoY29uc3RyYWludHMudmFsdWUpIHJldHVybiBjb25zdHJhaW50cy52YWx1ZS5hdWRpbyB8fCBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIF9zdGFydCgpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8IHN0cmVhbS52YWx1ZSkgcmV0dXJuO1xuXHRcdHN0cmVhbS52YWx1ZSA9IGF3YWl0IG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuXHRcdFx0dmlkZW86IGdldERldmljZU9wdGlvbnMoXCJ2aWRlb1wiKSxcblx0XHRcdGF1ZGlvOiBnZXREZXZpY2VPcHRpb25zKFwiYXVkaW9cIilcblx0XHR9KTtcblx0XHRyZXR1cm4gc3RyZWFtLnZhbHVlO1xuXHR9XG5cdGZ1bmN0aW9uIF9zdG9wKCkge1xuXHRcdHZhciBfc3RyZWFtJHZhbHVlO1xuXHRcdChfc3RyZWFtJHZhbHVlID0gc3RyZWFtLnZhbHVlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJHZhbHVlID09PSB2b2lkIDAgfHwgX3N0cmVhbSR2YWx1ZS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG5cdFx0c3RyZWFtLnZhbHVlID0gdm9pZCAwO1xuXHR9XG5cdGZ1bmN0aW9uIHN0b3AoKSB7XG5cdFx0X3N0b3AoKTtcblx0XHRlbmFibGVkLnZhbHVlID0gZmFsc2U7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gc3RhcnQoKSB7XG5cdFx0YXdhaXQgX3N0YXJ0KCk7XG5cdFx0aWYgKHN0cmVhbS52YWx1ZSkgZW5hYmxlZC52YWx1ZSA9IHRydWU7XG5cdFx0cmV0dXJuIHN0cmVhbS52YWx1ZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZXN0YXJ0KCkge1xuXHRcdF9zdG9wKCk7XG5cdFx0cmV0dXJuIGF3YWl0IHN0YXJ0KCk7XG5cdH1cblx0d2F0Y2goZW5hYmxlZCwgKHYpID0+IHtcblx0XHRpZiAodikgX3N0YXJ0KCk7XG5cdFx0ZWxzZSBfc3RvcCgpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0d2F0Y2goY29uc3RyYWludHMsICgpID0+IHtcblx0XHRpZiAoYXV0b1N3aXRjaC52YWx1ZSAmJiBzdHJlYW0udmFsdWUpIHJlc3RhcnQoKTtcblx0fSwge1xuXHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRkZWVwOiB0cnVlXG5cdH0pO1xuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0c3RvcCgpO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdHJlYW0sXG5cdFx0c3RhcnQsXG5cdFx0c3RvcCxcblx0XHRyZXN0YXJ0LFxuXHRcdGNvbnN0cmFpbnRzLFxuXHRcdGVuYWJsZWQsXG5cdFx0YXV0b1N3aXRjaFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VWTW9kZWwvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHYtbW9kZWwgYmluZGluZywgcHJvcHMgKyBlbWl0IC0+IHJlZlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VWTW9kZWxcbiogQHBhcmFtIHByb3BzXG4qIEBwYXJhbSBrZXkgKGRlZmF1bHQgJ21vZGVsVmFsdWUnKVxuKiBAcGFyYW0gZW1pdFxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVZNb2RlbChwcm9wcywga2V5LCBlbWl0LCBvcHRpb25zID0ge30pIHtcblx0dmFyIF92bSQkZW1pdCwgX3ZtJHByb3h5O1xuXHRjb25zdCB7IGNsb25lID0gZmFsc2UsIHBhc3NpdmUgPSBmYWxzZSwgZXZlbnROYW1lLCBkZWVwID0gZmFsc2UsIGRlZmF1bHRWYWx1ZSwgc2hvdWxkRW1pdCB9ID0gb3B0aW9ucztcblx0Y29uc3Qgdm0gPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcblx0Y29uc3QgX2VtaXQgPSBlbWl0IHx8ICh2bSA9PT0gbnVsbCB8fCB2bSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdm0uZW1pdCkgfHwgKHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgfHwgKF92bSQkZW1pdCA9IHZtLiRlbWl0KSA9PT0gbnVsbCB8fCBfdm0kJGVtaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF92bSQkZW1pdC5iaW5kKHZtKSkgfHwgKHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgfHwgKF92bSRwcm94eSA9IHZtLnByb3h5KSA9PT0gbnVsbCB8fCBfdm0kcHJveHkgPT09IHZvaWQgMCB8fCAoX3ZtJHByb3h5ID0gX3ZtJHByb3h5LiRlbWl0KSA9PT0gbnVsbCB8fCBfdm0kcHJveHkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF92bSRwcm94eS5iaW5kKHZtID09PSBudWxsIHx8IHZtID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2bS5wcm94eSkpO1xuXHRsZXQgZXZlbnQgPSBldmVudE5hbWU7XG5cdGlmICgha2V5KSBrZXkgPSBcIm1vZGVsVmFsdWVcIjtcblx0ZXZlbnQgPSBldmVudCB8fCBgdXBkYXRlOiR7a2V5LnRvU3RyaW5nKCl9YDtcblx0Y29uc3QgY2xvbmVGbiA9ICh2YWwpID0+ICFjbG9uZSA/IHZhbCA6IHR5cGVvZiBjbG9uZSA9PT0gXCJmdW5jdGlvblwiID8gY2xvbmUodmFsKSA6IGNsb25lRm5KU09OKHZhbCk7XG5cdGNvbnN0IGdldFZhbHVlJDEgPSAoKSA9PiBpc0RlZihwcm9wc1trZXldKSA/IGNsb25lRm4ocHJvcHNba2V5XSkgOiBkZWZhdWx0VmFsdWU7XG5cdGNvbnN0IHRyaWdnZXJFbWl0ID0gKHZhbHVlKSA9PiB7XG5cdFx0aWYgKHNob3VsZEVtaXQpIHtcblx0XHRcdGlmIChzaG91bGRFbWl0KHZhbHVlKSkgX2VtaXQoZXZlbnQsIHZhbHVlKTtcblx0XHR9IGVsc2UgX2VtaXQoZXZlbnQsIHZhbHVlKTtcblx0fTtcblx0aWYgKHBhc3NpdmUpIHtcblx0XHRjb25zdCBwcm94eSA9IHJlZihnZXRWYWx1ZSQxKCkpO1xuXHRcdGxldCBpc1VwZGF0aW5nID0gZmFsc2U7XG5cdFx0d2F0Y2goKCkgPT4gcHJvcHNba2V5XSwgKHYpID0+IHtcblx0XHRcdGlmICghaXNVcGRhdGluZykge1xuXHRcdFx0XHRpc1VwZGF0aW5nID0gdHJ1ZTtcblx0XHRcdFx0cHJveHkudmFsdWUgPSBjbG9uZUZuKHYpO1xuXHRcdFx0XHRuZXh0VGljaygoKSA9PiBpc1VwZGF0aW5nID0gZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHdhdGNoKHByb3h5LCAodikgPT4ge1xuXHRcdFx0aWYgKCFpc1VwZGF0aW5nICYmICh2ICE9PSBwcm9wc1trZXldIHx8IGRlZXApKSB0cmlnZ2VyRW1pdCh2KTtcblx0XHR9LCB7IGRlZXAgfSk7XG5cdFx0cmV0dXJuIHByb3h5O1xuXHR9IGVsc2UgcmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZ2V0VmFsdWUkMSgpO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHR0cmlnZ2VyRW1pdCh2YWx1ZSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVk1vZGVscy9pbmRleC50c1xuLyoqXG4qIFNob3J0aGFuZCBmb3IgcHJvcHMgdi1tb2RlbCBiaW5kaW5nLiBUaGluayBsaWtlIGB0b1JlZnMocHJvcHMpYCBidXQgY2hhbmdlcyB3aWxsIGFsc28gZW1pdCBvdXQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVZNb2RlbHNcbiogQHBhcmFtIHByb3BzXG4qIEBwYXJhbSBlbWl0XG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVk1vZGVscyhwcm9wcywgZW1pdCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHJldCA9IHt9O1xuXHRmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykgcmV0W2tleV0gPSB1c2VWTW9kZWwocHJvcHMsIGtleSwgZW1pdCwgb3B0aW9ucyk7XG5cdHJldHVybiByZXQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVZpYnJhdGUvaW5kZXgudHNcbmZ1bmN0aW9uIGdldERlZmF1bHRTY2hlZHVsZXIkMShvcHRpb25zID0geyBpbnRlcnZhbDogMCB9KSB7XG5cdGNvbnN0IHsgaW50ZXJ2YWwgfSA9IG9wdGlvbnM7XG5cdGlmIChpbnRlcnZhbCA9PT0gMCkgcmV0dXJuO1xuXHRyZXR1cm4gKGZuKSA9PiB1c2VJbnRlcnZhbEZuKGZuLCBpbnRlcnZhbCwge1xuXHRcdGltbWVkaWF0ZTogZmFsc2UsXG5cdFx0aW1tZWRpYXRlQ2FsbGJhY2s6IGZhbHNlXG5cdH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIHZpYnJhdGVcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVmlicmF0ZVxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9WaWJyYXRpb25fQVBJXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVmlicmF0ZShvcHRpb25zKSB7XG5cdGNvbnN0IHsgcGF0dGVybiA9IFtdLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDEob3B0aW9ucyksIG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zIHx8IHt9O1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gdHlwZW9mIG5hdmlnYXRvciQxICE9PSBcInVuZGVmaW5lZFwiICYmIFwidmlicmF0ZVwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgcGF0dGVyblJlZiA9IHRvUmVmKHBhdHRlcm4pO1xuXHRjb25zdCB2aWJyYXRlID0gKHBhdHRlcm4kMSA9IHBhdHRlcm5SZWYudmFsdWUpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIG5hdmlnYXRvciQxLnZpYnJhdGUocGF0dGVybiQxKTtcblx0fTtcblx0Y29uc3QgaW50ZXJ2YWxDb250cm9scyA9IHNjaGVkdWxlciA9PT0gbnVsbCB8fCBzY2hlZHVsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVkdWxlcih2aWJyYXRlKTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIG5hdmlnYXRvciQxLnZpYnJhdGUoMCk7XG5cdFx0aW50ZXJ2YWxDb250cm9scyA9PT0gbnVsbCB8fCBpbnRlcnZhbENvbnRyb2xzID09PSB2b2lkIDAgfHwgaW50ZXJ2YWxDb250cm9scy5wYXVzZSgpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHBhdHRlcm4sXG5cdFx0aW50ZXJ2YWxDb250cm9scyxcblx0XHR2aWJyYXRlLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVmlydHVhbExpc3QvaW5kZXgudHNcbi8qKlxuKiBQbGVhc2UgY29uc2lkZXIgdXNpbmcgW2B2dWUtdmlydHVhbC1zY3JvbGxlcmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9Ba3J5dW0vdnVlLXZpcnR1YWwtc2Nyb2xsZXIpIGlmIHlvdSBhcmUgbG9va2luZyBmb3IgbW9yZSBmZWF0dXJlcy5cbiovXG5mdW5jdGlvbiB1c2VWaXJ0dWFsTGlzdChsaXN0LCBvcHRpb25zKSB7XG5cdGNvbnN0IHsgY29udGFpbmVyU3R5bGUsIHdyYXBwZXJQcm9wcywgc2Nyb2xsVG8sIGNhbGN1bGF0ZVJhbmdlLCBjdXJyZW50TGlzdCwgY29udGFpbmVyUmVmIH0gPSBcIml0ZW1IZWlnaHRcIiBpbiBvcHRpb25zID8gdXNlVmVydGljYWxWaXJ0dWFsTGlzdChvcHRpb25zLCBsaXN0KSA6IHVzZUhvcml6b250YWxWaXJ0dWFsTGlzdChvcHRpb25zLCBsaXN0KTtcblx0cmV0dXJuIHtcblx0XHRsaXN0OiBjdXJyZW50TGlzdCxcblx0XHRzY3JvbGxUbyxcblx0XHRjb250YWluZXJQcm9wczoge1xuXHRcdFx0cmVmOiBjb250YWluZXJSZWYsXG5cdFx0XHRvblNjcm9sbDogKCkgPT4ge1xuXHRcdFx0XHRjYWxjdWxhdGVSYW5nZSgpO1xuXHRcdFx0fSxcblx0XHRcdHN0eWxlOiBjb250YWluZXJTdHlsZVxuXHRcdH0sXG5cdFx0d3JhcHBlclByb3BzXG5cdH07XG59XG5mdW5jdGlvbiB1c2VWaXJ0dWFsTGlzdFJlc291cmNlcyhsaXN0KSB7XG5cdGNvbnN0IGNvbnRhaW5lclJlZiA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHNpemUgPSB1c2VFbGVtZW50U2l6ZShjb250YWluZXJSZWYpO1xuXHRjb25zdCBjdXJyZW50TGlzdCA9IHJlZihbXSk7XG5cdGNvbnN0IHNvdXJjZSA9IHNoYWxsb3dSZWYobGlzdCk7XG5cdHJldHVybiB7XG5cdFx0c3RhdGU6IHJlZih7XG5cdFx0XHRzdGFydDogMCxcblx0XHRcdGVuZDogMTBcblx0XHR9KSxcblx0XHRzb3VyY2UsXG5cdFx0Y3VycmVudExpc3QsXG5cdFx0c2l6ZSxcblx0XHRjb250YWluZXJSZWZcblx0fTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUdldFZpZXdDYXBhY2l0eShzdGF0ZSwgc291cmNlLCBpdGVtU2l6ZSkge1xuXHRyZXR1cm4gKGNvbnRhaW5lclNpemUpID0+IHtcblx0XHRpZiAodHlwZW9mIGl0ZW1TaXplID09PSBcIm51bWJlclwiKSByZXR1cm4gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG5cdFx0Y29uc3QgeyBzdGFydCA9IDAgfSA9IHN0YXRlLnZhbHVlO1xuXHRcdGxldCBzdW0gPSAwO1xuXHRcdGxldCBjYXBhY2l0eSA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc291cmNlLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzaXplID0gaXRlbVNpemUoaSk7XG5cdFx0XHRzdW0gKz0gc2l6ZTtcblx0XHRcdGNhcGFjaXR5ID0gaTtcblx0XHRcdGlmIChzdW0gPiBjb250YWluZXJTaXplKSBicmVhaztcblx0XHR9XG5cdFx0cmV0dXJuIGNhcGFjaXR5IC0gc3RhcnQ7XG5cdH07XG59XG5mdW5jdGlvbiBjcmVhdGVHZXRPZmZzZXQoc291cmNlLCBpdGVtU2l6ZSkge1xuXHRyZXR1cm4gKHNjcm9sbERpcmVjdGlvbikgPT4ge1xuXHRcdGlmICh0eXBlb2YgaXRlbVNpemUgPT09IFwibnVtYmVyXCIpIHJldHVybiBNYXRoLmZsb29yKHNjcm9sbERpcmVjdGlvbiAvIGl0ZW1TaXplKSArIDE7XG5cdFx0bGV0IHN1bSA9IDA7XG5cdFx0bGV0IG9mZnNldCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UudmFsdWUubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHNpemUgPSBpdGVtU2l6ZShpKTtcblx0XHRcdHN1bSArPSBzaXplO1xuXHRcdFx0aWYgKHN1bSA+PSBzY3JvbGxEaXJlY3Rpb24pIHtcblx0XHRcdFx0b2Zmc2V0ID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvZmZzZXQgKyAxO1xuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FsY3VsYXRlUmFuZ2UodHlwZSwgb3ZlcnNjYW4sIGdldE9mZnNldCwgZ2V0Vmlld0NhcGFjaXR5LCB7IGNvbnRhaW5lclJlZiwgc3RhdGUsIGN1cnJlbnRMaXN0LCBzb3VyY2UgfSkge1xuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBjb250YWluZXJSZWYudmFsdWU7XG5cdFx0aWYgKGVsZW1lbnQpIHtcblx0XHRcdGNvbnN0IG9mZnNldCA9IGdldE9mZnNldCh0eXBlID09PSBcInZlcnRpY2FsXCIgPyBlbGVtZW50LnNjcm9sbFRvcCA6IGVsZW1lbnQuc2Nyb2xsTGVmdCk7XG5cdFx0XHRjb25zdCB2aWV3Q2FwYWNpdHkgPSBnZXRWaWV3Q2FwYWNpdHkodHlwZSA9PT0gXCJ2ZXJ0aWNhbFwiID8gZWxlbWVudC5jbGllbnRIZWlnaHQgOiBlbGVtZW50LmNsaWVudFdpZHRoKTtcblx0XHRcdGNvbnN0IGZyb20gPSBvZmZzZXQgLSBvdmVyc2Nhbjtcblx0XHRcdGNvbnN0IHRvID0gb2Zmc2V0ICsgdmlld0NhcGFjaXR5ICsgb3ZlcnNjYW47XG5cdFx0XHRzdGF0ZS52YWx1ZSA9IHtcblx0XHRcdFx0c3RhcnQ6IGZyb20gPCAwID8gMCA6IGZyb20sXG5cdFx0XHRcdGVuZDogdG8gPiBzb3VyY2UudmFsdWUubGVuZ3RoID8gc291cmNlLnZhbHVlLmxlbmd0aCA6IHRvXG5cdFx0XHR9O1xuXHRcdFx0Y3VycmVudExpc3QudmFsdWUgPSBzb3VyY2UudmFsdWUuc2xpY2Uoc3RhdGUudmFsdWUuc3RhcnQsIHN0YXRlLnZhbHVlLmVuZCkubWFwKChlbGUsIGluZGV4KSA9PiAoe1xuXHRcdFx0XHRkYXRhOiBlbGUsXG5cdFx0XHRcdGluZGV4OiBpbmRleCArIHN0YXRlLnZhbHVlLnN0YXJ0XG5cdFx0XHR9KSk7XG5cdFx0fVxuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlR2V0RGlzdGFuY2UoaXRlbVNpemUsIHNvdXJjZSkge1xuXHRyZXR1cm4gKGluZGV4KSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGluZGV4ICogaXRlbVNpemU7XG5cdFx0cmV0dXJuIHNvdXJjZS52YWx1ZS5zbGljZSgwLCBpbmRleCkucmVkdWNlKChzdW0sIF8sIGkpID0+IHN1bSArIGl0ZW1TaXplKGkpLCAwKTtcblx0fTtcbn1cbmZ1bmN0aW9uIHVzZVdhdGNoRm9yU2l6ZXMoc2l6ZSwgbGlzdCwgY29udGFpbmVyUmVmLCBjYWxjdWxhdGVSYW5nZSkge1xuXHR3YXRjaChbXG5cdFx0c2l6ZS53aWR0aCxcblx0XHRzaXplLmhlaWdodCxcblx0XHQoKSA9PiB0b1ZhbHVlKGxpc3QpLFxuXHRcdGNvbnRhaW5lclJlZlxuXHRdLCAoKSA9PiB7XG5cdFx0Y2FsY3VsYXRlUmFuZ2UoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21wdXRlZFRvdGFsU2l6ZShpdGVtU2l6ZSwgc291cmNlKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHNvdXJjZS52YWx1ZS5sZW5ndGggKiBpdGVtU2l6ZTtcblx0XHRyZXR1cm4gc291cmNlLnZhbHVlLnJlZHVjZSgoc3VtLCBfLCBpbmRleCkgPT4gc3VtICsgaXRlbVNpemUoaW5kZXgpLCAwKTtcblx0fSk7XG59XG5jb25zdCBzY3JvbGxUb0RpY3Rpb25hcnlGb3JFbGVtZW50U2Nyb2xsS2V5ID0ge1xuXHRob3Jpem9udGFsOiBcInNjcm9sbExlZnRcIixcblx0dmVydGljYWw6IFwic2Nyb2xsVG9wXCJcbn07XG5mdW5jdGlvbiBjcmVhdGVTY3JvbGxUbyh0eXBlLCBjYWxjdWxhdGVSYW5nZSwgZ2V0RGlzdGFuY2UsIGNvbnRhaW5lclJlZikge1xuXHRyZXR1cm4gKGluZGV4KSA9PiB7XG5cdFx0aWYgKGNvbnRhaW5lclJlZi52YWx1ZSkge1xuXHRcdFx0Y29udGFpbmVyUmVmLnZhbHVlW3Njcm9sbFRvRGljdGlvbmFyeUZvckVsZW1lbnRTY3JvbGxLZXlbdHlwZV1dID0gZ2V0RGlzdGFuY2UoaW5kZXgpO1xuXHRcdFx0Y2FsY3VsYXRlUmFuZ2UoKTtcblx0XHR9XG5cdH07XG59XG5mdW5jdGlvbiB1c2VIb3Jpem9udGFsVmlydHVhbExpc3Qob3B0aW9ucywgbGlzdCkge1xuXHRjb25zdCByZXNvdXJjZXMgPSB1c2VWaXJ0dWFsTGlzdFJlc291cmNlcyhsaXN0KTtcblx0Y29uc3QgeyBzdGF0ZSwgc291cmNlLCBjdXJyZW50TGlzdCwgc2l6ZSwgY29udGFpbmVyUmVmIH0gPSByZXNvdXJjZXM7XG5cdGNvbnN0IGNvbnRhaW5lclN0eWxlID0geyBvdmVyZmxvd1g6IFwiYXV0b1wiIH07XG5cdGNvbnN0IHsgaXRlbVdpZHRoLCBvdmVyc2NhbiA9IDUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGdldFZpZXdDYXBhY2l0eSA9IGNyZWF0ZUdldFZpZXdDYXBhY2l0eShzdGF0ZSwgc291cmNlLCBpdGVtV2lkdGgpO1xuXHRjb25zdCBjYWxjdWxhdGVSYW5nZSA9IGNyZWF0ZUNhbGN1bGF0ZVJhbmdlKFwiaG9yaXpvbnRhbFwiLCBvdmVyc2NhbiwgY3JlYXRlR2V0T2Zmc2V0KHNvdXJjZSwgaXRlbVdpZHRoKSwgZ2V0Vmlld0NhcGFjaXR5LCByZXNvdXJjZXMpO1xuXHRjb25zdCBnZXREaXN0YW5jZUxlZnQgPSBjcmVhdGVHZXREaXN0YW5jZShpdGVtV2lkdGgsIHNvdXJjZSk7XG5cdGNvbnN0IG9mZnNldExlZnQgPSBjb21wdXRlZCgoKSA9PiBnZXREaXN0YW5jZUxlZnQoc3RhdGUudmFsdWUuc3RhcnQpKTtcblx0Y29uc3QgdG90YWxXaWR0aCA9IGNyZWF0ZUNvbXB1dGVkVG90YWxTaXplKGl0ZW1XaWR0aCwgc291cmNlKTtcblx0dXNlV2F0Y2hGb3JTaXplcyhzaXplLCBsaXN0LCBjb250YWluZXJSZWYsIGNhbGN1bGF0ZVJhbmdlKTtcblx0cmV0dXJuIHtcblx0XHRzY3JvbGxUbzogY3JlYXRlU2Nyb2xsVG8oXCJob3Jpem9udGFsXCIsIGNhbGN1bGF0ZVJhbmdlLCBnZXREaXN0YW5jZUxlZnQsIGNvbnRhaW5lclJlZiksXG5cdFx0Y2FsY3VsYXRlUmFuZ2UsXG5cdFx0d3JhcHBlclByb3BzOiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0XHRyZXR1cm4geyBzdHlsZToge1xuXHRcdFx0XHRoZWlnaHQ6IFwiMTAwJVwiLFxuXHRcdFx0XHR3aWR0aDogYCR7dG90YWxXaWR0aC52YWx1ZSAtIG9mZnNldExlZnQudmFsdWV9cHhgLFxuXHRcdFx0XHRtYXJnaW5MZWZ0OiBgJHtvZmZzZXRMZWZ0LnZhbHVlfXB4YCxcblx0XHRcdFx0ZGlzcGxheTogXCJmbGV4XCJcblx0XHRcdH0gfTtcblx0XHR9KSxcblx0XHRjb250YWluZXJTdHlsZSxcblx0XHRjdXJyZW50TGlzdCxcblx0XHRjb250YWluZXJSZWZcblx0fTtcbn1cbmZ1bmN0aW9uIHVzZVZlcnRpY2FsVmlydHVhbExpc3Qob3B0aW9ucywgbGlzdCkge1xuXHRjb25zdCByZXNvdXJjZXMgPSB1c2VWaXJ0dWFsTGlzdFJlc291cmNlcyhsaXN0KTtcblx0Y29uc3QgeyBzdGF0ZSwgc291cmNlLCBjdXJyZW50TGlzdCwgc2l6ZSwgY29udGFpbmVyUmVmIH0gPSByZXNvdXJjZXM7XG5cdGNvbnN0IGNvbnRhaW5lclN0eWxlID0geyBvdmVyZmxvd1k6IFwiYXV0b1wiIH07XG5cdGNvbnN0IHsgaXRlbUhlaWdodCwgb3ZlcnNjYW4gPSA1IH0gPSBvcHRpb25zO1xuXHRjb25zdCBnZXRWaWV3Q2FwYWNpdHkgPSBjcmVhdGVHZXRWaWV3Q2FwYWNpdHkoc3RhdGUsIHNvdXJjZSwgaXRlbUhlaWdodCk7XG5cdGNvbnN0IGNhbGN1bGF0ZVJhbmdlID0gY3JlYXRlQ2FsY3VsYXRlUmFuZ2UoXCJ2ZXJ0aWNhbFwiLCBvdmVyc2NhbiwgY3JlYXRlR2V0T2Zmc2V0KHNvdXJjZSwgaXRlbUhlaWdodCksIGdldFZpZXdDYXBhY2l0eSwgcmVzb3VyY2VzKTtcblx0Y29uc3QgZ2V0RGlzdGFuY2VUb3AgPSBjcmVhdGVHZXREaXN0YW5jZShpdGVtSGVpZ2h0LCBzb3VyY2UpO1xuXHRjb25zdCBvZmZzZXRUb3AgPSBjb21wdXRlZCgoKSA9PiBnZXREaXN0YW5jZVRvcChzdGF0ZS52YWx1ZS5zdGFydCkpO1xuXHRjb25zdCB0b3RhbEhlaWdodCA9IGNyZWF0ZUNvbXB1dGVkVG90YWxTaXplKGl0ZW1IZWlnaHQsIHNvdXJjZSk7XG5cdHVzZVdhdGNoRm9yU2l6ZXMoc2l6ZSwgbGlzdCwgY29udGFpbmVyUmVmLCBjYWxjdWxhdGVSYW5nZSk7XG5cdHJldHVybiB7XG5cdFx0Y2FsY3VsYXRlUmFuZ2UsXG5cdFx0c2Nyb2xsVG86IGNyZWF0ZVNjcm9sbFRvKFwidmVydGljYWxcIiwgY2FsY3VsYXRlUmFuZ2UsIGdldERpc3RhbmNlVG9wLCBjb250YWluZXJSZWYpLFxuXHRcdGNvbnRhaW5lclN0eWxlLFxuXHRcdHdyYXBwZXJQcm9wczogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHsgc3R5bGU6IHtcblx0XHRcdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdFx0XHRoZWlnaHQ6IGAke3RvdGFsSGVpZ2h0LnZhbHVlIC0gb2Zmc2V0VG9wLnZhbHVlfXB4YCxcblx0XHRcdFx0bWFyZ2luVG9wOiBgJHtvZmZzZXRUb3AudmFsdWV9cHhgXG5cdFx0XHR9IH07XG5cdFx0fSksXG5cdFx0Y3VycmVudExpc3QsXG5cdFx0Y29udGFpbmVyUmVmXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdha2VMb2NrL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgU2NyZWVuIFdha2UgTG9jayBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdha2VMb2NrXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlV2FrZUxvY2sob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCByZXF1ZXN0ZWRUeXBlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHNlbnRpbmVsID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgZG9jdW1lbnRWaXNpYmlsaXR5ID0gdXNlRG9jdW1lbnRWaXNpYmlsaXR5KHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgfSk7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcIndha2VMb2NrXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBpc0FjdGl2ZSA9IGNvbXB1dGVkKCgpID0+ICEhc2VudGluZWwudmFsdWUgJiYgZG9jdW1lbnRWaXNpYmlsaXR5LnZhbHVlID09PSBcInZpc2libGVcIik7XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoc2VudGluZWwsIFwicmVsZWFzZVwiLCAoKSA9PiB7XG5cdFx0XHR2YXIgX3NlbnRpbmVsJHZhbHVlJHR5cGUsIF9zZW50aW5lbCR2YWx1ZTtcblx0XHRcdHJlcXVlc3RlZFR5cGUudmFsdWUgPSAoX3NlbnRpbmVsJHZhbHVlJHR5cGUgPSAoX3NlbnRpbmVsJHZhbHVlID0gc2VudGluZWwudmFsdWUpID09PSBudWxsIHx8IF9zZW50aW5lbCR2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbnRpbmVsJHZhbHVlLnR5cGUpICE9PSBudWxsICYmIF9zZW50aW5lbCR2YWx1ZSR0eXBlICE9PSB2b2lkIDAgPyBfc2VudGluZWwkdmFsdWUkdHlwZSA6IGZhbHNlO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHR3aGVuZXZlcigoKSA9PiBkb2N1bWVudFZpc2liaWxpdHkudmFsdWUgPT09IFwidmlzaWJsZVwiICYmIChkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEudmlzaWJpbGl0eVN0YXRlKSA9PT0gXCJ2aXNpYmxlXCIgJiYgcmVxdWVzdGVkVHlwZS52YWx1ZSwgKHR5cGUpID0+IHtcblx0XHRcdHJlcXVlc3RlZFR5cGUudmFsdWUgPSBmYWxzZTtcblx0XHRcdGZvcmNlUmVxdWVzdCh0eXBlKTtcblx0XHR9KTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBmb3JjZVJlcXVlc3QodHlwZSkge1xuXHRcdHZhciBfc2VudGluZWwkdmFsdWUyO1xuXHRcdGF3YWl0ICgoX3NlbnRpbmVsJHZhbHVlMiA9IHNlbnRpbmVsLnZhbHVlKSA9PT0gbnVsbCB8fCBfc2VudGluZWwkdmFsdWUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2VudGluZWwkdmFsdWUyLnJlbGVhc2UoKSk7XG5cdFx0c2VudGluZWwudmFsdWUgPSBpc1N1cHBvcnRlZC52YWx1ZSA/IGF3YWl0IG5hdmlnYXRvciQxLndha2VMb2NrLnJlcXVlc3QodHlwZSkgOiBudWxsO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QodHlwZSkge1xuXHRcdGlmIChkb2N1bWVudFZpc2liaWxpdHkudmFsdWUgPT09IFwidmlzaWJsZVwiKSBhd2FpdCBmb3JjZVJlcXVlc3QodHlwZSk7XG5cdFx0ZWxzZSByZXF1ZXN0ZWRUeXBlLnZhbHVlID0gdHlwZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZWxlYXNlKCkge1xuXHRcdHJlcXVlc3RlZFR5cGUudmFsdWUgPSBmYWxzZTtcblx0XHRjb25zdCBzID0gc2VudGluZWwudmFsdWU7XG5cdFx0c2VudGluZWwudmFsdWUgPSBudWxsO1xuXHRcdGF3YWl0IChzID09PSBudWxsIHx8IHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHMucmVsZWFzZSgpKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbnRpbmVsLFxuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzQWN0aXZlLFxuXHRcdHJlcXVlc3QsXG5cdFx0Zm9yY2VSZXF1ZXN0LFxuXHRcdHJlbGVhc2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViTm90aWZpY2F0aW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgdXNlV2ViTm90aWZpY2F0aW9uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdlYk5vdGlmaWNhdGlvblxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9ub3RpZmljYXRpb25cbiovXG5mdW5jdGlvbiB1c2VXZWJOb3RpZmljYXRpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHJlcXVlc3RQZXJtaXNzaW9uczogX3JlcXVlc3RGb3JQZXJtaXNzaW9ucyA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRlZmF1bHRXZWJOb3RpZmljYXRpb25PcHRpb25zID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHtcblx0XHRpZiAoIXdpbmRvdyQxIHx8ICEoXCJOb3RpZmljYXRpb25cIiBpbiB3aW5kb3ckMSkpIHJldHVybiBmYWxzZTtcblx0XHRpZiAoTm90aWZpY2F0aW9uLnBlcm1pc3Npb24gPT09IFwiZ3JhbnRlZFwiKSByZXR1cm4gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgbm90aWZpY2F0aW9uJDEgPSBuZXcgTm90aWZpY2F0aW9uKFwiXCIpO1xuXHRcdFx0bm90aWZpY2F0aW9uJDEub25zaG93ID0gKCkgPT4ge1xuXHRcdFx0XHRub3RpZmljYXRpb24kMS5jbG9zZSgpO1xuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoZS5uYW1lID09PSBcIlR5cGVFcnJvclwiKSByZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9KTtcblx0Y29uc3QgcGVybWlzc2lvbkdyYW50ZWQgPSBzaGFsbG93UmVmKGlzU3VwcG9ydGVkLnZhbHVlICYmIFwicGVybWlzc2lvblwiIGluIE5vdGlmaWNhdGlvbiAmJiBOb3RpZmljYXRpb24ucGVybWlzc2lvbiA9PT0gXCJncmFudGVkXCIpO1xuXHRjb25zdCBub3RpZmljYXRpb24gPSByZWYobnVsbCk7XG5cdGNvbnN0IGVuc3VyZVBlcm1pc3Npb25zID0gYXN5bmMgKCkgPT4ge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRpZiAoIXBlcm1pc3Npb25HcmFudGVkLnZhbHVlICYmIE5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uICE9PSBcImRlbmllZFwiKSB7XG5cdFx0XHRpZiAoYXdhaXQgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkgPT09IFwiZ3JhbnRlZFwiKSBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZTtcblx0fTtcblx0Y29uc3QgeyBvbjogb25DbGljaywgdHJpZ2dlcjogY2xpY2tUcmlnZ2VyIH0gPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgeyBvbjogb25TaG93LCB0cmlnZ2VyOiBzaG93VHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHsgb246IG9uRXJyb3IsIHRyaWdnZXI6IGVycm9yVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHsgb246IG9uQ2xvc2UsIHRyaWdnZXI6IGNsb3NlVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHNob3cgPSBhc3luYyAob3ZlcnJpZGVzKSA9PiB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCAhcGVybWlzc2lvbkdyYW50ZWQudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBvcHRpb25zJDEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0V2ViTm90aWZpY2F0aW9uT3B0aW9ucywgb3ZlcnJpZGVzKTtcblx0XHRub3RpZmljYXRpb24udmFsdWUgPSBuZXcgTm90aWZpY2F0aW9uKG9wdGlvbnMkMS50aXRsZSB8fCBcIlwiLCBvcHRpb25zJDEpO1xuXHRcdG5vdGlmaWNhdGlvbi52YWx1ZS5vbmNsaWNrID0gY2xpY2tUcmlnZ2VyO1xuXHRcdG5vdGlmaWNhdGlvbi52YWx1ZS5vbnNob3cgPSBzaG93VHJpZ2dlcjtcblx0XHRub3RpZmljYXRpb24udmFsdWUub25lcnJvciA9IGVycm9yVHJpZ2dlcjtcblx0XHRub3RpZmljYXRpb24udmFsdWUub25jbG9zZSA9IGNsb3NlVHJpZ2dlcjtcblx0XHRyZXR1cm4gbm90aWZpY2F0aW9uLnZhbHVlO1xuXHR9O1xuXHRjb25zdCBjbG9zZSA9ICgpID0+IHtcblx0XHRpZiAobm90aWZpY2F0aW9uLnZhbHVlKSBub3RpZmljYXRpb24udmFsdWUuY2xvc2UoKTtcblx0XHRub3RpZmljYXRpb24udmFsdWUgPSBudWxsO1xuXHR9O1xuXHRpZiAoX3JlcXVlc3RGb3JQZXJtaXNzaW9ucykgdHJ5T25Nb3VudGVkKGVuc3VyZVBlcm1pc3Npb25zKTtcblx0dHJ5T25TY29wZURpc3Bvc2UoY2xvc2UpO1xuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgd2luZG93JDEpIHtcblx0XHRjb25zdCBkb2N1bWVudCQxID0gd2luZG93JDEuZG9jdW1lbnQ7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBcInZpc2liaWxpdHljaGFuZ2VcIiwgKGUpID0+IHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmIChkb2N1bWVudCQxLnZpc2liaWxpdHlTdGF0ZSA9PT0gXCJ2aXNpYmxlXCIpIGNsb3NlKCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRub3RpZmljYXRpb24sXG5cdFx0ZW5zdXJlUGVybWlzc2lvbnMsXG5cdFx0cGVybWlzc2lvbkdyYW50ZWQsXG5cdFx0c2hvdyxcblx0XHRjbG9zZSxcblx0XHRvbkNsaWNrLFxuXHRcdG9uU2hvdyxcblx0XHRvbkVycm9yLFxuXHRcdG9uQ2xvc2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViU29ja2V0L2luZGV4LnRzXG5jb25zdCBERUZBVUxUX1BJTkdfTUVTU0FHRSA9IFwicGluZ1wiO1xuZnVuY3Rpb24gcmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucykge1xuXHRpZiAob3B0aW9ucyA9PT0gdHJ1ZSkgcmV0dXJuIHt9O1xuXHRyZXR1cm4gb3B0aW9ucztcbn1cbmZ1bmN0aW9uIGdldERlZmF1bHRTY2hlZHVsZXIob3B0aW9ucykge1xuXHRpZiAoXCJpbnRlcnZhbFwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IGludGVydmFsID0gMWUzIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIGludGVydmFsLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdH1cblx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgMWUzLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG59XG4vKipcbiogUmVhY3RpdmUgV2ViU29ja2V0IGNsaWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlV2ViU29ja2V0XG4qIEBwYXJhbSB1cmxcbiovXG5mdW5jdGlvbiB1c2VXZWJTb2NrZXQodXJsLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBvbkNvbm5lY3RlZCwgb25EaXNjb25uZWN0ZWQsIG9uRXJyb3IsIG9uTWVzc2FnZSwgaW1tZWRpYXRlID0gdHJ1ZSwgYXV0b0Nvbm5lY3QgPSB0cnVlLCBhdXRvQ2xvc2UgPSB0cnVlLCBwcm90b2NvbHMgPSBbXSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZGF0YSA9IHJlZihudWxsKTtcblx0Y29uc3Qgc3RhdHVzID0gc2hhbGxvd1JlZihcIkNMT1NFRFwiKTtcblx0Y29uc3Qgd3NSZWYgPSByZWYoKTtcblx0Y29uc3QgdXJsUmVmID0gdG9SZWYodXJsKTtcblx0bGV0IGhlYXJ0YmVhdFBhdXNlO1xuXHRsZXQgaGVhcnRiZWF0UmVzdW1lO1xuXHRsZXQgZXhwbGljaXRseUNsb3NlZCA9IGZhbHNlO1xuXHRsZXQgcmV0cmllZCA9IDA7XG5cdGxldCBidWZmZXJlZERhdGEgPSBbXTtcblx0bGV0IHJldHJ5VGltZW91dDtcblx0bGV0IHBvbmdUaW1lb3V0V2FpdDtcblx0Y29uc3QgX3NlbmRCdWZmZXIgPSAoKSA9PiB7XG5cdFx0aWYgKGJ1ZmZlcmVkRGF0YS5sZW5ndGggJiYgd3NSZWYudmFsdWUgJiYgc3RhdHVzLnZhbHVlID09PSBcIk9QRU5cIikge1xuXHRcdFx0Zm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVyZWREYXRhKSB3c1JlZi52YWx1ZS5zZW5kKGJ1ZmZlcik7XG5cdFx0XHRidWZmZXJlZERhdGEgPSBbXTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0UmV0cnkgPSAoKSA9PiB7XG5cdFx0aWYgKHJldHJ5VGltZW91dCAhPSBudWxsKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQocmV0cnlUaW1lb3V0KTtcblx0XHRcdHJldHJ5VGltZW91dCA9IHZvaWQgMDtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0SGVhcnRiZWF0ID0gKCkgPT4ge1xuXHRcdGNsZWFyVGltZW91dChwb25nVGltZW91dFdhaXQpO1xuXHRcdHBvbmdUaW1lb3V0V2FpdCA9IHZvaWQgMDtcblx0fTtcblx0Y29uc3QgY2xvc2UgPSAoY29kZSA9IDFlMywgcmVhc29uKSA9PiB7XG5cdFx0cmVzZXRSZXRyeSgpO1xuXHRcdGlmICghaXNDbGllbnQgJiYgIWlzV29ya2VyIHx8ICF3c1JlZi52YWx1ZSkgcmV0dXJuO1xuXHRcdGV4cGxpY2l0bHlDbG9zZWQgPSB0cnVlO1xuXHRcdHJlc2V0SGVhcnRiZWF0KCk7XG5cdFx0aGVhcnRiZWF0UGF1c2UgPT09IG51bGwgfHwgaGVhcnRiZWF0UGF1c2UgPT09IHZvaWQgMCB8fCBoZWFydGJlYXRQYXVzZSgpO1xuXHRcdHdzUmVmLnZhbHVlLmNsb3NlKGNvZGUsIHJlYXNvbik7XG5cdFx0d3NSZWYudmFsdWUgPSB2b2lkIDA7XG5cdH07XG5cdGNvbnN0IHNlbmQgPSAoZGF0YSQxLCB1c2VCdWZmZXIgPSB0cnVlKSA9PiB7XG5cdFx0aWYgKCF3c1JlZi52YWx1ZSB8fCBzdGF0dXMudmFsdWUgIT09IFwiT1BFTlwiKSB7XG5cdFx0XHRpZiAodXNlQnVmZmVyKSBidWZmZXJlZERhdGEucHVzaChkYXRhJDEpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRfc2VuZEJ1ZmZlcigpO1xuXHRcdHdzUmVmLnZhbHVlLnNlbmQoZGF0YSQxKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblx0Y29uc3QgX2luaXQgPSAoKSA9PiB7XG5cdFx0aWYgKGV4cGxpY2l0bHlDbG9zZWQgfHwgdHlwZW9mIHVybFJlZi52YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuXHRcdGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmxSZWYudmFsdWUsIHByb3RvY29scyk7XG5cdFx0d3NSZWYudmFsdWUgPSB3cztcblx0XHRzdGF0dXMudmFsdWUgPSBcIkNPTk5FQ1RJTkdcIjtcblx0XHR3cy5vbm9wZW4gPSAoKSA9PiB7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcIk9QRU5cIjtcblx0XHRcdHJldHJpZWQgPSAwO1xuXHRcdFx0b25Db25uZWN0ZWQgPT09IG51bGwgfHwgb25Db25uZWN0ZWQgPT09IHZvaWQgMCB8fCBvbkNvbm5lY3RlZCh3cyk7XG5cdFx0XHRoZWFydGJlYXRSZXN1bWUgPT09IG51bGwgfHwgaGVhcnRiZWF0UmVzdW1lID09PSB2b2lkIDAgfHwgaGVhcnRiZWF0UmVzdW1lKCk7XG5cdFx0XHRfc2VuZEJ1ZmZlcigpO1xuXHRcdH07XG5cdFx0d3Mub25jbG9zZSA9IChldikgPT4ge1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJDTE9TRURcIjtcblx0XHRcdHJlc2V0SGVhcnRiZWF0KCk7XG5cdFx0XHRoZWFydGJlYXRQYXVzZSA9PT0gbnVsbCB8fCBoZWFydGJlYXRQYXVzZSA9PT0gdm9pZCAwIHx8IGhlYXJ0YmVhdFBhdXNlKCk7XG5cdFx0XHRvbkRpc2Nvbm5lY3RlZCA9PT0gbnVsbCB8fCBvbkRpc2Nvbm5lY3RlZCA9PT0gdm9pZCAwIHx8IG9uRGlzY29ubmVjdGVkKHdzLCBldik7XG5cdFx0XHRpZiAoIWV4cGxpY2l0bHlDbG9zZWQgJiYgb3B0aW9ucy5hdXRvUmVjb25uZWN0ICYmICh3c1JlZi52YWx1ZSA9PSBudWxsIHx8IHdzID09PSB3c1JlZi52YWx1ZSkpIHtcblx0XHRcdFx0Y29uc3QgeyByZXRyaWVzID0gLTEsIGRlbGF5ID0gMWUzLCBvbkZhaWxlZCB9ID0gcmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucy5hdXRvUmVjb25uZWN0KTtcblx0XHRcdFx0aWYgKCh0eXBlb2YgcmV0cmllcyA9PT0gXCJmdW5jdGlvblwiID8gcmV0cmllcyA6ICgpID0+IHR5cGVvZiByZXRyaWVzID09PSBcIm51bWJlclwiICYmIChyZXRyaWVzIDwgMCB8fCByZXRyaWVkIDwgcmV0cmllcykpKHJldHJpZWQpKSB7XG5cdFx0XHRcdFx0cmV0cmllZCArPSAxO1xuXHRcdFx0XHRcdGNvbnN0IGRlbGF5VGltZSA9IHR5cGVvZiBkZWxheSA9PT0gXCJmdW5jdGlvblwiID8gZGVsYXkocmV0cmllZCkgOiBkZWxheTtcblx0XHRcdFx0XHRyZXRyeVRpbWVvdXQgPSBzZXRUaW1lb3V0KF9pbml0LCBkZWxheVRpbWUpO1xuXHRcdFx0XHR9IGVsc2Ugb25GYWlsZWQgPT09IG51bGwgfHwgb25GYWlsZWQgPT09IHZvaWQgMCB8fCBvbkZhaWxlZCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0d3Mub25lcnJvciA9IChlKSA9PiB7XG5cdFx0XHRvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCB8fCBvbkVycm9yKHdzLCBlKTtcblx0XHR9O1xuXHRcdHdzLm9ubWVzc2FnZSA9IChlKSA9PiB7XG5cdFx0XHRpZiAob3B0aW9ucy5oZWFydGJlYXQpIHtcblx0XHRcdFx0cmVzZXRIZWFydGJlYXQoKTtcblx0XHRcdFx0Y29uc3QgeyBtZXNzYWdlID0gREVGQVVMVF9QSU5HX01FU1NBR0UsIHJlc3BvbnNlTWVzc2FnZSA9IG1lc3NhZ2UgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMuaGVhcnRiZWF0KTtcblx0XHRcdFx0aWYgKGUuZGF0YSA9PT0gdG9WYWx1ZShyZXNwb25zZU1lc3NhZ2UpKSByZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRkYXRhLnZhbHVlID0gZS5kYXRhO1xuXHRcdFx0b25NZXNzYWdlID09PSBudWxsIHx8IG9uTWVzc2FnZSA9PT0gdm9pZCAwIHx8IG9uTWVzc2FnZSh3cywgZSk7XG5cdFx0fTtcblx0fTtcblx0aWYgKG9wdGlvbnMuaGVhcnRiZWF0KSB7XG5cdFx0Y29uc3QgeyBtZXNzYWdlID0gREVGQVVMVF9QSU5HX01FU1NBR0UsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIocmVzb2x2ZU5lc3RlZE9wdGlvbnMob3B0aW9ucy5oZWFydGJlYXQpKSwgcG9uZ1RpbWVvdXQgPSAxZTMgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMuaGVhcnRiZWF0KTtcblx0XHRjb25zdCB7IHBhdXNlLCByZXN1bWUgfSA9IHNjaGVkdWxlcigoKSA9PiB7XG5cdFx0XHRzZW5kKHRvVmFsdWUobWVzc2FnZSksIGZhbHNlKTtcblx0XHRcdGlmIChwb25nVGltZW91dFdhaXQgIT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0cG9uZ1RpbWVvdXRXYWl0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGNsb3NlKCk7XG5cdFx0XHRcdGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcblx0XHRcdH0sIHBvbmdUaW1lb3V0KTtcblx0XHR9KTtcblx0XHRoZWFydGJlYXRQYXVzZSA9IHBhdXNlO1xuXHRcdGhlYXJ0YmVhdFJlc3VtZSA9IHJlc3VtZTtcblx0fVxuXHRpZiAoYXV0b0Nsb3NlKSB7XG5cdFx0aWYgKGlzQ2xpZW50KSB1c2VFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsICgpID0+IGNsb3NlKCksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0XHR0cnlPblNjb3BlRGlzcG9zZShjbG9zZSk7XG5cdH1cblx0Y29uc3Qgb3BlbiA9ICgpID0+IHtcblx0XHRpZiAoIWlzQ2xpZW50ICYmICFpc1dvcmtlcikgcmV0dXJuO1xuXHRcdGNsb3NlKCk7XG5cdFx0ZXhwbGljaXRseUNsb3NlZCA9IGZhbHNlO1xuXHRcdHJldHJpZWQgPSAwO1xuXHRcdF9pbml0KCk7XG5cdH07XG5cdGlmIChpbW1lZGlhdGUpIG9wZW4oKTtcblx0aWYgKGF1dG9Db25uZWN0KSB3YXRjaCh1cmxSZWYsIG9wZW4pO1xuXHRyZXR1cm4ge1xuXHRcdGRhdGEsXG5cdFx0c3RhdHVzLFxuXHRcdGNsb3NlLFxuXHRcdHNlbmQsXG5cdFx0b3Blbixcblx0XHR3czogd3NSZWZcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViV29ya2VyL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VXZWJXb3JrZXIoYXJnMCwgd29ya2VyT3B0aW9ucywgb3B0aW9ucykge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcblx0Y29uc3QgZGF0YSA9IHJlZihudWxsKTtcblx0Y29uc3Qgd29ya2VyID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBwb3N0ID0gKC4uLmFyZ3MpID0+IHtcblx0XHRpZiAoIXdvcmtlci52YWx1ZSkgcmV0dXJuO1xuXHRcdHdvcmtlci52YWx1ZS5wb3N0TWVzc2FnZSguLi5hcmdzKTtcblx0fTtcblx0Y29uc3QgdGVybWluYXRlID0gZnVuY3Rpb24gdGVybWluYXRlJDEoKSB7XG5cdFx0aWYgKCF3b3JrZXIudmFsdWUpIHJldHVybjtcblx0XHR3b3JrZXIudmFsdWUudGVybWluYXRlKCk7XG5cdH07XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGlmICh0eXBlb2YgYXJnMCA9PT0gXCJzdHJpbmdcIikgd29ya2VyLnZhbHVlID0gbmV3IFdvcmtlcihhcmcwLCB3b3JrZXJPcHRpb25zKTtcblx0XHRlbHNlIGlmICh0eXBlb2YgYXJnMCA9PT0gXCJmdW5jdGlvblwiKSB3b3JrZXIudmFsdWUgPSBhcmcwKCk7XG5cdFx0ZWxzZSB3b3JrZXIudmFsdWUgPSBhcmcwO1xuXHRcdHdvcmtlci52YWx1ZS5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuXHRcdFx0ZGF0YS52YWx1ZSA9IGUuZGF0YTtcblx0XHR9O1xuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRcdGlmICh3b3JrZXIudmFsdWUpIHdvcmtlci52YWx1ZS50ZXJtaW5hdGUoKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGRhdGEsXG5cdFx0cG9zdCxcblx0XHR0ZXJtaW5hdGUsXG5cdFx0d29ya2VyXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdlYldvcmtlckZuL2xpYi9kZXBzUGFyc2VyLnRzXG4vKipcbipcbiogQ29uY2F0ZW5hdGVzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcuXG4qIHRoaXMgc3RyaW5nIHdpbGwgdGhlbiBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIFwiaW1wb3J0U2NyaXB0c1wiIGZ1bmN0aW9uXG4qXG4qIEBwYXJhbSBkZXBzIGFycmF5IG9mIHN0cmluZ1xuKiBAcGFyYW0gbG9jYWxEZXBzIGFycmF5IG9mIGZ1bmN0aW9uXG4qIEByZXR1cm5zIGEgc3RyaW5nIGNvbXBvc2VkIGJ5IHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBhcnJheVxuKiBlbGVtZW50cyBcImRlcHNcIiBhbmQgXCJpbXBvcnRTY3JpcHRzXCIuXG4qXG4qIEBleGFtcGxlXG4qIGRlcHNQYXJzZXIoWydkZW1vMScsICdkZW1vMiddKSAvLyByZXR1cm4gaW1wb3J0U2NyaXB0cygnZGVtbzEnLCAnZGVtbzInKVxuKi9cbmZ1bmN0aW9uIGRlcHNQYXJzZXIoZGVwcywgbG9jYWxEZXBzKSB7XG5cdGlmIChkZXBzLmxlbmd0aCA9PT0gMCAmJiBsb2NhbERlcHMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcblx0Y29uc3QgZGVwc1N0cmluZyA9IGRlcHMubWFwKChkZXApID0+IGAnJHtkZXB9J2ApLnRvU3RyaW5nKCk7XG5cdGNvbnN0IGRlcHNGdW5jdGlvblN0cmluZyA9IGxvY2FsRGVwcy5maWx0ZXIoKGRlcCkgPT4gdHlwZW9mIGRlcCA9PT0gXCJmdW5jdGlvblwiKS5tYXAoKGZuKSA9PiB7XG5cdFx0Y29uc3Qgc3RyID0gZm4udG9TdHJpbmcoKTtcblx0XHRpZiAoc3RyLnRyaW0oKS5zdGFydHNXaXRoKFwiZnVuY3Rpb25cIikpIHJldHVybiBzdHI7XG5cdFx0ZWxzZSByZXR1cm4gYGNvbnN0ICR7Zm4ubmFtZX0gPSAke3N0cn1gO1xuXHR9KS5qb2luKFwiO1wiKTtcblx0Y29uc3QgaW1wb3J0U3RyaW5nID0gYGltcG9ydFNjcmlwdHMoJHtkZXBzU3RyaW5nfSk7YDtcblx0cmV0dXJuIGAke2RlcHNTdHJpbmcudHJpbSgpID09PSBcIlwiID8gXCJcIiA6IGltcG9ydFN0cmluZ30gJHtkZXBzRnVuY3Rpb25TdHJpbmd9YDtcbn1cbnZhciBkZXBzUGFyc2VyX2RlZmF1bHQgPSBkZXBzUGFyc2VyO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9saWIvam9iUnVubmVyLnRzXG4vKipcbiogVGhpcyBmdW5jdGlvbiBhY2NlcHRzIGFzIGEgcGFyYW1ldGVyIGEgZnVuY3Rpb24gXCJ1c2VyRnVuY1wiXG4qIEFuZCBhcyBhIHJlc3VsdCByZXR1cm5zIGFuIGFub255bW91cyBmdW5jdGlvbi5cbiogVGhpcyBhbm9ueW1vdXMgZnVuY3Rpb24sIGFjY2VwdHMgYXMgYXJndW1lbnRzLFxuKiB0aGUgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiBcInVzZUFyZ3NcIiBhbmQgcmV0dXJucyBhIFByb21pc2VcbiogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhcyBhIHdyYXBwZXIsIG9ubHkgaW5zaWRlIGEgV29ya2VyXG4qIGJlY2F1c2UgaXQgZGVwZW5kcyBieSBcInBvc3RNZXNzYWdlXCIuXG4qXG4qIEBwYXJhbSB1c2VyRnVuYyB7RnVuY3Rpb259IGZuIHRoZSBmdW5jdGlvbiB0byBydW4gd2l0aCB3ZWIgd29ya2VyXG4qXG4qIEByZXR1cm5zIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHBhcmFtZXRlcnNcbiogdG8gYmUgcGFzc2VkIHRvIHRoZSBcInVzZXJGdW5jXCIgZnVuY3Rpb25cbiovXG5mdW5jdGlvbiBqb2JSdW5uZXIodXNlckZ1bmMpIHtcblx0cmV0dXJuIChlKSA9PiB7XG5cdFx0Y29uc3QgdXNlckZ1bmNBcmdzID0gZS5kYXRhWzBdO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodXNlckZ1bmMuYXBwbHkodm9pZCAwLCB1c2VyRnVuY0FyZ3MpKS50aGVuKChyZXN1bHQpID0+IHtcblx0XHRcdHBvc3RNZXNzYWdlKFtcIlNVQ0NFU1NcIiwgcmVzdWx0XSk7XG5cdFx0fSkuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRwb3N0TWVzc2FnZShbXCJFUlJPUlwiLCBlcnJvcl0pO1xuXHRcdH0pO1xuXHR9O1xufVxudmFyIGpvYlJ1bm5lcl9kZWZhdWx0ID0gam9iUnVubmVyO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9saWIvY3JlYXRlV29ya2VyQmxvYlVybC50c1xuLyoqXG4qIENvbnZlcnRzIHRoZSBcImZuXCIgZnVuY3Rpb24gaW50byB0aGUgc3ludGF4IG5lZWRlZCB0byBiZSBleGVjdXRlZCB3aXRoaW4gYSB3ZWIgd29ya2VyXG4qXG4qIEBwYXJhbSBmbiB0aGUgZnVuY3Rpb24gdG8gcnVuIHdpdGggd2ViIHdvcmtlclxuKiBAcGFyYW0gZGVwcyBhcnJheSBvZiBzdHJpbmdzLCBpbXBvcnRlZCBpbnRvIHRoZSB3b3JrZXIgdGhyb3VnaCBcImltcG9ydFNjcmlwdHNcIlxuKiBAcGFyYW0gbG9jYWxEZXBzIGFycmF5IG9mIGZ1bmN0aW9uLCBsb2NhbCBkZXBlbmRlbmNpZXNcbipcbiogQHJldHVybnMgYSBibG9iIHVybCwgY29udGFpbmluZyB0aGUgY29kZSBvZiBcImZuXCIgYXMgYSBzdHJpbmdcbipcbiogQGV4YW1wbGVcbiogY3JlYXRlV29ya2VyQmxvYlVybCgoYSxiKSA9PiBhK2IsIFtdKVxuKiAvLyByZXR1cm4gXCJvbm1lc3NhZ2U9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgoYSxiKSA9PiBhICsgYilcbiogLnRoZW4ocG9zdE1lc3NhZ2UoWydTVUNDRVNTJywgcmVzdWx0XSkpXG4qIC5jYXRjaChwb3N0TWVzc2FnZShbJ0VSUk9SJywgZXJyb3JdKVwiXG4qL1xuZnVuY3Rpb24gY3JlYXRlV29ya2VyQmxvYlVybChmbiwgZGVwcywgbG9jYWxEZXBzKSB7XG5cdGNvbnN0IGJsb2JDb2RlID0gYCR7ZGVwc1BhcnNlcl9kZWZhdWx0KGRlcHMsIGxvY2FsRGVwcyl9OyBvbm1lc3NhZ2U9KCR7am9iUnVubmVyX2RlZmF1bHR9KSgke2ZufSlgO1xuXHRjb25zdCBibG9iID0gbmV3IEJsb2IoW2Jsb2JDb2RlXSwgeyB0eXBlOiBcInRleHQvamF2YXNjcmlwdFwiIH0pO1xuXHRyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbn1cbnZhciBjcmVhdGVXb3JrZXJCbG9iVXJsX2RlZmF1bHQgPSBjcmVhdGVXb3JrZXJCbG9iVXJsO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9pbmRleC50c1xuLyoqXG4qIFJ1biBleHBlbnNpdmUgZnVuY3Rpb24gd2l0aG91dCBibG9ja2luZyB0aGUgVUksIHVzaW5nIGEgc2ltcGxlIHN5bnRheCB0aGF0IG1ha2VzIHVzZSBvZiBQcm9taXNlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXZWJXb3JrZXJGblxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VXZWJXb3JrZXJGbihmbiwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZGVwZW5kZW5jaWVzID0gW10sIGxvY2FsRGVwZW5kZW5jaWVzID0gW10sIHRpbWVvdXQsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCB3b3JrZXIgPSByZWYoKTtcblx0Y29uc3Qgd29ya2VyU3RhdHVzID0gc2hhbGxvd1JlZihcIlBFTkRJTkdcIik7XG5cdGNvbnN0IHByb21pc2UgPSByZWYoe30pO1xuXHRjb25zdCB0aW1lb3V0SWQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHdvcmtlclRlcm1pbmF0ZSA9IChzdGF0dXMgPSBcIlBFTkRJTkdcIikgPT4ge1xuXHRcdGlmICh3b3JrZXIudmFsdWUgJiYgd29ya2VyLnZhbHVlLl91cmwgJiYgd2luZG93JDEpIHtcblx0XHRcdHdvcmtlci52YWx1ZS50ZXJtaW5hdGUoKTtcblx0XHRcdFVSTC5yZXZva2VPYmplY3RVUkwod29ya2VyLnZhbHVlLl91cmwpO1xuXHRcdFx0cHJvbWlzZS52YWx1ZSA9IHt9O1xuXHRcdFx0d29ya2VyLnZhbHVlID0gdm9pZCAwO1xuXHRcdFx0d2luZG93JDEuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZC52YWx1ZSk7XG5cdFx0XHR3b3JrZXJTdGF0dXMudmFsdWUgPSBzdGF0dXM7XG5cdFx0fVxuXHR9O1xuXHR3b3JrZXJUZXJtaW5hdGUoKTtcblx0dHJ5T25TY29wZURpc3Bvc2Uod29ya2VyVGVybWluYXRlKTtcblx0Y29uc3QgZ2VuZXJhdGVXb3JrZXIgPSAoKSA9PiB7XG5cdFx0Y29uc3QgYmxvYlVybCA9IGNyZWF0ZVdvcmtlckJsb2JVcmxfZGVmYXVsdChmbiwgZGVwZW5kZW5jaWVzLCBsb2NhbERlcGVuZGVuY2llcyk7XG5cdFx0Y29uc3QgbmV3V29ya2VyID0gbmV3IFdvcmtlcihibG9iVXJsKTtcblx0XHRuZXdXb3JrZXIuX3VybCA9IGJsb2JVcmw7XG5cdFx0bmV3V29ya2VyLm9ubWVzc2FnZSA9IChlKSA9PiB7XG5cdFx0XHRjb25zdCB7IHJlc29sdmUgPSAoKSA9PiB7fSwgcmVqZWN0ID0gKCkgPT4ge30gfSA9IHByb21pc2UudmFsdWU7XG5cdFx0XHRjb25zdCBbc3RhdHVzLCByZXN1bHRdID0gZS5kYXRhO1xuXHRcdFx0c3dpdGNoIChzdGF0dXMpIHtcblx0XHRcdFx0Y2FzZSBcIlNVQ0NFU1NcIjpcblx0XHRcdFx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHRcdFx0d29ya2VyVGVybWluYXRlKHN0YXR1cyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0cmVqZWN0KHJlc3VsdCk7XG5cdFx0XHRcdFx0d29ya2VyVGVybWluYXRlKFwiRVJST1JcIik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRuZXdXb3JrZXIub25lcnJvciA9IChlKSA9PiB7XG5cdFx0XHRjb25zdCB7IHJlamVjdCA9ICgpID0+IHt9IH0gPSBwcm9taXNlLnZhbHVlO1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0cmVqZWN0KGUpO1xuXHRcdFx0d29ya2VyVGVybWluYXRlKFwiRVJST1JcIik7XG5cdFx0fTtcblx0XHRpZiAodGltZW91dCkgdGltZW91dElkLnZhbHVlID0gc2V0VGltZW91dCgoKSA9PiB3b3JrZXJUZXJtaW5hdGUoXCJUSU1FT1VUX0VYUElSRURcIiksIHRpbWVvdXQpO1xuXHRcdHJldHVybiBuZXdXb3JrZXI7XG5cdH07XG5cdGNvbnN0IGNhbGxXb3JrZXIgPSAoLi4uZm5BcmdzKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0dmFyIF93b3JrZXIkdmFsdWU7XG5cdFx0cHJvbWlzZS52YWx1ZSA9IHtcblx0XHRcdHJlc29sdmUsXG5cdFx0XHRyZWplY3Rcblx0XHR9O1xuXHRcdChfd29ya2VyJHZhbHVlID0gd29ya2VyLnZhbHVlKSA9PT0gbnVsbCB8fCBfd29ya2VyJHZhbHVlID09PSB2b2lkIDAgfHwgX3dvcmtlciR2YWx1ZS5wb3N0TWVzc2FnZShbWy4uLmZuQXJnc11dKTtcblx0XHR3b3JrZXJTdGF0dXMudmFsdWUgPSBcIlJVTk5JTkdcIjtcblx0fSk7XG5cdGNvbnN0IHdvcmtlckZuID0gKC4uLmZuQXJncykgPT4ge1xuXHRcdGlmICh3b3JrZXJTdGF0dXMudmFsdWUgPT09IFwiUlVOTklOR1wiKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiW3VzZVdlYldvcmtlckZuXSBZb3UgY2FuIG9ubHkgcnVuIG9uZSBpbnN0YW5jZSBvZiB0aGUgd29ya2VyIGF0IGEgdGltZS5cIik7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcblx0XHR9XG5cdFx0d29ya2VyLnZhbHVlID0gZ2VuZXJhdGVXb3JrZXIoKTtcblx0XHRyZXR1cm4gY2FsbFdvcmtlciguLi5mbkFyZ3MpO1xuXHR9O1xuXHRyZXR1cm4ge1xuXHRcdHdvcmtlckZuLFxuXHRcdHdvcmtlclN0YXR1cyxcblx0XHR3b3JrZXJUZXJtaW5hdGVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2luZG93Rm9jdXMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IHRyYWNrIHdpbmRvdyBmb2N1cyB3aXRoIGB3aW5kb3cub25mb2N1c2AgYW5kIGB3aW5kb3cub25ibHVyYC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlV2luZG93Rm9jdXNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VXaW5kb3dGb2N1cyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBmb2N1c2VkID0gc2hhbGxvd1JlZih3aW5kb3ckMS5kb2N1bWVudC5oYXNGb2N1cygpKTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiYmx1clwiLCAoKSA9PiB7XG5cdFx0Zm9jdXNlZC52YWx1ZSA9IGZhbHNlO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImZvY3VzXCIsICgpID0+IHtcblx0XHRmb2N1c2VkLnZhbHVlID0gdHJ1ZTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0cmV0dXJuIGZvY3VzZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdpbmRvd1Njcm9sbC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHdpbmRvdyBzY3JvbGwuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdpbmRvd1Njcm9sbFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVdpbmRvd1Njcm9sbChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywuLi5yZXN0IH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gdXNlU2Nyb2xsKHdpbmRvdyQxLCByZXN0KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2luZG93U2l6ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHdpbmRvdyBzaXplLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXaW5kb3dTaXplXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlV2luZG93U2l6ZShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaW5pdGlhbFdpZHRoID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBpbml0aWFsSGVpZ2h0ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBsaXN0ZW5PcmllbnRhdGlvbiA9IHRydWUsIGluY2x1ZGVTY3JvbGxiYXIgPSB0cnVlLCB0eXBlID0gXCJpbm5lclwiIH0gPSBvcHRpb25zO1xuXHRjb25zdCB3aWR0aCA9IHNoYWxsb3dSZWYoaW5pdGlhbFdpZHRoKTtcblx0Y29uc3QgaGVpZ2h0ID0gc2hhbGxvd1JlZihpbml0aWFsSGVpZ2h0KTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4ge1xuXHRcdGlmICh3aW5kb3ckMSkgaWYgKHR5cGUgPT09IFwib3V0ZXJcIikge1xuXHRcdFx0d2lkdGgudmFsdWUgPSB3aW5kb3ckMS5vdXRlcldpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gd2luZG93JDEub3V0ZXJIZWlnaHQ7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSBcInZpc3VhbFwiICYmIHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0KSB7XG5cdFx0XHRjb25zdCB7IHdpZHRoOiB2aXN1YWxWaWV3cG9ydFdpZHRoLCBoZWlnaHQ6IHZpc3VhbFZpZXdwb3J0SGVpZ2h0LCBzY2FsZSB9ID0gd2luZG93JDEudmlzdWFsVmlld3BvcnQ7XG5cdFx0XHR3aWR0aC52YWx1ZSA9IE1hdGgucm91bmQodmlzdWFsVmlld3BvcnRXaWR0aCAqIHNjYWxlKTtcblx0XHRcdGhlaWdodC52YWx1ZSA9IE1hdGgucm91bmQodmlzdWFsVmlld3BvcnRIZWlnaHQgKiBzY2FsZSk7XG5cdFx0fSBlbHNlIGlmIChpbmNsdWRlU2Nyb2xsYmFyKSB7XG5cdFx0XHR3aWR0aC52YWx1ZSA9IHdpbmRvdyQxLmlubmVyV2lkdGg7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSB3aW5kb3ckMS5pbm5lckhlaWdodDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2lkdGgudmFsdWUgPSB3aW5kb3ckMS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSB3aW5kb3ckMS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXHRcdH1cblx0fTtcblx0dXBkYXRlKCk7XG5cdHRyeU9uTW91bnRlZCh1cGRhdGUpO1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0dXNlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGlmICh3aW5kb3ckMSAmJiB0eXBlID09PSBcInZpc3VhbFwiICYmIHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0KSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0LCBcInJlc2l6ZVwiLCB1cGRhdGUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGlmIChsaXN0ZW5PcmllbnRhdGlvbikgd2F0Y2godXNlTWVkaWFRdWVyeShcIihvcmllbnRhdGlvbjogcG9ydHJhaXQpXCIpLCAoKSA9PiB1cGRhdGUoKSk7XG5cdHJldHVybiB7XG5cdFx0d2lkdGgsXG5cdFx0aGVpZ2h0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgRGVmYXVsdE1hZ2ljS2V5c0FsaWFzTWFwLCBTdG9yYWdlU2VyaWFsaXplcnMsIFRyYW5zaXRpb25QcmVzZXRzLCBhc3luY0NvbXB1dGVkLCBicmVha3BvaW50c0FudERlc2lnbiwgYnJlYWtwb2ludHNCb290c3RyYXBWNSwgYnJlYWtwb2ludHNFbGVtZW50LCBicmVha3BvaW50c01hc3RlckNzcywgYnJlYWtwb2ludHNQcmltZUZsZXgsIGJyZWFrcG9pbnRzUXVhc2FyLCBicmVha3BvaW50c1NlbWF0aWMsIGJyZWFrcG9pbnRzVGFpbHdpbmQsIGJyZWFrcG9pbnRzVnVldGlmeSwgYnJlYWtwb2ludHNWdWV0aWZ5VjIsIGJyZWFrcG9pbnRzVnVldGlmeVYzLCBjbG9uZUZuSlNPTiwgY29tcHV0ZWRBc3luYywgY29tcHV0ZWRJbmplY3QsIGNyZWF0ZUZldGNoLCBjcmVhdGVSZXVzYWJsZVRlbXBsYXRlLCBjcmVhdGVUZW1wbGF0ZVByb21pc2UsIGNyZWF0ZVVucmVmRm4sIGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUsIGRlZmF1bHREb2N1bWVudCwgZGVmYXVsdExvY2F0aW9uLCBkZWZhdWx0TmF2aWdhdG9yLCBkZWZhdWx0V2luZG93LCBleGVjdXRlVHJhbnNpdGlvbiwgZm9ybWF0VGltZUFnbywgZm9ybWF0VGltZUFnb0ludGwsIGZvcm1hdFRpbWVBZ29JbnRsUGFydHMsIGdldFNTUkhhbmRsZXIsIG1hcEdhbWVwYWRUb1hib3gzNjBDb250cm9sbGVyLCBvbkNsaWNrT3V0c2lkZSwgb25FbGVtZW50UmVtb3ZhbCwgb25LZXlEb3duLCBvbktleVByZXNzZWQsIG9uS2V5U3Ryb2tlLCBvbktleVVwLCBvbkxvbmdQcmVzcywgb25TdGFydFR5cGluZywgcHJvdmlkZVNTUldpZHRoLCBzZXRTU1JIYW5kbGVyLCB0ZW1wbGF0ZVJlZiwgdHJhbnNpdGlvbiwgdW5yZWZFbGVtZW50LCB1c2VBY3RpdmVFbGVtZW50LCB1c2VBbmltYXRlLCB1c2VBc3luY1F1ZXVlLCB1c2VBc3luY1N0YXRlLCB1c2VCYXNlNjQsIHVzZUJhdHRlcnksIHVzZUJsdWV0b290aCwgdXNlQnJlYWtwb2ludHMsIHVzZUJyb2FkY2FzdENoYW5uZWwsIHVzZUJyb3dzZXJMb2NhdGlvbiwgdXNlQ2FjaGVkLCB1c2VDbGlwYm9hcmQsIHVzZUNsaXBib2FyZEl0ZW1zLCB1c2VDbG9uZWQsIHVzZUNvbG9yTW9kZSwgdXNlQ29uZmlybURpYWxvZywgdXNlQ291bnRkb3duLCB1c2VDc3NTdXBwb3J0cywgdXNlQ3NzVmFyLCB1c2VDdXJyZW50RWxlbWVudCwgdXNlQ3ljbGVMaXN0LCB1c2VEYXJrLCB1c2VEZWJvdW5jZWRSZWZIaXN0b3J5LCB1c2VEZXZpY2VNb3Rpb24sIHVzZURldmljZU9yaWVudGF0aW9uLCB1c2VEZXZpY2VQaXhlbFJhdGlvLCB1c2VEZXZpY2VzTGlzdCwgdXNlRGlzcGxheU1lZGlhLCB1c2VEb2N1bWVudFZpc2liaWxpdHksIHVzZURyYWdnYWJsZSwgdXNlRHJvcFpvbmUsIHVzZUVsZW1lbnRCb3VuZGluZywgdXNlRWxlbWVudEJ5UG9pbnQsIHVzZUVsZW1lbnRIb3ZlciwgdXNlRWxlbWVudFNpemUsIHVzZUVsZW1lbnRWaXNpYmlsaXR5LCB1c2VFdmVudEJ1cywgdXNlRXZlbnRMaXN0ZW5lciwgdXNlRXZlbnRTb3VyY2UsIHVzZUV5ZURyb3BwZXIsIHVzZUZhdmljb24sIHVzZUZldGNoLCB1c2VGaWxlRGlhbG9nLCB1c2VGaWxlU3lzdGVtQWNjZXNzLCB1c2VGb2N1cywgdXNlRm9jdXNXaXRoaW4sIHVzZUZwcywgdXNlRnVsbHNjcmVlbiwgdXNlR2FtZXBhZCwgdXNlR2VvbG9jYXRpb24sIHVzZUlkbGUsIHVzZUltYWdlLCB1c2VJbmZpbml0ZVNjcm9sbCwgdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIsIHVzZUtleU1vZGlmaWVyLCB1c2VMb2NhbFN0b3JhZ2UsIHVzZU1hZ2ljS2V5cywgdXNlTWFudWFsUmVmSGlzdG9yeSwgdXNlTWVkaWFDb250cm9scywgdXNlTWVkaWFRdWVyeSwgdXNlTWVtb2l6ZSwgdXNlTWVtb3J5LCB1c2VNb3VudGVkLCB1c2VNb3VzZSwgdXNlTW91c2VJbkVsZW1lbnQsIHVzZU1vdXNlUHJlc3NlZCwgdXNlTXV0YXRpb25PYnNlcnZlciwgdXNlTmF2aWdhdG9yTGFuZ3VhZ2UsIHVzZU5ldHdvcmssIHVzZU5vdywgdXNlT2JqZWN0VXJsLCB1c2VPZmZzZXRQYWdpbmF0aW9uLCB1c2VPbmxpbmUsIHVzZVBhZ2VMZWF2ZSwgdXNlUGFyYWxsYXgsIHVzZVBhcmVudEVsZW1lbnQsIHVzZVBlcmZvcm1hbmNlT2JzZXJ2ZXIsIHVzZVBlcm1pc3Npb24sIHVzZVBvaW50ZXIsIHVzZVBvaW50ZXJMb2NrLCB1c2VQb2ludGVyU3dpcGUsIHVzZVByZWZlcnJlZENvbG9yU2NoZW1lLCB1c2VQcmVmZXJyZWRDb250cmFzdCwgdXNlUHJlZmVycmVkRGFyaywgdXNlUHJlZmVycmVkTGFuZ3VhZ2VzLCB1c2VQcmVmZXJyZWRSZWR1Y2VkTW90aW9uLCB1c2VQcmVmZXJyZWRSZWR1Y2VkVHJhbnNwYXJlbmN5LCB1c2VQcmV2aW91cywgdXNlUmFmRm4sIHVzZVJlZkhpc3RvcnksIHVzZVJlc2l6ZU9ic2VydmVyLCB1c2VTU1JXaWR0aCwgdXNlU2NyZWVuT3JpZW50YXRpb24sIHVzZVNjcmVlblNhZmVBcmVhLCB1c2VTY3JpcHRUYWcsIHVzZVNjcm9sbCwgdXNlU2Nyb2xsTG9jaywgdXNlU2Vzc2lvblN0b3JhZ2UsIHVzZVNoYXJlLCB1c2VTb3J0ZWQsIHVzZVNwZWVjaFJlY29nbml0aW9uLCB1c2VTcGVlY2hTeW50aGVzaXMsIHVzZVN0ZXBwZXIsIHVzZVN0b3JhZ2UsIHVzZVN0b3JhZ2VBc3luYywgdXNlU3R5bGVUYWcsIHVzZVN1cHBvcnRlZCwgdXNlU3dpcGUsIHVzZVRlbXBsYXRlUmVmc0xpc3QsIHVzZVRleHREaXJlY3Rpb24sIHVzZVRleHRTZWxlY3Rpb24sIHVzZVRleHRhcmVhQXV0b3NpemUsIHVzZVRocm90dGxlZFJlZkhpc3RvcnksIHVzZVRpbWVBZ28sIHVzZVRpbWVBZ29JbnRsLCB1c2VUaW1lb3V0UG9sbCwgdXNlVGltZXN0YW1wLCB1c2VUaXRsZSwgdXNlVHJhbnNpdGlvbiwgdXNlVXJsU2VhcmNoUGFyYW1zLCB1c2VVc2VyTWVkaWEsIHVzZVZNb2RlbCwgdXNlVk1vZGVscywgdXNlVmlicmF0ZSwgdXNlVmlydHVhbExpc3QsIHVzZVdha2VMb2NrLCB1c2VXZWJOb3RpZmljYXRpb24sIHVzZVdlYlNvY2tldCwgdXNlV2ViV29ya2VyLCB1c2VXZWJXb3JrZXJGbiwgdXNlV2luZG93Rm9jdXMsIHVzZVdpbmRvd1Njcm9sbCwgdXNlV2luZG93U2l6ZSB9OyIsImltcG9ydCB7IGJyZWFrcG9pbnRzVGFpbHdpbmQsIHVzZUJyZWFrcG9pbnRzIGFzIGNvcmVVc2VCcmVha3BvaW50cyB9IGZyb20gJ0B2dWV1c2UvY29yZSdcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJyZWFrcG9pbnRzKCkge1xuICAgIHJldHVybiBjb3JlVXNlQnJlYWtwb2ludHMoYnJlYWtwb2ludHNUYWlsd2luZClcbn1cbiIsImltcG9ydCB7IHJlZiwgdG9WYWx1ZSwgaXNSZWYsIGNvbXB1dGVkIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ3Z1ZSdcblxuZXhwb3J0IGludGVyZmFjZSBSR0Ige1xuICAgIHI6IG51bWJlclxuICAgIGc6IG51bWJlclxuICAgIGI6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJHQkEgZXh0ZW5kcyBSR0Ige1xuICAgIGE6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhTTCB7XG4gICAgaDogbnVtYmVyXG4gICAgczogbnVtYmVyXG4gICAgbDogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT0tMQ0gge1xuICAgIGw6IG51bWJlclxuICAgIGM6IG51bWJlclxuICAgIGg6IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjUkdCKGNvbG9yOiBzdHJpbmcpOiBSR0Ige1xuICAgIGNvbnN0IHJnYk1hdGNoID0gL3JnYmE/XFwoKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrKSg/OixcXHMqW1xcZC5dKyk/XFwpLy5leGVjKGNvbG9yKVxuXG4gICAgaWYgKCFyZ2JNYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUkdCIGNvbG9yIGZvcm1hdDogJyArIGNvbG9yKVxuICAgIH0gICAgXG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogcGFyc2VJbnQocmdiTWF0Y2hbMV0pLFxuICAgICAgICBnOiBwYXJzZUludChyZ2JNYXRjaFsyXSksXG4gICAgICAgIGI6IHBhcnNlSW50KHJnYk1hdGNoWzNdKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSR0JBKGNvbG9yOiBzdHJpbmcpOiBSR0JBIHtcbiAgICBjb25zdCByZ2JhTWF0Y2ggPSAvcmdiYVxcKChcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkKyksXFxzKihbXFxkLl0rKVxcKS8uZXhlYyhjb2xvcilcbiAgICBpZiAoIXJnYmFNYXRjaCkge1xuICAgICAgICAvLyBmYWxsYmFjayB0byByZ2Igd2l0aCBhbHBoYSAxXG4gICAgICAgIGNvbnN0IHJnYiA9IGV4dHJhY1JHQihjb2xvcilcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnJnYixcbiAgICAgICAgICAgIGE6IDEgXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogcGFyc2VJbnQocmdiYU1hdGNoWzFdKSxcbiAgICAgICAgZzogcGFyc2VJbnQocmdiYU1hdGNoWzJdKSxcbiAgICAgICAgYjogcGFyc2VJbnQocmdiYU1hdGNoWzNdKSxcbiAgICAgICAgYTogcGFyc2VGbG9hdChyZ2JhTWF0Y2hbNF0pXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9SR0IoaGV4OiBzdHJpbmcpOiBSR0Ige1xuICAgIGNvbnN0IGhleE1hdGNoID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGhleClcblxuICAgIGlmICghaGV4TWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEhFWCBjb2xvciBmb3JtYXQ6ICcgKyBoZXgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogcGFyc2VJbnQoaGV4TWF0Y2hbMV0sIDE2KSxcbiAgICAgICAgZzogcGFyc2VJbnQoaGV4TWF0Y2hbMl0sIDE2KSxcbiAgICAgICAgYjogcGFyc2VJbnQoaGV4TWF0Y2hbM10sIDE2KVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbFRvUmdiKGhzbDogc3RyaW5nKTogUkdCIHtcbiAgICBjb25zdCBoc2xNYXRjaCA9IC9oc2xhP1xcKChcXGQrKSxcXHMqKFxcZCspJSxcXHMqKFxcZCspJSg/OixcXHMqW1xcZC5dKyk/XFwpLy5leGVjKGhzbClcblxuICAgIGlmICghaHNsTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEhTTCBjb2xvciBmb3JtYXQ6ICcgKyBoc2wpXG4gICAgfVxuXG4gICAgY29uc3QgaCA9IHBhcnNlSW50KGhzbE1hdGNoWzFdKSAvIDM2MFxuICAgIGNvbnN0IHMgPSBwYXJzZUludChoc2xNYXRjaFsyXSkgLyAxMDBcbiAgICBjb25zdCBsID0gcGFyc2VJbnQoaHNsTWF0Y2hbM10pIC8gMTAwXG5cbiAgICBsZXQgcjogbnVtYmVyXG4gICAgbGV0IGc6IG51bWJlclxuICAgIGxldCBiOiBudW1iZXJcblxuICAgIGlmIChzID09PSAwKSB7XG4gICAgICAgIHIgPSBnID0gYiA9IGxcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBodWUycmdiID0gKHA6IG51bWJlciwgcTogbnVtYmVyLCB0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmICh0IDwgMCkgdCArPSAxXG4gICAgICAgICAgICBpZiAodCA+IDEpIHQgLT0gMVxuICAgICAgICAgICAgaWYgKHQgPCAxIC8gNikgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHRcbiAgICAgICAgICAgIGlmICh0IDwgMSAvIDIpIHJldHVybiBxXG4gICAgICAgICAgICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDZcbiAgICAgICAgICAgIHJldHVybiBwXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogc1xuICAgICAgICBjb25zdCBwID0gMiAqIGwgLSBxXG5cbiAgICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKVxuICAgICAgICBnID0gaHVlMnJnYihwLCBxLCBoKVxuICAgICAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMSAvIDMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogTWF0aC5yb3VuZChyICogMjU1KSxcbiAgICAgICAgZzogTWF0aC5yb3VuZChnICogMjU1KSxcbiAgICAgICAgYjogTWF0aC5yb3VuZChiICogMjU1KVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvSHNsKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBIU0wge1xuICAgIHIgLz0gMjU1XG4gICAgZyAvPSAyNTVcbiAgICBiIC89IDI1NVxuXG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYilcbiAgICBjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKVxuICAgIGNvbnN0IGwgPSAobWF4ICsgbWluKSAvIDJcblxuICAgIGlmIChtYXggPT09IG1pbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaDogMCxcbiAgICAgICAgICAgIHM6IDAsXG4gICAgICAgICAgICBsOiBNYXRoLnJvdW5kKGwgKiAxMDApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkID0gbWF4IC0gbWluXG4gICAgY29uc3QgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pXG4gICAgbGV0IGggPSAwXG5cbiAgICBzd2l0Y2ggKG1heCkge1xuICAgIGNhc2UgcjpcbiAgICAgICAgaCA9ICgoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKSkgKiA2MFxuICAgICAgICBicmVha1xuICAgIGNhc2UgZzpcbiAgICAgICAgaCA9ICgoYiAtIHIpIC8gZCArIDIpICogNjBcbiAgICAgICAgYnJlYWtcbiAgICBjYXNlIGI6XG4gICAgICAgIGggPSAoKHIgLSBnKSAvIGQgKyA0KSAqIDYwXG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgaDogTWF0aC5yb3VuZChoKSxcbiAgICAgICAgczogTWF0aC5yb3VuZChzICogMTAwKSxcbiAgICAgICAgbDogTWF0aC5yb3VuZChsICogMTAwKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvSGV4KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvSGV4ID0gKG46IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBoZXggPSBuLnRvU3RyaW5nKDE2KVxuICAgICAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PT0gMSA/ICcwJyArIGhleCA6IGhleFxuICAgIH1cblxuICAgIHJldHVybiBgIyR7dG9IZXgocil9JHt0b0hleChnKX0ke3RvSGV4KGIpfWBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYmFUb1N0cmluZyhyZ2JhOiBSR0JBKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJnYmEoJHtyZ2JhLnJ9LCAke3JnYmEuZ30sICR7cmdiYS5ifSwgJHtyZ2JhLmF9KWBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RPS0xDSChjb2xvcjogc3RyaW5nKTogT0tMQ0gge1xuICAgIGNvbnN0IG9rbGNoTWF0Y2ggPSAvb2tsY2hcXCgoW1xcZC5dKylcXHMrKFtcXGQuXSspXFxzKyhbXFxkLl0rKVxcKS8uZXhlYyhjb2xvcilcblxuICAgIGlmICghb2tsY2hNYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgT0tMQ0ggY29sb3IgZm9ybWF0OiAnICsgY29sb3IpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbDogcGFyc2VGbG9hdChva2xjaE1hdGNoWzFdKSxcbiAgICAgICAgYzogcGFyc2VGbG9hdChva2xjaE1hdGNoWzJdKSxcbiAgICAgICAgaDogcGFyc2VGbG9hdChva2xjaE1hdGNoWzNdKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9rbGNoVG9SZ2IoY29sb3I6IHN0cmluZyk6IFJHQiB7XG4gICAgY29uc3Qgb2tsY2ggPSBleHRyYWN0T0tMQ0goY29sb3IpXG4gICAgY29uc3QgeyBsLCBjLCBoIH0gPSBva2xjaFxuICAgIFxuICAgIGNvbnN0IGhSYWQgPSAoaCAqIE1hdGguUEkpIC8gMTgwXG4gICAgY29uc3QgYSA9IGMgKiBNYXRoLmNvcyhoUmFkKVxuICAgIGNvbnN0IGIgPSBjICogTWF0aC5zaW4oaFJhZClcbiAgICBcbiAgICBjb25zdCBsXyA9IGwgKyAwLjM5NjMzNzc3NzQgKiBhICsgMC4yMTU4MDM3NTczICogYlxuICAgIGNvbnN0IG1fID0gbCAtIDAuMTA1NTYxMzQ1OCAqIGEgLSAwLjA2Mzg1NDE3MjggKiBiXG4gICAgY29uc3Qgc18gPSBsIC0gMC4wODk0ODQxNzc1ICogYSAtIDEuMjkxNDg1NTQ4MCAqIGJcbiAgICBcbiAgICBjb25zdCBsMyA9IGxfICogbF8gKiBsX1xuICAgIGNvbnN0IG0zID0gbV8gKiBtXyAqIG1fXG4gICAgY29uc3QgczMgPSBzXyAqIHNfICogc19cbiAgICBcbiAgICBsZXQgciA9ICs0LjA3Njc0MTY2MjEgKiBsMyAtIDMuMzA3NzExNTkxMyAqIG0zICsgMC4yMzA5Njk5MjkyICogczNcbiAgICBsZXQgZyA9IC0xLjI2ODQzODAwNDYgKiBsMyArIDIuNjA5NzU3NDAxMSAqIG0zIC0gMC4zNDEzMTkzOTY1ICogczNcbiAgICBsZXQgYmx1ZSA9IC0wLjAwNDE5NjA4NjMgKiBsMyAtIDAuNzAzNDE4NjE0NyAqIG0zICsgMS43MDc2MTQ3MDEwICogczNcbiAgICBcbiAgICBjb25zdCBnYW1tYUNvcnJlY3QgPSAodmFsOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICBpZiAodmFsID49IDAuMDAzMTMwOCkge1xuICAgICAgICAgICAgcmV0dXJuIDEuMDU1ICogTWF0aC5wb3codmFsLCAxIC8gMi40KSAtIDAuMDU1XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiAxMi45MiAqIHZhbFxuICAgIH1cbiAgICBcbiAgICByID0gZ2FtbWFDb3JyZWN0KHIpXG4gICAgZyA9IGdhbW1hQ29ycmVjdChnKVxuICAgIGJsdWUgPSBnYW1tYUNvcnJlY3QoYmx1ZSlcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgICByOiBNYXRoLnJvdW5kKE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHIpKSAqIDI1NSksXG4gICAgICAgIGc6IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgZykpICogMjU1KSxcbiAgICAgICAgYjogTWF0aC5yb3VuZChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBibHVlKSkgKiAyNTUpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiVG9Pa2xjaChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogT0tMQ0gge1xuICAgIHIgPSByIC8gMjU1XG4gICAgZyA9IGcgLyAyNTVcbiAgICBiID0gYiAvIDI1NVxuICAgIFxuICAgIGNvbnN0IGdhbW1hRXhwYW5kID0gKHZhbDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgaWYgKHZhbCA+PSAwLjA0MDQ1KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5wb3coKHZhbCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiB2YWwgLyAxMi45MlxuICAgIH1cbiAgICBcbiAgICByID0gZ2FtbWFFeHBhbmQocilcbiAgICBnID0gZ2FtbWFFeHBhbmQoZylcbiAgICBiID0gZ2FtbWFFeHBhbmQoYilcbiAgICBcbiAgICBjb25zdCBsID0gMC40MTIyMjE0NzA4ICogciArIDAuNTM2MzMyNTM2MyAqIGcgKyAwLjA1MTQ0NTk5MjkgKiBiXG4gICAgY29uc3QgbSA9IDAuMjExOTAzNDk4MiAqIHIgKyAwLjY4MDY5OTU0NTEgKiBnICsgMC4xMDczOTY5NTY2ICogYlxuICAgIGNvbnN0IHMgPSAwLjA4ODMwMjQ2MTkgKiByICsgMC4yODE3MTg4Mzc2ICogZyArIDAuNjI5OTc4NzAwNSAqIGJcbiAgICBcbiAgICBjb25zdCBsXyA9IE1hdGguY2JydChsKVxuICAgIGNvbnN0IG1fID0gTWF0aC5jYnJ0KG0pXG4gICAgY29uc3Qgc18gPSBNYXRoLmNicnQocylcbiAgICBcbiAgICBjb25zdCBMID0gMC4yMTA0NTQyNTUzICogbF8gKyAwLjc5MzYxNzc4NTAgKiBtXyAtIDAuMDA0MDcyMDQ2OCAqIHNfXG4gICAgY29uc3QgYSA9IDEuOTc3OTk4NDk1MSAqIGxfIC0gMi40Mjg1OTIyMDUwICogbV8gKyAwLjQ1MDU5MzcwOTkgKiBzX1xuICAgIGNvbnN0IGJfID0gMC4wMjU5MDQwMzcxICogbF8gKyAwLjc4Mjc3MTc2NjIgKiBtXyAtIDAuODA4Njc1NzY2MCAqIHNfXG4gICAgXG4gICAgY29uc3QgQyA9IE1hdGguc3FydChhICogYSArIGJfICogYl8pXG4gICAgbGV0IEggPSBNYXRoLmF0YW4yKGJfLCBhKSAqICgxODAgLyBNYXRoLlBJKVxuICAgIFxuICAgIGlmIChIIDwgMCkge1xuICAgICAgICBIICs9IDM2MFxuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgICBsOiBNYXRoLnJvdW5kKEwgKiAxMDAwKSAvIDEwMDAsXG4gICAgICAgIGM6IE1hdGgucm91bmQoQyAqIDEwMDApIC8gMTAwMCxcbiAgICAgICAgaDogTWF0aC5yb3VuZChIICogMTAwMCkgLyAxMDAwXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29sb3JUeXBlKHBheWxvYWQ/OiBNYXliZVJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPikge1xuICAgIGNvbnN0IGNvbG9yID0gaXNSZWYocGF5bG9hZCkgPyBwYXlsb2FkIDogcmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KHRvVmFsdWUocGF5bG9hZCkpXG4gICAgXG4gICAgcmV0dXJuIGNvbXB1dGVkPHN0cmluZyB8IG51bGw+KHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgaWYgKCFjb2xvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb2xvci52YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hleCdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9ecmdiYS8udGVzdChjb2xvci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JnYmEnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvXnJnYi8udGVzdChjb2xvci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JnYidcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9eb2tsY2gvLnRlc3QoY29sb3IudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdva2xjaCdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9eaHNsYS8udGVzdChjb2xvci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hzbGEnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvXmhzbC8udGVzdChjb2xvci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hzbCdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICd1bmtub3duJ1xuICAgICAgICB9LFxuICAgICAgICBzZXQodHlwZSkge1xuICAgICAgICAgICAgaWYgKCFjb2xvci52YWx1ZSB8fCAhdHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UmdiID0gdXNlUkdCKGNvbG9yKS52YWx1ZVxuXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRSZ2IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdoZXgnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSByZ2JUb0hleChjdXJyZW50UmdiLnIsIGN1cnJlbnRSZ2IuZywgY3VycmVudFJnYi5iKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGByZ2IoJHtjdXJyZW50UmdiLnJ9LCAke2N1cnJlbnRSZ2IuZ30sICR7Y3VycmVudFJnYi5ifSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAncmdiYScpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGByZ2JhKCR7Y3VycmVudFJnYi5yfSwgJHtjdXJyZW50UmdiLmd9LCAke2N1cnJlbnRSZ2IuYn0sIDEpYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2hzbCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoc2wgPSByZ2JUb0hzbChjdXJyZW50UmdiLnIsIGN1cnJlbnRSZ2IuZywgY3VycmVudFJnYi5iKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYGhzbCgke2hzbC5ofSwgJHtoc2wuc30lLCAke2hzbC5sfSUpYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2hzbGEnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaHNsID0gcmdiVG9Ic2woY3VycmVudFJnYi5yLCBjdXJyZW50UmdiLmcsIGN1cnJlbnRSZ2IuYilcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGBoc2xhKCR7aHNsLmh9LCAke2hzbC5zfSUsICR7aHNsLmx9JSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnb2tsY2gnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2tsY2ggPSByZ2JUb09rbGNoKGN1cnJlbnRSZ2IuciwgY3VycmVudFJnYi5nLCBjdXJyZW50UmdiLmIpXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgb2tsY2goJHtva2xjaC5sfSAke29rbGNoLmN9ICR7b2tsY2guaH0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJHQihwYXlsb2FkPzogTWF5YmVSZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjb2xvciA9IGlzUmVmKHBheWxvYWQpID8gcGF5bG9hZCA6IHJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPih0b1ZhbHVlKHBheWxvYWQpKVxuICAgIFxuICAgIGNvbnN0IHR5cGUgPSB1c2VDb2xvclR5cGUoY29sb3IpXG5cbiAgICByZXR1cm4gY29tcHV0ZWQ8UkdCIHwgbnVsbD4oe1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBpZiAoIWNvbG9yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2JhJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJnYmEgPSBleHRyYWN0UkdCQShjb2xvci52YWx1ZSlcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHI6IHJnYmEucixcbiAgICAgICAgICAgICAgICAgICAgZzogcmdiYS5nLFxuICAgICAgICAgICAgICAgICAgICBiOiByZ2JhLmIgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjUkdCKGNvbG9yLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ2hleCcgJiYgY29sb3IudmFsdWUubGVuZ3RoID09PSA3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhleFRvUkdCKGNvbG9yLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ2hzbCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHNsVG9SZ2IoY29sb3IudmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAnb2tsY2gnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9rbGNoVG9SZ2IoY29sb3IudmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHNldCgpe1xuICAgICAgICAgICAgaWYgKCFjb2xvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2IgPSBleHRyYWNSR0IoY29sb3IudmFsdWUpXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiKCR7cmdiLnJ9LCAke3JnYi5nfSwgJHtyZ2IuYn0pYFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2JhJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJnYmEgPSBleHRyYWN0UkdCQShjb2xvci52YWx1ZSlcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGByZ2JhKCR7cmdiYS5yfSwgJHtyZ2JhLmd9LCAke3JnYmEuYn0sICR7cmdiYS5hfSlgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUkdCQShwYXlsb2FkPzogTWF5YmVSZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjb2xvciA9IGlzUmVmKHBheWxvYWQpID8gcGF5bG9hZCA6IHJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPih0b1ZhbHVlKHBheWxvYWQpKVxuICAgIFxuICAgIGNvbnN0IHR5cGUgPSB1c2VDb2xvclR5cGUoY29sb3IpXG4gICAgY29uc3QgcmdiID0gdXNlUkdCKGNvbG9yKVxuXG4gICAgcmV0dXJuIGNvbXB1dGVkPFJHQkEgfCBudWxsPih7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGlmICghcmdiLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2JhJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHRyYWN0UkdCQShjb2xvci52YWx1ZSEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucmdiLnZhbHVlLFxuICAgICAgICAgICAgICAgIGE6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlIHx8ICFjb2xvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYmEnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiYSgke3ZhbHVlLnJ9LCAke3ZhbHVlLmd9LCAke3ZhbHVlLmJ9LCAke3ZhbHVlLmF9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2InKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiKCR7dmFsdWUucn0sICR7dmFsdWUuZ30sICR7dmFsdWUuYn0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUhTTChwYXlsb2FkPzogTWF5YmVSZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjb2xvciA9IGlzUmVmKHBheWxvYWQpID8gcGF5bG9hZCA6IHJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPih0b1ZhbHVlKHBheWxvYWQpKVxuICAgIFxuICAgIGNvbnN0IHR5cGUgPSB1c2VDb2xvclR5cGUoY29sb3IpXG4gICAgY29uc3QgcmdiID0gdXNlUkdCKGNvbG9yKVxuXG4gICAgcmV0dXJuIGNvbXB1dGVkPEhTTCB8IG51bGw+KHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgaWYgKCFyZ2IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmdiVG9Ic2wocmdiLnZhbHVlLnIsIHJnYi52YWx1ZS5nLCByZ2IudmFsdWUuYilcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlIHx8ICFjb2xvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ2hzbCcpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGBoc2woJHt2YWx1ZS5ofSwgJHt2YWx1ZS5zfSUsICR7dmFsdWUubH0lKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoc2xhJykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYGhzbGEoJHt2YWx1ZS5ofSwgJHt2YWx1ZS5zfSUsICR7dmFsdWUubH0lKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoZXgnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmdiID0gaHNsVG9SZ2IoYGhzbCgke3ZhbHVlLmh9LCAke3ZhbHVlLnN9JSwgJHt2YWx1ZS5sfSUpYClcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IHJnYlRvSGV4KHJnYi5yLCByZ2IuZywgcmdiLmIpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiYScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2IgPSBoc2xUb1JnYihgaHNsKCR7dmFsdWUuaH0sICR7dmFsdWUuc30lLCAke3ZhbHVlLmx9JSlgKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYmEoJHtyZ2Iucn0sICR7cmdiLmd9LCAke3JnYi5ifSwgMSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJnYiA9IGhzbFRvUmdiKGBoc2woJHt2YWx1ZS5ofSwgJHt2YWx1ZS5zfSUsICR7dmFsdWUubH0lKWApXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiKCR7cmdiLnJ9LCAke3JnYi5nfSwgJHtyZ2IuYn0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ29rbGNoJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJnYiA9IGhzbFRvUmdiKGBoc2woJHt2YWx1ZS5ofSwgJHt2YWx1ZS5zfSUsICR7dmFsdWUubH0lKWApXG4gICAgICAgICAgICAgICAgY29uc3Qgb2tsY2ggPSByZ2JUb09rbGNoKHJnYi5yLCByZ2IuZywgcmdiLmIpXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgb2tsY2goJHtva2xjaC5sfSAke29rbGNoLmN9ICR7b2tsY2guaH0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUhleChwYXlsb2FkPzogTWF5YmVSZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjb2xvciA9IGlzUmVmKHBheWxvYWQpID8gcGF5bG9hZCA6IHJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPih0b1ZhbHVlKHBheWxvYWQpKVxuICAgIFxuICAgIGNvbnN0IHR5cGUgPSB1c2VDb2xvclR5cGUoY29sb3IpXG4gICAgY29uc3QgcmdiID0gdXNlUkdCKGNvbG9yKVxuXG4gICAgcmV0dXJuIGNvbXB1dGVkPHN0cmluZyB8IG51bGw+KHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgaWYgKCFyZ2IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmdiVG9IZXgocmdiLnZhbHVlLnIsIHJnYi52YWx1ZS5nLCByZ2IudmFsdWUuYilcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAnaGV4Jykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gdmFsdWUuc3RhcnRzV2l0aCgnIycpID8gdmFsdWUgOiBgIyR7dmFsdWV9YFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29sb3IocGF5bG9hZD86IE1heWJlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBpc1JlZihwYXlsb2FkKSA/IHBheWxvYWQgOiByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odG9WYWx1ZShwYXlsb2FkKSkgICAgXG4gICAgY29uc3QgdHlwZSA9IHVzZUNvbG9yVHlwZShjb2xvcilcbiAgICBjb25zdCBoZXggPSB1c2VIZXgoY29sb3IpXG4gICAgY29uc3QgcmdiID0gdXNlUkdCKGNvbG9yKVxuICAgIGNvbnN0IHJnYmEgPSB1c2VSR0JBKGNvbG9yKVxuICAgIGNvbnN0IGhzbCA9IHVzZUhTTChjb2xvcilcblxuICAgIFxuICAgIGNvbnN0IG9rbGNoID0gY29tcHV0ZWQ8T0tMQ0ggfCBudWxsPih7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGlmICghcmdiLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJnYlRvT2tsY2gocmdiLnZhbHVlLnIsIHJnYi52YWx1ZS5nLCByZ2IudmFsdWUuYilcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAnb2tsY2gnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgb2tsY2goJHt2YWx1ZS5sfSAke3ZhbHVlLmN9ICR7dmFsdWUuaH0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZ2IgPSBva2xjaFRvUmdiKGBva2xjaCgke3ZhbHVlLmx9ICR7dmFsdWUuY30gJHt2YWx1ZS5ofSlgKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ2hleCcpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IHJnYlRvSGV4KHJnYi5yLCByZ2IuZywgcmdiLmIpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiJykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYigke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBjb2xvcixcbiAgICAgICAgaGV4LFxuICAgICAgICByZ2IsXG4gICAgICAgIGhzbCxcbiAgICAgICAgb2tsY2gsXG4gICAgICAgIHJnYmFcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBpbmplY3QsIHByb3ZpZGUgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIERhc2hib2FyZEVudGl0eSBmcm9tICcjY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZC50cydcblxuY29uc3QgREFTSEJPQVJEX0tFWSA9IFN5bWJvbCgnZGFzaGJvYXJkJylcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYXNoYm9hcmQoZW50aXR5OiBSZWY8RGFzaGJvYXJkRW50aXR5Pikge1xuICAgIHByb3ZpZGUoREFTSEJPQVJEX0tFWSwgZW50aXR5KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRGFzaGJvYXJkKCkge1xuICAgIGNvbnN0IGVudGl0eSA9IGluamVjdDxSZWY8RGFzaGJvYXJkRW50aXR5IHwgdW5kZWZpbmVkPj4oREFTSEJPQVJEX0tFWSlcblxuICAgIGlmICghZW50aXR5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlRGFzaGJvYXJkIG11c3QgYmUgdXNlZCBpbnNpZGUgYSBjb21wb25lbnQgdGhhdCBjYWxscyBwcm92aWRlRGFzaGJvYXJkJylcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5IGFzIFJlZjxEYXNoYm9hcmRFbnRpdHk+XG59XG4iLCJpbXBvcnQgeyBpbmplY3QsIHByb3ZpZGUgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIERhc2hib2FyZFdpZGdldCBmcm9tICcjY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldC50cydcblxuY29uc3QgS0VZID0gU3ltYm9sKCdkYXNoYm9hcmQtd2lkZ2V0JylcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYXNoYm9hcmRXaWRnZXQoZW50aXR5OiBSZWY8RGFzaGJvYXJkV2lkZ2V0Pikge1xuICAgIHByb3ZpZGUoS0VZLCBlbnRpdHkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXNoYm9hcmRXaWRnZXQoKSB7XG4gICAgY29uc3QgZW50aXR5ID0gaW5qZWN0KEtFWSlcblxuICAgIGlmICghZW50aXR5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlRGFzaGJvYXJkV2lkZ2V0IG11c3QgYmUgdXNlZCBpbnNpZGUgYSBjb21wb25lbnQgdGhhdCBjYWxscyBwcm92aWRlRGFzaGJvYXJkV2lkZ2V0JylcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5IGFzIFJlZjxEYXNoYm9hcmRXaWRnZXQ+XG59XG4iLCJpbXBvcnQgeyByZWYsIHdhdGNoIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBkaSBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZVN0YXRlT3B0aW9ucyB7XG4gICAgZGVmYXVsdD86ICgpID0+IGFueVxuICAgIHRyYW5zZm9ybT86ICh2YWx1ZTogYW55KSA9PiBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0YXRlPFQ+KGtleTogc3RyaW5nLCBvcHRpb25zPzogVXNlU3RhdGVPcHRpb25zKTogUmVmPFQ+IHtcbiAgICBjb25zdCByZWZzID0gZGkuZ2V0PFJlY29yZDxzdHJpbmcsIGFueT4+KCdzdGF0ZScpXG5cbiAgICBsZXQgdmFsdWUgPSByZWZzW2tleV1cblxuICAgIGlmICghdmFsdWUgJiYgb3B0aW9ucz8uZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlID0gb3B0aW9ucy5kZWZhdWx0KClcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgJiYgb3B0aW9ucz8udHJhbnNmb3JtKSB7XG4gICAgICAgIHZhbHVlID0gb3B0aW9ucy50cmFuc2Zvcm0odmFsdWUpXG4gICAgfVxuICAgIFxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICBjb25zdCBzdGF0ZSA9IHJlZjxUPih2YWx1ZSlcblxuICAgIGNvbnN0IHVwZGF0ZSA9IChuZXdWYWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHJlZnNba2V5XSA9IG5ld1ZhbHVlXG4gICAgICAgIFxuICAgICAgICBkaS5zZXQoJ3N0YXRlJywgcmVmcylcbiAgICB9XG4gICAgXG4gICAgd2F0Y2goc3RhdGUsIHVwZGF0ZSwgeyBkZWVwOiB0cnVlIH0pXG5cbiAgICAvLyBMb2dpYyB0byBpbml0aWFsaXplIGFuZCBtYW5hZ2Ugc3RhdGVcbiAgICByZXR1cm4gY29tcHV0ZWQ8VD4oe1xuICAgICAgICBnZXQ6ICgpID0+IHN0YXRlLnZhbHVlLFxuICAgICAgICBzZXQ6IChuZXdWYWx1ZTogVCkgPT4ge1xuICAgICAgICAgICAgc3RhdGUudmFsdWUgPSBuZXdWYWx1ZVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB1cGRhdGUobmV3VmFsdWUpXG4gICAgICAgIH1cbiAgICB9KVxufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiwgdG9SZWYsIHdhdGNoIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBNYXliZVJlZiwgUmVmIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgd2F0Y2hEZWJvdW5jZWQgfSBmcm9tICdAdnVldXNlL2NvcmUnXG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJy4vdXNlU3RhdGUudHMnXG5pbXBvcnQgdHlwZSBQYWdpbmF0aW9uIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvUGFnaW5hdGlvbkVudGl0eS50cydcbmltcG9ydCAkZmV0Y2ggZnJvbSAnI2NsaWVudC9mYWNhZGVzL2ZldGNoZXIudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRmV0Y2hQYWdpbmF0aW9uT3B0aW9ucyB7XG4gICAga2V5Pzogc3RyaW5nXG4gICAgcXVlcnk/OiBNYXliZVJlZjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgIHBhZ2U/OiBNYXliZVJlZjxudW1iZXI+XG4gICAgc2VyaWFsaXplPzogKGl0ZW06IGFueSkgPT4gYW55XG4gICAgcmVmaW5lPzogKGl0ZW1zOiBhbnlbXSkgPT4gYW55W11cbiAgICBsaW1pdD86IG51bWJlclxuICAgIG9yZGVyQnk/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGxcbiAgICBvcmRlckRpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnIHwgKCdhc2MnIHwgJ2Rlc2MnKVtdIHwgbnVsbFxuICAgIGRlYm91bmNlPzogbnVtYmVyXG4gICAgaW1tZWRpYXRlPzogYm9vbGVhblxufVxuXG5jb25zdCBoeWRyYXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VGZXRjaFBhZ2luYXRpb248VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IFVzZUZldGNoUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5IHx8IHVybFxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSB1c2VTdGF0ZTxQYWdpbmF0aW9uPihrZXksIHtcbiAgICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgICB0b3RhbDogMCxcbiAgICAgICAgICAgIHRvdGFsX3BhZ2VzOiAxLFxuICAgICAgICB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBsb2FkaW5nID0gcmVmKGZhbHNlKVxuXG4gICAgY29uc3QgcGFnZSA9IHRvUmVmKG9wdGlvbnMucGFnZSB8fCAxKSBhcyBSZWY8bnVtYmVyPlxuICAgIGNvbnN0IHF1ZXJ5ID0gdG9SZWYob3B0aW9ucy5xdWVyeSB8fCB7fSkgYXMgUmVmPFJlY29yZDxzdHJpbmcsIGFueT4+XG4gICAgY29uc3QgbGltaXQgPSB0b1JlZihvcHRpb25zLmxpbWl0IHx8IDEwKSBhcyBSZWY8bnVtYmVyPlxuICAgIGNvbnN0IG9yZGVyQnkgPSB0b1JlZihvcHRpb25zLm9yZGVyQnkgfHwgbnVsbCkgYXMgUmVmPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5cbiAgICBjb25zdCBvcmRlckRpcmVjdGlvbiA9IHRvUmVmKG9wdGlvbnMub3JkZXJEaXJlY3Rpb24gfHwgbnVsbCkgYXMgUmVmPCdhc2MnIHwgJ2Rlc2MnIHwgKCdhc2MnIHwgJ2Rlc2MnKVtdIHwgbnVsbD5cblxuICAgIGNvbnN0IHRvdGFsID0gY29tcHV0ZWQoKCkgPT4gcmVzcG9uc2UudmFsdWUudG90YWwpXG4gICAgY29uc3QgdG90YWxQYWdlcyA9IGNvbXB1dGVkKCgpID0+IHJlc3BvbnNlLnZhbHVlLnRvdGFsX3BhZ2VzKVxuICAgIGNvbnN0IGl0ZW1zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBsZXQgaXRlbXMgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlLml0ZW1zKSA/IHJlc3BvbnNlLnZhbHVlLml0ZW1zIDogW11cblxuICAgICAgICBpZiAob3B0aW9ucy5yZWZpbmUpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gb3B0aW9ucy5yZWZpbmUoaXRlbXMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5zZXJpYWxpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtcy5tYXAoaSA9PiBvcHRpb25zLnNlcmlhbGl6ZSEoaSkpIGFzIFRbXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zIGFzIFRbXVxuICAgIH0pXG5cbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkKCkge1xuICAgICAgICBpZiAobG9hZGluZy52YWx1ZSkgcmV0dXJuXG5cbiAgICAgICAgbG9hZGluZy52YWx1ZSA9IHRydWVcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIC4uLnF1ZXJ5LnZhbHVlLFxuICAgICAgICAgICAgcGFnZTogcGFnZS52YWx1ZSxcbiAgICAgICAgICAgIGxpbWl0OiBsaW1pdC52YWx1ZSxcbiAgICAgICAgICAgIG9yZGVyQnk6IG9yZGVyQnkudmFsdWUgPyBvcmRlckJ5LnZhbHVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3JkZXJEaXJlY3Rpb246IG9yZGVyRGlyZWN0aW9uLnZhbHVlID8gb3JkZXJEaXJlY3Rpb24udmFsdWUgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0XSA9IGF3YWl0ICRmZXRjaC50cnk8UGFnaW5hdGlvbj4odXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcXVlcnk6IHBhcmFtc1xuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICByZXNwb25zZS52YWx1ZSA9IHJlc3VsdFxuXG4gICAgICAgIGlmIChpbXBvcnQubWV0YS5lbnYuU1NSKSB7XG4gICAgICAgICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDgwMCkpXG5cbiAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlXG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgIGlmIChwYWdlLnZhbHVlID09PSAxKSB7XG4gICAgICAgICAgICBhd2FpdCBsb2FkKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcGFnZS52YWx1ZSA9IDFcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblF1ZXJ5Q2hhbmdlKG5ld0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sIG9sZERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgY29uc3QgaXNFcXVhbCA9IEpTT04uc3RyaW5naWZ5KG5ld0RhdGEpID09PSBKU09OLnN0cmluZ2lmeShvbGREYXRhKVxuXG4gICAgICAgIGlmICghaXNFcXVhbCkge1xuICAgICAgICAgICAgcmVzZXQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2F0Y2goW3BhZ2UsIGxpbWl0XSwgbG9hZClcbiAgICB3YXRjaChbb3JkZXJCeSwgb3JkZXJEaXJlY3Rpb25dLCByZXNldCwgeyBkZWVwOiB0cnVlIH0pXG5cbiAgICB3YXRjaERlYm91bmNlZChcbiAgICAgICAgKCkgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShxdWVyeS52YWx1ZSkpLFxuICAgICAgICBvblF1ZXJ5Q2hhbmdlLFxuICAgICAgICB7XG4gICAgICAgICAgICBkZWJvdW5jZTogb3B0aW9ucy5kZWJvdW5jZSB8fCAxMDAwXG4gICAgICAgIH1cbiAgICApXG5cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGUoKSB7XG4gICAgICAgIGlmICghaHlkcmF0ZWQuaGFzKGtleSkgJiYgaXRlbXMudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBoeWRyYXRlZC5hZGQoa2V5KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBoeWRyYXRlZC5hZGQoa2V5KVxuXG4gICAgICAgIGF3YWl0IGxvYWQoKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHBhZ2UsXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBvcmRlckJ5LFxuICAgICAgICBvcmRlckRpcmVjdGlvbixcbiAgICAgICAgdG90YWwsXG4gICAgICAgIHRvdGFsUGFnZXMsXG4gICAgICAgIGl0ZW1zLFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgICBsb2FkLFxuICAgICAgICByZXNldCxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGh5ZHJhdGVcbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0eXBlIFZhbGlib3RPYmplY3RTY2hlbWEsIHR5cGUgVmFsaWJvdFNjaGVtYSwgdHlwZSBWYWxpZGF0ZVBheWxvYWQsIHR5cGUgVmFsaWRhdG9yUmVzdWx0IH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cyc7XG5pbXBvcnQgeyB0b1R5cGVkU2NoZW1hIGFzICB2ZWVWYWxpZGF0ZVRvVHlwZWRTY2hlbWEgfSBmcm9tICdAdmVlLXZhbGlkYXRlL3ZhbGlib3QnO1xuaW1wb3J0IHsgdXNlRm9ybSBhcyB1c2VWZWVWYWxpZGF0ZUZvcm0sIHR5cGUgRm9ybUNvbnRleHQsIHR5cGUgRm9ybU9wdGlvbnMsIHR5cGUgR2VuZXJpY09iamVjdCB9IGZyb20gJ3ZlZS12YWxpZGF0ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWJvdEZvcm1PcHRpb25zPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hID0gVmFsaWJvdFNjaGVtYT4gXG4gICAgZXh0ZW5kcyBPbWl0PEZvcm1PcHRpb25zPFZhbGlkYXRlUGF5bG9hZDxUPiwgVmFsaWRhdG9yUmVzdWx0PFQ+PiwgJ3ZhbGlkYXRpb25TY2hlbWEnPiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlib3RGb3JtUmVzdWx0T2JqZWN0PFQgZXh0ZW5kcyBWYWxpYm90T2JqZWN0U2NoZW1hPlxuICAgIGV4dGVuZHMgR2VuZXJpY09iamVjdCxcbiAgICBGb3JtQ29udGV4dDxWYWxpZGF0b3JSZXN1bHQ8VD4+XG4gICAge31cblxuZXhwb3J0IGNvbnN0IHVzZUZvcm0gPSB1c2VWYWxpYm90Rm9ybTtcblxuZXhwb3J0IGNvbnN0IHRvVHlwZWRTY2hlbWEgPSB2ZWVWYWxpZGF0ZVRvVHlwZWRTY2hlbWE7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VWYWxpYm90Rm9ybTxUIGV4dGVuZHMgVmFsaWJvdE9iamVjdFNjaGVtYSA9IFZhbGlib3RPYmplY3RTY2hlbWE+KHNjaGVtYTogVCwgb3B0aW9uczogVmFsaWJvdEZvcm1PcHRpb25zPFQ+ID0ge30pOiBGb3JtQ29udGV4dDxWYWxpZGF0b3JSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gdXNlVmVlVmFsaWRhdGVGb3JtKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgdmFsaWRhdGlvblNjaGVtYTogdmVlVmFsaWRhdGVUb1R5cGVkU2NoZW1hKHNjaGVtYSBhcyBhbnkpLFxuICAgIH0pIGFzIGFueVxufVxuIiwiaW1wb3J0IExheW91dE1hbmFnZXIgZnJvbSBcIiNjbGllbnQvc2VydmljZXMvTGF5b3V0U2VydmljZS50c1wiO1xuXG5jb25zdCBnID0gZ2xvYmFsVGhpcyBhcyBhbnlcblxuY29uc3QgbGF5b3V0ID0gZy5sYXlvdXQgfHwgbmV3IExheW91dE1hbmFnZXIoKVxuXG5nLmxheW91dCA9IGxheW91dFxuXG5leHBvcnQgZGVmYXVsdCBsYXlvdXRcbiIsImltcG9ydCBlbW1pdHRlciBmcm9tIFwiI2NsaWVudC9mYWNhZGVzL2VtbWl0dGVyLnRzXCJcbmltcG9ydCBsYXlvdXQgZnJvbSBcIiNjbGllbnQvZmFjYWRlcy9sYXlvdXQudHNcIlxuaW1wb3J0IHsgcmVmIH0gZnJvbSBcInZ1ZVwiXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VMYXlvdXRPcHRpb25zKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSByZWYobGF5b3V0LmdldE9wdGlvbnMoKSlcblxuICAgIGNvbnN0IHJlZnJlc2ggPSAoKSA9PiB7XG4gICAgICAgIG9wdGlvbnMudmFsdWUgPSBsYXlvdXQuZ2V0T3B0aW9ucygpXG4gICAgfVxuXG4gICAgZW1taXR0ZXIub24oJ2xheW91dDpjaGFuZ2UnLCByZWZyZXNoKVxuICAgIGVtbWl0dGVyLm9uKCdsYXlvdXQ6c2V0LW9wdGlvbnMnLCByZWZyZXNoKVxuXG4gICAgcmV0dXJuIG9wdGlvbnNcbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCByZWYgIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnXG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgICB0aW1lb3V0PzogbnVtYmVyXG59XG5cbmludGVyZmFjZSBMb2FkaW5nUmVmIGV4dGVuZHMgUmVmPGJvb2xlYW4+IHtcbiAgICBzZXQ6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlTG9hZGluZyhkZWZhdWx0VmFsdWUgPSBmYWxzZSwgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHJlZihkZWZhdWx0VmFsdWUpXG4gICAgY29uc3QgdGltZW91dCA9IHJlZihvcHRpb25zPy50aW1lb3V0ID8/IDUwMClcblxuICAgIGZ1bmN0aW9uIHNldCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgbG9hZGluZyA9IGNvbXB1dGVkKHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWUgPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHNldChmYWxzZSksIHRpbWVvdXQudmFsdWUpXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgbG9hZGluZ1JlZjogTG9hZGluZ1JlZiA9IE9iamVjdC5hc3NpZ24obG9hZGluZywgeyBzZXQgfSlcblxuICAgIHJldHVybiBsb2FkaW5nUmVmXG5cbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCByZWYgfSBmcm9tICd2dWUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUJhc2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIG9yZGVyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVTaW5nbGUgIGV4dGVuZHMgTWVudUJhc2Uge1xuICAgIGljb246IHN0cmluZztcbiAgICB0bzogc3RyaW5nO1xuICAgIHRhcmdldD86ICdfYmxhbmsnIHwgJ19zZWxmJyB8ICdfcGFyZW50JyB8ICdfdG9wJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW51V2l0aENoaWxkcmVuIGV4dGVuZHMgTWVudUJhc2Uge1xuICAgIGljb246IHN0cmluZztcbiAgICBjaGlsZHJlbjogT21pdDxNZW51U2luZ2xlLCAnaWNvbic+W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUdyb3VwIGV4dGVuZHMgTWVudUJhc2Uge1xuICAgIGdyb3VwOiBib29sZWFuO1xuICAgIGl0ZW1zOiBNZW51SXRlbVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVJdGVtIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB0bz86IHN0cmluZztcbiAgICB0YXJnZXQ/OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCc7XG4gICAgZ3JvdXA/OiBzdHJpbmdcbiAgICBvcmRlcj86IG51bWJlcjtcbiAgICBpY29uPzogc3RyaW5nXG4gICAgcGFyZW50Pzogc3RyaW5nXG4gICAgbGF5b3V0Pzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFVzZU1lbnUgPSBSZXR1cm5UeXBlPHR5cGVvZiB1c2VNZW51PlxuXG5jb25zdCBpdGVtcyA9IHJlZjxNYXA8c3RyaW5nLCBNZW51SXRlbT4+KG5ldyBNYXAoKSlcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lbnUoKSB7XG4gICAgZnVuY3Rpb24gYWRkKC4uLml0ZW06IE1lbnVJdGVtW10pIHtcbiAgICAgICAgaXRlbS5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpLmxheW91dCkge1xuICAgICAgICAgICAgICAgIGkubGF5b3V0ID0gJ2FkbWluJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpdGVtcy52YWx1ZS5zZXQoaS5pZCwgaSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmUoaXRlbTogTWVudUl0ZW0gfCBNZW51SXRlbVsnaWQnXSkge1xuXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGl0ZW1zLnZhbHVlLmRlbGV0ZShpdGVtKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlR3JvdXAoZ3JvdXBJZDogc3RyaW5nKSB7XG4gICAgICAgIEFycmF5LmZyb20oaXRlbXMudmFsdWUudmFsdWVzKCkpXG4gICAgICAgICAgICAuZmlsdGVyKGkgPT4gaS5ncm91cCA9PT0gZ3JvdXBJZCB8fCBpLnBhcmVudCA9PT0gZ3JvdXBJZClcbiAgICAgICAgICAgIC5mb3JFYWNoKGkgPT4gaXRlbXMudmFsdWUuZGVsZXRlKGkuaWQpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZU1hbnkoaXRlbUlkczogc3RyaW5nW10pIHtcbiAgICAgICAgaXRlbUlkcy5mb3JFYWNoKGlkID0+IHJlbW92ZShpZCkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlTWFueUdyb3VwKGdyb3VwSWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBncm91cElkcy5mb3JFYWNoKGlkID0+IHJlbW92ZUdyb3VwKGlkKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgaXRlbXMudmFsdWUuY2xlYXIoKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGl0ZW1zOiBjb21wdXRlZCgoKSA9PiBBcnJheS5mcm9tKGl0ZW1zLnZhbHVlLnZhbHVlcygpKSksXG4gICAgICAgIGFkZCxcbiAgICAgICAgcmVtb3ZlLFxuICAgICAgICByZW1vdmVHcm91cCxcbiAgICAgICAgcmVtb3ZlTWFueSxcbiAgICAgICAgcmVtb3ZlTWFueUdyb3VwLFxuICAgICAgICBjbGVhclxuICAgIH1cbn0iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgdHlwZSB7IFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkR2VuZXJpYyB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5cbmNvbnN0IHJvdXRlID0gY29udGFpbmVyLnByb3h5PFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkR2VuZXJpYz4oJ3JvdXRlJylcblxuZXhwb3J0IGRlZmF1bHQgcm91dGVcblxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZXIgfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5cbmNvbnN0IHJvdXRlciA9IGNvbnRhaW5lci5wcm94eTxSb3V0ZXI+KCdyb3V0ZXInKVxuXG5leHBvcnQgZGVmYXVsdCByb3V0ZXJcbiIsImltcG9ydCByb3V0ZSBmcm9tICcjY2xpZW50L2ZhY2FkZXMvcm91dGUudHMnXG5pbXBvcnQgcm91dGVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9yb3V0ZXIudHMnXG5cbmltcG9ydCB7IHVzZVJvdXRlUXVlcnkgYXMgdnVlVXNlclJvdXRlUXVlcnkgfSBmcm9tICdAdnVldXNlL3JvdXRlcidcblxuY29uc3QgemVuaXRoVXNlUm91dGVRdWVyeT0gKGtleTogYW55LCBkZWZhdWx0VmFsdWU6IGFueSwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgcmV0dXJuIHZ1ZVVzZXJSb3V0ZVF1ZXJ5KGtleSwgZGVmYXVsdFZhbHVlLCB7XG4gICAgICAgIHJvdXRlLFxuICAgICAgICByb3V0ZXIsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgdXNlUm91dGVRdWVyeSA9IHplbml0aFVzZVJvdXRlUXVlcnkgYXMgdHlwZW9mIHZ1ZVVzZXJSb3V0ZVF1ZXJ5XG5cbiIsImltcG9ydCBBdXRoU2VydmljZSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL0F1dGhTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgYXV0aCA9IGNvbnRhaW5lci5wcm94eTxBdXRoU2VydmljZT4oQXV0aFNlcnZpY2UpXG5cbmlmIChpbXBvcnQubWV0YS5lbnYuREVWICYmICFpbXBvcnQubWV0YS5lbnYuU1NSKSB7XG4gICAgKHdpbmRvdyBhcyBhbnkpLmF1dGggPSBhdXRoXG59XG5cbmV4cG9ydCBkZWZhdWx0IGF1dGhcbiIsImltcG9ydCB0eXBlIERhc2hib2FyZFdpZGdldERlZmluaXRpb24gZnJvbSAnI2NsaWVudC9lbnRpdGllcy9EYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmRXaWRnZXRSZWdpc3RyeSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRGFzaGJvYXJkV2lkZ2V0UmVnaXN0cnknXG4gICAgcHJpdmF0ZSBkZWZpbml0aW9uczogTWFwPHN0cmluZywgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbj4gPSBuZXcgTWFwKClcblxuICAgIHB1YmxpYyByZWdpc3RlciguLi5kZWZpbml0aW9uOiBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWYgb2YgZGVmaW5pdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kZWZpbml0aW9ucy5zZXQoZGVmLmlkLCBkZWYpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpOiBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmluaXRpb25zLmdldChpZCkgfHwgbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCk6IERhc2hib2FyZFdpZGdldERlZmluaXRpb25bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGVmaW5pdGlvbnMudmFsdWVzKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IERhc2hib2FyZFdpZGdldFJlZ2lzdHJ5IGZyb20gJyNjbGllbnQvcmVnaXN0cnkvRGFzaGJvYXJkV2lkZ2V0UmVnaXN0cnkudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBkYXNoYm9hcmRSZWdpc3RyeSA9IGNvbnRhaW5lci5wcm94eTxEYXNoYm9hcmRXaWRnZXRSZWdpc3RyeT4oRGFzaGJvYXJkV2lkZ2V0UmVnaXN0cnkpXG5cbmV4cG9ydCBkZWZhdWx0IGRhc2hib2FyZFJlZ2lzdHJ5XG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuaW1wb3J0IExpZmVjeWNsZVNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzJ1xuXG5jb25zdCBsaWZlY3ljbGUgPSBjb250YWluZXIucHJveHk8TGlmZWN5Y2xlU2VydmljZT4oTGlmZWN5Y2xlU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbGlmZWN5Y2xlXG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBsb2dnZXIgPSBjb250YWluZXIucHJveHk8TG9nZ2VyU2VydmljZT4oTG9nZ2VyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbG9nZ2VyXG4iLCJpbXBvcnQgTWVudVNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9NZW51U2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IG1lbnUgPSBjb250YWluZXIucHJveHk8TWVudVNlcnZpY2U+KE1lbnVTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBtZW51XG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgVG9hc3RTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvVG9hc3RTZXJ2aWNlLnRzJ1xuXG5jb25zdCB0b2FzdCA9IGNvbnRhaW5lci5wcm94eTxUb2FzdFNlcnZpY2U+KFRvYXN0U2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgdG9hc3RcbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCAqIGFzIFZlZVZhbGlkYXRlIGZyb20gJ3ZlZS12YWxpZGF0ZSdcblxuZXhwb3J0IGNvbnN0IFZFRV9WQUxJREFURV9DT05UQUlORVJfS0VZID0gJ3ZlZS12YWxpZGF0ZSdcblxuY29uc3QgdmVlVmFsaWRhdGUgPSBjb250YWluZXIucHJveHk8dHlwZW9mIFZlZVZhbGlkYXRlPihWRUVfVkFMSURBVEVfQ09OVEFJTkVSX0tFWSlcblxuZXhwb3J0IGRlZmF1bHQgdmVlVmFsaWRhdGVcbiIsIlxuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0ICogYXMgVnVlIGZyb20gJ3Z1ZSdcblxuZXhwb3J0IGNvbnN0IFZVRV9DT05UQUlORVJfS0VZID0gJ1Z1ZSdcblxuY29uc3QgdnVlID0gY29udGFpbmVyLnByb3h5PHR5cGVvZiBWdWU+KFZVRV9DT05UQUlORVJfS0VZKVxuXG5leHBvcnQgZGVmYXVsdCB2dWVcbiIsIlxuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0ICogYXMgVnVlUm91dGVyIGZyb20gJ3Z1ZS1yb3V0ZXInXG5cbmV4cG9ydCBjb25zdCBWVUVfUk9VVEVSX0NPTlRBSU5FUl9LRVkgPSAnVnVlUm91dGVyJ1xuXG5jb25zdCB2dWVSb3V0ZXIgPSBjb250YWluZXIucHJveHk8dHlwZW9mIFZ1ZVJvdXRlcj4oVlVFX1JPVVRFUl9DT05UQUlORVJfS0VZKVxuXG5leHBvcnQgZGVmYXVsdCB2dWVSb3V0ZXJcbiIsImltcG9ydCB7IGNyZWF0ZUlkIH0gZnJvbSAnI3NoYXJlZC91dGlscy9pbmRleC50cydcblxuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRHcmlkVW5pdCB7XG4gICAgYmFzZT86IG51bWJlclxuICAgIHNtPzogbnVtYmVyXG4gICAgbWQ/OiBudW1iZXJcbiAgICBsZz86IG51bWJlclxuICAgIHhsPzogbnVtYmVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZFdpZGdldERhdGEge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZWZpbml0aW9uX2lkOiBzdHJpbmdcbiAgICBwdWJsaWMgY29sdW1uczogRGFzaGJvYXJkR3JpZFVuaXQgXG4gICAgcHVibGljIHJvd3M6IERhc2hib2FyZEdyaWRVbml0XG4gICAgcHVibGljIHg6IERhc2hib2FyZEdyaWRVbml0XG4gICAgcHVibGljIHk6IERhc2hib2FyZEdyaWRVbml0XG4gICAgcHVibGljIG9yZGVyOiBudW1iZXJcbiAgICBwdWJsaWMgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxEYXNoYm9hcmRXaWRnZXREYXRhPikge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG5cbiAgICAgICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gY3JlYXRlSWQoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHt9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFdpZGdldEFjdGlvbiB7XG4gICAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgY29tcG9uZW50OiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbiB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGljb24/OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmlkID0gJydcbiAgICAgICAgdGhpcy5uYW1lID0gJydcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9ICcnXG4gICAgICAgIHRoaXMuaWNvbiA9ICcnXG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBhY3Rpb25zKCk6IERhc2hib2FyZFdpZGdldEFjdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxufVxuIiwiaW1wb3J0IEVtbWl0dGVyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cydcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB0eXBlIERhc2hib2FyZFdpZGdldERhdGEgZnJvbSAnLi9EYXNoYm9hcmRXaWRnZXREYXRhJ1xuaW1wb3J0IERhc2hib2FyZFdpZGdldERlZmluaXRpb24gZnJvbSAnLi9EYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uJ1xuaW1wb3J0IGRhc2hib2FyZFJlZ2lzdHJ5IGZyb20gJyNjbGllbnQvZmFjYWRlcy9kYXNoYm9hcmRSZWdpc3RyeS50cydcblxuZXhwb3J0IGNvbnN0IERBU0hCT0FSRF9ST1dfSEVJR0hUID0gODBcblxuaW50ZXJmYWNlIERhc2hib2FyZFdpZGdldE9wdGlvbnMge1xuICAgIGRhdGE6IERhc2hib2FyZFdpZGdldERhdGFcbiAgICBkZWZpbml0aW9uOiBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uXG59XG5cbmludGVyZmFjZSBTdHlsZXNPcHRpb25zIHtcbiAgICBjb250aWFuZXJXaWR0aDogbnVtYmVyXG4gICAgYnJlYWtwb2ludD86ICdiYXNlJyB8ICdzbScgfCAnbWQnIHwgJ3hsJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmRXaWRnZXQge1xuICAgIHB1YmxpYyBkYXRhOiBEYXNoYm9hcmRXaWRnZXREYXRhXG4gICAgcHVibGljIGRlZmluaXRpb246IERhc2hib2FyZFdpZGdldERlZmluaXRpb25cbiAgICBwdWJsaWMgZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IoeyBkYXRhLCBkZWZpbml0aW9uIH06IERhc2hib2FyZFdpZGdldE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YVxuICAgICAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uXG4gICAgICAgIHRoaXMuZW1taXR0ZXIgPSBuZXcgRW1taXR0ZXJTZXJ2aWNlKClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21EYXRhKGRhdGE6IERhc2hib2FyZFdpZGdldERhdGEpIHtcbiAgICAgICAgbGV0IGRlZiA9IGRhc2hib2FyZFJlZ2lzdHJ5LmdldChkYXRhLmRlZmluaXRpb25faWQpXG5cbiAgICAgICAgaWYgKCFkZWYpIHtcbiAgICAgICAgICAgIGRlZiA9IG5ldyBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uKClcbiAgICAgICAgICAgIGRlZi5uYW1lID0gYFVua25vd246ICR7ZGF0YS5kZWZpbml0aW9uX2lkfWBcbiAgICAgICAgICAgIGRlZi5pZCA9IGRhdGEuZGVmaW5pdGlvbl9pZFxuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYERhc2hib2FyZFdpZGdldERlZmluaXRpb24gbm90IGZvdW5kIGZvciBpZDogJHtkYXRhLmRlZmluaXRpb25faWR9LiBVc2luZyB1bmtub3duIGRlZmluaXRpb24uYClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRGFzaGJvYXJkV2lkZ2V0KHtcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBkZWZpbml0aW9uOiBkZWYsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHNldEVtbWl0dGVyKGVtbWl0dGVyOiBFbW1pdHRlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5lbW1pdHRlciA9IGVtbWl0dGVyXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmlkXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubmFtZVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudXBkYXRlKHsgbmFtZTogdmFsdWUgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG9wdGlvbnMoKTogRGFzaGJvYXJkV2lkZ2V0RGF0YVsnb3B0aW9ucyddIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5vcHRpb25zIHx8IHt9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgZ2V0IGRlZmluaXRpb25faWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5kZWZpbml0aW9uX2lkXG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbi5jb21wb25lbnQoKVxuICAgIH1cblxuICAgIHB1YmxpYyBhY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uLmFjdGlvbnMoKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sdW1ucygpOiBEYXNoYm9hcmRXaWRnZXREYXRhWydjb2x1bW5zJ10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmNvbHVtbnMgfHwge31cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvbHVtbnMocGF5bG9hZDogRGFzaGJvYXJkV2lkZ2V0RGF0YVsnY29sdW1ucyddKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS5jb2x1bW5zIHx8IHt9KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsnY29sdW1ucyddXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5zLCBwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgY29sdW1ucyB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93cygpOiBEYXNoYm9hcmRXaWRnZXREYXRhWydyb3dzJ10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnJvd3MgfHwge31cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJvd3MocGF5bG9hZDogRGFzaGJvYXJkV2lkZ2V0RGF0YVsncm93cyddKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS5yb3dzIHx8IHt9KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsncm93cyddXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihyb3dzLCBwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgcm93cyB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgeCgpOiBEYXNoYm9hcmRXaWRnZXREYXRhWyd4J10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnggfHwge31cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHgocGF5bG9hZDogRGFzaGJvYXJkV2lkZ2V0RGF0YVsneCddKSB7XG4gICAgICAgIGNvbnN0IHggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS54IHx8IHt9KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsneCddXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih4LCBwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgeCB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgeSgpOiBEYXNoYm9hcmRXaWRnZXREYXRhWyd5J10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnkgfHwge31cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHkocGF5bG9hZDogRGFzaGJvYXJkV2lkZ2V0RGF0YVsneSddKSB7XG4gICAgICAgIGNvbnN0IHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS55IHx8IHt9KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsneSddXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih5LCBwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgeSB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShjbGFzc2VzLnZhbHVlcygpKS5qb2luKCcgJylcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcHV0ZVN0eWxlcyhvcHRpb25zOiBTdHlsZXNPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gb3B0aW9ucy5icmVha3BvaW50ID8/ICdiYXNlJ1xuXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLnhbYnJlYWtwb2ludF0gPz8gMFxuICAgICAgICBjb25zdCB5ID0gdGhpcy55W2JyZWFrcG9pbnRdID8/IDBcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuY29sdW1uc1ticmVha3BvaW50XSA/PyAxXG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnJvd3NbYnJlYWtwb2ludF0gPz8gMVxuXG4gICAgICAgIGNvbnN0IGNvbFNpemUgPSBvcHRpb25zLmNvbnRpYW5lcldpZHRoIC8gMTJcbiAgICAgICAgY29uc3Qgcm93U2l6ZSA9IERBU0hCT0FSRF9ST1dfSEVJR0hUXG5cbiAgICAgICAgc3R5bGVzLnNldCgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICBzdHlsZXMuc2V0KCdsZWZ0JywgYCR7eCAqIGNvbFNpemV9cHhgKVxuICAgICAgICBzdHlsZXMuc2V0KCd0b3AnLCBgJHt5ICogcm93U2l6ZX1weGApXG4gICAgICAgIHN0eWxlcy5zZXQoJ3dpZHRoJywgYCR7Y29scyAqIGNvbFNpemUgLSAxMH1weGApIC8vIHBhZGRpbmcgYW5kIHNjcm9sbGJhciBjb21wZW5zYXRpb25cbiAgICAgICAgc3R5bGVzLnNldCgnaGVpZ2h0JywgYCR7cm93cyAqIHJvd1NpemV9cHhgKVxuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHN0eWxlcy5lbnRyaWVzKCkpXG4gICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06ICR7dmFsdWV9O2ApXG4gICAgICAgICAgICAuam9pbignICcpXG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZShwYXlsb2FkOiBQYXJ0aWFsPERhc2hib2FyZFdpZGdldERhdGE+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXRhLCBwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW1taXR0ZXIuZW1pdCgnd2lkZ2V0OnVwZGF0ZWQnLCB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRPcHRpb24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLm9wdGlvbnMgfHwge30pKVxuXG4gICAgICAgIHNldChvcHRpb25zLCBrZXksIHZhbHVlKVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgb3B0aW9ucyB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRYKGJyZWFrcG9pbnQ6ICdiYXNlJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy54KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsneCddXG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB4W2JyZWFrcG9pbnRdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgeFticmVha3BvaW50XSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZSh7IHggfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0WShicmVha3BvaW50OiAnYmFzZScgfCAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnLCB2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMueSkpIGFzIERhc2hib2FyZFdpZGdldERhdGFbJ3knXVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgeVticmVha3BvaW50XVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHlbYnJlYWtwb2ludF0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyB5IH0pXG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbHVtbihicmVha3BvaW50OiAnYmFzZScgfCAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnLCB2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY29sdW1ucykpIGFzIERhc2hib2FyZFdpZGdldERhdGFbJ2NvbHVtbnMnXVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgY29sdW1uc1ticmVha3BvaW50XVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbHVtbnNbYnJlYWtwb2ludF0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyBjb2x1bW5zIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvdyhicmVha3BvaW50OiAnYmFzZScgfCAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnLCB2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucm93cykpIGFzIERhc2hib2FyZFdpZGdldERhdGFbJ3Jvd3MnXVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93c1ticmVha3BvaW50XVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJvd3NbYnJlYWtwb2ludF0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyByb3dzIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IEVtbWl0dGVyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cydcbmltcG9ydCBEYXNoYm9hcmRXaWRnZXREYXRhIGZyb20gJy4vRGFzaGJvYXJkV2lkZ2V0RGF0YSdcbmltcG9ydCBEYXNoYm9hcmRXaWRnZXQgZnJvbSAnLi9EYXNoYm9hcmRXaWRnZXQnXG5pbXBvcnQgdHlwZSB7IERhc2hib2FyZFNjaGVtYSB9IGZyb20gJyNzaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRTY2hlbWEudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkT3B0aW9ucyB7XG4gICAgZGFzaGJvYXJkOiBEYXNoYm9hcmRTY2hlbWFcbiAgICB3aWRnZXRzPzogRGFzaGJvYXJkV2lkZ2V0RGF0YVtdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZCB7XG4gICAgcHVibGljIG5hbWU6IERhc2hib2FyZFNjaGVtYVsnbmFtZSddID0gJydcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IERhc2hib2FyZFNjaGVtYVsnZGVzY3JpcHRpb24nXSA9ICcnXG4gICAgcHVibGljIHdpZGdldHM6IERhc2hib2FyZFdpZGdldFtdID0gW11cbiAgICBwdWJsaWMgZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZVxuICAgIHB1YmxpYyBjb250YWluZXJXaWR0aDogbnVtYmVyID0gMFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW1taXR0ZXIgPSBuZXcgRW1taXR0ZXJTZXJ2aWNlKClcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDb250YWluZXJXaWR0aCh3aWR0aDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSB3aWR0aFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRXaWRnZXRzKHdpZGdldHM6IERhc2hib2FyZFdpZGdldERhdGFbXSkge1xuXG4gICAgICAgIHRoaXMud2lkZ2V0cyA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCB3IG9mIHdpZGdldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZGdldCA9IERhc2hib2FyZFdpZGdldC5mcm9tRGF0YSh3KVxuXG4gICAgICAgICAgICB3aWRnZXQuc2V0RW1taXR0ZXIodGhpcy5lbW1pdHRlcilcblxuICAgICAgICAgICAgdGhpcy53aWRnZXRzLnB1c2god2lkZ2V0KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZExhc3RSb3coKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDAgXG5cbiAgICAgICAgZm9yIChjb25zdCB3aWRnZXQgb2YgdGhpcy53aWRnZXRzKSB7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gd2lkZ2V0LnJvd3M/LmJhc2UgPz8gMFxuICAgICAgICAgICAgY29uc3QgeSA9IHdpZGdldC55Py5iYXNlID8/IDBcblxuICAgICAgICAgICAgY29uc3QgYm90dG9tID0geSArIHJvd3NcblxuICAgICAgICAgICAgaWYgKGJvdHRvbSA+IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJvdHRvbVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkV2lkZ2V0KHBheWxvYWQ6IFBhcnRpYWw8RGFzaGJvYXJkV2lkZ2V0RGF0YT4gPSB7fSkge1xuICAgICAgICBpZiAoIXBheWxvYWQuY29sdW1ucykge1xuICAgICAgICAgICAgcGF5bG9hZC5jb2x1bW5zID0geyBiYXNlOiA0LCB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBheWxvYWQucm93cykge1xuICAgICAgICAgICAgcGF5bG9hZC5yb3dzID0geyBiYXNlOiA0LCB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBheWxvYWQueCkge1xuICAgICAgICAgICAgcGF5bG9hZC54ID0geyBiYXNlOiAwLCB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBheWxvYWQueSkge1xuICAgICAgICAgICAgcGF5bG9hZC55ID0geyBiYXNlOiB0aGlzLmZpbmRMYXN0Um93KCksIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRGFzaGJvYXJkV2lkZ2V0RGF0YShwYXlsb2FkKVxuXG4gICAgICAgIGNvbnN0IHdpZGdldCA9IERhc2hib2FyZFdpZGdldC5mcm9tRGF0YShkYXRhKVxuXG4gICAgICAgIHdpZGdldC5zZXRFbW1pdHRlcih0aGlzLmVtbWl0dGVyKVxuXG4gICAgICAgIHRoaXMud2lkZ2V0cy5wdXNoKHdpZGdldClcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlV2lkZ2V0KGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy53aWRnZXRzID0gdGhpcy53aWRnZXRzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpXG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZVdpZGdldEJ5SWQoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMuZmlsdGVyKCh3KSA9PiB3LmlkICE9PSBpZClcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlV2lkZ2V0KGluZGV4OiBudW1iZXIsIHdpZGdldDogRGFzaGJvYXJkV2lkZ2V0KSB7XG4gICAgICAgIHRoaXMud2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAoKHcsIGkpID0+IGkgPT09IGluZGV4ID8gd2lkZ2V0IDogdylcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVwbGljYXRlV2lkZ2V0KGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY29weTogRGFzaGJvYXJkV2lkZ2V0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLndpZGdldHNbaW5kZXhdKSlcblxuICAgICAgICBjb25zdCB1cGRhdGVkID0gWy4uLnRoaXMud2lkZ2V0c11cblxuICAgICAgICB1cGRhdGVkLnNwbGljZShpbmRleCArIDEsIDAsIGNvcHkpXG4gICAgfVxufVxuIiwiaW1wb3J0IERhc2hib2FyZFdpZGdldERlZmluaXRpb24gZnJvbSAnLi9EYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uJ1xuaW1wb3J0IHR5cGUgRGFzaGJvYXJkV2lkZ2V0RGF0YSBmcm9tICcuL0Rhc2hib2FyZFdpZGdldERhdGEnXG5cbi8qKlxuICAgICogQ29tcG9uZW50IHRvIGJlIHVzZWQgZm9yIGNoYXJ0IHdpZGdldHMgaW4gdGhlIGRhc2hib2FyZC5cbiAgICAqIFBsdWdpbnMgY2FuIGV4dGVuZCB0aGlzIGNsYXNzIHRvIGNyZWF0ZSB0aGVpciBvd24gY2hhcnQgd2lkZ2V0cy5cbiAgICAqIEBleGFtcGxlXG4gICAgKiBjbGFzcyBNeUNoYXJ0V2lkZ2V0IGV4dGVuZHMgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbkNoYXJ0IHtcbiAgICAqICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAqICAgICAgICAgc3VwZXIoKVxuICAgICogICAgICAgICB0aGlzLm5hbWUgPSAnTXkgQ2hhcnQgV2lkZ2V0J1xuICAgICogICAgICAgICB0aGlzLmlkID0gJ215LWNoYXJ0LXdpZGdldCdcbiAgICAqICAgICB9XG4gICAgKiB9XG4gICAgKi9cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uQ2hhcnQgZXh0ZW5kcyBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZW5kZXJlcjogYW55IFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5uYW1lID0gJ0NoYXJ0J1xuICAgICAgICB0aGlzLmlkID0gJ2NoYXJ0J1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0UmVuZGVyZXIocmVuZGVyZXI6IGFueSkge1xuICAgICAgICBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uQ2hhcnQucmVuZGVyZXIgPSByZW5kZXJlclxuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uQ2hhcnQucmVuZGVyZXJcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gY2hhcnQgb3B0aW9ucyBmb3IgdGhlIGNoYXJ0IHdpZGdldC4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwbHVnaW5zIHRvIHByb3ZpZGUgY3VzdG9tIGNoYXJ0IG9wdGlvbnMuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0byBiZSBleHRlbmRlZCBsYXRlclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgYXN5bmMgY2hhcnRPcHRpb25zKHBheWxvYWQ6IERhc2hib2FyZFdpZGdldERhdGFbJ29wdGlvbnMnXSk6IFByb21pc2U8YW55PntcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMyUnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAnNCUnLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgICAgICAgICBjb250YWluTGFiZWw6IHRydWUgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGU6IHsgdGV4dDogJ0VDaGFydHMgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUnIH0sXG4gICAgICAgICAgICB0b29sdGlwOiB7fSxcbiAgICAgICAgICAgIHhBeGlzOiB7IGRhdGE6IFsnc2hpcnQnLCAnY2FyZGlnYW4nLCAnY2hpZmZvbicsICdwYW50cycsICdoZWVscycsICdzb2NrcyddIH0sXG4gICAgICAgICAgICB5QXhpczoge30sXG4gICAgICAgICAgICBzZXJpZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzYWxlcycsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdiYXInLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBbNSwgMjAsIDM2LCAxMCwgMTAsIDIwXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgIFxufVxuIiwiaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMnXG5pbXBvcnQgcm91dGVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9yb3V0ZXIudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB0eXBlIHsgQXV0b09wdGlvbnMgfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgICBwdWJsaWMgYWRkUGFnZXNGb2xkZXIoaW1wb3J0czogYW55LCBvcHRpb25zPzogQXV0b09wdGlvbnMpIHtcbiAgICAgICAgcm91dGVyLmF1dG8oaW1wb3J0cywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbG9hZCBhZGRpdGlvbmFsIGRhdGEgZnJvbSB0aGUgcGx1Z2luJ3MgZGlyZWN0b3J5IGlmIG5lZWRlZFxuICAgIH1cbn1cbiIsImltcG9ydCB7IGF1dG8gfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IEF1dG9PcHRpb25zIH0gZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBEZWZpbmVDb21wb25lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSB7IFJvdXRlUmVjb3JkUmF3IH0gZnJvbSAndnVlLXJvdXRlcidcblxuLyoqIEBkZXByZWNhdGVkIFVzZSBhdXRvIGZyb20gUm91dGVyU2VydmljZSBpbnN0ZWFkICovXG5leHBvcnQgZnVuY3Rpb24gYXV0b1JvdXRlcyhcbiAgICBpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVDb21wb25lbnQgfCAoKCkgPT4gUHJvbWlzZTxEZWZpbmVDb21wb25lbnQ+KT4sXG4gICAgb3B0aW9uczogQXV0b09wdGlvbnMgPSB7fVxuKTogUm91dGVSZWNvcmRSYXdbXSB7XG4gICAgcmV0dXJuIGF1dG8oaW1wb3J0cywgb3B0aW9ucylcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlQ29sdW1uPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGlkPzogc3RyaW5nXG4gICAgbGFiZWw/OiBzdHJpbmdcbiAgICBmaWVsZD86IGtleW9mIFQgfCAoKHJvdzogVCkgPT4gYW55KSB8IChzdHJpbmcgJiB7fSlcbiAgICBzb3J0YWJsZT86IGJvb2xlYW5cbiAgICB3aWR0aD86IHN0cmluZyB8IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29sdW1uczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oY29sdW1uczogRGF0YVRhYmxlQ29sdW1uPFQ+W10pIHtcbiAgICByZXR1cm4gY29sdW1uc1xufVxuIiwiZXhwb3J0IGludGVyZmFjZSBEZWZpbmVGb3JtRmllbGQge1xuICAgIGNvbXBvbmVudDpcbiAgICAndGV4dC1maWVsZCdcbiAgICB8ICd0ZXh0YXJlYSdcbiAgICB8ICdzZWxlY3QnXG4gICAgfCAnYXV0b2NvbXBsZXRlJ1xuICAgIHwgJ3N3aXRjaCdcbiAgICB8ICdmaWxlLXVwbG9hZCdcbiAgICB8ICdpbWFnZS11cGxvYWQnXG4gICAgfCAnY29sb3ItcGlja2VyJ1xuICAgIHwgJ3N0cmluZy1saXN0LWlucHV0J1xuICAgIHwgJ2pzb24taW5wdXQnXG4gICAgfCAnZGF0ZS1waWNrZXInXG4gICAgfCAnaGlkZGVuJ1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRm9ybUZpZWxkcyhmaWVsZDogUmVjb3JkPHN0cmluZywgRGVmaW5lRm9ybUZpZWxkPikge1xuICAgIHJldHVybiBmaWVsZFxufVxuXG4iLCJpbXBvcnQgJG9yaWdpbmFsIGZyb20gXCIjY2xpZW50L2ZhY2FkZXMvZmV0Y2hlci50c1wiO1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGZldGNoZXIgZmFjYWRlICovXG5leHBvcnQgY29uc3QgJGZldGNoID0gJG9yaWdpbmFsO1xuIiwiaW1wb3J0IHsgJGZldGNoIH0gZnJvbSAnLi9mZXRjaGVyJ1xuXG5pbnRlcmZhY2UgUGlja09wdGlvbnMge1xuICAgIGFjY2VwdD86IHN0cmluZ1xuICAgIG11bHRpcGxlPzogYm9vbGVhblxufVxuXG50eXBlIFBpY2tSZXN1bHQ8VCBleHRlbmRzIFBpY2tPcHRpb25zPiA9IFRbJ211bHRpcGxlJ10gZXh0ZW5kcyB0cnVlID8gRmlsZVtdIDogRmlsZSB8IG51bGxcblxuZnVuY3Rpb24gcGljazxUIGV4dGVuZHMgUGlja09wdGlvbnM+KG9wdGlvbnM6IFQpOiBQcm9taXNlPFBpY2tSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXG5cbiAgICAgICAgaW5wdXQudHlwZSA9ICdmaWxlJ1xuICAgICAgICBpbnB1dC5hY2NlcHQgPSBvcHRpb25zLmFjY2VwdCB8fCAnKi8qJ1xuICAgICAgICBpbnB1dC5tdWx0aXBsZSA9IG9wdGlvbnMubXVsdGlwbGUgfHwgZmFsc2VcblxuICAgICAgICBpbnB1dC5vbmNoYW5nZSA9IChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20odGFyZ2V0LmZpbGVzIGFzIEZpbGVMaXN0KSBhcyBGaWxlW11cblxuICAgICAgICAgICAgcmVzb2x2ZSgob3B0aW9ucy5tdWx0aXBsZSA/IEFycmF5LmZyb20oZmlsZXMpIDogZmlsZXNbMF0pIGFzIFBpY2tSZXN1bHQ8VD4pXG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dC5vbmNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUob3B0aW9ucy5tdWx0aXBsZSA/IFtdIDogKG51bGwgYXMgYW55KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0LmNsaWNrKClcbiAgICB9KVxufVxuXG5mdW5jdGlvbiB0b1VpbnQ4QXJyYXkoZmlsZTogRmlsZSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcblxuICAgICAgICByZWFkZXIub25sb2FkID0gKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLnRhcmdldD8ucmVzdWx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KGUudGFyZ2V0LnJlc3VsdCkpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZWFkIGZpbGUgYXMgQXJyYXlCdWZmZXInKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KHJlYWRlci5lcnJvcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKVxuICAgIH0pXG59XG5cbmludGVyZmFjZSBVcGxvYWRPcHRpb25zIHtcbiAgICBkcml2ZUlkOiBzdHJpbmdcbiAgICBmaWxlOiBGaWxlXG4gICAgZGlyZWN0b3J5Pzogc3RyaW5nXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZChvcHRpb25zOiBVcGxvYWRPcHRpb25zKXtcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgICBcbiAgICBmb3JtLmFwcGVuZCgnZmlsZScsIG9wdGlvbnMuZmlsZSlcblxuICAgIGlmIChvcHRpb25zLmRpcmVjdG9yeSkge1xuICAgICAgICBmb3JtLmFwcGVuZCgnZGlyZWN0b3J5Jywgb3B0aW9ucy5kaXJlY3RvcnkpXG4gICAgfVxuXG4gICAgcmV0dXJuICRmZXRjaChgL2FwaS9kcml2ZXMvJHtvcHRpb25zLmRyaXZlSWR9L3VwbG9hZGAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IGZvcm0sXG4gICAgICAgIHF1ZXJ5OiB7IGRpcmVjdG9yeTogb3B0aW9ucy5kaXJlY3RvcnksIH1cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgJGZpbGUgPSB7XG4gICAgcGljayxcbiAgICB1cGxvYWQsXG4gICAgdG9VaW50OEFycmF5LFxufSIsImltcG9ydCByb3V0ZSBmcm9tICcjY2xpZW50L2ZhY2FkZXMvcm91dGUudHMnIFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUbyh0bzogc3RyaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9IHRvXG5cbiAgICAvLyByZXBsYWNlIDpwYXJhbSB3aXRoIHJvdXRlIHBhcmFtIHZhbHVlXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocm91dGUucGFyYW1zKSkge1xuICAgICAgICBjb25zdCBwYXJhbVBsYWNlaG9sZGVyID0gYDoke2tleX1gXG5cbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UocGFyYW1QbGFjZWhvbGRlciwgU3RyaW5nKHZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbiIsImltcG9ydCB7IHRvYXN0IH0gZnJvbSAndnVlLXNvbm5lcidcblxuZXhwb3J0IGNvbnN0ICR0b2FzdCA9IHRvYXN0XG4iLCJpbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25HdWFyZCwgUm91dGVMb2NhdGlvbk5vcm1hbGl6ZWQgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IGF1dGggZnJvbSAnI2NsaWVudC9mYWNhZGVzL2F1dGgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEd1YXJkT3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q6IHN0cmluZyB8ICgodG86IFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkKSA9PiBzdHJpbmcpXG4gICAgZXhjbHVkZT86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdXRoR3VhcmQob3B0aW9uczogQXV0aEd1YXJkT3B0aW9ucyk6IE5hdmlnYXRpb25HdWFyZCB7XG4gICAgY29uc3QgZXhjbHVkZSA9IG9wdGlvbnMuZXhjbHVkZSB8fCBbJy9hdXRoL2xvZ2luJywgJy9hdXRoL3JlZ2lzdGVyJ11cblxuICAgIHJldHVybiAodG8pID0+IHtcblxuICAgICAgICBpZiAoIWF1dGgudXNlciAmJiAhZXhjbHVkZS5pbmNsdWRlcyh0by5wYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RQYXRoID0gdHlwZW9mIG9wdGlvbnMucmVkaXJlY3QgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnJlZGlyZWN0KHRvKSA6IG9wdGlvbnMucmVkaXJlY3RcblxuICAgICAgICAgICAgcmV0dXJuIHJlZGlyZWN0UGF0aFxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBhdXRoR3VhcmQgPSBjcmVhdGVBdXRoR3VhcmQoe1xuICAgIHJlZGlyZWN0OiB0byA9PiAnL2F1dGgvbG9naW4/cmVkaXJlY3Q9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0by5mdWxsUGF0aCksXG59KVxuXG5leHBvcnQgZGVmYXVsdCBhdXRoR3VhcmRcbiIsImltcG9ydCBhdXRoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9hdXRoLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1ZXN0R3VhcmRPcHRpb25zIHtcbiAgICByZWRpcmVjdDogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHdWVzdEd1YXJkKG9wdGlvbnM6IEd1ZXN0R3VhcmRPcHRpb25zKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGF1dGgudXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucmVkaXJlY3RcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgZ3Vlc3RHdWFyZCA9IGNyZWF0ZUd1ZXN0R3VhcmQoe1xuICAgIHJlZGlyZWN0OiAnLydcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IGd1ZXN0R3VhcmRcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNTUsNTZdLCJtYXBwaW5ncyI6IjR4QkFZQSxlQUFzQixFQUErQixFQUEyQyxDQUM1RixHQUFJLENBRUEsTUFBTyxDQUFDLEtBRE8sTUFBTSxHQUFPLENBQ1AsT0FDaEIsRUFBTyxDQUNaLE1BQU8sQ0FBQyxFQUFjLEtBQUssRUFJbkMsRUFBUyxLQUFPLFNBQTJCLEVBQTZCLENBQ3BFLEdBQUksQ0FFQSxNQUFPLENBQUMsS0FETyxHQUFPLENBQ0QsT0FDaEIsRUFBTyxDQUNaLE1BQU8sQ0FBQyxFQUFjLEtBQUssR0NqQm5DLElBQXFCLEVBQXJCLEtBQWtDLENBQzlCLE9BQWMsc0JBQXdCLGVBRXRDLE1BQWdCLFlBQVksRUFBb0IsQ0FDNUMsR0FBSSxFQUFTLFFBQVEsSUFBSSxlQUFlLEVBQUUsU0FBUyxPQUFPLENBQUUsQ0FDeEQsSUFBTSxFQUFPLE1BQU0sRUFBUyxNQUFNLENBQzdCLFdBQWEsQ0FBRSxRQUFTLEdBQUcsd0JBQXdCLENBQUUsRUFBRSxDQU01RCxPQUpJLEVBQUssU0FDTCxFQUFNLE1BQU0sRUFBSyxRQUFRLENBR3RCLEVBS1gsT0FGQSxFQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxDQUVqQyxDQUNILFFBQVMsR0FBRyx3QkFBd0IsQ0FDdkMsQ0FHTCxTQUFtQixFQUFhLEVBQXFDLENBQ2pFLEdBQUksQ0FBQyxFQUNELE9BQU8sRUFHWCxJQUFNLEVBQWMsRUFBRyxVQUFVLEVBQU8sQ0FBRSxZQUFhLFdBQVksQ0FBQyxDQUVwRSxPQUFPLEVBQU0sSUFBTSxFQUd2QixpQkFBMkIsRUFBb0MsQ0FDM0QsSUFBTSxFQUE0QixDQUFFLEdBQUcsRUFBUyxDQVVoRCxPQVJJLEVBQVEsT0FDUixFQUFhLEtBQU8sS0FBSyxVQUFVLEVBQVEsS0FBSyxDQUNoRCxFQUFhLFFBQVUsQ0FDbkIsR0FBRyxFQUFhLFFBQ2hC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