UNPKG

@runtime-env/cli

Version:

Build once, deploy anywhere. Startup/runtime environment variable solution for JavaScript.

4 lines 46.3 kB
#!/usr/bin/env node 'use strict'; (()=>{"use strict";var e={13:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const r=a(858),i=n(a(44)),o=a(896);t.default=()=>new r.Command("gen-js").description("generate a JavaScript file that includes environment variables within an object, making them accessible through the globalThis property").option("--env-file <envFile...>","set environment variables from supplied file (requires Node.js v20.12.0)",[]).option("--output-file <outputFile>","specify the output file to be written instead of being piped to stdout").action((async({outputFile:e,envFile:t})=>{const{globalVariableName:n,schemaFile:s,watch:l}=r.program.opts();async function c(){const{output:a}=await(0,i.default)({schemaFile:s,globalVariableName:n,envFiles:t});e?(0,o.writeFileSync)(e,a,"utf8"):console.log(a)}await c(),l&&a(231).watch([s,...t]).on("change",(async()=>{await c()}))}))},23:e=>{e.exports=require("util")},44:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(236);t.default=async({envFiles:e,globalVariableName:t,schemaFile:a})=>{const r=await(0,n.createGeneratorForJSONSchema)({envFiles:e,schemaFile:a,globalVariableName:t,userEnvironment:!0});return{output:await r.generateJs()}}},64:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const r=a(858),i=n(a(797)),o=a(896),s=n(a(623));t.default=()=>new r.Command("interpolate").description("perform template interpolation by substituting environment variables").option("--env-file <envFile...>","set environment variables from supplied file (requires Node.js v20.12.0)",[]).option("--input-file <inputFile>","specify the input file to be loaded instead of being read from stdin").option("--output-file <outputFile>","specify the output file to be written instead of being piped to stdout").allowExcessArguments().action((async({inputFile:e,outputFile:t,envFile:n},{args:l})=>{const{globalVariableName:c,schemaFile:u,watch:p}=r.program.opts();async function d(){let a="";if(e)try{a=(0,o.readFileSync)(e,"utf8")}catch(t){(0,s.default)(`input file not found: no such file, open '${e}'`)}else a=l[0];const{output:r}=await(0,i.default)({envFiles:n,schemaFile:u,globalVariableName:c,input:a});t?(0,o.writeFileSync)(t,r,"utf8"):console.log(r)}await d(),p&&a(231).watch([u,...n,...e?[e]:[]]).on("change",(async()=>{await d()}))}))},91:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const r=a(858),i=n(a(626)),o=a(896);t.default=()=>new r.Command("gen-ts").description("generate a TypeScript file that provides the corresponding type definitions for the JavaScript file generated by the gen-js command").option("--output-file <outputFile>","specify the output file to be written instead of being piped to stdout").action((async({outputFile:e})=>{const{globalVariableName:t,schemaFile:n,watch:s}=r.program.opts();async function l(){const{output:a}=await(0,i.default)({schemaFile:n,globalVariableName:t});e?(0,o.writeFileSync)(e,a,"utf8"):console.log(a)}await l(),s&&a(231).watch([n]).on("change",(async()=>{await l()}))}))},93:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const r=a(858),i=a(330),o=n(a(13)),s=n(a(91)),l=n(a(64));r.program.version(i.version).option("--global-variable-name <globalVariableName>","specify the global variable name","runtimeEnv").option("--schema-file <schemaFile>","specify the json schema file to be loaded",".runtimeenvschema.json").option("--watch","turn on watch mode",!1).addCommand((0,o.default)()).addCommand((0,s.default)()).addCommand((0,l.default)()).parse()},231:e=>{e.exports=require("chokidar")},236:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createGeneratorForJSONSchema=void 0;const r=n(a(474)),i=n(a(711)),o=n(a(402)),s=n(a(23)),l=a(896),c=a(844),u=a(825),p=n(a(623));t.createGeneratorForJSONSchema=async({globalVariableName:e,schemaFile:t,envFiles:a,userEnvironment:n})=>({interpolate:async r=>{const i=await d({envFiles:a,schemaFile:t,userEnvironment:n}),o=m(i),s=f(o);return(0,u.template)(r,{variable:e})(s)},generateJs:async()=>{const r=await d({envFiles:a,schemaFile:t,userEnvironment:n});return["// Generated by '@runtime-env/cli'","",`globalThis.${e} = {`,...Object.entries(r).map((([e,t])=>` "${e}": ${t},`)),"}",""].join("\n")},generateTs:async()=>{let a="";try{a=(0,l.readFileSync)(t,"utf8")}catch{(0,p.default)(`schema file not found: no such file, open '${t}'`)}const n=JSON.parse(a),r=await(0,c.compile)(n,e,{bannerComment:"\n// Generated by '@runtime-env/cli'\n\ntype Primitive = undefined | null | boolean | string | number\n\ntype DeepReadonly<T> =\n T extends Primitive ? T :\n T extends Array<infer U> ? DeepReadonlyArray<U> :\n DeepReadonlyObject<T>\n\ntype DeepReadonlyArray<T> = ReadonlyArray<DeepReadonly<T>>\n\ntype DeepReadonlyObject<T> = {\n readonly [K in keyof T]: DeepReadonly<T[K]>\n}\n ",additionalProperties:!1}),i=e.charAt(0).toUpperCase()+e.slice(1);return r.replace(/export interface (\S+) /,`\ndeclare global {\n var ${e}: ${i}\n}\n\nexport type ${i} = DeepReadonly<\n `.trim()).trim()+">\n"}});const d=async({envFiles:e,schemaFile:t,userEnvironment:a})=>{const n=new i.default({allErrors:!0,strict:!0,coerceTypes:!1});(0,o.default)(n);let c="";try{c=(0,l.readFileSync)(t,"utf8")}catch{(0,p.default)(`schema file not found: no such file, open '${t}'`)}const u=JSON.parse(c),d=(()=>{let t={};return e.forEach((e=>{void 0===s.default.parseEnv&&(0,p.default)("util.parseEnv is not a function: please upgrade to Node.js v20.12.0 or later");try{t={...t,...s.default.parseEnv((0,l.readFileSync)(e,"utf8"))}}catch{(0,p.default)(`env file not found: no such file, open '${e}'`)}})),a&&(t={...t,...process.env}),t})();"object"!==u.type&&(0,p.default)('schema is invalid: data/type must be "object"'),Object.getPrototypeOf(u.properties??"").constructor!==Object&&(0,p.default)("schema is invalid: data/properties must be object"),!1===Array.isArray(Object.getPrototypeOf(u.required??[]))&&(0,p.default)("schema is invalid: data/required must be array"),(u.required??[]).forEach(((e,t)=>{"string"!=typeof e&&(0,p.default)(`schema is invalid: data/required/${t} must be string`)}));const m={},f=[];return Object.keys(u.properties).forEach((e=>{const t="string"===u.properties[e].type?d[e]:(()=>{try{return JSON.parse(d[e])}catch{return d[e]}})(),a={type:u.type,properties:{[e]:u.properties[e]},required:(u.required??[]).includes(e)?[e]:[]};try{n.validate(a,{[e]:t})?m[e]=(0,r.default)(t):f.push("env is invalid: "+JSON.stringify(n.errors))}catch(e){f.push(String(e).replace("Error: ",""))}})),f.length&&(0,p.default)(...f),m},m=e=>Object.entries(e).reduce(((e,[t,a])=>{try{return Object.assign(e,{[t]:JSON.parse(a)})}catch{return Object.assign(e,{[t]:""})}}),{}),f=e=>Array.isArray(e)?e.map((e=>f(e))):"object"==typeof e&&null!==e?Object.entries(e).reduce(((e,[t,a])=>Object.assign(e,{[t]:f(a)})),{}):"string"==typeof e?(0,r.default)(e).slice(1,-1):(0,r.default)(e)},330:e=>{e.exports=JSON.parse('{"name":"@runtime-env/cli","version":"0.7.3","description":"Build once, deploy anywhere. Startup/runtime environment variable solution for JavaScript.","license":"MIT","author":"Ernest","keywords":["twelve-factor","import-meta-env","json-schema"],"bin":{"runtime-env":"bin/runtime-env.js"},"files":["bin"],"scripts":{"build":"rimraf bin dist && tsc && webpack --mode production && node ./scripts/patchBin.js","pack":"rm -f *.tgz && pnpm pack && node ../../scripts/rename-tgz.js","release":"standard-version --skip.tag -t cli --preset=conventionalcommits --releaseCommitMessageFormat \'chore(release): @runtime-env/cli@{{currentTag}}\' --path .","test":"NODE_OPTIONS=\\"$NODE_OPTIONS --experimental-vm-modules\\" jest"},"repository":{"type":"git","url":"git+https://github.com/runtime-env/runtime-env.git","directory":"packages/cli"},"bugs":{"url":"https://github.com/runtime-env/runtime-env/issues"},"homepage":"https://github.com/runtime-env/runtime-env#readme","devDependencies":{"@tsconfig/node-lts":"22.0.1","@types/lodash":"4.17.16","@types/node":"22.15.19","@types/serialize-javascript":"5.0.4","webpack-node-externals":"3.0.0"},"dependencies":{"ajv":"8.17.1","ajv-formats":"3.0.1","chokidar":"4.0.3","commander":"14.0.0","json-schema-to-typescript":"15.0.4","lodash":"4.17.21","serialize-javascript":"6.0.2"}}')},402:e=>{e.exports=require("ajv-formats")},474:e=>{e.exports=require("serialize-javascript")},623:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=(...e)=>{const t=e.join("\n");console.error(`[@runtime-env/cli]\n${t.split("\n").map((e=>" "+e)).join("\n")}`),process.exit(1)}},626:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(236);t.default=async({globalVariableName:e,schemaFile:t})=>{const a=await(0,n.createGeneratorForJSONSchema)({envFiles:[],schemaFile:t,globalVariableName:e,userEnvironment:!1});return{output:await a.generateTs()}}},711:e=>{e.exports=require("ajv")},797:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(236);t.default=async({envFiles:e,schemaFile:t,globalVariableName:a,input:r})=>{const i=await(0,n.createGeneratorForJSONSchema)({envFiles:e,schemaFile:t,globalVariableName:a,userEnvironment:!0});return{output:await i.interpolate(r)}}},825:e=>{e.exports=require("lodash")},844:e=>{e.exports=require("json-schema-to-typescript")},858:e=>{e.exports=require("commander")},896:e=>{e.exports=require("fs")}},t={};!function a(n){var r=t[n];if(void 0!==r)return r.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,a),i.exports}(93)})(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QWtCLEVBQUlELEVBQWNFLDhCQUE4QixDQUNwRVQsU0FBVSxHQUNWUCxhQUNBRCxxQkFDQWtCLGlCQUFpQixJQUdyQixNQUFPLENBQUVaLGFBRFlVLEVBQVVxQyxhQUNkLEMsVUNYckJ4QyxFQUFPekIsUUFBVTBCLFFBQVEsTSxnQkNDekI1QixPQUFPQyxlQUFlQyxFQUFTLGFBQWMsQ0FBRUMsT0FBTyxJQUN0RCxNQUFNMEIsRUFBZ0IsRUFBUSxLQWE5QjNCLEVBQUEsUUFaWVMsT0FBU1csV0FBVVAsYUFBWUQscUJBQW9Cd0IsWUFDM0QsTUFBTVIsUUFBa0IsRUFBSUQsRUFBY0UsOEJBQThCLENBQ3BFVCxXQUNBUCxhQUNBRCxxQkFDQWtCLGlCQUFpQixJQUdyQixNQUFPLENBQ0haLGFBRmlCVSxFQUFVd0IsWUFBWWhCLEdBRzFDLEMsVUNiTFgsRUFBT3pCLFFBQVUwQixRQUFRLFMsVUNBekJELEVBQU96QixRQUFVMEIsUUFBUSw0QixVQ0F6QkQsRUFBT3pCLFFBQVUwQixRQUFRLFksVUNBekJELEVBQU96QixRQUFVMEIsUUFBUSxLLEdDQ3JCc0YsRUFBMkIsQ0FBQyxHQUdoQyxTQUFTQyxFQUFvQkMsR0FFNUIsSUFBSUMsRUFBZUgsRUFBeUJFLEdBQzVDLFFBQXFCN0IsSUFBakI4QixFQUNILE9BQU9BLEVBQWFuSCxRQUdyQixJQUFJeUIsRUFBU3VGLEVBQXlCRSxHQUFZLENBR2pEbEgsUUFBUyxDQUFDLEdBT1gsT0FIQW9ILEVBQW9CRixHQUFVRyxLQUFLNUYsRUFBT3pCLFFBQVN5QixFQUFRQSxFQUFPekIsUUFBU2lILEdBR3BFeEYsRUFBT3pCLE9BQ2YsQ0NuQjBCaUgsQ0FBb0IsRyIsInNvdXJjZXMiOlsid2VicGFjazovL0BydW50aW1lLWVudi9jbGkvLi9zcmMvZ2VuLWpzL2NvbW1hbmQudHMiLCJ3ZWJwYWNrOi8vQHJ1bnRpbWUtZW52L2NsaS9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwidXRpbFwiIiwid2VicGFjazovL0BydW50aW1lLWVudi9jbGkvLi9zcmMvZ2VuLWpzL2FjdC50cyIsIndlYnBhY2s6Ly9AcnVudGltZS1lbnYvY2xpLy4vc3JjL2ludGVycG9sYXRlL2NvbW1hbmQudHMiLCJ3ZWJwYWNrOi8vQHJ1bnRpbWUtZW52L2NsaS8uL3NyYy9nZW4tdHMvY29tbWFuZC50cyIsIndlYnBhY2s6Ly9AcnVudGltZS1lbnYvY2xpLy4vc3JjL2luZGV4LnRzIiwid2VicGFjazovL0BydW50aW1lLWVudi9jbGkvZXh0ZXJuYWwgY29tbW9uanMgXCJjaG9raWRhclwiIiwid2VicGFjazovL0BydW50aW1lLWVudi9jbGkvLi9zcmMvY3JlYXRlLWdlbmVyYXRvci9qc29uLXNjaGVtYS50cyIsIndlYnBhY2s6Ly9AcnVudGltZS1lbnYvY2xpL2V4dGVybmFsIGNvbW1vbmpzIFwiYWp2LWZvcm1hdHNcIiIsIndlYnBhY2s6Ly9AcnVudGltZS1lbnYvY2xpL2V4dGVybmFsIGNvbW1vbmpzIFwic2VyaWFsaXplLWphdmFzY3JpcHRcIiIsIndlYnBhY2s6Ly9AcnVudGltZS1lbnYvY2xpLy4vc3JjL3Rocm93RXJyb3IudHMiLCJ3ZWJwYWNrOi8vQHJ1bnRpbWUtZW52L2NsaS8uL3NyYy9nZW4tdHMvYWN0LnRzIiwid2VicGFjazovL0BydW50aW1lLWVudi9jbGkvZXh0ZXJuYWwgY29tbW9uanMgXCJhanZcIiIsIndlYnBhY2s6Ly9AcnVudGltZS1lbnYvY2xpLy4vc3JjL2ludGVycG9sYXRlL2FjdC50cyIsIndlYnBhY2s6Ly9AcnVudGltZS1lbnYvY2xpL2V4dGVybmFsIGNvbW1vbmpzIFwibG9kYXNoXCIiLCJ3ZWJwYWNrOi8vQHJ1bnRpbWUtZW52L2NsaS9leHRlcm5hbCBjb21tb25qcyBcImpzb24tc2NoZW1hLXRvLXR5cGVzY3JpcHRcIiIsIndlYnBhY2s6Ly9AcnVudGltZS1lbnYvY2xpL2V4dGVybmFsIGNvbW1vbmpzIFwiY29tbWFuZGVyXCIiLCJ3ZWJwYWNrOi8vQHJ1bnRpbWUtZW52L2NsaS9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiZnNcIiIsIndlYnBhY2s6Ly9AcnVudGltZS1lbnYvY2xpL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0BydW50aW1lLWVudi9jbGkvd2VicGFjay9zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29tbWFuZGVyXzEgPSByZXF1aXJlKFwiY29tbWFuZGVyXCIpO1xuY29uc3QgYWN0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vYWN0XCIpKTtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5leHBvcnRzLmRlZmF1bHQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBjb21tYW5kZXJfMS5Db21tYW5kKFwiZ2VuLWpzXCIpXG4gICAgICAgIC5kZXNjcmlwdGlvbihcImdlbmVyYXRlIGEgSmF2YVNjcmlwdCBmaWxlIHRoYXQgaW5jbHVkZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGhpbiBhbiBvYmplY3QsIG1ha2luZyB0aGVtIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgZ2xvYmFsVGhpcyBwcm9wZXJ0eVwiKVxuICAgICAgICAub3B0aW9uKFwiLS1lbnYtZmlsZSA8ZW52RmlsZS4uLj5cIiwgXCJzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gc3VwcGxpZWQgZmlsZSAocmVxdWlyZXMgTm9kZS5qcyB2MjAuMTIuMClcIiwgW10pXG4gICAgICAgIC5vcHRpb24oXCItLW91dHB1dC1maWxlIDxvdXRwdXRGaWxlPlwiLCBcInNwZWNpZnkgdGhlIG91dHB1dCBmaWxlIHRvIGJlIHdyaXR0ZW4gaW5zdGVhZCBvZiBiZWluZyBwaXBlZCB0byBzdGRvdXRcIilcbiAgICAgICAgLmFjdGlvbihhc3luYyAoeyBvdXRwdXRGaWxlLCBlbnZGaWxlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBnbG9iYWxWYXJpYWJsZU5hbWUsIHNjaGVtYUZpbGUsIHdhdGNoIH0gPSBjb21tYW5kZXJfMS5wcm9ncmFtLm9wdHMoKTtcbiAgICAgICAgYXdhaXQgcnVuKCk7XG4gICAgICAgIGlmICh3YXRjaCkge1xuICAgICAgICAgICAgY29uc3QgY2hva2lkYXIgPSByZXF1aXJlKFwiY2hva2lkYXJcIik7XG4gICAgICAgICAgICBjaG9raWRhci53YXRjaChbc2NoZW1hRmlsZSwgLi4uZW52RmlsZV0pLm9uKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBydW4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBhd2FpdCAoMCwgYWN0XzEuZGVmYXVsdCkoe1xuICAgICAgICAgICAgICAgIHNjaGVtYUZpbGUsXG4gICAgICAgICAgICAgICAgZ2xvYmFsVmFyaWFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGVudkZpbGVzOiBlbnZGaWxlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAob3V0cHV0RmlsZSkge1xuICAgICAgICAgICAgICAgICgwLCBmc18xLndyaXRlRmlsZVN5bmMpKG91dHB1dEZpbGUsIG91dHB1dCwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cob3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInV0aWxcIik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBqc29uX3NjaGVtYV8xID0gcmVxdWlyZShcIi4uL2NyZWF0ZS1nZW5lcmF0b3IvanNvbi1zY2hlbWFcIik7XG5jb25zdCBhY3QgPSBhc3luYyAoeyBlbnZGaWxlcywgZ2xvYmFsVmFyaWFibGVOYW1lLCBzY2hlbWFGaWxlIH0pID0+IHtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBhd2FpdCAoMCwganNvbl9zY2hlbWFfMS5jcmVhdGVHZW5lcmF0b3JGb3JKU09OU2NoZW1hKSh7XG4gICAgICAgIGVudkZpbGVzLFxuICAgICAgICBzY2hlbWFGaWxlLFxuICAgICAgICBnbG9iYWxWYXJpYWJsZU5hbWUsXG4gICAgICAgIHVzZXJFbnZpcm9ubWVudDogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBnZW5lcmF0b3IuZ2VuZXJhdGVKcygpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG91dHB1dCxcbiAgICB9O1xufTtcbmV4cG9ydHMuZGVmYXVsdCA9IGFjdDtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29tbWFuZGVyXzEgPSByZXF1aXJlKFwiY29tbWFuZGVyXCIpO1xuY29uc3QgYWN0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vYWN0XCIpKTtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCB0aHJvd0Vycm9yXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL3Rocm93RXJyb3JcIikpO1xuZXhwb3J0cy5kZWZhdWx0ID0gKCkgPT4ge1xuICAgIHJldHVybiBuZXcgY29tbWFuZGVyXzEuQ29tbWFuZChcImludGVycG9sYXRlXCIpXG4gICAgICAgIC5kZXNjcmlwdGlvbihcInBlcmZvcm0gdGVtcGxhdGUgaW50ZXJwb2xhdGlvbiBieSBzdWJzdGl0dXRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXCIpXG4gICAgICAgIC5vcHRpb24oXCItLWVudi1maWxlIDxlbnZGaWxlLi4uPlwiLCBcInNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBzdXBwbGllZCBmaWxlIChyZXF1aXJlcyBOb2RlLmpzIHYyMC4xMi4wKVwiLCBbXSlcbiAgICAgICAgLm9wdGlvbihcIi0taW5wdXQtZmlsZSA8aW5wdXRGaWxlPlwiLCBcInNwZWNpZnkgdGhlIGlucHV0IGZpbGUgdG8gYmUgbG9hZGVkIGluc3RlYWQgb2YgYmVpbmcgcmVhZCBmcm9tIHN0ZGluXCIpXG4gICAgICAgIC5vcHRpb24oXCItLW91dHB1dC1maWxlIDxvdXRwdXRGaWxlPlwiLCBcInNwZWNpZnkgdGhlIG91dHB1dCBmaWxlIHRvIGJlIHdyaXR0ZW4gaW5zdGVhZCBvZiBiZWluZyBwaXBlZCB0byBzdGRvdXRcIilcbiAgICAgICAgLmFsbG93RXhjZXNzQXJndW1lbnRzKClcbiAgICAgICAgLmFjdGlvbihhc3luYyAoeyBpbnB1dEZpbGUsIG91dHB1dEZpbGUsIGVudkZpbGUgfSwgeyBhcmdzIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBnbG9iYWxWYXJpYWJsZU5hbWUsIHNjaGVtYUZpbGUsIHdhdGNoIH0gPSBjb21tYW5kZXJfMS5wcm9ncmFtLm9wdHMoKTtcbiAgICAgICAgYXdhaXQgcnVuKCk7XG4gICAgICAgIGlmICh3YXRjaCkge1xuICAgICAgICAgICAgY29uc3QgY2hva2lkYXIgPSByZXF1aXJlKFwiY2hva2lkYXJcIik7XG4gICAgICAgICAgICBjaG9raWRhclxuICAgICAgICAgICAgICAgIC53YXRjaChbc2NoZW1hRmlsZSwgLi4uZW52RmlsZSwgLi4uKGlucHV0RmlsZSA/IFtpbnB1dEZpbGVdIDogW10pXSlcbiAgICAgICAgICAgICAgICAub24oXCJjaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gcnVuKCkge1xuICAgICAgICAgICAgbGV0IGlucHV0ID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChpbnB1dEZpbGUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9ICgwLCBmc18xLnJlYWRGaWxlU3luYykoaW5wdXRGaWxlLCBcInV0ZjhcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAoMCwgdGhyb3dFcnJvcl8xLmRlZmF1bHQpKGBpbnB1dCBmaWxlIG5vdCBmb3VuZDogbm8gc3VjaCBmaWxlLCBvcGVuICcke2lucHV0RmlsZX0nYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBhcmdzWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0ICgwLCBhY3RfMS5kZWZhdWx0KSh7XG4gICAgICAgICAgICAgICAgZW52RmlsZXM6IGVudkZpbGUsXG4gICAgICAgICAgICAgICAgc2NoZW1hRmlsZSxcbiAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlKSB7XG4gICAgICAgICAgICAgICAgKDAsIGZzXzEud3JpdGVGaWxlU3luYykob3V0cHV0RmlsZSwgb3V0cHV0LCBcInV0ZjhcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb21tYW5kZXJfMSA9IHJlcXVpcmUoXCJjb21tYW5kZXJcIik7XG5jb25zdCBhY3RfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9hY3RcIikpO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmV4cG9ydHMuZGVmYXVsdCA9ICgpID0+IHtcbiAgICByZXR1cm4gbmV3IGNvbW1hbmRlcl8xLkNvbW1hbmQoXCJnZW4tdHNcIilcbiAgICAgICAgLmRlc2NyaXB0aW9uKFwiZ2VuZXJhdGUgYSBUeXBlU2NyaXB0IGZpbGUgdGhhdCBwcm92aWRlcyB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGRlZmluaXRpb25zIGZvciB0aGUgSmF2YVNjcmlwdCBmaWxlIGdlbmVyYXRlZCBieSB0aGUgZ2VuLWpzIGNvbW1hbmRcIilcbiAgICAgICAgLm9wdGlvbihcIi0tb3V0cHV0LWZpbGUgPG91dHB1dEZpbGU+XCIsIFwic3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgd3JpdHRlbiBpbnN0ZWFkIG9mIGJlaW5nIHBpcGVkIHRvIHN0ZG91dFwiKVxuICAgICAgICAuYWN0aW9uKGFzeW5jICh7IG91dHB1dEZpbGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGdsb2JhbFZhcmlhYmxlTmFtZSwgc2NoZW1hRmlsZSwgd2F0Y2ggfSA9IGNvbW1hbmRlcl8xLnByb2dyYW0ub3B0cygpO1xuICAgICAgICBhd2FpdCBydW4oKTtcbiAgICAgICAgaWYgKHdhdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBjaG9raWRhciA9IHJlcXVpcmUoXCJjaG9raWRhclwiKTtcbiAgICAgICAgICAgIGNob2tpZGFyLndhdGNoKFtzY2hlbWFGaWxlXSkub24oXCJjaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gcnVuKCkge1xuICAgICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0ICgwLCBhY3RfMS5kZWZhdWx0KSh7XG4gICAgICAgICAgICAgICAgc2NoZW1hRmlsZSxcbiAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYWJsZU5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlKSB7XG4gICAgICAgICAgICAgICAgKDAsIGZzXzEud3JpdGVGaWxlU3luYykob3V0cHV0RmlsZSwgb3V0cHV0LCBcInV0ZjhcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb21tYW5kZXJfMSA9IHJlcXVpcmUoXCJjb21tYW5kZXJcIik7XG5jb25zdCBwYWNrYWdlX2pzb25fMSA9IHJlcXVpcmUoXCIuLi9wYWNrYWdlLmpzb25cIik7XG5jb25zdCBjb21tYW5kXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZ2VuLWpzL2NvbW1hbmRcIikpO1xuY29uc3QgY29tbWFuZF8yID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2dlbi10cy9jb21tYW5kXCIpKTtcbmNvbnN0IGNvbW1hbmRfMyA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9pbnRlcnBvbGF0ZS9jb21tYW5kXCIpKTtcbmNvbW1hbmRlcl8xLnByb2dyYW1cbiAgICAudmVyc2lvbihwYWNrYWdlX2pzb25fMS52ZXJzaW9uKVxuICAgIC5vcHRpb24oXCItLWdsb2JhbC12YXJpYWJsZS1uYW1lIDxnbG9iYWxWYXJpYWJsZU5hbWU+XCIsIFwic3BlY2lmeSB0aGUgZ2xvYmFsIHZhcmlhYmxlIG5hbWVcIiwgXCJydW50aW1lRW52XCIpXG4gICAgLm9wdGlvbihcIi0tc2NoZW1hLWZpbGUgPHNjaGVtYUZpbGU+XCIsIFwic3BlY2lmeSB0aGUganNvbiBzY2hlbWEgZmlsZSB0byBiZSBsb2FkZWRcIiwgXCIucnVudGltZWVudnNjaGVtYS5qc29uXCIpXG4gICAgLm9wdGlvbihcIi0td2F0Y2hcIiwgXCJ0dXJuIG9uIHdhdGNoIG1vZGVcIiwgZmFsc2UpXG4gICAgLmFkZENvbW1hbmQoKDAsIGNvbW1hbmRfMS5kZWZhdWx0KSgpKVxuICAgIC5hZGRDb21tYW5kKCgwLCBjb21tYW5kXzIuZGVmYXVsdCkoKSlcbiAgICAuYWRkQ29tbWFuZCgoMCwgY29tbWFuZF8zLmRlZmF1bHQpKCkpXG4gICAgLnBhcnNlKCk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjaG9raWRhclwiKTsiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlR2VuZXJhdG9yRm9ySlNPTlNjaGVtYSA9IHZvaWQgMDtcbmNvbnN0IHNlcmlhbGl6ZV9qYXZhc2NyaXB0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInNlcmlhbGl6ZS1qYXZhc2NyaXB0XCIpKTtcbmNvbnN0IGFqdl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJhanZcIikpO1xuY29uc3QgYWp2X2Zvcm1hdHNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiYWp2LWZvcm1hdHNcIikpO1xuY29uc3QgdXRpbF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJ1dGlsXCIpKTtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBqc29uX3NjaGVtYV90b190eXBlc2NyaXB0XzEgPSByZXF1aXJlKFwianNvbi1zY2hlbWEtdG8tdHlwZXNjcmlwdFwiKTtcbmNvbnN0IGxvZGFzaF8xID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IHRocm93RXJyb3JfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vdGhyb3dFcnJvclwiKSk7XG5jb25zdCBjcmVhdGVHZW5lcmF0b3JGb3JKU09OU2NoZW1hID0gYXN5bmMgKHsgZ2xvYmFsVmFyaWFibGVOYW1lLCBzY2hlbWFGaWxlLCBlbnZGaWxlcywgdXNlckVudmlyb25tZW50LCB9KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW50ZXJwb2xhdGU6IGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkRW52ID0gYXdhaXQgcGFyc2VFbnYoe1xuICAgICAgICAgICAgICAgIGVudkZpbGVzLFxuICAgICAgICAgICAgICAgIHNjaGVtYUZpbGUsXG4gICAgICAgICAgICAgICAgdXNlckVudmlyb25tZW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gY29udmVydEVudlRvRGF0YShwYXJzZWRFbnYpO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZERhdGEgPSBzZXJpYWxpemVMZWFmTm9kZXMoZGF0YSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gKDAsIGxvZGFzaF8xLnRlbXBsYXRlKShpbnB1dCwge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlOiBnbG9iYWxWYXJpYWJsZU5hbWUsXG4gICAgICAgICAgICB9KShzZXJpYWxpemVkRGF0YSk7XG4gICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2VuZXJhdGVKczogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkRW52ID0gYXdhaXQgcGFyc2VFbnYoe1xuICAgICAgICAgICAgICAgIGVudkZpbGVzLFxuICAgICAgICAgICAgICAgIHNjaGVtYUZpbGUsXG4gICAgICAgICAgICAgICAgdXNlckVudmlyb25tZW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gW1xuICAgICAgICAgICAgICAgIFwiLy8gR2VuZXJhdGVkIGJ5ICdAcnVudGltZS1lbnYvY2xpJ1wiLFxuICAgICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICAgICAgYGdsb2JhbFRoaXMuJHtnbG9iYWxWYXJpYWJsZU5hbWV9ID0ge2AsXG4gICAgICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMocGFyc2VkRW52KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCAgXCIke2tleX1cIjogJHt2YWx1ZX0sYCksXG4gICAgICAgICAgICAgICAgXCJ9XCIsXG4gICAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICB9LFxuICAgICAgICBnZW5lcmF0ZVRzOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZW52U2NoZW1hRmlsZUNvbnRlbnQgPSBcIlwiO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlbnZTY2hlbWFGaWxlQ29udGVudCA9ICgwLCBmc18xLnJlYWRGaWxlU3luYykoc2NoZW1hRmlsZSwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgICgwLCB0aHJvd0Vycm9yXzEuZGVmYXVsdCkoYHNjaGVtYSBmaWxlIG5vdCBmb3VuZDogbm8gc3VjaCBmaWxlLCBvcGVuICcke3NjaGVtYUZpbGV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZW52U2NoZW1hRmlsZUpTT04gPSBKU09OLnBhcnNlKGVudlNjaGVtYUZpbGVDb250ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0ICgwLCBqc29uX3NjaGVtYV90b190eXBlc2NyaXB0XzEuY29tcGlsZSkoZW52U2NoZW1hRmlsZUpTT04sIGdsb2JhbFZhcmlhYmxlTmFtZSwge1xuICAgICAgICAgICAgICAgIGJhbm5lckNvbW1lbnQ6IGBcbi8vIEdlbmVyYXRlZCBieSAnQHJ1bnRpbWUtZW52L2NsaSdcblxudHlwZSBQcmltaXRpdmUgPSB1bmRlZmluZWQgfCBudWxsIHwgYm9vbGVhbiB8IHN0cmluZyB8IG51bWJlclxuXG50eXBlIERlZXBSZWFkb25seTxUPiA9XG4gIFQgZXh0ZW5kcyBQcmltaXRpdmUgPyBUIDpcbiAgICBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBEZWVwUmVhZG9ubHlBcnJheTxVPiA6XG4gICAgICBEZWVwUmVhZG9ubHlPYmplY3Q8VD5cblxudHlwZSBEZWVwUmVhZG9ubHlBcnJheTxUPiA9IFJlYWRvbmx5QXJyYXk8RGVlcFJlYWRvbmx5PFQ+PlxuXG50eXBlIERlZXBSZWFkb25seU9iamVjdDxUPiA9IHtcbiAgcmVhZG9ubHkgW0sgaW4ga2V5b2YgVF06IERlZXBSZWFkb25seTxUW0tdPlxufVxuICAgICAgICBgLFxuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgY2FwaXRhbENhc2VHbG9iYWxWYXJpYWJsZU5hbWUgPSBnbG9iYWxWYXJpYWJsZU5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgK1xuICAgICAgICAgICAgICAgIGdsb2JhbFZhcmlhYmxlTmFtZS5zbGljZSgxKTtcbiAgICAgICAgICAgIHJldHVybiAocmVzdWx0XG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL2V4cG9ydCBpbnRlcmZhY2UgKFxcUyspIC8sIGBcbmRlY2xhcmUgZ2xvYmFsIHtcbiAgdmFyICR7Z2xvYmFsVmFyaWFibGVOYW1lfTogJHtjYXBpdGFsQ2FzZUdsb2JhbFZhcmlhYmxlTmFtZX1cbn1cblxuZXhwb3J0IHR5cGUgJHtjYXBpdGFsQ2FzZUdsb2JhbFZhcmlhYmxlTmFtZX0gPSBEZWVwUmVhZG9ubHk8XG4gICAgICAgICAgICBgLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAudHJpbSgpICsgXCI+XFxuXCIpO1xuICAgICAgICB9LFxuICAgIH07XG59O1xuZXhwb3J0cy5jcmVhdGVHZW5lcmF0b3JGb3JKU09OU2NoZW1hID0gY3JlYXRlR2VuZXJhdG9yRm9ySlNPTlNjaGVtYTtcbmNvbnN0IHBhcnNlRW52ID0gYXN5bmMgKHsgZW52RmlsZXMsIHNjaGVtYUZpbGUsIHVzZXJFbnZpcm9ubWVudCwgfSkgPT4ge1xuICAgIGNvbnN0IGFqdiA9IG5ldyBhanZfMS5kZWZhdWx0KHtcbiAgICAgICAgYWxsRXJyb3JzOiB0cnVlLFxuICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgIGNvZXJjZVR5cGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgICAoMCwgYWp2X2Zvcm1hdHNfMS5kZWZhdWx0KShhanYpO1xuICAgIGxldCBlbnZTY2hlbWFGaWxlQ29udGVudCA9IFwiXCI7XG4gICAgdHJ5IHtcbiAgICAgICAgZW52U2NoZW1hRmlsZUNvbnRlbnQgPSAoMCwgZnNfMS5yZWFkRmlsZVN5bmMpKHNjaGVtYUZpbGUsIFwidXRmOFwiKTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICAoMCwgdGhyb3dFcnJvcl8xLmRlZmF1bHQpKGBzY2hlbWEgZmlsZSBub3QgZm91bmQ6IG5vIHN1Y2ggZmlsZSwgb3BlbiAnJHtzY2hlbWFGaWxlfSdgKTtcbiAgICB9XG4gICAgY29uc3QgZW52U2NoZW1hRmlsZUpTT04gPSBKU09OLnBhcnNlKGVudlNjaGVtYUZpbGVDb250ZW50KTtcbiAgICBjb25zdCBlbnYgPSAoKCkgPT4ge1xuICAgICAgICBsZXQgZW52ID0ge307XG4gICAgICAgIGVudkZpbGVzLmZvckVhY2goKGVudkZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmICh1dGlsXzEuZGVmYXVsdC5wYXJzZUVudiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgKDAsIHRocm93RXJyb3JfMS5kZWZhdWx0KShcInV0aWwucGFyc2VFbnYgaXMgbm90IGEgZnVuY3Rpb246IHBsZWFzZSB1cGdyYWRlIHRvIE5vZGUuanMgdjIwLjEyLjAgb3IgbGF0ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGVudiA9IHsgLi4uZW52LCAuLi51dGlsXzEuZGVmYXVsdC5wYXJzZUVudigoMCwgZnNfMS5yZWFkRmlsZVN5bmMpKGVudkZpbGUsIFwidXRmOFwiKSkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAoMCwgdGhyb3dFcnJvcl8xLmRlZmF1bHQpKGBlbnYgZmlsZSBub3QgZm91bmQ6IG5vIHN1Y2ggZmlsZSwgb3BlbiAnJHtlbnZGaWxlfSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh1c2VyRW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgIGVudiA9IHsgLi4uZW52LCAuLi5wcm9jZXNzLmVudiB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnY7XG4gICAgfSkoKTtcbiAgICBpZiAoZW52U2NoZW1hRmlsZUpTT04udHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAoMCwgdGhyb3dFcnJvcl8xLmRlZmF1bHQpKCdzY2hlbWEgaXMgaW52YWxpZDogZGF0YS90eXBlIG11c3QgYmUgXCJvYmplY3RcIicpO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKGVudlNjaGVtYUZpbGVKU09OLnByb3BlcnRpZXMgPz8gXCJcIikuY29uc3RydWN0b3IgIT09XG4gICAgICAgIE9iamVjdCkge1xuICAgICAgICAoMCwgdGhyb3dFcnJvcl8xLmRlZmF1bHQpKFwic2NoZW1hIGlzIGludmFsaWQ6IGRhdGEvcHJvcGVydGllcyBtdXN0IGJlIG9iamVjdFwiKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoT2JqZWN0LmdldFByb3RvdHlwZU9mKGVudlNjaGVtYUZpbGVKU09OLnJlcXVpcmVkID8/IFtdKSkgPT09XG4gICAgICAgIGZhbHNlKSB7XG4gICAgICAgICgwLCB0aHJvd0Vycm9yXzEuZGVmYXVsdCkoXCJzY2hlbWEgaXMgaW52YWxpZDogZGF0YS9yZXF1aXJlZCBtdXN0IGJlIGFycmF5XCIpO1xuICAgIH1cbiAgICAoZW52U2NoZW1hRmlsZUpTT04ucmVxdWlyZWQgPz8gW10pLmZvckVhY2goKHByb3BlcnR5LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAoMCwgdGhyb3dFcnJvcl8xLmRlZmF1bHQpKGBzY2hlbWEgaXMgaW52YWxpZDogZGF0YS9yZXF1aXJlZC8ke2luZGV4fSBtdXN0IGJlIHN0cmluZ2ApO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcGFyc2VkRW52ID0ge307XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgT2JqZWN0LmtleXMoZW52U2NoZW1hRmlsZUpTT04ucHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlbnZTY2hlbWFGaWxlSlNPTi5wcm9wZXJ0aWVzW3Byb3BlcnR5XS50eXBlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IGVudltwcm9wZXJ0eV1cbiAgICAgICAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShlbnZbcHJvcGVydHldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52W3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eVNjaGVtYSA9IHtcbiAgICAgICAgICAgIHR5cGU6IGVudlNjaGVtYUZpbGVKU09OLnR5cGUsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgW3Byb3BlcnR5XTogZW52U2NoZW1hRmlsZUpTT04ucHJvcGVydGllc1twcm9wZXJ0eV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IChlbnZTY2hlbWFGaWxlSlNPTi5yZXF1aXJlZCA/PyBbXSkuaW5jbHVkZXMocHJvcGVydHkpXG4gICAgICAgICAgICAgICAgPyBbcHJvcGVydHldXG4gICAgICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhanYudmFsaWRhdGUocHJvcGVydHlTY2hlbWEsIHsgW3Byb3BlcnR5XTogdmFsdWUgfSkpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRFbnZbcHJvcGVydHldID0gKDAsIHNlcmlhbGl6ZV9qYXZhc2NyaXB0XzEuZGVmYXVsdCkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goXCJlbnYgaXMgaW52YWxpZDogXCIgKyBKU09OLnN0cmluZ2lmeShhanYuZXJyb3JzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChTdHJpbmcoZXJyb3IpLnJlcGxhY2UoXCJFcnJvcjogXCIsIFwiXCIpKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICgwLCB0aHJvd0Vycm9yXzEuZGVmYXVsdCkoLi4uZXJyb3JzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZEVudjtcbn07XG5jb25zdCBjb252ZXJ0RW52VG9EYXRhID0gKGVudikgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhlbnYpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBba2V5XTogSlNPTi5wYXJzZSh2YWx1ZSkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrZXldOiBcIlwiIH0pO1xuICAgICAgICB9XG4gICAgfSwge30pO1xufTtcbmNvbnN0IHNlcmlhbGl6ZUxlYWZOb2RlcyA9IChlbnYpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnYpKSB7XG4gICAgICAgIHJldHVybiBlbnYubWFwKCh2YWx1ZSkgPT4gc2VyaWFsaXplTGVhZk5vZGVzKHZhbHVlKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBlbnYgPT09IFwib2JqZWN0XCIgJiYgZW52ICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhlbnYpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrZXldOiBzZXJpYWxpemVMZWFmTm9kZXModmFsdWUpIH0pLCB7fSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGVudiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyAoMCwgc2VyaWFsaXplX2phdmFzY3JpcHRfMS5kZWZhdWx0KShlbnYpLnNsaWNlKDEsIC0xKVxuICAgICAgICAgICAgOiAoMCwgc2VyaWFsaXplX2phdmFzY3JpcHRfMS5kZWZhdWx0KShlbnYpO1xuICAgIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJhanYtZm9ybWF0c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzZXJpYWxpemUtamF2YXNjcmlwdFwiKTsiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHRocm93RXJyb3IgPSAoLi4ubWVzc2FnZXMpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXMuam9pbihcIlxcblwiKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtAcnVudGltZS1lbnYvY2xpXVxcbiR7bWVzc2FnZVxuICAgICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgICAubWFwKChtZXNzYWdlKSA9PiBcIiAgXCIgKyBtZXNzYWdlKVxuICAgICAgICAgICAgLmpvaW4oXCJcXG5cIil9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbn07XG5leHBvcnRzLmRlZmF1bHQgPSB0aHJvd0Vycm9yO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBqc29uX3NjaGVtYV8xID0gcmVxdWlyZShcIi4uL2NyZWF0ZS1nZW5lcmF0b3IvanNvbi1zY2hlbWFcIik7XG5jb25zdCBhY3QgPSBhc3luYyAoeyBnbG9iYWxWYXJpYWJsZU5hbWUsIHNjaGVtYUZpbGUgfSkgPT4ge1xuICAgIGNvbnN0IGdlbmVyYXRvciA9IGF3YWl0ICgwLCBqc29uX3NjaGVtYV8xLmNyZWF0ZUdlbmVyYXRvckZvckpTT05TY2hlbWEpKHtcbiAgICAgICAgZW52RmlsZXM6IFtdLFxuICAgICAgICBzY2hlbWFGaWxlLFxuICAgICAgICBnbG9iYWxWYXJpYWJsZU5hbWUsXG4gICAgICAgIHVzZXJFbnZpcm9ubWVudDogZmFsc2UsXG4gICAgfSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZ2VuZXJhdG9yLmdlbmVyYXRlVHMoKTtcbiAgICByZXR1cm4geyBvdXRwdXQgfTtcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBhY3Q7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJhanZcIik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBqc29uX3NjaGVtYV8xID0gcmVxdWlyZShcIi4uL2NyZWF0ZS1nZW5lcmF0b3IvanNvbi1zY2hlbWFcIik7XG5jb25zdCBhY3QgPSBhc3luYyAoeyBlbnZGaWxlcywgc2NoZW1hRmlsZSwgZ2xvYmFsVmFyaWFibGVOYW1lLCBpbnB1dCwgfSkgPT4ge1xuICAgIGNvbnN0IGdlbmVyYXRvciA9IGF3YWl0ICgwLCBqc29uX3NjaGVtYV8xLmNyZWF0ZUdlbmVyYXRvckZvckpTT05TY2hlbWEpKHtcbiAgICAgICAgZW52RmlsZXMsXG4gICAgICAgIHNjaGVtYUZpbGUsXG4gICAgICAgIGdsb2JhbFZhcmlhYmxlTmFtZSxcbiAgICAgICAgdXNlckVudmlyb25tZW50OiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGdlbmVyYXRvci5pbnRlcnBvbGF0ZShpbnB1dCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3V0cHV0LFxuICAgIH07XG59O1xuZXhwb3J0cy5kZWZhdWx0ID0gYWN0O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImpzb24tc2NoZW1hLXRvLXR5cGVzY3JpcHRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29tbWFuZGVyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTMpO1xuIl0sIm5hbWVzIjpbIl9faW1wb3J0RGVmYXVsdCIsInRoaXMiLCJtb2QiLCJfX2VzTW9kdWxlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJleHBvcnRzIiwidmFsdWUiLCJjb21tYW5kZXJfMSIsImFjdF8xIiwiZnNfMSIsIkNvbW1hbmQiLCJkZXNjcmlwdGlvbiIsIm9wdGlvbiIsImFjdGlvbiIsImFzeW5jIiwib3V0cHV0RmlsZSIsImVudkZpbGUiLCJnbG9iYWxWYXJpYWJsZU5hbWUiLCJzY2hlbWFGaWxlIiwid2F0Y2giLCJwcm9ncmFtIiwib3B0cyIsInJ1biIsIm91dHB1dCIsImRlZmF1bHQiLCJlbnZGaWxlcyIsIndyaXRlRmlsZVN5bmMiLCJjb25zb2xlIiwibG9nIiwib24iLCJtb2R1bGUiLCJyZXF1aXJlIiwianNvbl9zY2hlbWFfMSIsImdlbmVyYXRvciIsImNyZWF0ZUdlbmVyYXRvckZvckpTT05TY2hlbWEiLCJ1c2VyRW52aXJvbm1lbnQiLCJnZW5lcmF0ZUpzIiwidGhyb3dFcnJvcl8xIiwiYWxsb3dFeGNlc3NBcmd1bWVudHMiLCJpbnB1dEZpbGUiLCJhcmdzIiwiaW5wdXQiLCJyZWFkRmlsZVN5bmMiLCJlcnJvciIsInBhY2thZ2VfanNvbl8xIiwiY29tbWFuZF8xIiwiY29tbWFuZF8yIiwiY29tbWFuZF8zIiwidmVyc2lvbiIsImFkZENvbW1hbmQiLCJwYXJzZSIsInNlcmlhbGl6ZV9qYXZhc2NyaXB0XzEiLCJhanZfMSIsImFqdl9mb3JtYXRzXzEiLCJ1dGlsXzEiLCJqc29uX3NjaGVtYV90b190eXBlc2NyaXB0XzEiLCJsb2Rhc2hfMSIsImludGVycG9sYXRlIiwicGFyc2VkRW52IiwicGFyc2VFbnYiLCJkYXRhIiwiY29udmVydEVudlRvRGF0YSIsInNlcmlhbGl6ZWREYXRhIiwic2VyaWFsaXplTGVhZk5vZGVzIiwidGVtcGxhdGUiLCJ2YXJpYWJsZSIsImVudHJpZXMiLCJtYXAiLCJrZXkiLCJqb2luIiwiZ2VuZXJhdGVUcyIsImVudlNjaGVtYUZpbGVDb250ZW50IiwiZW52U2NoZW1hRmlsZUpTT04iLCJKU09OIiwicmVzdWx0IiwiY29tcGlsZSIsImJhbm5lckNvbW1lbnQiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImNhcGl0YWxDYXNlR2xvYmFsVmFyaWFibGVOYW1lIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInJlcGxhY2UiLCJ0cmltIiwiYWp2IiwiYWxsRXJyb3JzIiwic3RyaWN0IiwiY29lcmNlVHlwZXMiLCJlbnYiLCJmb3JFYWNoIiwidW5kZWZpbmVkIiwicHJvY2VzcyIsInR5cGUiLCJnZXRQcm90b3R5cGVPZiIsInByb3BlcnRpZXMiLCJjb25zdHJ1Y3RvciIsIkFycmF5IiwiaXNBcnJheSIsInJlcXVpcmVkIiwicHJvcGVydHkiLCJpbmRleCIsImVycm9ycyIsImtleXMiLCJwcm9wZXJ0eVNjaGVtYSIsImluY2x1ZGVzIiwidmFsaWRhdGUiLCJwdXNoIiwic3RyaW5naWZ5IiwiU3RyaW5nIiwibGVuZ3RoIiwicmVkdWNlIiwiYWNjIiwiYXNzaWduIiwibWVzc2FnZXMiLCJtZXNzYWdlIiwic3BsaXQiLCJleGl0IiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsImNhbGwiXSwic291cmNlUm9vdCI6IiJ9