UNPKG

99.2 kBJavaScriptView Raw
1#!/usr/bin/env node
2var Ye=Object.create;var L=Object.defineProperty,et=Object.defineProperties,tt=Object.getOwnPropertyDescriptor,rt=Object.getOwnPropertyDescriptors,ot=Object.getOwnPropertyNames,de=Object.getOwnPropertySymbols,st=Object.getPrototypeOf,fe=Object.prototype.hasOwnProperty,nt=Object.prototype.propertyIsEnumerable;var ge=(e,t,r)=>t in e?L(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,f=(e,t)=>{for(var r in t||(t={}))fe.call(t,r)&&ge(e,r,t[r]);if(de)for(var r of de(t))nt.call(t,r)&&ge(e,r,t[r]);return e},R=(e,t)=>et(e,rt(t)),it=e=>L(e,"__esModule",{value:!0});var at=(e,t,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ot(t))!fe.call(e,o)&&o!=="default"&&L(e,o,{get:()=>t[o],enumerable:!(r=tt(t,o))||r.enumerable});return e},c=e=>at(it(L(e!=null?Ye(st(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var Je=c(require("fs-extra")),Ze=c(require("sade"));var lt="presta",ct="0.41.1",pt="Hyper minimal framework for the modern web.",ut="index.js",mt="index.d.ts",dt={presta:"cli.js"},ft={build:"node scripts/build",cloc:"pnpx cloc lib/*.ts",typecheck:"pnpx tsc --noEmit"},gt={type:"git",url:"git+ssh://git@github.com/sure-thing/presta.git"},ht="estrattonbailey",bt="MIT",yt={url:"https://github.com/sure-thing/presta/issues"},vt="https://github.com/sure-thing/presta#readme",xt={"@netlify/functions":"^0.7.2","@types/mime-types":"^2.1.0",chokidar:"^3.4.3",deepmerge:"^4.2.2",esbuild:"^0.12.28","esbuild-register":"^2.6.0",filewatcher:"^3.0.1","fs-extra":"^9.0.1","get-port":"^5.1.1",kleur:"^4.1.4","mime-types":"^2.1.31","module-alias":"^2.2.2",ms:"^2.1.2",picomatch:"^2.3.0","pocket.io":"^0.1.4","query-string":"^6.14.1","raw-body":"^2.4.1",regexparam:"^1.3.0","route-sort":"^1.0.0",sade:"^1.7.3",sirv:"^1.0.7",statuses:"^2.0.1","tiny-glob":"^0.2.9","watch-dependency-graph":"^3.0.0"},wt={"@types/fs-extra":"^9.0.12","@types/picomatch":"^2.2.4","@types/sade":"^1.7.3","@types/statuses":"^2.0.0",proxyquire:"^2.1.3","supertest-fetch":"^1.4.3"},he={name:lt,version:ct,description:pt,main:ut,types:mt,bin:dt,scripts:ft,repository:gt,author:ht,license:bt,bugs:yt,homepage:vt,dependencies:xt,devDependencies:wt};var D=c(require("kleur"));var b={PRODUCTION:"production",DEVELOPMENT:"development"};var St={pid:process.pid,cwd:process.cwd(),env:b.PRODUCTION,debug:!1};function U(e){return global.__presta__=e,e}function E(){return global.__presta__||U(St),global.__presta__}var w;(function(n){n.Debug="debug",n.Info="info",n.Warn="warn",n.Err="error"})(w||(w={}));var be=[],Pt={[w.Debug]:"magenta",[w.Info]:"blue",[w.Warn]:"yellow",[w.Err]:"red"};function V(e){if(process.env.TESTING)be.push(e);else{let t=E().debug,r=E().env===b.PRODUCTION?"prod":"dev";if(!t&&e.level===w.Debug)return;console.log([D.default.gray(r),D.default[Pt[e.level||"info"]](e.label),e.message,e.duration?D.default.gray("+"+e.duration):"",e.error?`
3
4${e.error.stack||e.error}
5
6`:""].filter(Boolean).join(" "))}}function u(e){V(f({level:w.Debug},e))}function y(e){V(f({level:w.Info},e))}function O(e){V(f({level:w.Warn},e))}function d(e){V(f({level:w.Err},e))}function z(...e){process.env.TESTING?be.push(e):console.log(...e)}function F(){process.env.TESTING||console.log("")}var ve=c(require("fs")),S=c(require("path"));function ye(){let e={};function t(i,...l){e[i]&&e[i].map(s=>s(...l))}function r(i,l){return e[i]=e[i]?e[i].concat(l):[l],()=>e[i].splice(e[i].indexOf(l),1)}function o(){e={}}function n(i){return e[i]||[]}return{emit:t,on:r,clear:o,listeners:n}}var xe="presta.config.js";function we(e,{cwd:t}){return e.files&&(e.files=[].concat(e.files).map(r=>S.default.resolve(t,r))),e.output&&(e.output=S.default.resolve(t,e.output)),e.assets&&(e.assets=S.default.resolve(t,e.assets)),e}function j(e,t=!1){let r=S.default.resolve(e||xe);try{return require(r)}catch(o){return ve.default.existsSync(r)&&(d({label:"error",error:o}),t&&process.exit(1)),{}}}async function Se(){return u({label:"debug",message:"config file values cleared"}),U(await $(R(f({},E()),{config:{}})))}async function $({cwd:e=process.cwd(),env:t=E().env,config:r={},cli:o={}}){r=we(f({},r),{cwd:e}),o=we(f({},o),{cwd:e});let n={output:S.default.resolve(e,o.output||r.output||"build"),assets:S.default.resolve(o.assets||r.assets||"public"),files:o.files&&o.files.length?o.files:r.files?[].concat(r.files):[]},i=o.port?parseInt(o.port):r.port||4e3,l=E(),s=l.events||ye();s.clear();let a=U(R(f(f({},l),n),{env:t,cwd:e,port:i,debug:o.debug||E().debug,configFilepath:S.default.resolve(o.config||xe),staticOutputDir:S.default.join(n.output,"static"),functionsOutputDir:S.default.join(n.output,"functions"),functionsManifest:S.default.join(n.output,"routes.json"),events:s,hooks:{emitPostBuild(p){s.emit("postBuild",p)},onPostBuild(p){return s.on("postBuild",p)},emitBuildFile(p){s.emit("buildFile",p)},onBuildFile(p){return s.on("buildFile",p)},emitBrowserRefresh(){s.emit("browserRefresh")},onBrowserRefresh(p){return s.on("browserRefresh",p)}}}));return r.plugins&&await Promise.all(r.plugins.map(p=>{try{return p(E)}catch(m){d({label:"error",error:m})}})),u({label:"debug",message:`config created ${JSON.stringify(a)}`}),a}var Z=c(require("fs-extra")),je=c(require("watch-dependency-graph")),Ie=c(require("chokidar")),He=c(require("picomatch"));var G=c(require("fs-extra")),oe=c(require("path")),Ee=c(require("route-sort"));function Pe(e){for(var t=5381,r=e.length;r;)t=t*33^e.charCodeAt(--r);return(t>>>0).toString(36)}function Et(e,t){let{route:r}=require(e),o=oe.default.basename(e).split(".").reverse().slice(1).reverse().join("."),n=oe.default.join(t.functionsOutputDir,t.env===b.PRODUCTION?o+"-"+Pe(G.default.readFileSync(e,"utf8"))+".js":o+".js");return u({label:"debug",message:`generating ${o} lambda`}),delete require.cache[e],delete require.cache[n],G.default.outputFileSync(n,`import { wrapHandler } from 'presta';
7import * as file from '${e}';
8export const route = file.route
9export const handler = wrapHandler(file)`),[r,n]}function Q(e,t){let r=e.map(i=>{try{return Et(i,t)}catch(l){return d({label:"error",error:l}),null}}).filter(Boolean),o=(0,Ee.default)(r.map(i=>i[0])),n={};for(let i of o){let l=r.find(s=>s[0]===i);l&&(n[i]=l[1])}return G.default.outputFileSync(t.functionsManifest,JSON.stringify(n)),r}var se=c(require("fs-extra")),Fe=c(require("path")),Ce=c(require("tiny-glob/sync"));function T(e){return/export\s.+\sroute\s+\=/.test(se.default.readFileSync(e,"utf-8"))}function M(e){return/export\s.+\sgetStaticPaths/.test(se.default.readFileSync(e,"utf-8"))}function _(e){try{return[].concat(e.files).map(t=>(0,Ce.default)(t,{cwd:e.cwd})).flat().map(t=>Fe.default.resolve(e.cwd,t))}catch(t){return d({label:"paths",message:"no files found",error:t}),[]}}var $e=c(require("fs-extra")),ne=c(require("path")),Te=c(require("mime-types"));function P(){let e=process.hrtime();return()=>{let[t,r]=process.hrtime(e),o=r/1e6;return t<1?(o>=1?o.toFixed(0):o.toFixed(2))+"ms":t+"."+o.toFixed(0)+"s"}}var ke=c(require("regexparam"));function Re(e,t){let[r]=e.split("?"),o=(0,ke.default)(t),n=0,i={},l=o.pattern.exec(r)||[];for(;n<o.keys.length;)i[o.keys[n]]=l[++n];return i}function Ft(e){return typeof e=="object"?JSON.stringify(e):e}function C(e){let{isBase64Encoded:t=!1,statusCode:r=200,headers:o={},multiValueHeaders:n={},body:i="",html:l=void 0,json:s=void 0,xml:a=void 0}=typeof e=="string"?{body:e}:e,p="text/html; charset=utf-8";return s?p="application/json; charset=utf-8":a&&(p="application/xml; charset=utf-8"),{isBase64Encoded:t,statusCode:r,headers:f({"Content-Type":p},o),multiValueHeaders:n,body:Ft(i||l||s||a||"")}}var A={};var De=c(require("fs-extra")),Oe=c(require("path"));function W(e,t){u({label:"debug",message:`removing old static file ${e}`}),De.default.remove(Oe.default.join(t.staticOutputDir,e))}function J({port:e}){return`
10 <script>
11 (function (global) {
12 try {
13 const socketio = document.createElement('script')
14 socketio.src = 'https://unpkg.com/pocket.io@0.1.4/min.js'
15 socketio.onload = function init () {
16 var disconnected = false
17 var socket = io('http://localhost:${e}', {
18 reconnectionAttempts: 3
19 })
20 socket.on('connect', function() { console.log('presta connected on port ${e}') })
21 socket.on('refresh', function() {
22 global.location.reload()
23 })
24 socket.on('disconnect', function() {
25 disconnected = true
26 })
27 socket.on('reconnect_failed', function(e) {
28 if (disconnected) return
29 console.error("presta - connection to server on :${e} failed")
30 })
31 }
32 document.head.appendChild(socketio)
33 } catch (e) {}
34 })(this);
35 <\/script>
36 `}function Ct(e,t="html"){return ne.default.extname(e)?e:t==="html"?`${e}/index.html`:`${e}.${t}`}function q(e,t){return new Promise(async(r,o)=>{u({label:"debug",message:`rendering ${JSON.stringify(e)}`});let n=[],i=J({port:t.port});for(let l of e){let s=l.replace(t.cwd,"");try{delete require.cache[l];let a=require(l),p=await a.getStaticPaths(),m=A[l]=A[l]||[],k=[];if(!p||!p.length){O({label:"paths",message:`${s} - no paths to render`}),m.forEach(g=>W(g,t));continue}for(let g of p){let I=P(),ue={path:g,routeParameters:a.route?Re(g,a.route):{}},H=C(await a.handler(ue,{})),v=H.headers?H.headers["Content-Type"]:"",x=v&&Te.default.extension(v)||"html",B=Ct(g,x),re=H.body+(t.env===b.PRODUCTION?"":i);$e.default.outputFileSync(ne.default.join(t.staticOutputDir,B),re,"utf-8"),n.push(B),k.push(B),y({label:"built",message:g,duration:I()})}for(let g of m)k.includes(g)||W(g,t);A[l]=k}catch(a){t.env==="development"?(d({label:"error",message:"errors detected, pausing...",error:a}),r({allGeneratedFiles:n})):(d({label:"error",error:a}),o(a));break}}r({allGeneratedFiles:n})})}function K(e,t){let r=P();Q(e,t),e.length&&y({label:"built",message:"lambdas",duration:r()})}async function Be(e){let t=_(e),r=Z.default.existsSync(e.configFilepath);t.length||O({label:"paths",message:"no files configured"}),K(t.filter(T),e);let o=(0,je.create)({alias:{"@":e.cwd}}),n=Ie.default.watch(e.cwd,{ignoreInitial:!0,ignored:[e.output,e.assets]});async function i(){t=_(e),await q(t.filter(M),e),K(t.filter(T),e)}async function l(s){M(s)&&await q([s],e),T(s)&&K(t.filter(T),e),e.hooks.emitBrowserRefresh()}e.hooks.onBuildFile(({file:s})=>{l(s)}),o.onRemove(async([s])=>{u({label:"watch",message:`fileWatcher - removed ${s}`}),t.splice(t.indexOf(s),1),K(t.filter(T),e),s===e.configFilepath&&(e=await Se(),r=!1,i()),(A[s]||[]).forEach(a=>W(a,e))}),o.onChange(async s=>{for(let a of s)if(u({label:"watch",message:`fileWatcher - changed ${a}`}),a===e.configFilepath){delete require.cache[e.configFilepath];try{e=await $({config:j(e.configFilepath)}),i()}catch(p){d({label:"error",error:p})}}else l(a)}),o.onError(s=>{d({label:"error",error:typeof s=="string"?new Error(s):s})}),n.on("all",async(s,a)=>{if(!(!/add|change/.test(s)||!Z.default.existsSync(a)||Z.default.lstatSync(a).isDirectory())&&((0,He.default)(e.files)(a)&&!t.includes(a)&&(u({label:"watch",message:`globalWatcher - add ${a}`}),t.push(a),await o.add(a),l(a)),a===e.configFilepath&&!r)){u({label:"watch",message:`globalWatcher - add config file ${a}`}),await o.add(e.configFilepath);try{e=await $({config:j(e.configFilepath)}),r=!0,i()}catch(p){d({label:"error",error:p})}}}),await o.add(t),r&&await o.add(e.configFilepath);try{t.map(require)}catch(s){d({label:"error",error:s})}}var ie=c(require("fs-extra")),Ae=c(require("esbuild"));function kt(e){try{return require(e)}catch(t){return{}}}async function Me(e){let t=P(),r=_(e),o=r.filter(M),n=r.filter(T);if(u({label:"build",message:"starting build"}),!o.length&&!n.length)O({label:"files",message:"no files were found, nothing to build"});else{let i="",l=0,s="",a="",p=await Promise.allSettled([(async()=>{if(o.length){let m=P(),{allGeneratedFiles:k}=await q(o,e);i=m(),l=k.length}})(),(async()=>{if(n.length){let m=P();Q(n,e),await(0,Ae.build)({entryPoints:Object.values(require(e.functionsManifest)),outdir:e.functionsOutputDir,bundle:!0,platform:"node",target:["node12"],minify:!0,allowOverwrite:!0,define:{"process.env.PRESTA_SERVERLESS_RUNTIME":"true"}}),s=m()}})(),(async()=>{if(ie.default.existsSync(e.assets)){let m=P();ie.default.copySync(e.assets,e.staticOutputDir),a=m()}})()]);if(p.find(m=>m.status==="rejected")){u({label:"build",message:"build partially failed"}),p.forEach(m=>{m.status==="rejected"&&d({label:"error",error:m.reason})}),process.exit(1);return}(i||s)&&F(),i&&y({label:"static",message:`rendered ${l} file(s)`,duration:i}),s&&y({label:"lambda",message:`compiled ${n.length} function(s)`,duration:s}),a&&y({label:"assets",message:`copied in ${a}`}),e.hooks.emitPostBuild({output:e.output,staticOutput:e.staticOutputDir,functionsOutput:e.functionsOutputDir,functionsManifest:kt(e.functionsManifest)}),(i||s)&&(F(),y({label:"complete",message:`in ${t()}`}),F())}}var Tt=c(require("fs")),jt=c(require("path")),Ue=c(require("http")),Ve=c(require("get-port")),le=c(require("sirv")),ze=c(require("chokidar")),Ge=c(require("mime-types")),Qe=c(require("regexparam")),ee=c(require("statuses"));var ae=c(require("statuses"));function X({statusCode:e}){return`<!-- built with presta https://npm.im/presta -->
37 <!DOCTYPE html>
38 <html>
39 <head>
40 <meta charset="UTF-8" />
41 <meta name="viewport" content="width=device-width,initial-scale=1" />
42 <title>${e} \u2014\xA0${ae.default.message[e]}</title>
43 <link rel="icon" type="image/png" href="https://presta.run/favicon.png">
44 <link rel="icon" type="image/svg" href="https://presta.run/favicon.svg">
45 <link rel="preconnect" href="https://fonts.googleapis.com">
46 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
47 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;900&display=swap" rel="stylesheet">
48 <link rel='stylesheet' href='https://unpkg.com/svbstrate@5.1.0/svbstrate.css' />
49 <style>
50 html,body {
51 font-family: 'Inter', 'sans-serif';
52 color: #23283D;
53 background-color: #DADEF0;
54 }
55 #favicon {
56 fill: #23283D;
57 }
58 @media (prefers-color-scheme: dark) {
59 html,body {
60 color: #DADEF0;
61 background-color: #23283D;
62 }
63 #favicon {
64 fill: #DADEF0;
65 }
66 }
67 </style>
68 </head>
69 <body class='w f aic jcc' style='height: 100vh'>
70 <div class='p12 tac'>
71 <h1>${e}</h1>
72 <p class='mb1'>${ae.default.message[e]}</p>
73
74 <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
75 <g clip-path="url(#a)">
76 <path id="favicon" fill-rule="evenodd" clip-rule="evenodd" d="M10.4 7c-.3 0-.8.2-1 .5L1.1 22.1c-.2.3 0 .6.3.6l4 .3-2.1 2.6c-.2.3-.1.6.2.6l16.8 1.3c.4 0 .8-.2 1-.4L32 13.9c.2-.2.1-.5-.2-.5l-6.4-.5 2.2-4c.2-.3 0-.5-.3-.6L10.4 7ZM24 12.8l1.9-3.4-15.5-1.2-7.7 13.4 3.6.3 7.5-9.4c.3-.3.7-.5 1-.4l9.2.7ZM7.6 22l7.1-8.9 8.7.7-5.2 9L7.6 22Zm-1 1.1 11.6 1c.3 0 .8-.3 1-.6l5.5-9.6 5.5.5-9.7 12L5 25.2l1.7-2Z" fill="#23283D"/>
77 </g>
78 <defs>
79 <clipPath id="a">
80 <path fill="#fff" d="M0 0h32v32H0z"/>
81 </clipPath>
82 </defs>
83 </svg>
84 </div>
85 </body>
86 </html>
87 `}var _e=c(require("url")),We=c(require("query-string")),qe=c(require("raw-body")),Ne=c(require("mime-types")),Rt=/image|audio|video|application\/pdf|application\/zip|applicaton\/octet-stream/i;function Dt(e){return Boolean(e)&&Rt.test(e)}function Ot(e){let t={},r={};for(let o of Object.keys(e)){let n=o.toLowerCase(),i=e[o];!i||(Array.isArray(i)?r[n]=i:t[n]=i)}return{headers:t,multiValueHeaders:r}}function $t(e){let t=(0,We.parse)(e,{arrayFormat:"comma"}),r={},o={};for(let n of Object.keys(t)){let i=t[n];Array.isArray(i)?o[n]=i:r[n]=i||void 0}return{queryStringParameters:r,multiValueQueryStringParameters:o}}async function Le(e){let{url:t="",method:r}=e,{headers:o,multiValueHeaders:n}=Ot(e.headers),i=Dt(o["content-type"]||""),l=o["content-length"],s=l?await(0,qe.default)(e,{limit:"1mb",encoding:Ne.default.charset(l)||void 0}):void 0,a=(0,_e.parse)(t).query||"",{queryStringParameters:p,multiValueQueryStringParameters:m}=$t(a);return o["client-ip"]="0.0.0.0",{rawUrl:t,path:t,httpMethod:r,headers:o,multiValueHeaders:n,rawQuery:a,queryStringParameters:p,multiValueQueryStringParameters:m,body:s?Buffer.from(s).toString(i?"base64":"utf8"):null,isBase64Encoded:i}}function Y(e,t){let r=C(t);for(let o in t.multiValueHeaders)e.setHeader(o,String(t.multiValueHeaders[o]));for(let o in t.headers)e.setHeader(o,String(t.headers[o]));e.statusCode=r.statusCode,e.write(r.body),e.end()}function It({port:e,config:t}){let r=J({port:e}),o=t.staticOutputDir,n=t.assets;return async function(l,s){let a=P(),p=l.url;u({label:"debug",message:`handling ${p}`}),(0,le.default)(n,{dev:!0})(l,s,()=>{u({label:"debug",message:`attempting to serve generated static asset ${p}`}),(0,le.default)(o,{dev:!0})(l,s,async()=>{let m=await Le(l),k=m.headers.Accept||m.headers.accept,g=k&&k.includes("json");try{delete require.cache[t.functionsManifest];let I=require(t.functionsManifest),H=Object.keys(I).map(v=>({matcher:(0,Qe.default)(v),route:v})).filter(({matcher:v})=>v.pattern.test(p.split("?")[0])).map(({route:v})=>I[v])[0];if(H){u({label:"debug",message:`attempting to render lambda for ${p}`});let{handler:v}=require(H),x;try{x=C(await v(m,{}))}catch(Xe){d({label:"serve",message:"lambda",error:Xe}),x=C({statusCode:500,html:g?void 0:X({statusCode:500}),json:g?{detail:ee.default.message[500]}:void 0})}let B=x.headers||{},re=x.statusCode>299&&x.statusCode<399,me=B["Content-Type"],Ke=me?Ge.default.extension(me):"html";y({label:"serve",message:`${x.statusCode} ${re?B.Location:p}`,duration:a()}),Y(s,R(f({},x),{body:Ke==="html"?(x.body||"").split("</body>")[0]+r:x.body}))}else O({label:"serve",message:`404 ${p}`,duration:a()}),Y(s,C({statusCode:404,html:g?void 0:X({statusCode:404})+r,json:g?{detail:ee.default.message[404]}:void 0}))}catch(I){d({label:"serve",message:`500 ${p}`,error:I,duration:a()}),Y(s,C({statusCode:500,html:g?void 0:X({statusCode:500})+r,json:g?{detail:ee.default.message[500]}:void 0}))}})})}}async function ce(e){let t=await(0,Ve.default)({port:e.port}),r=Ue.default.createServer(It({port:t,config:e})).listen(t),o=require("pocket.io")(r,{serveClient:!1});return e.hooks.onBrowserRefresh(()=>{u({label:"debug",message:"refresh event received"}),o.emit("refresh")}),ze.default.watch(e.assets,{ignoreInitial:!0}).on("all",()=>{e.hooks.emitBrowserRefresh()}),{port:t}}var N=(0,Ze.default)("presta"),te="presta.config.js";function pe(e={}){require("module-alias").addAliases({"@":process.cwd(),"presta:internal":__dirname}),require("esbuild-register/dist/node").register(e)}N.version(he.version).option("--config, -c",`Path to a config file. (default ${te})`).option("--output, -o","Specify output directory for built files. (default ./build)").option("--assets, -a","Specify static asset directory. (default ./public)").option("--debug, -d","Enable debug mode (prints more logs)").example("dev index.jsx -o dist").example("dev 'pages/*.tsx' -o static").example("'pages/*.tsx'").example("-c site.json").example("serve -p 8080");N.command("build","Build project to output directory.",{default:!0}).example("").example("files/**/*.js").example(`-c ${te}`).action(async e=>{pe(),console.clear();let t=await $({env:b.PRODUCTION,config:j(e.config,!0),cli:R(f({},e),{files:e._})});Je.default.emptyDirSync(t.output),z(`${D.default.blue("presta build")}`),F(),await Me(t)});N.command("dev","Start Presta dev server and watch files",{alias:"watch"}).option("--port, -p","Port to run the local server. (default 4000)").option("--no-serve, -n","Do not run local dev server. (default false)").describe("Watch project and build to output directory.").example("dev").example("dev ./files/**/*.js").example("dev ./files/**/*.js -o ./out").example(`dev -c ${te}`).action(async e=>{pe(),console.clear();let t=await $({env:b.DEVELOPMENT,config:j(e.config),cli:R(f({},e),{files:e._})});if(e.n)y({label:"dev"}),F();else{let r=await ce(t);z(`${D.default.blue("presta dev")} - http://localhost:${r.port}`),F()}Be(t)});N.command("serve").option("--port, -p","Port to run the local server. (default 4000)").describe("Serve built files, lambdas, and static assets.").example("serve").example("serve -o ./out -p 8080").example(`serve -c ${te}`).action(async e=>{pe(),console.clear();let t=await $({env:b.PRODUCTION,config:j(e.config),cli:e}),r=await ce(t);z(`${D.default.blue("presta serve")} - http://localhost:${r.port}`),F()});N.parse(process.argv);
88//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibGliL2NsaS50cyIsICJsaWIvbG9nLnRzIiwgImxpYi9jb25zdGFudHMudHMiLCAibGliL2N1cnJlbnRQcmVzdGFJbnN0YW5jZS50cyIsICJsaWIvY29uZmlnLnRzIiwgImxpYi9jcmVhdGVFbWl0dGVyLnRzIiwgImxpYi93YXRjaC50cyIsICJsaWIvb3V0cHV0TGFtYmRhcy50cyIsICJsaWIvaGFzaENvbnRlbnQudHMiLCAibGliL2dldEZpbGVzLnRzIiwgImxpYi9yZW5kZXJTdGF0aWNFbnRyaWVzLnRzIiwgImxpYi90aW1lci50cyIsICJsaWIvZ2V0Um91dGVQYXJhbXMudHMiLCAibGliL25vcm1hbGl6ZVJlc3BvbnNlLnRzIiwgImxpYi9idWlsdFN0YXRpY0ZpbGVzLnRzIiwgImxpYi9yZW1vdmVCdWlsdFN0YXRpY0ZpbGUudHMiLCAibGliL2xpdmVSZWxvYWRTY3JpcHQudHMiLCAibGliL2J1aWxkLnRzIiwgImxpYi9zZXJ2ZS50cyIsICJsaWIvY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZS50cyIsICJsaWIvcmVxdWVzdFRvRXZlbnQudHMiLCAibGliL3NlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHNhZGUgZnJvbSAnc2FkZSdcblxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IGNyZWF0ZUNvbmZpZywgZ2V0Q29uZmlnRmlsZSB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuL3dhdGNoJ1xuaW1wb3J0IHsgYnVpbGQgfSBmcm9tICcuL2J1aWxkJ1xuaW1wb3J0IHsgc2VydmUgfSBmcm9tICcuL3NlcnZlJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmNvbnN0IHByb2cgPSBzYWRlKCdwcmVzdGEnKVxuY29uc3QgQ09ORklHX0RFRkFVTFQgPSAncHJlc3RhLmNvbmZpZy5qcydcblxuZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lKG9wdGlvbnMgPSB7fSkge1xuICByZXF1aXJlKCdtb2R1bGUtYWxpYXMnKS5hZGRBbGlhc2VzKHtcbiAgICAnQCc6IHByb2Nlc3MuY3dkKCksXG4gICAgJ3ByZXN0YTppbnRlcm5hbCc6IF9fZGlybmFtZSwgLy8gd2hlcmV2ZXIgdGhpcyBpcyBydW5uaW5nIGZyb21cbiAgfSlcblxuICByZXF1aXJlKCdlc2J1aWxkLXJlZ2lzdGVyL2Rpc3Qvbm9kZScpLnJlZ2lzdGVyKG9wdGlvbnMpXG59XG5cbnByb2dcbiAgLnZlcnNpb24ocGtnLnZlcnNpb24pXG4gIC8vIGRvIG5vdCBwcm92aWRlIGRlZmF1bHQgY29uZmlnIGhlcmVcbiAgLm9wdGlvbignLS1jb25maWcsIC1jJywgYFBhdGggdG8gYSBjb25maWcgZmlsZS4gIChkZWZhdWx0ICR7Q09ORklHX0RFRkFVTFR9KWApXG4gIC5vcHRpb24oJy0tb3V0cHV0LCAtbycsIGBTcGVjaWZ5IG91dHB1dCBkaXJlY3RvcnkgZm9yIGJ1aWx0IGZpbGVzLiAgKGRlZmF1bHQgLi9idWlsZClgKVxuICAub3B0aW9uKCctLWFzc2V0cywgLWEnLCBgU3BlY2lmeSBzdGF0aWMgYXNzZXQgZGlyZWN0b3J5LiAgKGRlZmF1bHQgLi9wdWJsaWMpYClcbiAgLm9wdGlvbignLS1kZWJ1ZywgLWQnLCBgRW5hYmxlIGRlYnVnIG1vZGUgKHByaW50cyBtb3JlIGxvZ3MpYClcbiAgLmV4YW1wbGUoYGRldiBpbmRleC5qc3ggLW8gZGlzdGApXG4gIC5leGFtcGxlKGBkZXYgJ3BhZ2VzLyoudHN4JyAtbyBzdGF0aWNgKVxuICAuZXhhbXBsZShgJ3BhZ2VzLyoudHN4J2ApXG4gIC5leGFtcGxlKGAtYyBzaXRlLmpzb25gKVxuICAuZXhhbXBsZShgc2VydmUgLXAgODA4MGApXG5cbnByb2dcbiAgLmNvbW1hbmQoJ2J1aWxkJywgJ0J1aWxkIHByb2plY3QgdG8gb3V0cHV0IGRpcmVjdG9yeS4nLCB7IGRlZmF1bHQ6IHRydWUgfSlcbiAgLmV4YW1wbGUoYGApXG4gIC5leGFtcGxlKGBmaWxlcy8qKi8qLmpzYClcbiAgLmV4YW1wbGUoYC1jICR7Q09ORklHX0RFRkFVTFR9YClcbiAgLmFjdGlvbihhc3luYyAob3B0cykgPT4ge1xuICAgIHJlZ2lzdGVyUnVudGltZSgpXG5cbiAgICBjb25zb2xlLmNsZWFyKClcblxuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGNyZWF0ZUNvbmZpZyh7XG4gICAgICBlbnY6IEVudi5QUk9EVUNUSU9OLFxuICAgICAgY29uZmlnOiBnZXRDb25maWdGaWxlKG9wdHMuY29uZmlnLCB0cnVlKSxcbiAgICAgIGNsaToge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBmaWxlczogb3B0cy5fLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgZnMuZW1wdHlEaXJTeW5jKGNvbmZpZy5vdXRwdXQpXG5cbiAgICBsb2dnZXIucmF3KGAke2xvZ2dlci5jb2xvcnMuYmx1ZSgncHJlc3RhIGJ1aWxkJyl9YClcbiAgICBsb2dnZXIubmV3bGluZSgpXG5cbiAgICBhd2FpdCBidWlsZChjb25maWcpXG4gIH0pXG5cbnByb2dcbiAgLmNvbW1hbmQoJ2RldicsICdTdGFydCBQcmVzdGEgZGV2IHNlcnZlciBhbmQgd2F0Y2ggZmlsZXMnLCB7IGFsaWFzOiAnd2F0Y2gnIH0pXG4gIC5vcHRpb24oJy0tcG9ydCwgLXAnLCBgUG9ydCB0byBydW4gdGhlIGxvY2FsIHNlcnZlci4gIChkZWZhdWx0IDQwMDApYClcbiAgLm9wdGlvbignLS1uby1zZXJ2ZSwgLW4nLCBgRG8gbm90IHJ1biBsb2NhbCBkZXYgc2VydmVyLiAgKGRlZmF1bHQgZmFsc2UpYClcbiAgLmRlc2NyaWJlKCdXYXRjaCBwcm9qZWN0IGFuZCBidWlsZCB0byBvdXRwdXQgZGlyZWN0b3J5LicpXG4gIC5leGFtcGxlKGBkZXZgKVxuICAuZXhhbXBsZShgZGV2IC4vZmlsZXMvKiovKi5qc2ApXG4gIC5leGFtcGxlKGBkZXYgLi9maWxlcy8qKi8qLmpzIC1vIC4vb3V0YClcbiAgLmV4YW1wbGUoYGRldiAtYyAke0NPTkZJR19ERUZBVUxUfWApXG4gIC5hY3Rpb24oYXN5bmMgKG9wdHMpID0+IHtcbiAgICByZWdpc3RlclJ1bnRpbWUoKVxuXG4gICAgY29uc29sZS5jbGVhcigpXG5cbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCBjcmVhdGVDb25maWcoe1xuICAgICAgZW52OiBFbnYuREVWRUxPUE1FTlQsXG4gICAgICBjb25maWc6IGdldENvbmZpZ0ZpbGUob3B0cy5jb25maWcpLFxuICAgICAgY2xpOiB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGZpbGVzOiBvcHRzLl8sXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBpZiAoIW9wdHMubikge1xuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc2VydmUoY29uZmlnKVxuXG4gICAgICBsb2dnZXIucmF3KGAke2xvZ2dlci5jb2xvcnMuYmx1ZSgncHJlc3RhIGRldicpfSAtIGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXIucG9ydH1gKVxuICAgICAgbG9nZ2VyLm5ld2xpbmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnZGV2JyxcbiAgICAgIH0pXG4gICAgICBsb2dnZXIubmV3bGluZSgpXG4gICAgfVxuXG4gICAgd2F0Y2goY29uZmlnKVxuICB9KVxuXG5wcm9nXG4gIC5jb21tYW5kKCdzZXJ2ZScpXG4gIC5vcHRpb24oJy0tcG9ydCwgLXAnLCBgUG9ydCB0byBydW4gdGhlIGxvY2FsIHNlcnZlci4gIChkZWZhdWx0IDQwMDApYClcbiAgLmRlc2NyaWJlKCdTZXJ2ZSBidWlsdCBmaWxlcywgbGFtYmRhcywgYW5kIHN0YXRpYyBhc3NldHMuJylcbiAgLmV4YW1wbGUoYHNlcnZlYClcbiAgLmV4YW1wbGUoYHNlcnZlIC1vIC4vb3V0IC1wIDgwODBgKVxuICAuZXhhbXBsZShgc2VydmUgLWMgJHtDT05GSUdfREVGQVVMVH1gKVxuICAuYWN0aW9uKGFzeW5jIChvcHRzKSA9PiB7XG4gICAgcmVnaXN0ZXJSdW50aW1lKClcblxuICAgIGNvbnNvbGUuY2xlYXIoKVxuXG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgY3JlYXRlQ29uZmlnKHtcbiAgICAgIGVudjogRW52LlBST0RVQ1RJT04sXG4gICAgICBjb25maWc6IGdldENvbmZpZ0ZpbGUob3B0cy5jb25maWcpLFxuICAgICAgY2xpOiBvcHRzLFxuICAgIH0pXG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc2VydmUoY29uZmlnKVxuXG4gICAgbG9nZ2VyLnJhdyhgJHtsb2dnZXIuY29sb3JzLmJsdWUoJ3ByZXN0YSBzZXJ2ZScpfSAtIGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXIucG9ydH1gKVxuICAgIGxvZ2dlci5uZXdsaW5lKClcbiAgfSlcblxucHJvZy5wYXJzZShwcm9jZXNzLmFyZ3YpXG4iLCAiaW1wb3J0IGMsIHsgS2xldXIgfSBmcm9tICdrbGV1cidcblxuaW1wb3J0IHsgZ2V0Q3VycmVudFByZXN0YUluc3RhbmNlIH0gZnJvbSAnLi9jdXJyZW50UHJlc3RhSW5zdGFuY2UnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IGVudW0gTGV2ZWxzIHtcbiAgRGVidWcgPSAnZGVidWcnLFxuICBJbmZvID0gJ2luZm8nLFxuICBXYXJuID0gJ3dhcm4nLFxuICBFcnIgPSAnZXJyb3InLFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlID0ge1xuICBsZXZlbD86IExldmVsc1xuICBsYWJlbDogc3RyaW5nIHwgbnVtYmVyXG4gIG1lc3NhZ2U/OiBzdHJpbmdcbiAgZHVyYXRpb24/OiBzdHJpbmcgfCBudW1iZXJcbiAgZXJyb3I/OiBFcnJvclxufVxuXG5sZXQgbG9nczogYW55W10gPSBbXVxuXG5jb25zdCBjb2xvcnMgPSB7XG4gIFtMZXZlbHMuRGVidWddOiAnbWFnZW50YScsXG4gIFtMZXZlbHMuSW5mb106ICdibHVlJyxcbiAgW0xldmVscy5XYXJuXTogJ3llbGxvdycsXG4gIFtMZXZlbHMuRXJyXTogJ3JlZCcsXG59XG5cbmV4cG9ydCB7IGMgYXMgY29sb3JzIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ3MoKSB7XG4gIGlmICghcHJvY2Vzcy5lbnYuVEVTVElORykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgbWV0aG9kIHdhcyBjYWxsZWQgb3V0c2lkZSB0ZXN0IG1vZGUnKVxuICB9XG5cbiAgcmV0dXJuIGxvZ3Ncbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dlcihtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5URVNUSU5HKSB7XG4gICAgbG9ncy5wdXNoKG1lc3NhZ2UpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVidWcgPSBnZXRDdXJyZW50UHJlc3RhSW5zdGFuY2UoKS5kZWJ1Z1xuICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDdXJyZW50UHJlc3RhSW5zdGFuY2UoKS5lbnYgPT09IEVudi5QUk9EVUNUSU9OID8gJ3Byb2QnIDogJ2RldidcblxuICAgIGlmICghZGVidWcgJiYgbWVzc2FnZS5sZXZlbCA9PT0gTGV2ZWxzLkRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgW1xuICAgICAgICBjLmdyYXkoY29udGV4dCksXG4gICAgICAgIGNbY29sb3JzW21lc3NhZ2UubGV2ZWwgfHwgJ2luZm8nXSBhcyBrZXlvZiBLbGV1cl0obWVzc2FnZS5sYWJlbCksXG4gICAgICAgIG1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgbWVzc2FnZS5kdXJhdGlvbiA/IGMuZ3JheSgnKycgKyBtZXNzYWdlLmR1cmF0aW9uKSA6ICcnLFxuICAgICAgICBtZXNzYWdlLmVycm9yID8gYFxcblxcbiR7bWVzc2FnZS5lcnJvci5zdGFjayB8fCBtZXNzYWdlLmVycm9yfVxcblxcbmAgOiAnJyxcbiAgICAgIF1cbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuam9pbignICcpXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1ZyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGxvZ2dlcih7IGxldmVsOiBMZXZlbHMuRGVidWcsIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZm8obWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLkluZm8sIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm4obWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLldhcm4sIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5FcnIsIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhdyguLi5hcmdzOiBhbnlbXSkge1xuICBpZiAocHJvY2Vzcy5lbnYuVEVTVElORykge1xuICAgIGxvZ3MucHVzaChhcmdzKVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld2xpbmUoKSB7XG4gIGlmIChwcm9jZXNzLmVudi5URVNUSU5HKSByZXR1cm5cbiAgY29uc29sZS5sb2coJycpXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVudiA9IHtcbiAgUFJPRFVDVElPTjogJ3Byb2R1Y3Rpb24nLFxuICBERVZFTE9QTUVOVDogJ2RldmVsb3BtZW50Jyxcbn1cbiIsICJpbXBvcnQgeyBQcmVzdGEgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIHBpZDogcHJvY2Vzcy5waWQsXG4gIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgZW52OiBFbnYuUFJPRFVDVElPTixcbiAgZGVidWc6IGZhbHNlLFxufSBhcyBQcmVzdGFcblxuZXhwb3J0IGZ1bmN0aW9uIHNldEN1cnJlbnRQcmVzdGFJbnN0YW5jZShjb25maWc6IFByZXN0YSk6IFByZXN0YSB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgZ2xvYmFsLl9fcHJlc3RhX18gPSBjb25maWdcbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudFByZXN0YUluc3RhbmNlKCk6IFByZXN0YSB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaWYgKCFnbG9iYWwuX19wcmVzdGFfXykge1xuICAgIHNldEN1cnJlbnRQcmVzdGFJbnN0YW5jZShkZWZhdWx0Q29uZmlnKVxuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gZ2xvYmFsLl9fcHJlc3RhX19cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBjcmVhdGVFbWl0dGVyLCBjcmVhdGVFbWl0SG9vaywgY3JlYXRlT25Ib29rIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgc2V0Q3VycmVudFByZXN0YUluc3RhbmNlLCBnZXRDdXJyZW50UHJlc3RhSW5zdGFuY2UgfSBmcm9tICcuL2N1cnJlbnRQcmVzdGFJbnN0YW5jZSdcbmltcG9ydCB7IFByZXN0YSwgQ29uZmlnLCBDTEksIENhbGxhYmxlIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnRmlsZXBhdGggPSAncHJlc3RhLmNvbmZpZy5qcydcblxuZnVuY3Rpb24gcmVzb2x2ZUFic29sdXRlUGF0aHMoXG4gIGNvbmZpZzoge1xuICAgIGZpbGVzPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBvdXRwdXQ/OiBzdHJpbmdcbiAgICBhc3NldHM/OiBzdHJpbmdcbiAgfSxcbiAgeyBjd2QgfTogeyBjd2Q6IHN0cmluZyB9XG4pIHtcbiAgaWYgKGNvbmZpZy5maWxlcykgY29uZmlnLmZpbGVzID0gKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQoY29uZmlnLmZpbGVzKS5tYXAoKHApID0+IHBhdGgucmVzb2x2ZShjd2QsIHApKVxuICBpZiAoY29uZmlnLm91dHB1dCkgY29uZmlnLm91dHB1dCA9IHBhdGgucmVzb2x2ZShjd2QsIGNvbmZpZy5vdXRwdXQpXG4gIGlmIChjb25maWcuYXNzZXRzKSBjb25maWcuYXNzZXRzID0gcGF0aC5yZXNvbHZlKGN3ZCwgY29uZmlnLmFzc2V0cylcbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2xlYXJDdXJyZW50Q29uZmlnKCkge1xuICAvLyBAdHMtaWdub3JlXG4gIGdsb2JhbC5fX3ByZXN0YV9fID0ge1xuICAgIHBpZDogcHJvY2Vzcy5waWQsXG4gICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGVudjogRW52LlBST0RVQ1RJT04sXG4gIH1cbn1cblxuLyoqXG4gKiBGZXRjaCBhIGNvbmZpZyBmaWxlLiBJZiBvbmUgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlciwgbGV0IHRoZW0ga25vdyBpZlxuICogYW55dGhpbmcgZ29lcyB3cm9uZy4gT3V0c2lkZSB3YXRjaCBtb2RlLCB0aGlzIHNob3VsZCBleGl0KDEpIGlmIHRoZSB1c2VyXG4gKiBwcm92aWRlZCBhIGNvbmZpZyBhbmQgdGhlcmUgd2FzIGFuIGVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdGaWxlKGZpbGVwYXRoPzogc3RyaW5nLCBzaG91bGRFeGl0OiBib29sZWFuID0gZmFsc2UpIHtcbiAgY29uc3QgZnAgPSBwYXRoLnJlc29sdmUoZmlsZXBhdGggfHwgZGVmYXVsdENvbmZpZ0ZpbGVwYXRoKVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoZnApXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKGZwKVxuXG4gICAgLy8gY29uZmlnIGZpbGUgZXhpc3RzLCBzaG91bGQgbG9nIGVycm9yLCBvdGhlcndpc2UgaWdub3JlIG1pc3NpbmcgZmlsZVxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICAgIH0pXG5cbiAgICAgIC8vIHdlJ3JlIG5vdCBpbiB3YXRjaCBtb2RlLCBleGl0IGJ1aWxkXG4gICAgICBpZiAoc2hvdWxkRXhpdCkgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHt9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIF93aXRob3V0XyBhbnkgdmFsdWVzIHByb3ZpZGVkIGJ5IHRoZSBjb25maWcgZmlsZS5cbiAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSB1c2VyIGRlbGV0ZXMgdGhlaXIgY29uZmlnIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVDb25maWdWYWx1ZXMoKSB7XG4gIGxvZ2dlci5kZWJ1Zyh7XG4gICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgbWVzc2FnZTogYGNvbmZpZyBmaWxlIHZhbHVlcyBjbGVhcmVkYCxcbiAgfSlcblxuICByZXR1cm4gc2V0Q3VycmVudFByZXN0YUluc3RhbmNlKFxuICAgIGF3YWl0IGNyZWF0ZUNvbmZpZyh7XG4gICAgICAuLi5nZXRDdXJyZW50UHJlc3RhSW5zdGFuY2UoKSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ29uZmlnKHtcbiAgY3dkID0gcHJvY2Vzcy5jd2QoKSxcbiAgZW52ID0gZ2V0Q3VycmVudFByZXN0YUluc3RhbmNlKCkuZW52LFxuICBjb25maWcgPSB7fSxcbiAgY2xpID0ge30sXG59OiB7XG4gIGN3ZD86IHN0cmluZ1xuICBlbnY/OiBzdHJpbmdcbiAgY29uZmlnPzogUGFydGlhbDxDb25maWc+XG4gIGNsaT86IFBhcnRpYWw8Q0xJPlxufSkge1xuICBjb25maWcgPSByZXNvbHZlQWJzb2x1dGVQYXRocyh7IC4uLmNvbmZpZyB9LCB7IGN3ZCB9KSAvLyBjbG9uZSByZWFkLW9ubHkgb2JqXG4gIGNsaSA9IHJlc29sdmVBYnNvbHV0ZVBhdGhzKHsgLi4uY2xpIH0sIHsgY3dkIH0pXG5cbiAgLy8gY29tYmluZWQgY29uZmlnLCBwcmVmZXJlbmNlIHRvIENMSSBhcmdzXG4gIGNvbnN0IG1lcmdlZCA9IHtcbiAgICBvdXRwdXQ6IHBhdGgucmVzb2x2ZShjd2QsIGNsaS5vdXRwdXQgfHwgY29uZmlnLm91dHB1dCB8fCAnYnVpbGQnKSxcbiAgICBhc3NldHM6IHBhdGgucmVzb2x2ZShjbGkuYXNzZXRzIHx8IGNvbmZpZy5hc3NldHMgfHwgJ3B1YmxpYycpLFxuICAgIGZpbGVzOiBjbGkuZmlsZXMgJiYgY2xpLmZpbGVzLmxlbmd0aCA/IGNsaS5maWxlcyA6IGNvbmZpZy5maWxlcyA/IChbXSBhcyBzdHJpbmdbXSkuY29uY2F0KGNvbmZpZy5maWxlcykgOiBbXSxcbiAgfVxuICBjb25zdCBwb3J0ID0gY2xpLnBvcnQgPyBwYXJzZUludChjbGkucG9ydCkgOiBjb25maWcucG9ydCB8fCA0MDAwXG5cbiAgY29uc3QgcHJldmlvdXMgPSBnZXRDdXJyZW50UHJlc3RhSW5zdGFuY2UoKVxuICAvLyBvbmx5IGNyZWF0ZSBvbmNlXG4gIGNvbnN0IGVtaXR0ZXIgPSBwcmV2aW91cy5ldmVudHMgfHwgY3JlYXRlRW1pdHRlcigpXG5cbiAgLy8gZGVyZWdpc3RlciBvbGQgZXZlbnRzXG4gIGVtaXR0ZXIuY2xlYXIoKVxuXG4gIC8vIHNldCBpbnN0YW5jZVxuICBjb25zdCBuZXh0OiBQcmVzdGEgPSBzZXRDdXJyZW50UHJlc3RhSW5zdGFuY2Uoe1xuICAgIC4uLnByZXZpb3VzLFxuICAgIC4uLm1lcmdlZCwgLy8gb3ZlcndyaXRlcyBldmVyeSB0aW1lXG4gICAgZW52LFxuICAgIGN3ZCxcbiAgICBwb3J0LFxuICAgIGRlYnVnOiBjbGkuZGVidWcgfHwgZ2V0Q3VycmVudFByZXN0YUluc3RhbmNlKCkuZGVidWcsXG4gICAgY29uZmlnRmlsZXBhdGg6IHBhdGgucmVzb2x2ZShjbGkuY29uZmlnIHx8IGRlZmF1bHRDb25maWdGaWxlcGF0aCksXG4gICAgc3RhdGljT3V0cHV0RGlyOiBwYXRoLmpvaW4obWVyZ2VkLm91dHB1dCwgJ3N0YXRpYycpLFxuICAgIGZ1bmN0aW9uc091dHB1dERpcjogcGF0aC5qb2luKG1lcmdlZC5vdXRwdXQsICdmdW5jdGlvbnMnKSxcbiAgICBmdW5jdGlvbnNNYW5pZmVzdDogcGF0aC5qb2luKG1lcmdlZC5vdXRwdXQsICdyb3V0ZXMuanNvbicpLFxuICAgIGV2ZW50czogZW1pdHRlcixcbiAgICBob29rczoge1xuICAgICAgZW1pdFBvc3RCdWlsZChwcm9wcykge1xuICAgICAgICBlbWl0dGVyLmVtaXQoJ3Bvc3RCdWlsZCcsIHByb3BzKVxuICAgICAgfSxcbiAgICAgIG9uUG9zdEJ1aWxkKGNiKSB7XG4gICAgICAgIHJldHVybiBlbWl0dGVyLm9uKCdwb3N0QnVpbGQnLCBjYilcbiAgICAgIH0sXG4gICAgICBlbWl0QnVpbGRGaWxlKHByb3BzKSB7XG4gICAgICAgIGVtaXR0ZXIuZW1pdCgnYnVpbGRGaWxlJywgcHJvcHMpXG4gICAgICB9LFxuICAgICAgb25CdWlsZEZpbGUoY2IpIHtcbiAgICAgICAgcmV0dXJuIGVtaXR0ZXIub24oJ2J1aWxkRmlsZScsIGNiKVxuICAgICAgfSxcbiAgICAgIGVtaXRCcm93c2VyUmVmcmVzaCgpIHtcbiAgICAgICAgZW1pdHRlci5lbWl0KCdicm93c2VyUmVmcmVzaCcpXG4gICAgICB9LFxuICAgICAgb25Ccm93c2VyUmVmcmVzaChjYikge1xuICAgICAgICByZXR1cm4gZW1pdHRlci5vbignYnJvd3NlclJlZnJlc2gnLCBjYilcbiAgICAgIH0sXG4gICAgfSxcbiAgfSlcblxuICBpZiAoY29uZmlnLnBsdWdpbnMpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbmZpZy5wbHVnaW5zLm1hcCgocCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBwKGdldEN1cnJlbnRQcmVzdGFJbnN0YW5jZSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKHtcbiAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICBtZXNzYWdlOiBgY29uZmlnIGNyZWF0ZWQgJHtKU09OLnN0cmluZ2lmeShuZXh0KX1gLFxuICB9KVxuXG4gIHJldHVybiBuZXh0XG59XG4iLCAiaW1wb3J0IHsgQ2FsbGFibGUgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgbGV0IGV2ZW50czogeyBbZXZlbnQ6IHN0cmluZ106IENhbGxhYmxlW10gfSA9IHt9XG5cbiAgZnVuY3Rpb24gZW1pdChldjogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGV2ZW50c1tldl0gPyBldmVudHNbZXZdLm1hcCgoZm46IENhbGxhYmxlKSA9PiBmbiguLi5hcmdzKSkgOiBbXVxuICB9XG5cbiAgZnVuY3Rpb24gb24oZXY6IHN0cmluZywgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGV2ZW50c1tldl0gPSBldmVudHNbZXZdID8gZXZlbnRzW2V2XS5jb25jYXQoZm4pIDogW2ZuXVxuICAgIHJldHVybiAoKSA9PiBldmVudHNbZXZdLnNwbGljZShldmVudHNbZXZdLmluZGV4T2YoZm4pLCAxKVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZXZlbnRzID0ge31cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbmVycyhldjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGV2ZW50c1tldl0gfHwgW11cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW1pdCxcbiAgICBvbixcbiAgICBjbGVhcixcbiAgICBsaXN0ZW5lcnMsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVtaXRIb29rKG5hbWU6IHN0cmluZywgZW1pdHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRW1pdHRlcj4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhvb2s8VD4ocHJvcHM6IFQpIHtcbiAgICBlbWl0dGVyLmVtaXQobmFtZSwgcHJvcHMpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9uSG9vayhuYW1lOiBzdHJpbmcsIGVtaXR0ZXI6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUVtaXR0ZXI+KSB7XG4gIHJldHVybiBmdW5jdGlvbiBob29rKGNhbGxiYWNrOiBDYWxsYWJsZSkge1xuICAgIHJldHVybiBlbWl0dGVyLm9uKG5hbWUsIGNhbGxiYWNrKVxuICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnd2F0Y2gtZGVwZW5kZW5jeS1ncmFwaCdcbmltcG9ydCBjaG9raWRhciBmcm9tICdjaG9raWRhcidcbmltcG9ydCBtYXRjaCBmcm9tICdwaWNvbWF0Y2gnXG5cbmltcG9ydCB7IG91dHB1dExhbWJkYXMgfSBmcm9tICcuL291dHB1dExhbWJkYXMnXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBnZXRGaWxlcywgaXNTdGF0aWMsIGlzRHluYW1pYyB9IGZyb20gJy4vZ2V0RmlsZXMnXG5pbXBvcnQgeyByZW5kZXJTdGF0aWNFbnRyaWVzIH0gZnJvbSAnLi9yZW5kZXJTdGF0aWNFbnRyaWVzJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0IHsgY3JlYXRlQ29uZmlnLCByZW1vdmVDb25maWdWYWx1ZXMsIGdldENvbmZpZ0ZpbGUgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IGJ1aWx0U3RhdGljRmlsZXMgfSBmcm9tICcuL2J1aWx0U3RhdGljRmlsZXMnXG5pbXBvcnQgeyByZW1vdmVCdWlsdFN0YXRpY0ZpbGUgfSBmcm9tICcuL3JlbW92ZUJ1aWx0U3RhdGljRmlsZSdcbmltcG9ydCB7IFByZXN0YSB9IGZyb20gJy4vdHlwZXMnXG5cbi8qXG4gKiBXcmFwcyBvdXRwdXRMYW1iZGFzIGZvciBsb2dnaW5nXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUxhbWJkYXMoaW5wdXRzOiBzdHJpbmdbXSwgY29uZmlnOiBQcmVzdGEpIHtcbiAgY29uc3QgdGltZSA9IHRpbWVyKClcblxuICAvLyBhbHdheXMgd3JpdGUgdGhpcywgZXZlbiBpZiBpbnB1dHMgPSBbXVxuICBvdXRwdXRMYW1iZGFzKGlucHV0cywgY29uZmlnKVxuXG4gIC8vIGlmIHVzZXIgYWN0dWFsbHkgaGFzIHJvdXRlcyBjb25maWd1cmVkLCBnaXZlIGZlZWRiYWNrXG4gIGlmIChpbnB1dHMubGVuZ3RoKSB7XG4gICAgbG9nZ2VyLmluZm8oe1xuICAgICAgbGFiZWw6ICdidWlsdCcsXG4gICAgICBtZXNzYWdlOiBgbGFtYmRhc2AsXG4gICAgICBkdXJhdGlvbjogdGltZSgpLFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhdGNoKGNvbmZpZzogUHJlc3RhKSB7XG4gIC8qXG4gICAqIEdldCBmaWxlcyB0aGF0IG1hdGNoIHN0YXRpYy9keW5hbWljIHBhdHRlcnMgYXQgc3RhcnR1cFxuICAgKi9cbiAgbGV0IGZpbGVzID0gZ2V0RmlsZXMoY29uZmlnKVxuICBsZXQgaGFzQ29uZmlnRmlsZSA9IGZzLmV4aXN0c1N5bmMoY29uZmlnLmNvbmZpZ0ZpbGVwYXRoKVxuXG4gIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgbG9nZ2VyLndhcm4oe1xuICAgICAgbGFiZWw6ICdwYXRocycsXG4gICAgICBtZXNzYWdlOiAnbm8gZmlsZXMgY29uZmlndXJlZCcsXG4gICAgfSlcbiAgfVxuXG4gIC8qXG4gICAqIENyZWF0ZSBpbml0aWFsIGR5bmFtaWMgZW50cnkgcmVnYXJkbGVzcyBvZiBpZiB0aGUgdXNlciBoYXMgcm91dGVzLCBiYyB3ZVxuICAgKiBuZWVkIHRoaXMgZmlsZSB0byBzZXJ2ZSA0MDQgbG9jYWxseVxuICAgKi9cbiAgdXBkYXRlTGFtYmRhcyhmaWxlcy5maWx0ZXIoaXNEeW5hbWljKSwgY29uZmlnKVxuXG4gIC8qXG4gICAqIFNldCB1cCBhbGwgd2F0Y2hlcnNcbiAgICovXG4gIGNvbnN0IGZpbGVXYXRjaGVyID0gY3JlYXRlKHsgYWxpYXM6IHsgJ0AnOiBjb25maWcuY3dkIH0gfSlcbiAgY29uc3QgZ2xvYmFsV2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKGNvbmZpZy5jd2QsIHtcbiAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIGlnbm9yZWQ6IFtjb25maWcub3V0cHV0LCBjb25maWcuYXNzZXRzXSxcbiAgfSlcblxuICAvKlxuICAgKiBPbiBhIGNvbmZpZyB1cGRhdGUsIHRoZSB1c2VyIG1heSBoYXZlIHBhc3NlZCBpbiBhIG5ldyBgZmlsZXNgIGFycmF5IG9yXG4gICAqIG90aGVyIGdsb2JhbCBjb25maWcgcmVxdWlyZWQgYnkgYWxsIGZpbGVzLCBzbyB3ZSBuZWVkIHRvIHJlLWZldGNoIGFsbFxuICAgKiBmaWxlcyBhbmQgcmVidWlsZCBldmVyeXRoaW5nLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ29uZmlnVXBkYXRlKCkge1xuICAgIGZpbGVzID0gZ2V0RmlsZXMoY29uZmlnKVxuICAgIGF3YWl0IHJlbmRlclN0YXRpY0VudHJpZXMoZmlsZXMuZmlsdGVyKGlzU3RhdGljKSwgY29uZmlnKVxuICAgIHVwZGF0ZUxhbWJkYXMoZmlsZXMuZmlsdGVyKGlzRHluYW1pYyksIGNvbmZpZylcbiAgfVxuXG4gIC8qXG4gICAqIE9uIGEgY2hhbmdlZCBmaWxlLCB3ZSBjYW4ganVzdCByZW5kZXIgaXRcbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZpbGVDaGFuZ2UoZmlsZTogc3RyaW5nKSB7XG4gICAgLy8gcmVuZGVyIGp1c3QgZmlsZSB0aGF0IGNoYW5nZWRcbiAgICBpZiAoaXNTdGF0aWMoZmlsZSkpIHtcbiAgICAgIGF3YWl0IHJlbmRlclN0YXRpY0VudHJpZXMoW2ZpbGVdLCBjb25maWcpXG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGR5bmFtaWMgZW50cnkgd2l0aCBBTEwgZHluYW1pYyBmaWxlc1xuICAgIGlmIChpc0R5bmFtaWMoZmlsZSkpIHtcbiAgICAgIHVwZGF0ZUxhbWJkYXMoZmlsZXMuZmlsdGVyKGlzRHluYW1pYyksIGNvbmZpZylcbiAgICB9XG5cbiAgICBjb25maWcuaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfVxuXG4gIGNvbmZpZy5ob29rcy5vbkJ1aWxkRmlsZSgoeyBmaWxlIH0pID0+IHtcbiAgICBoYW5kbGVGaWxlQ2hhbmdlKGZpbGUpXG4gIH0pXG5cbiAgZmlsZVdhdGNoZXIub25SZW1vdmUoYXN5bmMgKFtpZF0pID0+IHtcbiAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgbGFiZWw6ICd3YXRjaCcsXG4gICAgICBtZXNzYWdlOiBgZmlsZVdhdGNoZXIgLSByZW1vdmVkICR7aWR9YCxcbiAgICB9KVxuXG4gICAgLy8gcmVtb3ZlIGZyb20gbG9jYWwgaGFzaFxuICAgIGZpbGVzLnNwbGljZShmaWxlcy5pbmRleE9mKGlkKSwgMSlcblxuICAgIC8vIHVwZGF0ZSB0aGlzIHJlZ2FyZGxlc3MsIG5vdCBzdXJlIGlmIFtpZF0gd2FzIGR5bmFtaWMgb3Igc3RhdGljXG4gICAgdXBkYXRlTGFtYmRhcyhmaWxlcy5maWx0ZXIoaXNEeW5hbWljKSwgY29uZmlnKVxuXG4gICAgLy8gaWYgaXQgd2FzIGNvbmZpZywgd2UgZ290dGEgZG8gYSByZXN0YXJ0XG4gICAgaWYgKGlkID09PSBjb25maWcuY29uZmlnRmlsZXBhdGgpIHtcbiAgICAgIC8vIGZpbHRlciBvdXQgdmFsdWVzIGZyb20gdGhlIGNvbmZpZyBmaWxlXG4gICAgICBjb25maWcgPSBhd2FpdCByZW1vdmVDb25maWdWYWx1ZXMoKVxuXG4gICAgICAvLyByZXNldCB0aGlzIVxuICAgICAgaGFzQ29uZmlnRmlsZSA9IGZhbHNlXG5cbiAgICAgIGhhbmRsZUNvbmZpZ1VwZGF0ZSgpXG4gICAgfVxuXG4gICAgOyhidWlsdFN0YXRpY0ZpbGVzW2lkXSB8fCBbXSkuZm9yRWFjaCgoZmlsZSkgPT4gcmVtb3ZlQnVpbHRTdGF0aWNGaWxlKGZpbGUsIGNvbmZpZykpXG4gIH0pXG5cbiAgZmlsZVdhdGNoZXIub25DaGFuZ2UoYXN5bmMgKGZpbGVzKSA9PiB7XG4gICAgZm9yIChjb25zdCBpZCBvZiBmaWxlcykge1xuICAgICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgICAgbGFiZWw6ICd3YXRjaCcsXG4gICAgICAgIG1lc3NhZ2U6IGBmaWxlV2F0Y2hlciAtIGNoYW5nZWQgJHtpZH1gLFxuICAgICAgfSlcblxuICAgICAgaWYgKGlkID09PSBjb25maWcuY29uZmlnRmlsZXBhdGgpIHtcbiAgICAgICAgLy8gY2xlYXIgY29uZmlnIGZpbGUgZm9yIHJlLXJlcXVpcmVcbiAgICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbY29uZmlnLmNvbmZpZ0ZpbGVwYXRoXVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gbWVyZ2UgaW4gbmV3IHZhbHVlcyBmcm9tIGNvbmZpZyBmaWxlXG4gICAgICAgICAgY29uZmlnID0gYXdhaXQgY3JlYXRlQ29uZmlnKHtcbiAgICAgICAgICAgIGNvbmZpZzogZ2V0Q29uZmlnRmlsZShjb25maWcuY29uZmlnRmlsZXBhdGgpLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBoYW5kbGVDb25maWdVcGRhdGUoKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFuZGxlRmlsZUNoYW5nZShpZClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgZmlsZVdhdGNoZXIub25FcnJvcigoZSkgPT4ge1xuICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgIGVycm9yOiB0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBuZXcgRXJyb3IoZSkgOiBlLFxuICAgIH0pXG4gIH0pXG5cbiAgLypcbiAgICogZ2xvYmFsV2F0Y2hlciB3YXRjaGVzIHRoZSByYXcgZmlsZSBnbG9icyBwYXNzZWQgdG8gdGhlIENMSSBvciBhcyBgZmlsZXNgXG4gICAqIGluIHRoZSBjb25maWcuIElmIGNoZWNrcyBvbiBhZGQvY2hhbmdlIHRvIHNlZSBpZiBhIGZpbGUgc2hvdWxkIGJlIHVwZ3JhZGVkXG4gICAqIHRvIGEgYSBQcmVzdGEgc291cmNlIGZpbGUsIGFuZCBhZGRlZCB0byB0aGUgZmlsZVdhdGNoZXIuIEl0IGFsc28gd2F0Y2hlc1xuICAgKiBmb3IgYWRkaXRpb24gb2YgYSBjb25maWcgZmlsZS5cbiAgICovXG4gIGdsb2JhbFdhdGNoZXIub24oJ2FsbCcsIGFzeW5jIChldmVudCwgZmlsZSkgPT4ge1xuICAgIC8vIGlnbm9yZSBldmVudHMgaGFuZGxlZCBieSB3ZGcsIG9yIGFueSBkaXJlY3RvcnkgZXZlbnRzXG4gICAgaWYgKCEvYWRkfGNoYW5nZS8udGVzdChldmVudCkgfHwgIWZzLmV4aXN0c1N5bmMoZmlsZSkgfHwgZnMubHN0YXRTeW5jKGZpbGUpLmlzRGlyZWN0b3J5KCkpIHJldHVyblxuXG4gICAgLy8gaWYgYSBmaWxlIGNoYW5nZSBtYXRjaGVzIGFueSBwYWdlcyBnbG9ic1xuICAgIGlmIChtYXRjaChjb25maWcuZmlsZXMpKGZpbGUpICYmICFmaWxlcy5pbmNsdWRlcyhmaWxlKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgICAgbGFiZWw6ICd3YXRjaCcsXG4gICAgICAgIG1lc3NhZ2U6IGBnbG9iYWxXYXRjaGVyIC0gYWRkICR7ZmlsZX1gLFxuICAgICAgfSlcblxuICAgICAgZmlsZXMucHVzaChmaWxlKVxuXG4gICAgICBhd2FpdCBmaWxlV2F0Y2hlci5hZGQoZmlsZSlcblxuICAgICAgaGFuZGxlRmlsZUNoYW5nZShmaWxlKVxuICAgIH1cblxuICAgIC8vIGlmIGZpbGUgbWF0Y2hlcyBjb25maWcgZmlsZSBhbmQgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZVxuICAgIGlmIChmaWxlID09PSBjb25maWcuY29uZmlnRmlsZXBhdGggJiYgIWhhc0NvbmZpZ0ZpbGUpIHtcbiAgICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICAgIGxhYmVsOiAnd2F0Y2gnLFxuICAgICAgICBtZXNzYWdlOiBgZ2xvYmFsV2F0Y2hlciAtIGFkZCBjb25maWcgZmlsZSAke2ZpbGV9YCxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IGZpbGVXYXRjaGVyLmFkZChjb25maWcuY29uZmlnRmlsZXBhdGgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIG1lcmdlIGluIG5ldyB2YWx1ZXMgZnJvbSBjb25maWcgZmlsZVxuICAgICAgICBjb25maWcgPSBhd2FpdCBjcmVhdGVDb25maWcoe1xuICAgICAgICAgIGNvbmZpZzogZ2V0Q29uZmlnRmlsZShjb25maWcuY29uZmlnRmlsZXBhdGgpLFxuICAgICAgICB9KVxuXG4gICAgICAgIGhhc0NvbmZpZ0ZpbGUgPSB0cnVlXG5cbiAgICAgICAgaGFuZGxlQ29uZmlnVXBkYXRlKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgLyoqXG4gICAqIEluaXQgd2F0Y2hpbmcgYWZ0ZXIgZXZlbnQgc3Vic2NyaXB0aW9uc1xuICAgKi9cbiAgYXdhaXQgZmlsZVdhdGNoZXIuYWRkKGZpbGVzKVxuICBpZiAoaGFzQ29uZmlnRmlsZSkgYXdhaXQgZmlsZVdhdGNoZXIuYWRkKGNvbmZpZy5jb25maWdGaWxlcGF0aClcblxuICAvKipcbiAgICogUHJpbWUgZmlsZXMgdG8gY2hlY2sgZm9yIGVycm9ycyBvbiBzdGFydHVwIGFuZCByZWdpc3RlciBhbnkgcGx1Z2luc1xuICAgKi9cbiAgdHJ5IHtcbiAgICBmaWxlcy5tYXAocmVxdWlyZSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgIH0pXG4gIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHJzb3J0IGZyb20gJ3JvdXRlLXNvcnQnXG5cbmltcG9ydCB7IGhhc2hDb250ZW50IH0gZnJvbSAnLi9oYXNoQ29udGVudCdcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IFByZXN0YSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dExhbWJkYShpbnB1dDogc3RyaW5nLCBjb25maWc6IFByZXN0YSk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICBjb25zdCB7IHJvdXRlIH0gPSByZXF1aXJlKGlucHV0KVxuICBjb25zdCBuYW1lID0gcGF0aC5iYXNlbmFtZShpbnB1dCkuc3BsaXQoJy4nKS5yZXZlcnNlKCkuc2xpY2UoMSkucmV2ZXJzZSgpLmpvaW4oJy4nKVxuICBjb25zdCBvdXRwdXQgPSBwYXRoLmpvaW4oXG4gICAgY29uZmlnLmZ1bmN0aW9uc091dHB1dERpcixcbiAgICBjb25maWcuZW52ID09PSBFbnYuUFJPRFVDVElPTiA/IG5hbWUgKyAnLScgKyBoYXNoQ29udGVudChmcy5yZWFkRmlsZVN5bmMoaW5wdXQsICd1dGY4JykpICsgJy5qcycgOiBuYW1lICsgJy5qcydcbiAgKVxuXG4gIGxvZ2dlci5kZWJ1Zyh7XG4gICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgbWVzc2FnZTogYGdlbmVyYXRpbmcgJHtuYW1lfSBsYW1iZGFgLFxuICB9KVxuXG4gIC8vIGltcG9ydGFudCBmb3Igd2F0Y2ggdGFza1xuICBkZWxldGUgcmVxdWlyZS5jYWNoZVtpbnB1dF1cbiAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbb3V0cHV0XVxuXG4gIGZzLm91dHB1dEZpbGVTeW5jKFxuICAgIG91dHB1dCxcbiAgICBgaW1wb3J0IHsgd3JhcEhhbmRsZXIgfSBmcm9tICdwcmVzdGEnO1xuaW1wb3J0ICogYXMgZmlsZSBmcm9tICcke2lucHV0fSc7XG5leHBvcnQgY29uc3Qgcm91dGUgPSBmaWxlLnJvdXRlXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IHdyYXBIYW5kbGVyKGZpbGUpYFxuICApXG5cbiAgcmV0dXJuIFtyb3V0ZSwgb3V0cHV0XVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb3V0cHV0TGFtYmRhcyhpbnB1dHM6IHN0cmluZ1tdLCBjb25maWc6IFByZXN0YSkge1xuICBjb25zdCBsYW1iZGFzID0gaW5wdXRzXG4gICAgLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBvdXRwdXRMYW1iZGEoaW5wdXQsIGNvbmZpZylcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgW3N0cmluZywgc3RyaW5nXVtdXG5cbiAgY29uc3Qgc29ydGVkID0gcnNvcnQobGFtYmRhcy5tYXAoKGwpID0+IGxbMF0pKVxuICBjb25zdCBtYW5pZmVzdDogeyBbcm91dGU6IHN0cmluZ106IHN0cmluZyB9ID0ge31cblxuICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNvcnRlZCkge1xuICAgIGNvbnN0IG1hdGNoID0gbGFtYmRhcy5maW5kKChsKSA9PiBsWzBdID09PSByb3V0ZSlcblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgbWFuaWZlc3Rbcm91dGVdID0gbWF0Y2hbMV1cbiAgICB9XG4gIH1cblxuICBmcy5vdXRwdXRGaWxlU3luYyhjb25maWcuZnVuY3Rpb25zTWFuaWZlc3QsIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0KSlcblxuICByZXR1cm4gbGFtYmRhc1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBoYXNoQ29udGVudChjb250ZW50OiBzdHJpbmcpIHtcbiAgdmFyIGggPSA1MzgxLFxuICAgIGkgPSBjb250ZW50Lmxlbmd0aFxuXG4gIHdoaWxlIChpKSBoID0gKGggKiAzMykgXiBjb250ZW50LmNoYXJDb2RlQXQoLS1pKVxuXG4gIHJldHVybiAoaCA+Pj4gMCkudG9TdHJpbmcoMzYpXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBnbG9iU3luYyBmcm9tICd0aW55LWdsb2Ivc3luYydcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgUHJlc3RhIH0gZnJvbSAnLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pYyhmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIC9leHBvcnRcXHMuK1xcc3JvdXRlXFxzK1xcPS8udGVzdChmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YXRpYyhmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIC9leHBvcnRcXHMuK1xcc2dldFN0YXRpY1BhdGhzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlc3RhRmlsZShmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzU3RhdGljKGZpbGUpIHx8IGlzRHluYW1pYyhmaWxlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZXMoY29uZmlnOiBQcmVzdGEpOiBzdHJpbmdbXSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChbXSBhcyBzdHJpbmdbXSlcbiAgICAgIC5jb25jYXQoY29uZmlnLmZpbGVzKVxuICAgICAgLm1hcCgoZmlsZSkgPT4gZ2xvYlN5bmMoZmlsZSwgeyBjd2Q6IGNvbmZpZy5jd2QgfSkpXG4gICAgICAuZmxhdCgpXG4gICAgICAubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmN3ZCwgZmlsZSkpIC8vIG1ha2UgYWJzb2x1dGVcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICBsYWJlbDogJ3BhdGhzJyxcbiAgICAgIG1lc3NhZ2U6IGBubyBmaWxlcyBmb3VuZGAsXG4gICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICB9KVxuXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0IHsgZ2V0Um91dGVQYXJhbXMgfSBmcm9tICcuL2dldFJvdXRlUGFyYW1zJ1xuaW1wb3J0IHsgbm9ybWFsaXplUmVzcG9uc2UgfSBmcm9tICcuL25vcm1hbGl6ZVJlc3BvbnNlJ1xuaW1wb3J0IHsgYnVpbHRTdGF0aWNGaWxlcyB9IGZyb20gJy4vYnVpbHRTdGF0aWNGaWxlcydcbmltcG9ydCB7IHJlbW92ZUJ1aWx0U3RhdGljRmlsZSB9IGZyb20gJy4vcmVtb3ZlQnVpbHRTdGF0aWNGaWxlJ1xuaW1wb3J0IHsgY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCB9IGZyb20gJy4vbGl2ZVJlbG9hZFNjcmlwdCdcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgUHJlc3RhIH0gZnJvbSAnLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhuYW1lVG9GaWxlKHBhdGhuYW1lOiBzdHJpbmcsIGV4dCA9ICdodG1sJykge1xuICByZXR1cm4gISFwYXRoLmV4dG5hbWUocGF0aG5hbWUpXG4gICAgPyBwYXRobmFtZSAvLyBpZiBwYXRoIGhhcyBleHRlbnNpb24sIHVzZSBpdFxuICAgIDogZXh0ID09PSAnaHRtbCdcbiAgICA/IGAke3BhdGhuYW1lfS9pbmRleC5odG1sYCAvLyBpZiBIVE1MIGlzIGluZmVycmVkLCBjcmVhdGUgaW5kZXhcbiAgICA6IGAke3BhdGhuYW1lfS4ke2V4dH1gIC8vIGFueXRoaW5nIGJ1dCBIVE1MIHdpbGwgbmVlZCBhbiBleHRlbnNpb24sIG90aGVyd2lzZSBicm93c2VycyB3aWxsIHJlbmRlciBhcyB0ZXh0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTdGF0aWNFbnRyaWVzKGVudHJpZXM6IHN0cmluZ1tdLCBjb25maWc6IFByZXN0YSk6IFByb21pc2U8eyBhbGxHZW5lcmF0ZWRGaWxlczogc3RyaW5nW10gfT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHksIG4pID0+IHtcbiAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICBtZXNzYWdlOiBgcmVuZGVyaW5nICR7SlNPTi5zdHJpbmdpZnkoZW50cmllcyl9YCxcbiAgICB9KVxuXG4gICAgY29uc3QgYWxsR2VuZXJhdGVkRmlsZXM6IHN0cmluZ1tdID0gW11cbiAgICBjb25zdCBkZXZDbGllbnQgPSBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0KHsgcG9ydDogY29uZmlnLnBvcnQgfSlcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBlbnRyeS5yZXBsYWNlKGNvbmZpZy5jd2QsICcnKVxuXG4gICAgICB0cnkge1xuICAgICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtlbnRyeV1cblxuICAgICAgICBjb25zdCBmaWxlID0gcmVxdWlyZShlbnRyeSlcbiAgICAgICAgY29uc3QgcGF0aHMgPSBhd2FpdCBmaWxlLmdldFN0YXRpY1BhdGhzKClcblxuICAgICAgICBjb25zdCBwcmV2RmlsZXMgPSAoYnVpbHRTdGF0aWNGaWxlc1tlbnRyeV0gPSBidWlsdFN0YXRpY0ZpbGVzW2VudHJ5XSB8fCBbXSlcbiAgICAgICAgY29uc3QgbmV4dEZpbGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICAgICAgaWYgKCFwYXRocyB8fCAhcGF0aHMubGVuZ3RoKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oe1xuICAgICAgICAgICAgbGFiZWw6ICdwYXRocycsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHtsb2NhdGlvbn0gLSBubyBwYXRocyB0byByZW5kZXJgLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBwcmV2RmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4gcmVtb3ZlQnVpbHRTdGF0aWNGaWxlKGZpbGUsIGNvbmZpZykpXG5cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB1cmwgb2YgcGF0aHMpIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgcGF0aDogdXJsLFxuICAgICAgICAgICAgcm91dGVQYXJhbWV0ZXJzOiBmaWxlLnJvdXRlID8gZ2V0Um91dGVQYXJhbXModXJsLCBmaWxlLnJvdXRlKSA6IHt9LFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbm9ybWFsaXplUmVzcG9uc2UoYXdhaXQgZmlsZS5oYW5kbGVyKGV2ZW50LCB7fSkpXG4gICAgICAgICAgY29uc3QgdHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA6ICcnXG4gICAgICAgICAgY29uc3QgZXh0ID0gdHlwZSA/IG1pbWUuZXh0ZW5zaW9uKHR5cGUgYXMgc3RyaW5nKSB8fCAnaHRtbCcgOiAnaHRtbCdcbiAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGhuYW1lVG9GaWxlKHVybCwgZXh0KVxuICAgICAgICAgIGNvbnN0IGh0bWwgPSByZXNwb25zZS5ib2R5ICsgKGNvbmZpZy5lbnYgPT09IEVudi5QUk9EVUNUSU9OID8gJycgOiBkZXZDbGllbnQpXG5cbiAgICAgICAgICBmcy5vdXRwdXRGaWxlU3luYyhwYXRoLmpvaW4oY29uZmlnLnN0YXRpY091dHB1dERpciwgZmlsZW5hbWUpLCBodG1sLCAndXRmLTgnKVxuXG4gICAgICAgICAgYWxsR2VuZXJhdGVkRmlsZXMucHVzaChmaWxlbmFtZSlcbiAgICAgICAgICBuZXh0RmlsZXMucHVzaChmaWxlbmFtZSlcblxuICAgICAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgICAgIGxhYmVsOiAnYnVpbHQnLFxuICAgICAgICAgICAgbWVzc2FnZTogdXJsLFxuICAgICAgICAgICAgZHVyYXRpb246IHRpbWUoKSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGlmZiBhbmQgcmVtb3ZlIGZpbGVzXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBwcmV2RmlsZXMpIHtcbiAgICAgICAgICBpZiAoIW5leHRGaWxlcy5pbmNsdWRlcyhmaWxlKSkge1xuICAgICAgICAgICAgcmVtb3ZlQnVpbHRTdGF0aWNGaWxlKGZpbGUsIGNvbmZpZylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWlsdFN0YXRpY0ZpbGVzW2VudHJ5XSA9IG5leHRGaWxlc1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoY29uZmlnLmVudiA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdlcnJvcnMgZGV0ZWN0ZWQsIHBhdXNpbmcuLi4nLFxuICAgICAgICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHkoeyBhbGxHZW5lcmF0ZWRGaWxlcyB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBuKGUpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBleGl0IGxvb3Agb24gYW55IGVycm9yXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2xlYXIgdG8gcHJldmVudCBtZW1vcnkgbGVha1xuICAgIC8vIGxvYWRDYWNoZS5jbGVhckFsbE1lbW9yeSgpIC8vIFRPRE8gcHJvYnMgY2FuJ3QgXHUyMDE0IGVtaXQ/XG5cbiAgICB5KHsgYWxsR2VuZXJhdGVkRmlsZXMgfSlcbiAgfSlcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gdGltZXIoKSB7XG4gIGNvbnN0IHN0YXJ0ID0gcHJvY2Vzcy5ocnRpbWUoKVxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNvbnN0IFtzLCBuYW5vc10gPSBwcm9jZXNzLmhydGltZShzdGFydClcbiAgICBjb25zdCBtcyA9IG5hbm9zIC8gMTAwMDAwMFxuXG4gICAgaWYgKHMgPCAxKSB7XG4gICAgICByZXR1cm4gKG1zID49IDEgPyBtcy50b0ZpeGVkKDApIDogbXMudG9GaXhlZCgyKSkgKyAnbXMnXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzICsgJy4nICsgbXMudG9GaXhlZCgwKSArICdzJ1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB0b1JlZ0V4cCBmcm9tICdyZWdleHBhcmFtJ1xuXG5pbXBvcnQgeyBSb3V0ZVBhcmFtZXRlcnMgfSBmcm9tICcuL3R5cGVzJ1xuXG4vLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQvcmVnZXhwYXJhbSN1c2FnZVxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdXRlUGFyYW1zKHVybDogc3RyaW5nLCByb3V0ZTogc3RyaW5nKTogUm91dGVQYXJhbWV0ZXJzIHtcbiAgY29uc3QgW3BhdGhdID0gdXJsLnNwbGl0KCc/JylcbiAgY29uc3QgcmVzdWx0ID0gdG9SZWdFeHAocm91dGUpXG4gIGxldCBpID0gMFxuICBsZXQgb3V0OiBSb3V0ZVBhcmFtZXRlcnMgPSB7fVxuICBsZXQgbWF0Y2hlcyA9IHJlc3VsdC5wYXR0ZXJuLmV4ZWMocGF0aCkgfHwgW11cblxuICB3aGlsZSAoaSA8IHJlc3VsdC5rZXlzLmxlbmd0aCkge1xuICAgIG91dFtyZXN1bHQua2V5c1tpXV0gPSBtYXRjaGVzWysraV1cbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cbiIsICJpbXBvcnQgeyBBV1MsIFJlc3BvbnNlIH0gZnJvbSAnLi90eXBlcydcblxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iajogb2JqZWN0IHwgc3RyaW5nKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KG9iaikgOiBvYmpcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlc3BvbnNlKHJlc3BvbnNlOiBQYXJ0aWFsPFJlc3BvbnNlPiB8IHN0cmluZyk6IEFXU1snSGFuZGxlclJlc3BvbnNlJ10ge1xuICBjb25zdCB7XG4gICAgaXNCYXNlNjRFbmNvZGVkID0gZmFsc2UsXG4gICAgc3RhdHVzQ29kZSA9IDIwMCxcbiAgICBoZWFkZXJzID0ge30sXG4gICAgbXVsdGlWYWx1ZUhlYWRlcnMgPSB7fSxcbiAgICBib2R5ID0gJycsXG4gICAgaHRtbCA9IHVuZGVmaW5lZCxcbiAgICBqc29uID0gdW5kZWZpbmVkLFxuICAgIHhtbCA9IHVuZGVmaW5lZCxcbiAgfSA9IHR5cGVvZiByZXNwb25zZSA9PT0gJ3N0cmluZydcbiAgICA/IHtcbiAgICAgICAgYm9keTogcmVzcG9uc2UsXG4gICAgICB9XG4gICAgOiByZXNwb25zZVxuXG4gIGxldCBjb250ZW50VHlwZSA9ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnXG5cbiAgaWYgKCEhanNvbikge1xuICAgIGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnXG4gIH0gZWxzZSBpZiAoISF4bWwpIHtcbiAgICBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLTgnXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlzQmFzZTY0RW5jb2RlZCxcbiAgICBzdGF0dXNDb2RlLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSxcbiAgICAgIC4uLmhlYWRlcnMsXG4gICAgfSxcbiAgICBtdWx0aVZhbHVlSGVhZGVycyxcbiAgICBib2R5OiBzdHJpbmdpZnkoYm9keSB8fCBodG1sIHx8IGpzb24gfHwgeG1sIHx8ICcnKSxcbiAgfVxufVxuIiwgInR5cGUgQnVpbHRTdGF0aWNGaWxlID0gc3RyaW5nXG5cbmV4cG9ydCBjb25zdCBidWlsdFN0YXRpY0ZpbGVzOiB7IFtlbnRyeUZpbGU6IHN0cmluZ106IEJ1aWx0U3RhdGljRmlsZVtdIH0gPSB7fVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IFByZXN0YSB9IGZyb20gJy4vdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVCdWlsdFN0YXRpY0ZpbGUoZmlsZTogc3RyaW5nLCBjb25maWc6IFByZXN0YSkge1xuICBsb2dnZXIuZGVidWcoe1xuICAgIGxhYmVsOiAnZGVidWcnLFxuICAgIG1lc3NhZ2U6IGByZW1vdmluZyBvbGQgc3RhdGljIGZpbGUgJHtmaWxlfWAsXG4gIH0pXG5cbiAgZnMucmVtb3ZlKHBhdGguam9pbihjb25maWcuc3RhdGljT3V0cHV0RGlyLCBmaWxlKSlcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCh7IHBvcnQgfTogeyBwb3J0OiBudW1iZXIgfSkge1xuICByZXR1cm4gYFxuICAgIDxzY3JpcHQ+XG4gICAgICAoZnVuY3Rpb24gKGdsb2JhbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNvY2tldGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICAgICAgICBzb2NrZXRpby5zcmMgPSAnaHR0cHM6Ly91bnBrZy5jb20vcG9ja2V0LmlvQDAuMS40L21pbi5qcydcbiAgICAgICAgICBzb2NrZXRpby5vbmxvYWQgPSBmdW5jdGlvbiBpbml0ICgpIHtcbiAgICAgICAgICAgIHZhciBkaXNjb25uZWN0ZWQgPSBmYWxzZVxuICAgICAgICAgICAgdmFyIHNvY2tldCA9IGlvKCdodHRwOi8vbG9jYWxob3N0OiR7cG9ydH0nLCB7XG4gICAgICAgICAgICAgIHJlY29ubmVjdGlvbkF0dGVtcHRzOiAzXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc29ja2V0Lm9uKCdjb25uZWN0JywgZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdwcmVzdGEgY29ubmVjdGVkIG9uIHBvcnQgJHtwb3J0fScpIH0pXG4gICAgICAgICAgICBzb2NrZXQub24oJ3JlZnJlc2gnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgZ2xvYmFsLmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc29ja2V0Lm9uKCdkaXNjb25uZWN0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZCA9IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzb2NrZXQub24oJ3JlY29ubmVjdF9mYWlsZWQnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmIChkaXNjb25uZWN0ZWQpIHJldHVyblxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwicHJlc3RhIC0gY29ubmVjdGlvbiB0byBzZXJ2ZXIgb24gOiR7cG9ydH0gZmFpbGVkXCIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNvY2tldGlvKVxuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfSkodGhpcyk7XG4gICAgPC9zY3JpcHQ+XG4gIGBcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgeyBidWlsZCBhcyBlc2J1aWxkIH0gZnJvbSAnZXNidWlsZCdcblxuaW1wb3J0IHsgb3V0cHV0TGFtYmRhcyB9IGZyb20gJy4vb3V0cHV0TGFtYmRhcydcbmltcG9ydCB7IGdldEZpbGVzLCBpc1N0YXRpYywgaXNEeW5hbWljIH0gZnJvbSAnLi9nZXRGaWxlcydcbmltcG9ydCB7IHJlbmRlclN0YXRpY0VudHJpZXMgfSBmcm9tICcuL3JlbmRlclN0YXRpY0VudHJpZXMnXG5pbXBvcnQgeyB0aW1lciB9IGZyb20gJy4vdGltZXInXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBQcmVzdGEgfSBmcm9tICcuL3R5cGVzJ1xuXG5mdW5jdGlvbiBnZXRSb3V0ZXNNYW5pZmVzdFNhZmVseShtYW5pZmVzdEZpbGVwYXRoOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZShtYW5pZmVzdEZpbGVwYXRoKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGNvbmZpZzogUHJlc3RhKSB7XG4gIGNvbnN0IHRvdGFsVGltZSA9IHRpbWVyKClcbiAgY29uc3QgZmlsZXMgPSBnZXRGaWxlcyhjb25maWcpXG4gIGNvbnN0IHN0YXRpY0lkcyA9IGZpbGVzLmZpbHRlcihpc1N0YXRpYylcbiAgY29uc3QgZHluYW1pY0lkcyA9IGZpbGVzLmZpbHRlcihpc0R5bmFtaWMpXG5cbiAgbG9nZ2VyLmRlYnVnKHtcbiAgICBsYWJlbDogJ2J1aWxkJyxcbiAgICBtZXNzYWdlOiAnc3RhcnRpbmcgYnVpbGQnLFxuICB9KVxuXG4gIGlmICghc3RhdGljSWRzLmxlbmd0aCAmJiAhZHluYW1pY0lkcy5sZW5ndGgpIHtcbiAgICBsb2dnZXIud2Fybih7XG4gICAgICBsYWJlbDogJ2ZpbGVzJyxcbiAgICAgIG1lc3NhZ2U6ICdubyBmaWxlcyB3ZXJlIGZvdW5kLCBub3RoaW5nIHRvIGJ1aWxkJyxcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIGxldCBzdGF0aWNUaW1lID0gJydcbiAgICBsZXQgc3RhdGljRmlsZUFtb3VudCA9IDBcbiAgICBsZXQgZHluYW1pY1RpbWUgPSAnJ1xuICAgIGxldCBjb3B5VGltZSA9ICcnXG5cbiAgICBjb25zdCB0YXNrcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoc3RhdGljSWRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICAgICAgICBjb25zdCB7IGFsbEdlbmVyYXRlZEZpbGVzIH0gPSBhd2FpdCByZW5kZXJTdGF0aWNFbnRyaWVzKHN0YXRpY0lkcywgY29uZmlnKVxuXG4gICAgICAgICAgc3RhdGljVGltZSA9IHRpbWUoKVxuICAgICAgICAgIHN0YXRpY0ZpbGVBbW91bnQgPSBhbGxHZW5lcmF0ZWRGaWxlcy5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChkeW5hbWljSWRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICAgICAgICBvdXRwdXRMYW1iZGFzKGR5bmFtaWNJZHMsIGNvbmZpZylcblxuICAgICAgICAgIGF3YWl0IGVzYnVpbGQoe1xuICAgICAgICAgICAgZW50cnlQb2ludHM6IE9iamVjdC52YWx1ZXMocmVxdWlyZShjb25maWcuZnVuY3Rpb25zTWFuaWZlc3QpKSxcbiAgICAgICAgICAgIG91dGRpcjogY29uZmlnLmZ1bmN0aW9uc091dHB1dERpcixcbiAgICAgICAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICAgICAgICB0YXJnZXQ6IFsnbm9kZTEyJ10sXG4gICAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgICBhbGxvd092ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlZmluZToge1xuICAgICAgICAgICAgICAncHJvY2Vzcy5lbnYuUFJFU1RBX1NFUlZFUkxFU1NfUlVOVElNRSc6ICd0cnVlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGR5bmFtaWNUaW1lID0gdGltZSgpXG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWcuYXNzZXRzKSkge1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICAgICAgICBmcy5jb3B5U3luYyhjb25maWcuYXNzZXRzLCBjb25maWcuc3RhdGljT3V0cHV0RGlyKVxuXG4gICAgICAgICAgY29weVRpbWUgPSB0aW1lKClcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICBdKVxuXG4gICAgLy8gc2luY2Ugd2UncmUgYnVpbGRpbmcgKG5vdCB3YXRjaCkgaWYgYW55IHRhc2sgZmFpbHMsIGV4aXQgd2l0aCBlcnJvclxuICAgIGlmICh0YXNrcy5maW5kKCh0YXNrKSA9PiB0YXNrLnN0YXR1cyA9PT0gJ3JlamVjdGVkJykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICAgIGxhYmVsOiAnYnVpbGQnLFxuICAgICAgICBtZXNzYWdlOiAnYnVpbGQgcGFydGlhbGx5IGZhaWxlZCcsXG4gICAgICB9KVxuXG4gICAgICAvLyBsb2cgb3V0IGVycm9yc1xuICAgICAgdGFza3MuZm9yRWFjaCgodGFzaykgPT4ge1xuICAgICAgICBpZiAodGFzay5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgICAgICBlcnJvcjogdGFzay5yZWFzb24sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc3RhdGljVGltZSB8fCBkeW5hbWljVGltZSkge1xuICAgICAgbG9nZ2VyLm5ld2xpbmUoKVxuICAgIH1cblxuICAgIGlmIChzdGF0aWNUaW1lKSB7XG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnc3RhdGljJyxcbiAgICAgICAgbWVzc2FnZTogYHJlbmRlcmVkICR7c3RhdGljRmlsZUFtb3VudH0gZmlsZShzKWAsXG4gICAgICAgIGR1cmF0aW9uOiBzdGF0aWNUaW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoZHluYW1pY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdsYW1iZGEnLFxuICAgICAgICBtZXNzYWdlOiBgY29tcGlsZWQgJHtkeW5hbWljSWRzLmxlbmd0aH0gZnVuY3Rpb24ocylgLFxuICAgICAgICBkdXJhdGlvbjogZHluYW1pY1RpbWUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChjb3B5VGltZSkge1xuICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICBsYWJlbDogJ2Fzc2V0cycsXG4gICAgICAgIG1lc3NhZ2U6IGBjb3BpZWQgaW4gJHtjb3B5VGltZX1gLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25maWcuaG9va3MuZW1pdFBvc3RCdWlsZCh7XG4gICAgICBvdXRwdXQ6IGNvbmZpZy5vdXRwdXQsXG4gICAgICBzdGF0aWNPdXRwdXQ6IGNvbmZpZy5zdGF0aWNPdXRwdXREaXIsXG4gICAgICBmdW5jdGlvbnNPdXRwdXQ6IGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgICBmdW5jdGlvbnNNYW5pZmVzdDogZ2V0Um91dGVzTWFuaWZlc3RTYWZlbHkoY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0KSxcbiAgICB9KVxuXG4gICAgaWYgKHN0YXRpY1RpbWUgfHwgZHluYW1pY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5uZXdsaW5lKClcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdjb21wbGV0ZScsXG4gICAgICAgIG1lc3NhZ2U6IGBpbiAke3RvdGFsVGltZSgpfWAsXG4gICAgICB9KVxuICAgICAgbG9nZ2VyLm5ld2xpbmUoKVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJ1xuaW1wb3J0IGdldFBvcnQgZnJvbSAnZ2V0LXBvcnQnXG5pbXBvcnQgc2lydiBmcm9tICdzaXJ2J1xuaW1wb3J0IGNob2tpZGFyIGZyb20gJ2Nob2tpZGFyJ1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcbmltcG9ydCB0b1JlZ0V4cCBmcm9tICdyZWdleHBhcmFtJ1xuaW1wb3J0IHN0YXR1cyBmcm9tICdzdGF0dXNlcydcblxuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZSB9IGZyb20gJy4vY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZSdcbmltcG9ydCB7IHJlcXVlc3RUb0V2ZW50IH0gZnJvbSAnLi9yZXF1ZXN0VG9FdmVudCdcbmltcG9ydCB7IHNlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UgfSBmcm9tICcuL3NlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UnXG5pbXBvcnQgeyBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0IH0gZnJvbSAnLi9saXZlUmVsb2FkU2NyaXB0J1xuaW1wb3J0IHsgQVdTLCBQcmVzdGEgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgbm9ybWFsaXplUmVzcG9uc2UgfSBmcm9tICcuL25vcm1hbGl6ZVJlc3BvbnNlJ1xuXG5mdW5jdGlvbiByZXNvbHZlSFRNTChkaXI6IHN0cmluZywgdXJsOiBzdHJpbmcpIHtcbiAgbGV0IGZpbGUgPSBwYXRoLmpvaW4oZGlyLCB1cmwpXG5cbiAgLy8gaWYgbm8gZXh0ZW5zaW9uLCBpdCdzIHByb2JhYmx5IGludGVuZGVkIHRvIGJlIGFuIEhUTUwgZmlsZVxuICBpZiAoIXBhdGguZXh0bmFtZSh1cmwpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpciwgdXJsLCAnaW5kZXguaHRtbCcpLCAndXRmOCcpXG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0ZjgnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVySGFuZGxlcih7IHBvcnQsIGNvbmZpZyB9OiB7IHBvcnQ6IG51bWJlcjsgY29uZmlnOiBQcmVzdGEgfSkge1xuICBjb25zdCBkZXZDbGllbnQgPSBjcmVhdGVMaXZlUmVsb2FkU2NyaXB0KHsgcG9ydCB9KVxuICBjb25zdCBzdGF0aWNEaXIgPSBjb25maWcuc3RhdGljT3V0cHV0RGlyXG4gIGNvbnN0IGFzc2V0RGlyID0gY29uZmlnLmFzc2V0c1xuXG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBzZXJ2ZUhhbmRsZXIocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlKSB7XG4gICAgY29uc3QgdGltZSA9IHRpbWVyKClcbiAgICBjb25zdCB1cmwgPSByZXEudXJsIGFzIHN0cmluZ1xuXG4gICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgIGxhYmVsOiAnZGVidWcnLFxuICAgICAgbWVzc2FnZTogYGhhbmRsaW5nICR7dXJsfWAsXG4gICAgfSlcblxuICAgIC8qXG4gICAgICogZmlyc3QgY2hlY2sgdGhlIHZjcy10cmFja2VkIHN0YXRpYyBmb2xkZXIsXG4gICAgICogdGhlbiBjaGVjayB0aGUgcHJlc3RhLWJ1aWx0IHN0YXRpYyBmb2xkZXJcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1cmUtdGhpbmcvcHJlc3RhL2lzc3Vlcy8zMFxuICAgICAqL1xuICAgIHNpcnYoYXNzZXREaXIsIHsgZGV2OiB0cnVlIH0pKHJlcSwgcmVzLCAoKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgICAgbWVzc2FnZTogYGF0dGVtcHRpbmcgdG8gc2VydmUgZ2VuZXJhdGVkIHN0YXRpYyBhc3NldCAke3VybH1gLFxuICAgICAgfSlcblxuICAgICAgc2lydihzdGF0aWNEaXIsIHsgZGV2OiB0cnVlIH0pKHJlcSwgcmVzLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcmVxdWVzdFRvRXZlbnQocmVxKSAvLyBzdG9jayBBV1MgRXZlbnQgc2hhcGVcbiAgICAgICAgY29uc3QgYWNjZXB0ID0gZXZlbnQuaGVhZGVycy5BY2NlcHQgfHwgZXZlbnQuaGVhZGVycy5hY2NlcHRcbiAgICAgICAgY29uc3QgYWNjZXB0c0pzb24gPSBhY2NlcHQgJiYgYWNjZXB0LmluY2x1ZGVzKCdqc29uJylcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8qXG4gICAgICAgICAgICogTm8gYXNzZXQgZmlsZSwgbm8gc3RhdGljIGZpbGUsIHRyeSBkeW5hbWljXG4gICAgICAgICAgICovXG4gICAgICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0XVxuICAgICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gcmVxdWlyZShjb25maWcuZnVuY3Rpb25zTWFuaWZlc3QpXG4gICAgICAgICAgY29uc3Qgcm91dGVzID0gT2JqZWN0LmtleXMobWFuaWZlc3QpXG4gICAgICAgICAgY29uc3QgbGFtYmRhRmlsZXBhdGggPSByb3V0ZXNcbiAgICAgICAgICAgIC5tYXAoKHJvdXRlKSA9PiAoe1xuICAgICAgICAgICAgICBtYXRjaGVyOiB0b1JlZ0V4cChyb3V0ZSksXG4gICAgICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAuZmlsdGVyKCh7IG1hdGNoZXIgfSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5wYXR0ZXJuLnRlc3QodXJsLnNwbGl0KCc/JylbMF0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcCgoeyByb3V0ZSB9KSA9PiBtYW5pZmVzdFtyb3V0ZV0pWzBdXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBJZiB3ZSBoYXZlIGEgc2VydmVybGVzcyBmdW5jdGlvbiwgZGVsZWdhdGUgdG8gaXQsIG90aGVyd2lzZSA0MDRcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBpZiAobGFtYmRhRmlsZXBhdGgpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICAgICAgICAgIGxhYmVsOiAnZGVidWcnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgYXR0ZW1wdGluZyB0byByZW5kZXIgbGFtYmRhIGZvciAke3VybH1gLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY29uc3QgeyBoYW5kbGVyIH06IHsgaGFuZGxlcjogQVdTWydIYW5kbGVyJ10gfSA9IHJlcXVpcmUobGFtYmRhRmlsZXBhdGgpXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U6IEFXU1snSGFuZGxlclJlc3BvbnNlJ11cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVzcG9uc2UgPSBub3JtYWxpemVSZXNwb25zZShhd2FpdCBoYW5kbGVyKGV2ZW50LCB7fSkpIC8vIHdyYXBwZWQgaW4gLi93cmFwSGFuZGxlci50c1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnc2VydmUnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBsYW1iZGFgLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIHJlc3BvbnNlID0gbm9ybWFsaXplUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICAgICAgICAgICAgICBodG1sOiBhY2NlcHRzSnNvbiA/IHVuZGVmaW5lZCA6IGNyZWF0ZURlZmF1bHRIdG1sUmVzcG9uc2UoeyBzdGF0dXNDb2RlOiA1MDAgfSksXG4gICAgICAgICAgICAgICAganNvbjogYWNjZXB0c0pzb24gPyB7IGRldGFpbDogc3RhdHVzLm1lc3NhZ2VbNTAwXSB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycyB8fCB7fVxuICAgICAgICAgICAgY29uc3QgcmVkaXIgPSByZXNwb25zZS5zdGF0dXNDb2RlID4gMjk5ICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzOTlcblxuICAgICAgICAgICAgLy8gZ2V0IG1pbWUgdHlwZVxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddIGFzIHN0cmluZ1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gdHlwZSA/IG1pbWUuZXh0ZW5zaW9uKHR5cGUpIDogJ2h0bWwnXG5cbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9ICR7cmVkaXIgPyBoZWFkZXJzLkxvY2F0aW9uIDogdXJsfWAsXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBzZW5kU2VydmVybGVzc1Jlc3BvbnNlKHJlcywge1xuICAgICAgICAgICAgICAuLi5yZXNwb25zZSxcbiAgICAgICAgICAgICAgLy8gb25seSBodG1sIGNhbiBiZSBsaXZlLXJlbG9hZGVkLCBkdWhcbiAgICAgICAgICAgICAgYm9keTogZXh0ID09PSAnaHRtbCcgPyAocmVzcG9uc2UuYm9keSB8fCAnJykuc3BsaXQoJzwvYm9keT4nKVswXSArIGRldkNsaWVudCA6IHJlc3BvbnNlLmJvZHksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIud2Fybih7XG4gICAgICAgICAgICAgIGxhYmVsOiAnc2VydmUnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgNDA0ICR7dXJsfWAsXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBzZW5kU2VydmVybGVzc1Jlc3BvbnNlKFxuICAgICAgICAgICAgICByZXMsXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZVJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiA0MDQsXG4gICAgICAgICAgICAgICAgaHRtbDogYWNjZXB0c0pzb24gPyB1bmRlZmluZWQgOiBjcmVhdGVEZWZhdWx0SHRtbFJlc3BvbnNlKHsgc3RhdHVzQ29kZTogNDA0IH0pICsgZGV2Q2xpZW50LFxuICAgICAgICAgICAgICAgIGpzb246IGFjY2VwdHNKc29uID8geyBkZXRhaWw6IHN0YXR1cy5tZXNzYWdlWzQwNF0gfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgICAgbGFiZWw6ICdzZXJ2ZScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgNTAwICR7dXJsfWAsXG4gICAgICAgICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHNlbmRTZXJ2ZXJsZXNzUmVzcG9uc2UoXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICBub3JtYWxpemVSZXNwb25zZSh7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICAgICAgICAgICAgaHRtbDogYWNjZXB0c0pzb24gPyB1bmRlZmluZWQgOiBjcmVhdGVEZWZhdWx0SHRtbFJlc3BvbnNlKHsgc3RhdHVzQ29kZTogNTAwIH0pICsgZGV2Q2xpZW50LFxuICAgICAgICAgICAgICBqc29uOiBhY2NlcHRzSnNvbiA/IHsgZGV0YWlsOiBzdGF0dXMubWVzc2FnZVs1MDBdIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJ2ZShjb25maWc6IFByZXN0YSkge1xuICBjb25zdCBwb3J0ID0gYXdhaXQgZ2V0UG9ydCh7IHBvcnQ6IGNvbmZpZy5wb3J0IH0pXG4gIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGNyZWF0ZVNlcnZlckhhbmRsZXIoeyBwb3J0LCBjb25maWcgfSkpLmxpc3Rlbihwb3J0KVxuICBjb25zdCBzb2NrZXQgPSByZXF1aXJlKCdwb2NrZXQuaW8nKShzZXJ2ZXIsIHsgc2VydmVDbGllbnQ6IGZhbHNlIH0pXG5cbiAgY29uZmlnLmhvb2tzLm9uQnJvd3NlclJlZnJlc2goKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICBsYWJlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2U6IGByZWZyZXNoIGV2ZW50IHJlY2VpdmVkYCxcbiAgICB9KVxuXG4gICAgc29ja2V0LmVtaXQoJ3JlZnJlc2gnKVxuICB9KVxuXG4gIGNob2tpZGFyLndhdGNoKGNvbmZpZy5hc3NldHMsIHsgaWdub3JlSW5pdGlhbDogdHJ1ZSB9KS5vbignYWxsJywgKCkgPT4ge1xuICAgIGNvbmZpZy5ob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIHJldHVybiB7IHBvcnQgfVxufVxuIiwgImltcG9ydCBzdGF0dXMgZnJvbSAnc3RhdHVzZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0SHRtbFJlc3BvbnNlKHsgc3RhdHVzQ29kZSB9OiB7IHN0YXR1c0NvZGU6IG51bWJlciB9KSB7XG4gIHJldHVybiBgPCEtLSBidWlsdCB3aXRoIHByZXN0YSBodHRwczovL25wbS5pbS9wcmVzdGEgLS0+XG4gICAgPCFET0NUWVBFIGh0bWw+XG4gICAgPGh0bWw+XG4gICAgICA8aGVhZD5cbiAgICAgICAgPG1ldGEgY2hhcnNldD1cIlVURi04XCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTFcIiAvPlxuICAgICAgICA8dGl0bGU+JHtzdGF0dXNDb2RlfSBcdTIwMTRcdTAwQTAke3N0YXR1cy5tZXNzYWdlW3N0YXR1c0NvZGVdfTwvdGl0bGU+XG4gICAgICAgIDxsaW5rIHJlbD1cImljb25cIiB0eXBlPVwiaW1hZ2UvcG5nXCIgaHJlZj1cImh0dHBzOi8vcHJlc3RhLnJ1bi9mYXZpY29uLnBuZ1wiPlxuICAgICAgICA8bGluayByZWw9XCJpY29uXCIgdHlwZT1cImltYWdlL3N2Z1wiIGhyZWY9XCJodHRwczovL3ByZXN0YS5ydW4vZmF2aWNvbi5zdmdcIj5cbiAgICAgICAgPGxpbmsgcmVsPVwicHJlY29ubmVjdFwiIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tXCI+XG4gICAgICAgIDxsaW5rIHJlbD1cInByZWNvbm5lY3RcIiBocmVmPVwiaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbVwiIGNyb3Nzb3JpZ2luPlxuICAgICAgICA8bGluayBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDQwMDs5MDAmZGlzcGxheT1zd2FwXCIgcmVsPVwic3R5bGVzaGVldFwiPiBcbiAgICAgICAgPGxpbmsgcmVsPSdzdHlsZXNoZWV0JyBocmVmPSdodHRwczovL3VucGtnLmNvbS9zdmJzdHJhdGVANS4xLjAvc3Zic3RyYXRlLmNzcycgLz5cbiAgICAgICAgPHN0eWxlPlxuICAgICAgICAgIGh0bWwsYm9keSB7XG4gICAgICAgICAgICBmb250LWZhbWlseTogJ0ludGVyJywgJ3NhbnMtc2VyaWYnO1xuICAgICAgICAgICAgY29sb3I6ICMyMzI4M0Q7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjREFERUYwO1xuICAgICAgICAgIH1cbiAgICAgICAgICAjZmF2aWNvbiB7XG4gICAgICAgICAgICBmaWxsOiAjMjMyODNEO1xuICAgICAgICAgIH1cbiAgICAgICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7XG4gICAgICAgICAgICBodG1sLGJvZHkge1xuICAgICAgICAgICAgICBjb2xvcjogI0RBREVGMDtcbiAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzIzMjgzRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICNmYXZpY29uIHtcbiAgICAgICAgICAgICAgZmlsbDogI0RBREVGMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvc3R5bGU+XG4gICAgICA8L2hlYWQ+XG4gICAgICA8Ym9keSBjbGFzcz0ndyBmIGFpYyBqY2MnIHN0eWxlPSdoZWlnaHQ6IDEwMHZoJz5cbiAgICAgICAgPGRpdiBjbGFzcz0ncDEyIHRhYyc+XG4gICAgICAgICAgPGgxPiR7c3RhdHVzQ29kZX08L2gxPlxuICAgICAgICAgIDxwIGNsYXNzPSdtYjEnPiR7c3RhdHVzLm1lc3NhZ2Vbc3RhdHVzQ29kZV19PC9wPlxuXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2EpXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGlkPVwiZmF2aWNvblwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMC40IDdjLS4zIDAtLjguMi0xIC41TDEuMSAyMi4xYy0uMi4zIDAgLjYuMy42bDQgLjMtMi4xIDIuNmMtLjIuMy0uMS42LjIuNmwxNi44IDEuM2MuNCAwIC44LS4yIDEtLjRMMzIgMTMuOWMuMi0uMi4xLS41LS4yLS41bC02LjQtLjUgMi4yLTRjLjItLjMgMC0uNS0uMy0uNkwxMC40IDdaTTI0IDEyLjhsMS45LTMuNC0xNS41LTEuMi03LjcgMTMuNCAzLjYuMyA3LjUtOS40Yy4zLS4zLjctLjUgMS0uNGw5LjIuN1pNNy42IDIybDcuMS04LjkgOC43LjctNS4yIDlMNy42IDIyWm0tMSAxLjEgMTEuNiAxYy4zIDAgLjgtLjMgMS0uNmw1LjUtOS42IDUuNS41LTkuNyAxMkw1IDI1LjJsMS43LTJaXCIgZmlsbD1cIiMyMzI4M0RcIi8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiYVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0wIDBoMzJ2MzJIMHpcIi8+XG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9ib2R5PlxuICAgIDwvaHRtbD5cbiAgYFxufVxuIiwgImltcG9ydCBodHRwIGZyb20gJ2h0dHAnXG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVVybCB9IGZyb20gJ3VybCdcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlUXVlcnkgfSBmcm9tICdxdWVyeS1zdHJpbmcnXG5pbXBvcnQgcmF3Qm9keSBmcm9tICdyYXctYm9keSdcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXG5pbXBvcnQgeyBBV1MgfSBmcm9tICcuL3R5cGVzJ1xuXG4vLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXRsaWZ5L2NsaS9ibG9iLzI3YmI3YjliMzBkNDY1YWJlODZmODdmNDI3NGRkN2E3MWIxYjAwM2Ivc3JjL3V0aWxzL3NlcnZlLWZ1bmN0aW9ucy5qcyNMMTY3XG5jb25zdCBCQVNFXzY0X01JTUVfUkVHRVhQID0gL2ltYWdlfGF1ZGlvfHZpZGVvfGFwcGxpY2F0aW9uXFwvcGRmfGFwcGxpY2F0aW9uXFwvemlwfGFwcGxpY2F0b25cXC9vY3RldC1zdHJlYW0vaVxuZnVuY3Rpb24gc2hvdWxkQmFzZTY0RW5jb2RlKGNvbnRlbnRUeXBlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIEJvb2xlYW4oY29udGVudFR5cGUpICYmIEJBU0VfNjRfTUlNRV9SRUdFWFAudGVzdChjb250ZW50VHlwZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlcnMocmF3SGVhZGVyczogaHR0cC5JbmNvbWluZ01lc3NhZ2VbJ2hlYWRlcnMnXSkge1xuICBjb25zdCBoZWFkZXJzOiBBV1NbJ0hhbmRsZXJFdmVudCddWydoZWFkZXJzJ10gPSB7fVxuICBjb25zdCBtdWx0aVZhbHVlSGVhZGVyczogQVdTWydIYW5kbGVyRXZlbnQnXVsnbXVsdGlWYWx1ZUhlYWRlcnMnXSA9IHt9XG5cbiAgZm9yIChjb25zdCBoZWFkZXIgb2YgT2JqZWN0LmtleXMocmF3SGVhZGVycykpIHtcbiAgICBjb25zdCBrZXkgPSBoZWFkZXIudG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IHZhbHVlID0gcmF3SGVhZGVyc1toZWFkZXJdXG5cbiAgICBpZiAoIXZhbHVlKSBjb250aW51ZVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBtdWx0aVZhbHVlSGVhZGVyc1trZXldID0gdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyc1trZXldID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBoZWFkZXJzLCBtdWx0aVZhbHVlSGVhZGVycyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeVN0cmluZ1BhcmFtZXRlcnMocXVlcnk6IHN0cmluZykge1xuICBjb25zdCBwYXJhbXMgPSBwYXJzZVF1ZXJ5KHF1ZXJ5LCB7IGFycmF5Rm9ybWF0OiAnY29tbWEnIH0pXG5cbiAgY29uc3QgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiBBV1NbJ0hhbmRsZXJFdmVudCddWydxdWVyeVN0cmluZ1BhcmFtZXRlcnMnXSA9IHt9XG4gIGNvbnN0IG11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnM6IEFXU1snSGFuZGxlckV2ZW50J11bJ211bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMnXSA9IHt9XG5cbiAgZm9yIChjb25zdCBwYXJhbSBvZiBPYmplY3Qua2V5cyhwYXJhbXMpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbXNbcGFyYW1dXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzW3BhcmFtXSA9IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyc1twYXJhbV0gPSB2YWx1ZSB8fCB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBxdWVyeVN0cmluZ1BhcmFtZXRlcnMsIG11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFRvRXZlbnQocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSk6IFByb21pc2U8QVdTWydIYW5kbGVyRXZlbnQnXT4ge1xuICBjb25zdCB7IHVybDogcGF0aCA9ICcnLCBtZXRob2QgfSA9IHJlcVxuICBjb25zdCB7IGhlYWRlcnMsIG11bHRpVmFsdWVIZWFkZXJzIH0gPSBub3JtYWxpemVIZWFkZXJzKHJlcS5oZWFkZXJzKVxuICBjb25zdCBpc0Jhc2U2NEVuY29kZWQgPSBzaG91bGRCYXNlNjRFbmNvZGUoaGVhZGVyc1snY29udGVudC10eXBlJ10gfHwgJycpXG4gIGNvbnN0IGNvbnRlbnRMZW5ndGhIZWFkZXIgPSBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddXG4gIGNvbnN0IGJvZHkgPSBjb250ZW50TGVuZ3RoSGVhZGVyXG4gICAgPyBhd2FpdCByYXdCb2R5KHJlcSwge1xuICAgICAgICBsaW1pdDogJzFtYicsXG4gICAgICAgIGVuY29kaW5nOiBtaW1lLmNoYXJzZXQoY29udGVudExlbmd0aEhlYWRlcikgfHwgdW5kZWZpbmVkLFxuICAgICAgfSlcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCByYXdRdWVyeSA9IHBhcnNlVXJsKHBhdGgpLnF1ZXJ5IHx8ICcnXG4gIGNvbnN0IHsgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzLCBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzIH0gPSBnZXRRdWVyeVN0cmluZ1BhcmFtZXRlcnMocmF3UXVlcnkpXG5cbiAgLyoqXG4gICAqIEp1c3QgZmFrZSB0aGlzIGxvY2FsbHlcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmV0bGlmeS9jbGkvYmxvYi8yN2JiN2I5YjMwZDQ2NWFiZTg2Zjg3ZjQyNzRkZDdhNzFiMWIwMDNiL3NyYy91dGlscy9zZXJ2ZS1mdW5jdGlvbnMuanMjTDIwOFxuICAgKi9cbiAgaGVhZGVyc1snY2xpZW50LWlwJ10gPSAnMC4wLjAuMCdcblxuICByZXR1cm4ge1xuICAgIHJhd1VybDogcGF0aCxcbiAgICBwYXRoLFxuICAgIGh0dHBNZXRob2Q6IG1ldGhvZCBhcyBzdHJpbmcsXG4gICAgaGVhZGVycyxcbiAgICBtdWx0aVZhbHVlSGVhZGVycyxcbiAgICByYXdRdWVyeSxcbiAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnMsXG4gICAgbXVsdGlWYWx1ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVycyxcbiAgICBib2R5OiBib2R5ID8gQnVmZmVyLmZyb20oYm9keSkudG9TdHJpbmcoaXNCYXNlNjRFbmNvZGVkID8gJ2Jhc2U2NCcgOiAndXRmOCcpIDogbnVsbCxcbiAgICBpc0Jhc2U2NEVuY29kZWQsXG4gIH1cbn1cbiIsICJpbXBvcnQgaHR0cCBmcm9tICdodHRwJ1xuXG5pbXBvcnQgeyBub3JtYWxpemVSZXNwb25zZSB9IGZyb20gJy4vbm9ybWFsaXplUmVzcG9uc2UnXG5pbXBvcnQgeyBBV1MgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gc2VuZFNlcnZlcmxlc3NSZXNwb25zZShyZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIHI6IFBhcnRpYWw8QVdTWydIYW5kbGVyUmVzcG9uc2UnXT4pIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBub3JtYWxpemVSZXNwb25zZShyKVxuXG4gIC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25ldGxpZnkvY2xpL2Jsb2IvMjdiYjdiOWIzMGQ0NjVhYmU4NmY4N2Y0Mjc0ZGQ3YTcxYjFiMDAzYi9zcmMvdXRpbHMvc2VydmUtZnVuY3Rpb25zLmpzI0w3M1xuICBmb3IgKGNvbnN0IGtleSBpbiByLm11bHRpVmFsdWVIZWFkZXJzKSB7XG4gICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyhyLm11bHRpVmFsdWVIZWFkZXJzW2tleV0pKVxuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gci5oZWFkZXJzKSB7XG4gICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyhyLmhlYWRlcnNba2V5XSkpXG4gIH1cblxuICByZXMuc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1c0NvZGVcbiAgcmVzLndyaXRlKHJlc3BvbnNlLmJvZHkpXG4gIHJlcy5lbmQoKVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtrNEJBRUEsT0FBZSx1QkFDZixHQUFpQix1dkNDSGpCLE1BQXlCLG9CQ0FsQixHQUFNLEdBQU0sQ0FDakIsV0FBWSxhQUNaLFlBQWEsZUNDZixHQUFNLElBQWdCLENBQ3BCLElBQUssUUFBUSxJQUNiLElBQUssUUFBUSxNQUNiLElBQUssRUFBSSxXQUNULE1BQU8sSUFHRixXQUFrQyxFQUF3QixDQUUvRCxjQUFPLFdBQWEsRUFDYixFQUdGLFlBQTRDLENBRWpELE1BQUssUUFBTyxZQUNWLEVBQXlCLElBSXBCLE9BQU8sV0ZsQlQsR0FBSyxHQUFMLFVBQUssRUFBTCxDQUNMLFFBQVEsUUFDUixPQUFPLE9BQ1AsT0FBTyxPQUNQLE1BQU0sVUFKSSxXQWVaLEdBQUksSUFBYyxHQUVaLEdBQVMsRUFDWixFQUFPLE9BQVEsV0FDZixFQUFPLE1BQU8sUUFDZCxFQUFPLE1BQU8sVUFDZCxFQUFPLEtBQU0sT0FhVCxXQUFnQixFQUFrQixDQUN2QyxHQUFJLFFBQVEsSUFBSSxRQUNkLEdBQUssS0FBSyxPQUNMLENBQ0wsR0FBTSxHQUFRLElBQTJCLE1BQ25DLEVBQVUsSUFBMkIsTUFBUSxFQUFJLFdBQWEsT0FBUyxNQUU3RSxHQUFJLENBQUMsR0FBUyxFQUFRLFFBQVUsRUFBTyxNQUFPLE9BRTlDLFFBQVEsSUFDTixDQUNFLFVBQUUsS0FBSyxHQUNQLFVBQUUsR0FBTyxFQUFRLE9BQVMsU0FBd0IsRUFBUSxPQUMxRCxFQUFRLFFBQ1IsRUFBUSxTQUFXLFVBQUUsS0FBSyxJQUFNLEVBQVEs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T0FBTyxlQUFnQix1REFDdkIsT0FBTyxjQUFlLHdDQUN0QixRQUFRLHlCQUNSLFFBQVEsK0JBQ1IsUUFBUSxpQkFDUixRQUFRLGdCQUNSLFFBQVEsaUJBRVgsRUFDRyxRQUFRLFFBQVMscUNBQXNDLENBQUUsUUFBUyxLQUNsRSxRQUFRLElBQ1IsUUFBUSxpQkFDUixRQUFRLE1BQU0sTUFDZCxPQUFPLEtBQU8sSUFBUyxDQUN0QixLQUVBLFFBQVEsUUFFUixHQUFNLEdBQVMsS0FBTSxHQUFhLENBQ2hDLElBQUssRUFBSSxXQUNULE9BQVEsRUFBYyxFQUFLLE9BQVEsSUFDbkMsSUFBSyxPQUNBLEdBREEsQ0FFSCxNQUFPLEVBQUssTUFJaEIsV0FBRyxhQUFhLEVBQU8sUUFFdkIsQUFBTyxFQUFJLEdBQUcsQUFBTyxVQUFPLEtBQUssbUJBQ2pDLEFBQU8sSUFFUCxLQUFNLElBQU0sS0FHaEIsRUFDRyxRQUFRLE1BQU8sMENBQTJDLENBQUUsTUFBTyxVQUNuRSxPQUFPLGFBQWMsaURBQ3JCLE9BQU8saUJBQWtCLGlEQUN6QixTQUFTLGdEQUNULFFBQVEsT0FDUixRQUFRLHVCQUNSLFFBQVEsZ0NBQ1IsUUFBUSxVQUFVLE1BQ2xCLE9BQU8sS0FBTyxJQUFTLENBQ3RCLEtBRUEsUUFBUSxRQUVSLEdBQU0sR0FBUyxLQUFNLEdBQWEsQ0FDaEMsSUFBSyxFQUFJLFlBQ1QsT0FBUSxFQUFjLEVBQUssUUFDM0IsSUFBSyxPQUNBLEdBREEsQ0FFSCxNQUFPLEVBQUssTUFJaEIsR0FBSyxFQUFLLEVBTVIsQUFBTyxFQUFLLENBQ1YsTUFBTyxRQUVULEFBQU8sUUFUSSxDQUNYLEdBQU0sR0FBUyxLQUFNLElBQU0sR0FFM0IsQUFBTyxFQUFJLEdBQUcsQUFBTyxVQUFPLEtBQUssb0NBQW9DLEVBQU8sUUFDNUUsQUFBTyxJQVFULEdBQU0sS0FHVixFQUNHLFFBQVEsU0FDUixPQUFPLGFBQWMsaURBQ3JCLFNBQVMsa0RBQ1QsUUFBUSxTQUNSLFFBQVEsMEJBQ1IsUUFBUSxZQUFZLE1BQ3BCLE9BQU8sS0FBTyxJQUFTLENBQ3RCLEtBRUEsUUFBUSxRQUVSLEdBQU0sR0FBUyxLQUFNLEdBQWEsQ0FDaEMsSUFBSyxFQUFJLFdBQ1QsT0FBUSxFQUFjLEVBQUssUUFDM0IsSUFBSyxJQUVELEVBQVMsS0FBTSxJQUFNLEdBRTNCLEFBQU8sRUFBSSxHQUFHLEFBQU8sVUFBTyxLQUFLLHNDQUFzQyxFQUFPLFFBQzlFLEFBQU8sTUFHWCxFQUFLLE1BQU0sUUFBUSIsCiAgIm5hbWVzIjogW10KfQo=