drizzle-kit 0.9.12 → 0.9.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/drizzle.js +2248 -2
  2. package/index.js +234922 -0
  3. package/package.json +5 -5
  4. package/drizzle.js.map +0 -1
package/drizzle.js CHANGED
@@ -1,4 +1,2250 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- (()=>{"use strict";var __webpack_modules__={194:(e,t,a)=>{a.r(t),a.d(t,{diffForRenamed:()=>l,differ:()=>r});const n=require("json-diff");function l(e){return e.map((e=>{const t=e.from||e.old,a=e.to||e.new;return[{...t,name:a.name},a]})).map((e=>{const t=(0,n.diff)(e[0],e[1]);return t.name=e[0].name,o(t)}))}function r(e,t){const a=(0,n.diff)(e,t);a.tables=a.tables?a.tables:{},a.enums=a.enums?a.enums:{};const l=Object.entries(a.tables),r=l.filter((e=>e[0].includes("__added"))).map((e=>e[1])).map((e=>({...e,indexes:Object.entries(e.indexes).map((e=>{const t=e[1],a=t.name,n=Object.values(t.columns).map((e=>e.name));return{name:a,columns:n}}))}))),d=l.filter((e=>e[0].includes("__deleted"))).map((e=>e[1])),u=Object.entries(a.enums),s=u.filter((e=>e[0].includes("__added"))).map((e=>e[1])).map((e=>{const t=Object.entries(e.values).map((e=>e[1]));return{name:e.name,values:t}})),i=u.filter((e=>e[0].includes("__deleted"))).map((e=>e[1])).map((e=>{const t=Object.entries(e.values).map((e=>e[1]));return{name:e.name,values:t}})),c=u.filter((e=>!(e[0].includes("__added")||e[0].includes("__deleted")))).map((e=>{const t=e[1].values,a=Object.entries(t).filter((e=>e[0].includes("__added"))).map((e=>e[1])),n=Object.entries(t).filter((e=>e[0].includes("__deleted"))).map((e=>e[1]));return{name:e[0],addedValues:a,deletedValues:n}}));return{addedTables:r,deletedTables:d,alteredTablesWithColumns:Object.keys(a.tables).filter((e=>!(e.includes("__added")||e.includes("__deleted")))).map((e=>({name:e,...a.tables[e]}))).map((e=>o(e))),addedEnums:s,deletedEnums:i,alteredEnums:c}}const o=e=>{const t=e.columns,a=Object.keys(t).filter((e=>e.includes("__added"))).map((e=>({...t[e]}))),n=Object.keys(t).filter((e=>e.includes("__deleted"))).map((e=>({...t[e]}))),l=Object.keys(t).filter((e=>!(e.includes("__deleted")||e.includes("__added")))).map((e=>({name:e,...t[e]}))),r=Object.values(e.indexes__deleted||{}).map((e=>({name:e.name,columns:Object.values(e.columns).map((e=>e.name))}))).concat(Object.keys(e.indexes||{}).filter((e=>e.includes("__deleted"))).map((t=>{const a=e.indexes[t],n=a.name,l=Object.values(a.columns).map((e=>e.name));return{name:n,columns:l}}))),o=Object.values(e.indexes__added||{}).map((e=>({name:e.name,columns:Object.values(e.columns).map((e=>e.name))}))).concat(Object.keys(e.indexes||{}).filter((e=>e.includes("__added"))).map((t=>{const a=e.indexes[t],n=a.name,l=Object.values(a.columns).map((e=>e.name));return{name:n,columns:l}})));return{name:e.name,deleted:n,added:a,altered:l,addedIndexes:o,deletedIndexes:r}}},845:(e,t,a)=>{a.r(t),a.d(t,{Types:()=>n,prepareCreateTableJson:()=>l,prepareDropTableJson:()=>r,prepareRenameTableJson:()=>o,prepareCreateEnumJson:()=>d,prepareAddValuesToEnumJson:()=>u,prepareAlterTableColumnsJson:()=>s,prepareCreateIndexesJson:()=>f,prepareDropIndexesJson:()=>p});class n{static createTable="create_table";static dropTable="drop_table";static renameTable="rename_table";static alterTableDropColumn="alter_table_drop_column";static alterTableAddColumn="alter_table_add_column";static alterTableAlterColumnSetType="alter_table_alter_column_set_type";static alterTableAlterColumnSetDefault="alter_table_alter_column_set_default";static alterTableAlterColumnDropDefault="alter_table_alter_column_drop_default";static alterTableAlterColumnSetNotNull="alter_table_alter_column_set_notnull";static alterTableAlterColumnDropNotNull="alter_table_alter_column_drop_notnull";static createIndex="create_index";static dropIndex="drop_index";static createTypeEnum="create_type_enum";static alterTypeAddValue="alter_type_add_value"}const l=e=>{const{name:t,columns:a}=e,l=Object.keys(a).map((e=>({...a[e]})));return{type:n.createTable,tableName:t,columns:l}},r=e=>({type:n.dropTable,tableName:e.name}),o=(e,t)=>({type:n.renameTable,from:e.name,to:t.name}),d=(e,t)=>({type:n.createTypeEnum,enumName:e,values:t}),u=(e,t)=>t.map((t=>({type:n.alterTypeAddValue,enumName:e,enumValue:t}))),s=e=>{const t=e.name,a=[],n=i(t,e.deleted),l=c(t,e.created),r=m(t,e.altered);return a.push(...n),a.push(...l),a.push(...r),a},i=(e,t)=>t.map((t=>({type:n.alterTableDropColumn,tableName:e,columnName:t.name}))),c=(e,t)=>t.map((t=>({type:n.alterTableAddColumn,tableName:e,column:t}))),m=(e,t)=>{let a=[];for(const l of t){const t=l.name;if(l.type){const{__new:r}=l.type;a.push({type:n.alterTableAlterColumnSetType,tableName:e,columnName:t,newDataType:r})}if(l.defaultValue||l.defaultValue__added){const r=l.defaultValue.__new|l.defaultValue__added;a.push({type:n.alterTableAlterColumnSetDefault,tableName:e,columnName:t,newDefault:r})}l.defaultValue__deleted&&a.push({type:n.alterTableAlterColumnDropDefault,tableName:e,columnName:t}),(l.notNull__added||l.notNull&&l.notNull.__new)&&a.push({type:n.alterTableAlterColumnSetNotNull,tableName:e,columnName:t}),(l.notNull__deleted||l.notNull&&!l.notNull.__new)&&a.push({type:n.alterTableAlterColumnDropNotNull,tableName:e,columnName:t})}return a},f=(e,t)=>t.map((t=>({type:n.createIndex,tableName:e,indexName:t.name,indexValue:t.columns.join(", ")}))),p=(e,t)=>t.map((t=>({type:n.dropIndex,tableName:e,indexName:t.name})))},373:(e,t,a)=>{a.r(t),a.d(t,{fromJson:()=>o,prepareDeleteColumns:()=>d,prepareCreateColumns:()=>u,prepareAlterColumns:()=>s,prepareCreateTable:()=>i,prepareCreateIndex:()=>c,prepareDropIndex:()=>m,prepareRenameTable:()=>f,prepareDropTable:()=>p,prepareCreateEnum:()=>_,prepareAddValuesToEnum:()=>b});var n=a(845);class l{constructor(e){this.type=e}can(e){return this.type===e}convert(e){throw Error("override the convert mothod")}}const r=[];r.push(new class extends l{constructor(){super(n.Types.createTable)}convert(e){const{tableName:t,columns:a}=e,n=Object.keys(a).map((e=>({...a[e]})));let l="";l+=`CREATE TABLE ${t} (\n`;for(const e of n){const t=e.primaryKey?"PRIMARY KEY":"",a=e.notNull?"NOT NULL":"",n=e.defaultValue?`DEFAULT '${e.defaultValue}'`:"";l+="\t"+`${e.name} ${e.type} ${t} ${n} ${a}`.replace(/ +/g," ").trim()+",\n"}return l+=");",l}}),r.push(new class extends l{constructor(){super(n.Types.createTypeEnum)}convert(e){const{enumName:t,values:a}=e;let n="(";return n+=a.map((e=>`'${e}'`)).join(", "),n+=")",`CREATE TYPE ${t} AS ENUM${n};`}}),r.push(new class extends l{constructor(){super(n.Types.dropTable)}convert(e){const{tableName:t}=e;return`DROP TABLE ${t}`}}),r.push(new class extends l{constructor(){super(n.Types.renameTable)}convert(e){const{from:t,to:a}=e;return`ALTER TABLE ${t} RENAME TO ${a}`}}),r.push(new class extends l{constructor(){super(n.Types.alterTableDropColumn)}convert(e){const{tableName:t,columnName:a}=e;return`ALTER TABLE ${t} DROP COLUMN IF EXISTS ${a};`}}),r.push(new class extends l{constructor(){super(n.Types.alterTableAddColumn)}convert(e){const{tableName:t,column:a}=e,{name:n,type:l,defaultValue:r,notNull:o}=a;return`ALTER TABLE ${t} ADD COLUMN ${n} ${l}${r?` DEFAULT ${r}`:""}${o?" NOT NULL":""}`.trim()+";"}}),r.push(new class extends l{constructor(){super(n.Types.alterTableAlterColumnSetType)}convert(e){const{tableName:t,columnName:a,newDataType:n}=e;return`ALTER TABLE ${t} ALTER COLUMN ${a} SET DATA TYPE ${n};`}}),r.push(new class extends l{constructor(){super(n.Types.createIndex)}convert(e){const{tableName:t,indexName:a,indexValue:n}=e;return`CREATE INDEX ${a} ON ${t} (${n});`}}),r.push(new class extends l{constructor(){super(n.Types.dropIndex)}convert(e){const{indexName:t}=e;return`DROP INDEX IF EXISTS ${t};`}}),r.push(new class extends l{constructor(){super(n.Types.alterTypeAddValue)}convert(e){const{enumName:t,enumValue:a}=e;return`ALTER TYPE ${t} ADD VALUE ${a};`}}),r.push(new class extends l{constructor(){super(n.Types.alterTableAlterColumnSetNotNull)}convert(e){const{tableName:t,columnName:a}=e;return`ALTER TABLE ${t} ALTER COLUMN ${a} SET NOT NULL;`}}),r.push(new class extends l{constructor(){super(n.Types.alterTableAlterColumnDropNotNull)}convert(e){const{tableName:t,columnName:a}=e;return`ALTER TABLE ${t} ALTER COLUMN ${a} DROP NOT NULL;`}});const o=e=>e.map((e=>{const t=r.filter((t=>t.can(e.type))),a=1===t.length?t[0]:void 0;return a?a.convert(e):(console.log("no convertor:",e.type),"dry run")})),d=(e,t)=>{let a="";for(const n of t)a+=`ALTER TABLE ${e} DROP COLUMN IF EXISTS ${n.name};`,a+="\n";return a.trim()},u=(e,t)=>{let a="";for(const n of t){const{name:t,type:l,defaultValue:r,notNull:o}=n;a+=`ALTER TABLE ${e} ADD COLUMN ${t} ${l} ${r?`DEFAULT ${r}`:""} ${o?"NOT NULL":""}`.trim()+";",a+="\n"}return a.trim()},s=(e,t)=>{let a="";for(const n of t){const{name:t}=n;if(n.type){const{__new:l}=n.type;a+=`ALTER TABLE ${e} ALTER COLUMN ${t} SET DATA TYPE ${l};`,a+="\n"}if(n.defaultValue){const{__new:l}=n.defaultValue;a+=`ALTER TABLE ${e} ALTER COLUMN ${t} SET DEFAULT ${l};`,a+="\n"}if(n.defaultValue__added&&(a+=`ALTER TABLE ${e} ALTER COLUMN ${t} SET DEFAULT ${n.defaultValue__added};`,a+="\n"),n.defaultValue__deleted&&(a+=`ALTER TABLE ${e} ALTER COLUMN ${t} DROP DEFAULT;`,a+="\n"),n.notNull){const{__new:l}=n.notNull;a+=`ALTER TABLE ${e} ALTER COLUMN ${t} ${l?"SET NOT NULL":"DROP NOT NULL"};`,a+="\n"}n.notNull__added&&(a+=`ALTER TABLE ${e} ALTER COLUMN ${t} SET NOT NULL;`,a+="\n"),n.notNull__deleted&&(a+=`ALTER TABLE ${e} ALTER COLUMN ${t} DROP NOT NULL;`,a+="\n")}return a.trim()},i=e=>{const{name:t,columns:a}=e,n=Object.keys(a).map((e=>({...a[e]})));let l="";l+=`CREATE TABLE ${t} (\n`;for(const e of n){const t=e.primaryKey?"PRIMARY KEY":"",a=e.notNull?"NOT NULL":"",n=e.defaultValue?`DEFAULT '${e.defaultValue}'`:"";l+="\t"+`${e.name} ${e.type} ${t} ${n} ${a}`.replace(/ +/g," ").trim()+",\n"}return l+=");",l},c=(e,t)=>{let a="";for(const n of t){const{name:t,columns:l}=n;a+=`CREATE INDEX ${t} ON ${e} (${l.join(", ")});`,a+="\n"}return a.trim()},m=(e,t)=>{let a="";for(const e of t){const{name:t}=e;a+=`DROP INDEX IF EXISTS ${t};`,a+="\n"}return a.trim()},f=(e,t)=>`ALTER TABLE ${e.name} RENAME TO ${t.name}`,p=e=>{const{name:t}=e;return`DROP TABLE ${t}`},_=(e,t)=>{let a="(";return a+=Object.values(t).map((e=>`'${e}'`)).join(", "),a+=")",`CREATE TYPE ${e} AS ENUM${a};`},b=(e,t)=>{let a="";for(const n in t)a+=`ALTER TYPE ${e} ADD VALUE ${t[n]};`,a+="\n";return a.trim()}},512: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 l=a(304),r=n(a(492));l.program.command("migrate").alias("mg").description("Migration").action(r.default).command("start").description("Start migration").action(r.default)},492:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),l=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return l(t,e),t},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const d=a(282),u=o(a(147)),s=o(a(793)),i=r(a(194)),c=o(a(572)),m=a(845),f=a(373);t.default=async()=>{const e=s.default.load(u.default.readFileSync("drizzle.config.yml",{encoding:"utf-8"})),t=e.migrationRootFolder||"drizzle",a=e.dataFolder,{prev:n,cur:l}=await d.task("preparing data schema json snapshot",(async({setTitle:e})=>c.default(t,a))),r=await d.task("preparing schemas diff",(async({setTitle:e})=>i.differ(n,l))),{created:o,renamed:p,deleted:_}=await d.promptTablesConflicts({newTables:r.addedTables,missingTables:r.deletedTables}),b=[],E=o.map((e=>m.prepareCreateTableJson(e))),T=o.map((e=>m.prepareCreateIndexesJson(e.name,e.indexes))).flat(),y=_.map((e=>m.prepareDropTableJson(e))),v=p.map((e=>m.prepareRenameTableJson(e.old,e.new))),N=i.diffForRenamed(p),h=r.alteredTablesWithColumns.concat(N),I=[];for(const e of h){const t=await d.promptColumnsConflicts(e),{deleted:a,added:n,...l}=e;I.push({...l,...t})}const g=I.map((e=>m.prepareAlterTableColumnsJson(e))).flat(),C=I.map((e=>m.prepareCreateIndexesJson(e.name,e.addedIndexes||{}))).flat(),x=I.map((e=>m.prepareDropIndexesJson(e.name,e.deletedIndexes||{}))).flat(),A=r.addedEnums.map((e=>m.prepareCreateEnumJson(e.name,e.values))),O=r.alteredEnums.map((e=>m.prepareAddValuesToEnumJson(e.name,e.addedValues))).flat();b.push(...A),b.push(...O),b.push(...E),b.push(...T),b.push(...y),b.push(...v),b.push(...g),b.push(...C),b.push(...x);const D=f.fromJson(b);console.log(D.join("\n"));const w=(new Date).toISOString(),L=`./${t}/${w}`;u.default.mkdirSync(L),u.default.writeFileSync(`${L}/snapshot.json`,JSON.stringify(l,null,2)),u.default.writeFileSync(`${L}/migration.sql`,D.join("\n"))}},560: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 l=n(a(689)),r=a(259);t.default=({componentsList:e})=>(r.useSnapshot(e),l.default.createElement(l.default.Fragment,null,e.map(((e,t)=>({...e,key:t})))))},613: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 l=a(82),r=n(a(689)),o=n(a(560));t.default=e=>{const t=l.render(r.default.createElement(o.default,{componentsList:e}));return{remove(){t.rerender(null),t.unmount(),t.clear(),t.cleanup()}}}},243:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),l=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return l(t,e),t},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const d=o(a(689)),u=a(82),s=o(a(138)),i=r(a(164)),c=a(456),m=o(a(454)),f=a(313),p=o(a(234));t.default=({onDone:e,tableWithColumns:t})=>{const[a,n]=c.useMachine(p.default({tableWithColumns:t})),{tableName:l,addedColumns:r,deletedColumns:o,missingItemIndex:_,created:b,renamed:E,deleted:T}=a.context,y=e=>{n({type:"CHOICE_ITEM",itemIndex:e.value})},v=e=>{n({type:"CHOICE_NEW_ITEM",itemIndex:e.value})},N=e=>{n({type:e.value})},h=e=>{n({type:e.value})},I=()=>{if(a.matches("table"))return d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Box,{display:"flex",flexDirection:"column"},d.default.createElement(u.Box,{display:"flex"},d.default.createElement(u.Box,{flexDirection:"column"},d.default.createElement(i.Header,null,`Table "${l}" missing columns:`),d.default.createElement(s.default,{items:o.map(((e,t)=>({key:String(t),label:e.name,value:t}))),onSelect:y})),!!r?.length&&d.default.createElement(u.Box,{flexDirection:"column",paddingLeft:5},d.default.createElement(i.Header,null,"New tables:"),d.default.createElement(u.Box,{display:"flex",flexDirection:"column"},r.map((({name:e},t)=>d.default.createElement(u.Text,{key:e+t},e))))))));if(a.matches("action.actionChoice")){const e=r.length?f.actions:f.actions.filter((({value:e})=>e!==f.Action.RENAME));return d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,`${o[_]?.name} is:`),d.default.createElement(s.default,{items:e,onSelect:N}))}return a.matches("confirmationDelete")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,"!!! Data in table will be lost !!!"),d.default.createElement(u.Text,null,"Are you sure?"),d.default.createElement(s.default,{items:f.confirmations,onSelect:h})):a.matches("confirmationRename")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,"Are you sure?"),d.default.createElement(s.default,{items:f.confirmations,onSelect:h})):a.matches("action.rename")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,`${o[_]?.name} was renamed to:`),d.default.createElement(s.default,{items:r.map(((e,t)=>({key:String(t),label:e.name,value:t}))),onSelect:v})):(a.matches("done")&&e({created:b,renamed:E,deleted:T}),d.default.createElement(d.default.Fragment,null))};return T.length||E.length||b.length?d.default.createElement(u.Box,{flexDirection:"column",margin:1},d.default.createElement(u.Box,{flexDirection:"column",marginBottom:0},d.default.createElement(i.Header,null,`${l} columns:`),d.default.createElement(i.default,{data:m.default([{title:"Deleted",values:T},{title:"Renamed",values:E},{title:"Created",values:b}])})),I()):I()}},60:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),l=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return l(t,e),t},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const d=o(a(689)),u=a(82),s=o(a(138)),i=r(a(164)),c=a(456),m=o(a(761)),f=o(a(454)),p=a(313);t.default=({onDone:e,newTables:t,missingTables:a})=>{const[n,l]=c.useMachine(m.default({missingTables:a,newTables:t})),{missingItemIndex:r,newTables:o,missingTables:_,createdTables:b,renamedTables:E,deletedTables:T}=n.context,y=e=>{l({type:"CHOICE_ITEM",itemIndex:e.value})},v=e=>{l({type:"CHOICE_NEW_ITEM",itemIndex:e.value})},N=e=>{l({type:e.value})},h=e=>{l({type:e.value})},I=()=>{if(n.matches("table"))return d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Box,{display:"flex",flexDirection:"column"},d.default.createElement(u.Box,{display:"flex"},d.default.createElement(u.Box,{flexDirection:"column"},d.default.createElement(i.Header,null,"Missing tables:"),d.default.createElement(s.default,{items:_.map(((e,t)=>({key:String(t),label:e.name,value:t}))),onSelect:y})),!!o?.length&&d.default.createElement(u.Box,{flexDirection:"column",paddingLeft:5},d.default.createElement(i.Header,null,"New tables:"),d.default.createElement(u.Box,{display:"flex",flexDirection:"column"},o.map((({name:e},t)=>d.default.createElement(u.Text,{key:e+t},e))))))));if(n.matches("action.actionChoice")){const e=o.length?p.actions:p.actions.filter((({value:e})=>e!==p.Action.RENAME));return d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,`${_[r]?.name} is:`),d.default.createElement(s.default,{items:e,onSelect:N}))}return n.matches("confirmationDelete")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,"!!! Data in table will be lost !!!"),d.default.createElement(u.Text,null,"Are you sure?"),d.default.createElement(s.default,{items:p.confirmations,onSelect:h})):n.matches("confirmationRename")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,"Are you sure?"),d.default.createElement(s.default,{items:p.confirmations,onSelect:h})):n.matches("action.rename")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,`${_[r]?.name} was renamed to:`),d.default.createElement(s.default,{items:o.map(((e,t)=>({key:String(t),label:e.name,value:t}))),onSelect:v})):(n.matches("done")&&e({created:b,renamed:E,deleted:T}),d.default.createElement(d.default.Fragment,null))};return T.length||E.length||b.length?d.default.createElement(u.Box,{flexDirection:"column",margin:1},d.default.createElement(u.Box,{flexDirection:"column",marginBottom:0},d.default.createElement(i.Header,null,"Tables: "),d.default.createElement(i.default,{data:f.default([{title:"Deleted",values:T},{title:"Renamed",values:E},{title:"Created",values:b}])})),I()):I()}},808:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),l=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return l(t,e),t},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const d=r(a(689)),u=a(82),s=o(a(618));var i;!function(e){e[e.IN_PROGRESS=0]="IN_PROGRESS",e[e.SUCCESS=1]="SUCCESS",e[e.FAIL=2]="FAIL"}(i||(i={})),t.default=e=>{const{func:t,onDone:a,titleStr:n}=e,[l,r]=d.useState(n),[o,c]=d.useState(i.IN_PROGRESS),[m,f]=d.useState(null);return d.useEffect((()=>{(async()=>{try{const e=await t({setTitle:r,setError:f});c(i.SUCCESS),a(e)}catch(e){f(e),c(i.FAIL)}})()}),[]),d.default.createElement(u.Box,{flexDirection:"row"},d.default.createElement(u.Box,{marginRight:1},o===i.IN_PROGRESS?d.default.createElement(u.Text,null,"[",d.default.createElement(s.default,{type:"dots"}),"]"):o===i.SUCCESS?d.default.createElement(u.Text,null,"[",d.default.createElement(u.Text,{color:"green"},"✓"),"]"):d.default.createElement(u.Text,null,"[",d.default.createElement(u.Text,{color:"red"},"×"),"]"),o===i.FAIL?d.default.createElement(u.Text,null,l,d.default.createElement(u.Newline,null),d.default.createElement(u.Text,{color:"red"},m.message)):d.default.createElement(d.default.Fragment,null,d.default.createElement(u.Text,null,l))))}},282: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.promptColumnsConflicts=t.promptTablesConflicts=t.task=void 0;const l=n(a(689)),r=a(259),o=n(a(808)),d=n(a(613)),u=n(a(60)),s=n(a(243)),i=r.proxy([]);let c;const m=()=>{c||(c=d.default(i),i.length=0)};t.task=(e,t)=>new Promise((a=>{m(),i.push(l.default.createElement(o.default,{titleStr:e,func:t,onDone:e=>a(e)}))})),t.promptTablesConflicts=({missingTables:e,newTables:t})=>new Promise((a=>{m(),i.push(l.default.createElement(u.default,{onDone:e=>a(e),missingTables:e,newTables:t}))})),t.promptColumnsConflicts=e=>new Promise((t=>{m(),i.push(l.default.createElement(s.default,{onDone:e=>t(e),tableWithColumns:e}))}))},234:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(522);t.default=e=>n.createMachine({id:"resolveColumns",initial:"table",context:{tableName:e.tableWithColumns.name,addedColumns:e.tableWithColumns.added,deletedColumns:e.tableWithColumns.deleted,missingItemIndex:0,newItemIndex:0,created:[],renamed:[],deleted:[]},states:{table:{entry:n.send({type:"NEXT"}),on:{NEXT:[{target:"done",cond:"isMissingColumnsResolved",actions:["resolveRemaining"]},{target:"done",cond:"isNewColumnsResolved",actions:["resolveMissing"]}],CHOICE_ITEM:{target:"action",actions:["choseItem"]}}},action:{initial:"actionChoice",states:{actionChoice:{on:{DELETE:"#resolveColumns.confirmationDelete",RENAME:"rename"}},rename:{on:{CHOICE_NEW_ITEM:{target:"#resolveColumns.confirmationRename",actions:["choseNewItem"]}}}}},confirmationDelete:{on:{CANCEL:"action.actionChoice",CONFIRM:[{target:"final",actions:["delete"]}]}},confirmationRename:{on:{CANCEL:"action.actionChoice",CONFIRM:[{target:"final",actions:["rename"]}]}},final:{entry:n.send({type:"NEXT"}),on:{NEXT:[{target:"done",cond:"isMissingColumnsResolved",actions:["resolveRemaining"]},{target:"table"}]}},done:{}}},{guards:{isMissingColumnsResolved:({deletedColumns:e})=>!e.length,isNewColumnsResolved:({addedColumns:e})=>!e.length},actions:{choseItem:n.assign({missingItemIndex:(e,t)=>"CHOICE_ITEM"===t.type?t.itemIndex:0}),choseNewItem:n.assign({newItemIndex:(e,t)=>"CHOICE_NEW_ITEM"===t.type?t.itemIndex:0}),delete:n.assign({deleted:({missingItemIndex:e,deleted:t,deletedColumns:a})=>[...t,a[e]],deletedColumns:({missingItemIndex:e,deletedColumns:t})=>t.filter(((t,a)=>a!==e))}),rename:n.assign({renamed:({missingItemIndex:e,newItemIndex:t,renamed:a,addedColumns:n,deletedColumns:l})=>[...a,{old:l[e],new:n[t]}],deletedColumns:({missingItemIndex:e,deletedColumns:t})=>t.filter(((t,a)=>a!==e)),addedColumns:({newItemIndex:e,addedColumns:t})=>t.filter(((t,a)=>a!==e))}),resolveRemaining:n.assign({created:({addedColumns:e,created:t})=>[...t,...e],addedColumns:e=>[]}),resolveMissing:n.assign({deleted:({deletedColumns:e,deleted:t})=>[...t,...e],deletedColumns:e=>[]})}})},761:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(522);t.default=e=>n.createMachine({id:"resolveTables",initial:"table",context:{...e,missingItemIndex:0,newItemIndex:0,createdTables:[],renamedTables:[],deletedTables:[]},states:{table:{entry:n.send({type:"NEXT"}),on:{NEXT:[{target:"done",cond:"isMissingTablesResolved",actions:["resolveRemaining"]},{target:"done",cond:"isNewTablesResolved",actions:["resolveMissing"]}],CHOICE_ITEM:{target:"action",actions:["choseItem"]}}},action:{initial:"actionChoice",states:{actionChoice:{on:{DELETE:"#resolveTables.confirmationDelete",RENAME:"rename"}},rename:{on:{CHOICE_NEW_ITEM:{target:"#resolveTables.confirmationRename",actions:["choseNewItem"]}}}}},confirmationDelete:{on:{CANCEL:"action.actionChoice",CONFIRM:[{target:"final",actions:["delete"]}]}},confirmationRename:{on:{CANCEL:"action.actionChoice",CONFIRM:[{target:"final",actions:["rename"]}]}},final:{entry:n.send({type:"NEXT"}),on:{NEXT:[{target:"done",cond:"isMissingTablesResolved",actions:["resolveRemaining"]},{target:"table"}]}},done:{}}},{guards:{isMissingTablesResolved:({missingTables:e})=>!e.length,isNewTablesResolved:({newTables:e})=>!e.length},actions:{choseItem:n.assign({missingItemIndex:(e,t)=>"CHOICE_ITEM"===t.type?t.itemIndex:0}),choseNewItem:n.assign({newItemIndex:(e,t)=>"CHOICE_NEW_ITEM"===t.type?t.itemIndex:0}),delete:n.assign({deletedTables:({missingItemIndex:e,deletedTables:t,missingTables:a})=>[...t,a[e]],missingTables:({missingItemIndex:e,missingTables:t})=>t.filter(((t,a)=>a!==e))}),rename:n.assign({renamedTables:({missingItemIndex:e,newItemIndex:t,renamedTables:a,newTables:n,missingTables:l})=>[...a,{old:l[e],new:n[t]}],missingTables:({missingItemIndex:e,missingTables:t})=>t.filter(((t,a)=>a!==e)),newTables:({newItemIndex:e,newTables:t})=>t.filter(((t,a)=>a!==e))}),resolveRemaining:n.assign({createdTables:({newTables:e,createdTables:t})=>[...t,...e],newTables:e=>[]}),resolveMissing:n.assign({deletedTables:({missingTables:e,deletedTables:t})=>[...t,...e],missingTables:e=>[]})}})},454:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=e=>{const t=[];return t.length=e.reduce(((e,{values:t})=>e<t.length?t.length:e),0),t.fill({"":""}),t.map(((t,a)=>{const n={};return e.forEach(((t,l)=>{n[e[l].title]=t.values[a]?.old?.name?`${t.values[a]?.old?.name} -> ${t.values[a]?.new?.name}`:t.values[a]?.name||""})),n}))}},313:(e,t)=>{var a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.confirmations=t.actions=t.Confirmation=t.Action=void 0,function(e){e.RENAME="RENAME",e.DELETE="DELETE"}(a=t.Action||(t.Action={})),function(e){e.CANCEL="CANCEL",e.CONFIRM="CONFIRM"}(n=t.Confirmation||(t.Confirmation={})),t.actions=[{key:a.RENAME,label:"Renamed",value:a.RENAME},{key:a.DELETE,label:"Deleted",value:a.DELETE}],t.confirmations=[{key:n.CONFIRM,label:"Yes",value:n.CONFIRM},{key:n.CANCEL,label:"No",value:n.CANCEL}]},572: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 l=n(a(147)),r=n(a(980)),o={version:"1",tables:{},enums:{}};t.default=(e="drizzle",t)=>{const a=e;l.default.readdirSync("./").find((e=>e===a))||l.default.mkdirSync(a);const n=l.default.readdirSync(`./${a}`);let d;if(0===n.length)d=o;else{n.sort();const e=n[n.length-1];console.log(e),d=JSON.parse(l.default.readFileSync(`./${a}/${e}/snapshot.json`).toString())}const u=`${t}/tables/`,s=`${t}/types/`;return{prev:d,cur:r.default(u,s)}}},258: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 l=n(a(7)),r=n(a(147)),o=l.default.createPrinter();t.default=(e,t)=>{const a=[l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(void 0,l.default.createNamespaceImport(l.default.createIdentifier("drizzle"))),l.default.createStringLiteral("drizzle-orm")),l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(l.default.createIdentifier("MigrationSerializer"),void 0),l.default.createStringLiteral("drizzle-orm/serializer/serializer")),l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(l.default.createIdentifier("Enum"),void 0),l.default.createStringLiteral("drizzle-orm/types/type")),l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(void 0,l.default.createNamespaceImport(l.default.createIdentifier("pg"))),l.default.createStringLiteral("pg"))],n=[],d=r.default.readdirSync(e);for(let t=0;t<d.length;t++){const a=`${e}${d[t].split(".")[0]}`;n.push(l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(void 0,l.default.createNamespaceImport(l.default.createIdentifier(`i${t}`))),l.default.createStringLiteral(a)))}const u=r.default.readdirSync(t);for(let e=0;e<u.length;e++){const a=`${t}${u[e].split(".")[0]}`;n.push(l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(void 0,l.default.createNamespaceImport(l.default.createIdentifier(`t${e}`))),l.default.createStringLiteral(a)))}const s=[l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("db"),void 0,l.default.createNew(l.default.createIdentifier("drizzle.DB"),void 0,[l.default.createNew(l.default.createPropertyAccess(l.default.createIdentifier("pg"),l.default.createIdentifier("Pool")),void 0,[])]))],l.default.NodeFlags.Const)),l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("serializer"),void 0,l.default.createNew(l.default.createIdentifier("MigrationSerializer"),void 0,[]))],l.default.NodeFlags.Const))],i=[];i.push(l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("tables"),l.default.createArrayTypeNode(l.default.createTypeReferenceNode(l.default.createQualifiedName(l.default.createIdentifier("drizzle"),l.default.createIdentifier("AbstractTable")),[l.default.createKeywordTypeNode(l.default.SyntaxKind.AnyKeyword)])),l.default.createArrayLiteral([],!1))],l.default.NodeFlags.Const)));for(let e=0;e<d.length;e++){const t=[l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("table"+e),void 0,l.default.createParen(l.default.createAsExpression(l.default.createAsExpression(l.default.createNew(l.default.createPropertyAccess(l.default.createIdentifier("i"+e),l.default.createIdentifier("default")),void 0,[l.default.createIdentifier("db")]),l.default.createKeywordTypeNode(l.default.SyntaxKind.UnknownKeyword)),l.default.createTypeReferenceNode(l.default.createQualifiedName(l.default.createIdentifier("drizzle"),l.default.createIdentifier("AbstractTable")),[l.default.createKeywordTypeNode(l.default.SyntaxKind.AnyKeyword)]))))],l.default.NodeFlags.Const)),l.default.createExpressionStatement(l.default.createCall(l.default.createPropertyAccess(l.default.createIdentifier("tables"),l.default.createIdentifier("push")),void 0,[l.default.createIdentifier("table"+e)]))];i.push(...t)}i.push(l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("enums"),l.default.createArrayTypeNode(l.default.createTypeReferenceNode(l.default.createIdentifier("Enum"),[l.default.createKeywordTypeNode(l.default.SyntaxKind.AnyKeyword)])),l.default.createArrayLiteral([],!1))],l.default.NodeFlags.Const))),u.length>0&&i.push(l.default.createExpressionStatement(l.default.createCall(l.default.createPropertyAccess(l.default.createCall(l.default.createPropertyAccess(l.default.createIdentifier("Object"),l.default.createIdentifier("values")),void 0,[l.default.createIdentifier("t0")]),l.default.createIdentifier("forEach")),void 0,[l.default.createArrowFunction(void 0,void 0,[l.default.createParameter(void 0,void 0,void 0,l.default.createIdentifier("t"),void 0,void 0,void 0)],void 0,l.default.createToken(l.default.SyntaxKind.EqualsGreaterThanToken),l.default.createBlock([l.default.createExpressionStatement(l.default.createCall(l.default.createPropertyAccess(l.default.createIdentifier("enums"),l.default.createIdentifier("push")),void 0,[l.default.createAsExpression(l.default.createAsExpression(l.default.createIdentifier("t"),l.default.createKeywordTypeNode(l.default.SyntaxKind.UnknownKeyword)),l.default.createTypeReferenceNode(l.default.createIdentifier("Enum"),[l.default.createKeywordTypeNode(l.default.SyntaxKind.AnyKeyword)]))]))],!0))]))),i.push(l.default.createReturn(l.default.createCall(l.default.createPropertyAccess(l.default.createIdentifier("serializer"),l.default.createIdentifier("generate")),void 0,[l.default.createIdentifier("tables"),l.default.createIdentifier("enums")])));const c=[l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("testFun"),void 0,l.default.createArrowFunction(void 0,void 0,[],void 0,l.default.createToken(l.default.SyntaxKind.EqualsGreaterThanToken),l.default.createBlock(i,!0)))],l.default.NodeFlags.Const))],m=[l.default.createExpressionStatement(l.default.createCall(l.default.createIdentifier("testFun"),void 0,[]))],f=l.default.createSourceFile("outfile.ts","",l.default.ScriptTarget.ES2015,!0,l.default.ScriptKind.TS),p=[];p.push(...a),p.push(...n),p.push(...s),p.push(...c),p.push(...m);const _=l.default.factory.updateSourceFile(f,p);return o.printFile(_)}},980:function(__unused_webpack_module,exports,__webpack_require__){var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const fs_1=__importDefault(__webpack_require__(147)),string_decoder_1=__webpack_require__(330),factory_1=__importDefault(__webpack_require__(258)),esbuild=__webpack_require__(659),serialize=(pathToTables,pathToTypes)=>{const decoder=new string_decoder_1.StringDecoder,preparedFarbic=factory_1.default(pathToTables,pathToTypes);fs_1.default.writeFileSync("__out.ts",preparedFarbic,"utf-8");const result=esbuild.buildSync({entryPoints:["__out.ts"],bundle:!0,platform:"node",write:!1,external:["pg-native"]});return fs_1.default.rmSync("__out.ts"),eval(decoder.write(result.outputFiles[0].contents))};exports.default=serialize},456:e=>{e.exports=require("@xstate/react")},304:e=>{e.exports=require("commander")},659:e=>{e.exports=require("esbuild")},82:e=>{e.exports=require("ink")},138:e=>{e.exports=require("ink-select-input")},618:e=>{e.exports=require("ink-spinner")},164:e=>{e.exports=require("ink-table")},793:e=>{e.exports=require("js-yaml")},102:e=>{e.exports=require("pretty-error/start")},689:e=>{e.exports=require("react")},501:e=>{e.exports=require("source-map-support/register")},330:e=>{e.exports=require("string_decoder")},7:e=>{e.exports=require("typescript")},259:e=>{e.exports=require("valtio")},522:e=>{e.exports=require("xstate")},147:e=>{e.exports=require("fs")}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var a=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(a.exports,a,a.exports,__webpack_require__),a.exports}__webpack_require__.d=(e,t)=>{for(var a in t)__webpack_require__.o(t,a)&&!__webpack_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};(()=>{const e=__webpack_require__(304);__webpack_require__(501),__webpack_require__(102),__webpack_require__(512),e.program.parse()})()})();
4
- //# sourceMappingURL=drizzle.js.map
3
+ /******/ (() => { // webpackBootstrap
4
+ /******/ "use strict";
5
+ /******/ var __webpack_modules__ = ({
6
+
7
+ /***/ "./src/jsonDiffer.js":
8
+ /*!***************************!*\
9
+ !*** ./src/jsonDiffer.js ***!
10
+ \***************************/
11
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
12
+
13
+ __webpack_require__.r(__webpack_exports__);
14
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15
+ /* harmony export */ "diffForRenamed": () => (/* binding */ diffForRenamed),
16
+ /* harmony export */ "applyJsonDiff": () => (/* binding */ applyJsonDiff)
17
+ /* harmony export */ });
18
+ /* harmony import */ var json_diff__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! json-diff */ "json-diff");
19
+ /* harmony import */ var json_diff__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(json_diff__WEBPACK_IMPORTED_MODULE_0__);
20
+ 'use-strict';
21
+
22
+
23
+
24
+
25
+ function diffForRenamed(pairs) {
26
+ // raname table1 to name of table2, so we can apply diffs
27
+ const renamed = pairs.map(it => {
28
+ const from = it.from || it.old
29
+ const to = it.to || it.new
30
+ const newFrom = { ...from, name: to.name }
31
+ return [newFrom, to]
32
+ })
33
+
34
+ // find any alternations made to a renamed table
35
+ const altered = renamed.map(pair => {
36
+ const diffed = (0,json_diff__WEBPACK_IMPORTED_MODULE_0__.diff)(pair[0], pair[1]);
37
+ diffed.name = pair[0].name
38
+
39
+ return findAlternationsInTable(diffed)
40
+ })
41
+
42
+ return altered
43
+ }
44
+ function applyJsonDiff(json1, json2) {
45
+ const difference = (0,json_diff__WEBPACK_IMPORTED_MODULE_0__.diff)(json1, json2);
46
+
47
+ difference.tables = difference.tables ? difference.tables : {}
48
+ difference.enums = difference.enums ? difference.enums : {}
49
+
50
+ const tableEntries = Object.entries(difference.tables)
51
+ const addedTables = tableEntries.filter(it => it[0].includes('__added'))
52
+ .map(it => it[1])
53
+ .map(it => {
54
+ return {
55
+ ...it, indexes: Object.entries(it.indexes).map(indexEntry => {
56
+ const idx = indexEntry[1]
57
+ const name = idx['name']
58
+ const columns = Object.values(idx['columns']).map(it => it['name'])
59
+ return { name, columns }
60
+ })
61
+ }
62
+ })
63
+
64
+ const deletedTables = tableEntries.filter(it => it[0].includes('__deleted')).map(it => it[1])
65
+
66
+ const enumsEntries = Object.entries(difference.enums)
67
+
68
+ const addedEnums = enumsEntries.filter(it => it[0].includes('__added'))
69
+ .map(it => it[1])
70
+ .map(it => {
71
+ // values: { val1: 'val1', val2: 'val2' } => values: ['val1', 'val2']
72
+ const values = Object.entries(it.values).map(ve => ve[1])
73
+ return { name: it.name, values: values }
74
+ })
75
+
76
+ const deletedEnums = enumsEntries.filter(it => it[0].includes('__deleted'))
77
+ .map(it => it[1])
78
+ .map(it => {
79
+
80
+ // values: { val1: 'val1', val2: 'val2' } => values: ['val1', 'val2']
81
+ const values = Object.entries(it.values).map(ve => ve[1])
82
+ return { name: it.name, values: values }
83
+ })
84
+
85
+ const alteredEnums = enumsEntries.filter(it => !(it[0].includes('__added') || it[0].includes('__deleted')))
86
+ .map(it => {
87
+ const vals = it[1].values
88
+ const addedValues = Object.entries(vals).filter(val => val[0].includes('__added')).map(val => val[1])
89
+ const deletedValues = Object.entries(vals).filter(val => val[0].includes('__deleted')).map(val => val[1])
90
+ return { name: it[0], addedValues, deletedValues, }
91
+ })
92
+
93
+ const alteredTables = Object.keys(difference.tables)
94
+ .filter(it => !(it.includes('__added') || it.includes('__deleted')))
95
+ .map(it => {
96
+ return { name: it, ...difference.tables[it] }
97
+ })
98
+
99
+ const alteredTablesWithColumns = alteredTables.map(table => findAlternationsInTable(table))
100
+
101
+ return {
102
+ addedTables,
103
+ deletedTables,
104
+ alteredTablesWithColumns,
105
+ addedEnums,
106
+ deletedEnums,
107
+ alteredEnums,
108
+ }
109
+ }
110
+
111
+ const findAlternationsInTable = (table) => {
112
+ // map each table to have altered, deleted or renamed columns
113
+ const columns = table.columns; //in case no columns were altered, but indexes were
114
+
115
+ const added = Object.keys(columns).filter(it => it.includes('__added')).map(it => {
116
+ return { ...columns[it] }
117
+ })
118
+ const deleted = Object.keys(columns).filter(it => it.includes('__deleted')).map(it => {
119
+ return { ...columns[it] }
120
+ })
121
+ const altered = Object.keys(columns)
122
+ .filter(it => !(it.includes('__deleted') || it.includes('__added')))
123
+ .map(it => {
124
+ return { name: it, ...columns[it] }
125
+ })
126
+
127
+ const deletedIndexes = Object.values(table.indexes__deleted || {}).map(it => {
128
+ const name = it['name']
129
+ const columns = Object.values(it['columns']).map(it => it['name'])
130
+ return { name, columns }
131
+ }).concat(
132
+ Object.keys(table.indexes || {}).filter(it => it.includes('__deleted'))
133
+ .map(it => {
134
+ const idx = table.indexes[it]
135
+ const name = idx['name']
136
+ const columns = Object.values(idx['columns']).map(it => it['name'])
137
+ return { name, columns }
138
+ })
139
+ );
140
+
141
+ const addedIndexes = Object.values(table.indexes__added || {}).map(it => {
142
+ const name = it['name']
143
+ const columns = Object.values(it['columns']).map(it => it['name'])
144
+ return { name, columns }
145
+ }).concat(
146
+ Object.keys(table.indexes || {}).filter(it => it.includes('__added'))
147
+ .map(it => {
148
+ const idx = table.indexes[it]
149
+ const name = idx['name']
150
+ const columns = Object.values(idx['columns']).map(it => it['name'])
151
+ return { name, columns }
152
+ })
153
+ );
154
+
155
+ const mappedAltered = altered.map(it => {
156
+ if (typeof it.name !== 'string' && '__old' in it.name) {
157
+ // rename
158
+ return { ...it, name: { type: 'changed', old: it.name.__old, new: it.name.__new } }
159
+ }
160
+ return it
161
+ }).map(it => {
162
+ if ('type' in it) {
163
+ // type change
164
+ return { ...it, type: { type: 'changed', old: it.type.__old, new: it.type.__new } }
165
+ }
166
+ return it
167
+ }).map(it => {
168
+ if ('defaultValue' in it) {
169
+ return { ...it, defaultValue: { type: 'changed', old: it.defaultValue.__old, new: it.defaultValue.__new } }
170
+ }
171
+ if ('defaultValue__added' in it) {
172
+ const { defaultValue__added, ...others } = it
173
+ return { ...others, defaultValue: { type: 'added', value: it.defaultValue__added } }
174
+ }
175
+ if ('defaultValue__deleted' in it) {
176
+ const { defaultValue__deleted, ...others } = it
177
+ return { ...others, defaultValue: { type: 'deleted', value: it.defaultValue__deleted } }
178
+ }
179
+ return it
180
+ }).map(it => {
181
+ if ('notNull' in it) {
182
+ return { ...it, notNull: { type: 'changed', old: it.notNull.__old, new: it.notNull.__new } }
183
+ }
184
+ if ('notNull__added' in it) {
185
+ const { notNull__added, ...others } = it
186
+ return { ...others, notNull: { type: 'added', value: it.notNull__added } }
187
+ }
188
+ if ('notNull__deleted' in it) {
189
+ const { notNull__deleted, ...others } = it
190
+ return { ...others, notNull: { type: 'deleted', value: it.notNull__deleted } }
191
+ }
192
+
193
+ return it
194
+ })
195
+
196
+ return { name: table.name, deleted, added, altered: mappedAltered, addedIndexes, deletedIndexes }
197
+ }
198
+
199
+ /***/ }),
200
+
201
+ /***/ "./src/sqlgenerator.js":
202
+ /*!*****************************!*\
203
+ !*** ./src/sqlgenerator.js ***!
204
+ \*****************************/
205
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
206
+
207
+ __webpack_require__.r(__webpack_exports__);
208
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
209
+ /* harmony export */ "fromJson": () => (/* binding */ fromJson),
210
+ /* harmony export */ "prepareDeleteColumns": () => (/* binding */ prepareDeleteColumns),
211
+ /* harmony export */ "prepareCreateColumns": () => (/* binding */ prepareCreateColumns),
212
+ /* harmony export */ "prepareAlterColumns": () => (/* binding */ prepareAlterColumns),
213
+ /* harmony export */ "prepareCreateTable": () => (/* binding */ prepareCreateTable),
214
+ /* harmony export */ "prepareCreateIndex": () => (/* binding */ prepareCreateIndex),
215
+ /* harmony export */ "prepareDropIndex": () => (/* binding */ prepareDropIndex),
216
+ /* harmony export */ "prepareRenameTable": () => (/* binding */ prepareRenameTable),
217
+ /* harmony export */ "prepareDropTable": () => (/* binding */ prepareDropTable),
218
+ /* harmony export */ "prepareCreateEnum": () => (/* binding */ prepareCreateEnum),
219
+ /* harmony export */ "prepareAddValuesToEnum": () => (/* binding */ prepareAddValuesToEnum)
220
+ /* harmony export */ });
221
+ /* harmony import */ var _jsonStatements__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonStatements */ "./src/jsonStatements.ts");
222
+
223
+
224
+ class Convertor {
225
+ constructor(type) {
226
+ this.type = type
227
+ }
228
+
229
+ can(type) {
230
+ return this.type === type;
231
+ }
232
+
233
+ convert(_) {
234
+ throw Error('override the convert mothod')
235
+ }
236
+ }
237
+
238
+ class CreateTableConvertor extends Convertor {
239
+ constructor() {
240
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.createTable)
241
+ }
242
+
243
+ convert(jsonStatement) {
244
+ const { tableName, columns } = jsonStatement
245
+ const mappedColumns = Object.keys(columns)
246
+ .map(it => {
247
+ return { ...columns[it] }
248
+ })
249
+
250
+ let statement = ''
251
+
252
+ statement += `CREATE TABLE ${tableName} (\n`
253
+ for (let i = 0; i < mappedColumns.length; i++) {
254
+ const column = mappedColumns[i]
255
+
256
+ const primaryKeyStatement = column.primaryKey ? "PRIMARY KEY" : ''
257
+ const notNullStatement = column.notNull ? "NOT NULL" : "";
258
+ const defaultStatement = column.defaultValue ? `DEFAULT '${column.defaultValue}'` : "";
259
+
260
+ statement += '\t' + `${column.name} ${column.type} ${primaryKeyStatement} ${defaultStatement} ${notNullStatement}`.replace(/ +/g, ' ').trim();
261
+ statement += (i === mappedColumns.length - 1 ? '' : ',') + '\n'
262
+ }
263
+ statement += `);`
264
+ return statement;
265
+ }
266
+ }
267
+
268
+ class CreateTypeEnumConvertor extends Convertor {
269
+ constructor() {
270
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.createTypeEnum)
271
+ }
272
+
273
+ convert(jsonStatement) {
274
+ const { enumName, values } = jsonStatement
275
+ let valuesStatement = '('
276
+ valuesStatement += values.map(it => `'${it}'`).join(', ')
277
+ valuesStatement += ')'
278
+
279
+ return `CREATE TYPE ${enumName} AS ENUM${valuesStatement};`
280
+ }
281
+ }
282
+
283
+ class AlterTypeAddValueConvertor extends Convertor {
284
+ constructor() {
285
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTypeAddValue)
286
+ }
287
+
288
+ convert(jsonStatement) {
289
+ const { enumName, enumValue } = jsonStatement
290
+ return `ALTER TYPE ${enumName} ADD VALUE ${enumValue};`
291
+ }
292
+ }
293
+
294
+ class DropTableConvertor extends Convertor {
295
+ constructor() {
296
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.dropTable)
297
+ }
298
+
299
+ convert(jsonStatement) {
300
+ const { tableName } = jsonStatement
301
+ return `DROP TABLE ${tableName}`
302
+ }
303
+ }
304
+
305
+ class RenameTableConvertor extends Convertor {
306
+ constructor() {
307
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.renameTable)
308
+ }
309
+
310
+ convert(jsonStatement) {
311
+ const { from, to } = jsonStatement
312
+ return `ALTER TABLE ${from} RENAME TO ${to}`
313
+ }
314
+ }
315
+
316
+ class AlterTableDropColumnConvertor extends Convertor {
317
+ constructor() {
318
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTableDropColumn)
319
+ }
320
+
321
+ convert(jsonStatement) {
322
+ const { tableName, columnName } = jsonStatement
323
+ return `ALTER TABLE ${tableName} DROP COLUMN IF EXISTS ${columnName};`
324
+ }
325
+ }
326
+
327
+ class AlterTableAddColumnConvertor extends Convertor {
328
+ constructor() {
329
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTableAddColumn)
330
+ }
331
+
332
+ convert(jsonStatement) {
333
+ const { tableName, column } = jsonStatement
334
+ const { name, type, defaultValue, notNull } = column;
335
+
336
+ const defaultStatement = `${defaultValue ? `DEFAULT ${defaultValue}` : ''}`
337
+ const notNullStatement = `${notNull ? 'NOT NULL' : ''}`
338
+ return `ALTER TABLE ${tableName} ADD COLUMN ${name} ${type} ${defaultStatement} ${notNullStatement}`.replace(/ +/g, ' ').trim() + ';'
339
+ }
340
+ }
341
+
342
+ class AlterTableAlterColumnSetTypeConvertor extends Convertor {
343
+ constructor() {
344
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTableAlterColumnSetType)
345
+ }
346
+
347
+ convert(jsonStatement) {
348
+ const { tableName, columnName, newDataType } = jsonStatement
349
+ return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} SET DATA TYPE ${newDataType};`
350
+ }
351
+ }
352
+
353
+ class AlterTableAlterColumnSetNotNullConvertor extends Convertor {
354
+ constructor() {
355
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTableAlterColumnSetNotNull)
356
+ }
357
+
358
+ convert(jsonStatement) {
359
+ const { tableName, columnName } = jsonStatement
360
+ return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} SET NOT NULL;`
361
+ }
362
+ }
363
+
364
+ class AlterTableAlterColumnDropNotNullConvertor extends Convertor {
365
+ constructor() {
366
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTableAlterColumnDropNotNull)
367
+ }
368
+
369
+ convert(jsonStatement) {
370
+ const { tableName, columnName } = jsonStatement
371
+ return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} DROP NOT NULL;`
372
+ }
373
+ }
374
+
375
+ class CreateForeignKeyConvertor extends Convertor {
376
+ constructor() {
377
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.createReference)
378
+ }
379
+
380
+ convert(jsonStatement) {
381
+ const { fromTable, toTable, fromColumn, toColumn, foreignKeyName, onDelete, onUpdate } = jsonStatement
382
+ const onDeleteStatement = onDelete || ""
383
+ const onUpdateStatement = onUpdate || ""
384
+ return `ALTER TABLE ${fromTable} ADD CONSTRAINT ${foreignKeyName} FOREIGN KEY (${fromColumn}) REFERENCES ${toTable}(${toColumn}) ${onDeleteStatement} ${onUpdateStatement}`.replace(/ +/g, ' ').trim() + ';'
385
+ }
386
+ }
387
+
388
+ class CreateIndexConvertor extends Convertor {
389
+ constructor() {
390
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.createIndex)
391
+ }
392
+
393
+ convert(jsonStatement) {
394
+ const { tableName, indexName, indexValue } = jsonStatement
395
+ return `CREATE INDEX ${indexName} ON ${tableName} (${indexValue});`
396
+ }
397
+ }
398
+
399
+ class DropIndexConvertor extends Convertor {
400
+ constructor() {
401
+ super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.dropIndex)
402
+ }
403
+
404
+ convert(jsonStatement) {
405
+ const { indexName } = jsonStatement
406
+ return `DROP INDEX IF EXISTS ${indexName};`
407
+ }
408
+ }
409
+
410
+ const convertors = []
411
+ convertors.push(new CreateTableConvertor())
412
+ convertors.push(new CreateTypeEnumConvertor())
413
+ convertors.push(new DropTableConvertor())
414
+ convertors.push(new RenameTableConvertor())
415
+ convertors.push(new AlterTableDropColumnConvertor())
416
+ convertors.push(new AlterTableAddColumnConvertor())
417
+ convertors.push(new AlterTableAlterColumnSetTypeConvertor())
418
+ convertors.push(new CreateIndexConvertor())
419
+ convertors.push(new DropIndexConvertor())
420
+ convertors.push(new AlterTypeAddValueConvertor())
421
+ convertors.push(new AlterTableAlterColumnSetNotNullConvertor())
422
+ convertors.push(new AlterTableAlterColumnDropNotNullConvertor())
423
+ convertors.push(new CreateForeignKeyConvertor())
424
+
425
+ const fromJson = (statements) => {
426
+ return statements.map(statement => {
427
+ const filtered = convertors.filter(it => {
428
+ return it.can(statement.type)
429
+ })
430
+ const convertor = filtered.length === 1 ? filtered[0] : undefined
431
+
432
+ if (!convertor) {
433
+
434
+ console.log('no convertor:', statement.type)
435
+ return 'dry run'
436
+ }
437
+
438
+ return convertor.convert(statement)
439
+ })
440
+ }
441
+
442
+ const prepareDeleteColumns = (tableName, columns) => {
443
+ let statement = ''
444
+ for (const column of columns) {
445
+ statement += `ALTER TABLE ${tableName} DROP COLUMN IF EXISTS ${column.name};`
446
+ statement += '\n'
447
+ }
448
+ return statement.trim()
449
+ }
450
+
451
+ const prepareCreateColumns = (tableName, columns) => {
452
+ let statement = ''
453
+ for (const column of columns) {
454
+ const { name, type, defaultValue, notNull } = column;
455
+
456
+ const defaultStatement = `${defaultValue ? `DEFAULT ${defaultValue}` : ''}`
457
+ const notNullStatement = `${notNull ? 'NOT NULL' : ''}`
458
+ statement += `ALTER TABLE ${tableName} ADD COLUMN ${name} ${type} ${defaultStatement} ${notNullStatement}`.replace(/ +/g, ' ').trim() + ';'
459
+ statement += '\n'
460
+ }
461
+ return statement.trim()
462
+ }
463
+
464
+ const prepareAlterColumns = (tableName, columns) => {
465
+ let statement = ''
466
+ for (const column of columns) {
467
+ const { name } = column;
468
+
469
+ if (column['type']) {
470
+ const { __new } = column.type
471
+ statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} SET DATA TYPE ${__new};`
472
+ statement += '\n'
473
+ }
474
+
475
+ if (column['defaultValue']) {
476
+ const { __new } = column.defaultValue
477
+ statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} SET DEFAULT ${__new};`
478
+ statement += '\n'
479
+ }
480
+
481
+ if (column['defaultValue__added']) {
482
+ statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} SET DEFAULT ${column.defaultValue__added};`
483
+ statement += '\n'
484
+ }
485
+
486
+ if (column['defaultValue__deleted']) {
487
+ // console.log(`default value deleted`)
488
+ statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} DROP DEFAULT;`
489
+ statement += '\n'
490
+ }
491
+
492
+ if (column['notNull']) {
493
+ const { __new } = column.notNull
494
+ const dropStatement = __new ? 'SET NOT NULL' : 'DROP NOT NULL'
495
+ statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} ${dropStatement};`
496
+ statement += '\n'
497
+ }
498
+
499
+ if (column['notNull__added']) {
500
+ statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} SET NOT NULL;`
501
+ statement += '\n'
502
+ }
503
+
504
+ if (column['notNull__deleted']) {
505
+ statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} DROP NOT NULL;`
506
+ statement += '\n'
507
+ }
508
+ }
509
+ return statement.trim()
510
+ }
511
+
512
+ const prepareCreateTable = (table) => {
513
+ const { name, columns } = table
514
+ const mappedColumns = Object.keys(columns)
515
+ .map(it => {
516
+ return { ...columns[it] }
517
+ })
518
+
519
+ let statement = ''
520
+
521
+ statement += `CREATE TABLE ${name} (\n`
522
+ for (let i = 0; i < mappedColumns.length; i++) {
523
+ const column = mappedColumns[i]
524
+ const primaryKeyStatement = column.primaryKey ? "PRIMARY KEY" : ''
525
+ const notNullStatement = column.notNull ? "NOT NULL" : "";
526
+ const defaultStatement = column.defaultValue ? `DEFAULT '${column.defaultValue}'` : "";
527
+ statement += '\t' + `${column.name} ${column.type} ${primaryKeyStatement} ${defaultStatement} ${notNullStatement} ${column}`.replace(/ +/g, ' ').trim()
528
+
529
+ statement += (i === mappedColumns.length - 1 ? '' : ',') + '\n'
530
+ }
531
+
532
+ statement += `);`
533
+ return statement;
534
+ }
535
+
536
+ const prepareCreateIndex = (table, indexes) => {
537
+ let statement = ''
538
+ for (const index of indexes) {
539
+ const { name, columns } = index
540
+ statement += `CREATE INDEX ${name} ON ${table} (${columns.join(', ')});`
541
+ statement += '\n'
542
+ }
543
+
544
+ return statement.trim()
545
+ }
546
+
547
+ const prepareDropIndex = (table, indexes) => {
548
+ let statement = ''
549
+ for (const index of indexes) {
550
+ const { name } = index
551
+ statement += `DROP INDEX IF EXISTS ${name};`
552
+ statement += '\n'
553
+ }
554
+ return statement.trim()
555
+ }
556
+
557
+ const prepareRenameTable = (tableFrom, tableTo) => {
558
+ const namefrom = tableFrom.name
559
+ const nameTo = tableTo.name
560
+ const statement = `ALTER TABLE ${namefrom} RENAME TO ${nameTo}`
561
+ return statement
562
+ }
563
+
564
+ const prepareDropTable = (table) => {
565
+ const { name } = table;
566
+ return `DROP TABLE ${name}`
567
+ }
568
+
569
+ const prepareCreateEnum = (name, values) => {
570
+ // console.log(name, values)
571
+ let valuesStatement = '('
572
+ valuesStatement += Object.values(values).map(it => `'${it}'`).join(', ')
573
+ valuesStatement += ')'
574
+
575
+ const statement = `CREATE TYPE ${name} AS ENUM${valuesStatement};`
576
+ return statement;
577
+ }
578
+
579
+ // https://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
580
+ const prepareAddValuesToEnum = (name, values) => {
581
+ let statement = ''
582
+ for (const idx in values) {
583
+ statement += `ALTER TYPE ${name} ADD VALUE ${values[idx]};`
584
+ statement += '\n'
585
+ }
586
+ return statement.trim();
587
+ }
588
+
589
+
590
+
591
+
592
+ // test case for enum altering
593
+ `
594
+ create table users (
595
+ id int,
596
+ name character varying(128)
597
+ );
598
+
599
+ create type venum as enum('one', 'two', 'three');
600
+ alter table users add column typed venum;
601
+
602
+ insert into users(id, name, typed) values (1, 'name1', 'one');
603
+ insert into users(id, name, typed) values (2, 'name2', 'two');
604
+ insert into users(id, name, typed) values (3, 'name3', 'three');
605
+
606
+ alter type venum rename to __venum;
607
+ create type venum as enum ('one', 'two', 'three', 'four', 'five');
608
+
609
+ ALTER TABLE users ALTER COLUMN typed TYPE venum USING typed::text::venum;
610
+
611
+ insert into users(id, name, typed) values (4, 'name4', 'four');
612
+ insert into users(id, name, typed) values (5, 'name5', 'five');
613
+
614
+ drop type __venum;
615
+ `
616
+
617
+ /***/ }),
618
+
619
+ /***/ "./src/cli/commands/migrate.tsx":
620
+ /*!**************************************!*\
621
+ !*** ./src/cli/commands/migrate.tsx ***!
622
+ \**************************************/
623
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
624
+
625
+
626
+ var __importDefault = (this && this.__importDefault) || function (mod) {
627
+ return (mod && mod.__esModule) ? mod : { "default": mod };
628
+ };
629
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
630
+ const components_api_1 = __webpack_require__(/*! cli/components-api */ "./src/cli/components-api/index.tsx");
631
+ const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
632
+ const js_yaml_1 = __importDefault(__webpack_require__(/*! js-yaml */ "js-yaml"));
633
+ const migrationPreparator_1 = __importDefault(__webpack_require__(/*! migrationPreparator */ "./src/migrationPreparator.ts"));
634
+ const snapshotsDiffer_1 = __webpack_require__(/*! snapshotsDiffer */ "./src/snapshotsDiffer.ts");
635
+ const migrate = async () => {
636
+ const drizzleConfig = js_yaml_1.default.load(fs_1.default.readFileSync('drizzle.config.yml', { encoding: 'utf-8' }));
637
+ const migrationRootFolder = drizzleConfig.migrationRootFolder || 'drizzle'; // or from config/params
638
+ const dataFolder = drizzleConfig.dataFolder;
639
+ const { prev, cur } = await components_api_1.task('preparing data schema json snapshot', async ({ setTitle }) => {
640
+ return migrationPreparator_1.default(migrationRootFolder, dataFolder);
641
+ });
642
+ const tablesResolver = async (input) => {
643
+ const { created, deleted, renamed } = await components_api_1.promptTablesConflicts({
644
+ newTables: input.created,
645
+ missingTables: input.deleted,
646
+ });
647
+ const renamedMapped = renamed.map(it => {
648
+ return { from: it.old, to: it.new };
649
+ });
650
+ return { created: created, deleted: deleted, renamed: renamedMapped };
651
+ };
652
+ const columnsResolver = async (input) => {
653
+ const result = await components_api_1.promptColumnsConflicts({ name: input.tableName, added: input.created, deleted: input.deleted });
654
+ const renamedMapped = result.renamed.map(it => {
655
+ return { from: it.old, to: it.new };
656
+ });
657
+ return { tableName: input.tableName, created: result.created, deleted: input.deleted, renamed: renamedMapped };
658
+ };
659
+ const sql = await components_api_1.task('preparing schemas diff', async () => {
660
+ return snapshotsDiffer_1.applySnapshotsDiff(prev, cur, tablesResolver, columnsResolver);
661
+ });
662
+ // todo: save results to a new migration folder
663
+ const date = new Date();
664
+ // const folderName = `${date.getFullYear()}-${two(date.getMonth())}-${two(date.getDate())} ${two(date.getHours())}:${two(date.getMinutes())}:${two(date.getSeconds())}`
665
+ const folderName = date.toISOString();
666
+ const migrationFolderPath = `./${migrationRootFolder}/${folderName}`;
667
+ fs_1.default.mkdirSync(migrationFolderPath);
668
+ fs_1.default.writeFileSync(`${migrationFolderPath}/snapshot.json`, JSON.stringify(cur, null, 2));
669
+ fs_1.default.writeFileSync(`${migrationFolderPath}/migration.sql`, sql);
670
+ };
671
+ exports["default"] = migrate;
672
+
673
+
674
+ /***/ }),
675
+
676
+ /***/ "./src/cli/commands/prepare-snapshot.ts":
677
+ /*!**********************************************!*\
678
+ !*** ./src/cli/commands/prepare-snapshot.ts ***!
679
+ \**********************************************/
680
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
681
+
682
+
683
+ var __importDefault = (this && this.__importDefault) || function (mod) {
684
+ return (mod && mod.__esModule) ? mod : { "default": mod };
685
+ };
686
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
687
+ const serializer_1 = __importDefault(__webpack_require__(/*! serializer */ "./src/serializer/index.ts"));
688
+ function prepareSnapshot(path) {
689
+ const result = serializer_1.default(`${path}/tables/`, `${path}/types/`);
690
+ return result;
691
+ }
692
+ exports["default"] = prepareSnapshot;
693
+
694
+
695
+ /***/ }),
696
+
697
+ /***/ "./src/cli/components-api/ComponentsList.tsx":
698
+ /*!***************************************************!*\
699
+ !*** ./src/cli/components-api/ComponentsList.tsx ***!
700
+ \***************************************************/
701
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
702
+
703
+
704
+ var __importDefault = (this && this.__importDefault) || function (mod) {
705
+ return (mod && mod.__esModule) ? mod : { "default": mod };
706
+ };
707
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
708
+ const react_1 = __importDefault(__webpack_require__(/*! react */ "react"));
709
+ const valtio_1 = __webpack_require__(/*! valtio */ "valtio");
710
+ const ComponentsList = ({ componentsList, }) => {
711
+ valtio_1.useSnapshot(componentsList);
712
+ return (react_1.default.createElement(react_1.default.Fragment, null, componentsList.map((component, i) => ({ ...component, key: i }))));
713
+ };
714
+ exports["default"] = ComponentsList;
715
+
716
+
717
+ /***/ }),
718
+
719
+ /***/ "./src/cli/components-api/CreateApp.tsx":
720
+ /*!**********************************************!*\
721
+ !*** ./src/cli/components-api/CreateApp.tsx ***!
722
+ \**********************************************/
723
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
724
+
725
+
726
+ var __importDefault = (this && this.__importDefault) || function (mod) {
727
+ return (mod && mod.__esModule) ? mod : { "default": mod };
728
+ };
729
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
730
+ const ink_1 = __webpack_require__(/*! ink */ "ink");
731
+ const react_1 = __importDefault(__webpack_require__(/*! react */ "react"));
732
+ const ComponentsList_1 = __importDefault(__webpack_require__(/*! cli/components-api/ComponentsList */ "./src/cli/components-api/ComponentsList.tsx"));
733
+ const createApp = (componentsList) => {
734
+ const inkApp = ink_1.render(react_1.default.createElement(ComponentsList_1.default, { componentsList: componentsList }));
735
+ return {
736
+ remove() {
737
+ inkApp.rerender(null);
738
+ inkApp.unmount();
739
+ inkApp.clear();
740
+ inkApp.cleanup();
741
+ },
742
+ };
743
+ };
744
+ exports["default"] = createApp;
745
+
746
+
747
+ /***/ }),
748
+
749
+ /***/ "./src/cli/components-api/components/PromptColumnsConflicts.tsx":
750
+ /*!**********************************************************************!*\
751
+ !*** ./src/cli/components-api/components/PromptColumnsConflicts.tsx ***!
752
+ \**********************************************************************/
753
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
754
+
755
+
756
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
757
+ if (k2 === undefined) k2 = k;
758
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
759
+ }) : (function(o, m, k, k2) {
760
+ if (k2 === undefined) k2 = k;
761
+ o[k2] = m[k];
762
+ }));
763
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
764
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
765
+ }) : function(o, v) {
766
+ o["default"] = v;
767
+ });
768
+ var __importStar = (this && this.__importStar) || function (mod) {
769
+ if (mod && mod.__esModule) return mod;
770
+ var result = {};
771
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
772
+ __setModuleDefault(result, mod);
773
+ return result;
774
+ };
775
+ var __importDefault = (this && this.__importDefault) || function (mod) {
776
+ return (mod && mod.__esModule) ? mod : { "default": mod };
777
+ };
778
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
779
+ const react_1 = __importDefault(__webpack_require__(/*! react */ "react"));
780
+ const ink_1 = __webpack_require__(/*! ink */ "ink");
781
+ const ink_select_input_1 = __importDefault(__webpack_require__(/*! ink-select-input */ "ink-select-input"));
782
+ const ink_table_1 = __importStar(__webpack_require__(/*! ink-table */ "ink-table"));
783
+ const react_2 = __webpack_require__(/*! @xstate/react */ "@xstate/react");
784
+ const formatDataForTable_1 = __importDefault(__webpack_require__(/*! cli/utils/formatDataForTable */ "./src/cli/utils/formatDataForTable.ts"));
785
+ const valuesForPrompts_1 = __webpack_require__(/*! cli/utils/valuesForPrompts */ "./src/cli/utils/valuesForPrompts.ts");
786
+ const resolveColumnsMachine_1 = __importDefault(__webpack_require__(/*! cli/machines/resolveColumnsMachine */ "./src/cli/machines/resolveColumnsMachine.ts"));
787
+ const PromptColumnsConflicts = ({ onDone, tableWithColumns: props, }) => {
788
+ const [current, send] = react_2.useMachine(resolveColumnsMachine_1.default({ tableWithColumns: props }));
789
+ const { tableName, addedColumns, deletedColumns, missingItemIndex, created, renamed, deleted, } = current.context;
790
+ const selectItemIndex = (item) => {
791
+ send({ type: 'CHOICE_ITEM', itemIndex: item.value });
792
+ };
793
+ const selectNewItemIndex = (item) => {
794
+ send({ type: 'CHOICE_NEW_ITEM', itemIndex: item.value });
795
+ };
796
+ const selectAction = (action) => {
797
+ send({ type: action.value });
798
+ };
799
+ const confirm = (confirmationItem) => {
800
+ send({ type: confirmationItem.value });
801
+ };
802
+ const renderDOM = () => {
803
+ if (current.matches('table')) {
804
+ return (react_1.default.createElement(react_1.default.Fragment, null,
805
+ react_1.default.createElement(ink_1.Box, { display: "flex", flexDirection: "column" },
806
+ react_1.default.createElement(ink_1.Box, { display: "flex" },
807
+ react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
808
+ react_1.default.createElement(ink_table_1.Header, null, `Table "${tableName}" missing columns:`),
809
+ react_1.default.createElement(ink_select_input_1.default, { items: deletedColumns.map((column, i) => ({
810
+ key: String(i),
811
+ label: column.name,
812
+ value: i,
813
+ })), onSelect: selectItemIndex })),
814
+ !!addedColumns?.length && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingLeft: 5 },
815
+ react_1.default.createElement(ink_table_1.Header, null, "New tables:"),
816
+ react_1.default.createElement(ink_1.Box, { display: "flex", flexDirection: "column" }, addedColumns.map(({ name }, i) => react_1.default.createElement(ink_1.Text, { key: name + i }, name)))))))));
817
+ }
818
+ if (current.matches('action.actionChoice')) {
819
+ const tempActions = !addedColumns.length
820
+ ? valuesForPrompts_1.actions.filter(({ value }) => value !== valuesForPrompts_1.Action.RENAME)
821
+ : valuesForPrompts_1.actions;
822
+ return (react_1.default.createElement(react_1.default.Fragment, null,
823
+ react_1.default.createElement(ink_table_1.Header, null, `${deletedColumns[missingItemIndex]?.name} is:`),
824
+ react_1.default.createElement(ink_select_input_1.default, { items: tempActions, onSelect: selectAction })));
825
+ }
826
+ if (current.matches('confirmationDelete')) {
827
+ return (react_1.default.createElement(react_1.default.Fragment, null,
828
+ react_1.default.createElement(ink_table_1.Header, null, "!!! Data in table will be lost !!!"),
829
+ react_1.default.createElement(ink_1.Text, null, "Are you sure?"),
830
+ react_1.default.createElement(ink_select_input_1.default, { items: valuesForPrompts_1.confirmations, onSelect: confirm })));
831
+ }
832
+ if (current.matches('confirmationRename')) {
833
+ return (react_1.default.createElement(react_1.default.Fragment, null,
834
+ react_1.default.createElement(ink_table_1.Header, null, "Are you sure?"),
835
+ react_1.default.createElement(ink_select_input_1.default, { items: valuesForPrompts_1.confirmations, onSelect: confirm })));
836
+ }
837
+ if (current.matches('action.rename')) {
838
+ return (react_1.default.createElement(react_1.default.Fragment, null,
839
+ react_1.default.createElement(ink_table_1.Header, null, `${deletedColumns[missingItemIndex]?.name} was renamed to:`),
840
+ react_1.default.createElement(ink_select_input_1.default, { items: addedColumns.map((table, i) => ({
841
+ key: String(i),
842
+ label: table.name,
843
+ value: i,
844
+ })), onSelect: selectNewItemIndex })));
845
+ }
846
+ if (current.matches('done')) {
847
+ onDone({ created, renamed, deleted });
848
+ }
849
+ return (react_1.default.createElement(react_1.default.Fragment, null));
850
+ };
851
+ return (!!deleted.length
852
+ || !!renamed.length
853
+ || !!created.length) ? (react_1.default.createElement(ink_1.Box, { flexDirection: "column", margin: 1 },
854
+ react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 0 },
855
+ react_1.default.createElement(ink_table_1.Header, null, `${tableName} columns:`),
856
+ react_1.default.createElement(ink_table_1.default, { data: formatDataForTable_1.default([
857
+ {
858
+ title: 'Deleted',
859
+ values: deleted,
860
+ },
861
+ {
862
+ title: 'Renamed',
863
+ values: renamed,
864
+ },
865
+ {
866
+ title: 'Created',
867
+ values: created,
868
+ },
869
+ ]) })),
870
+ renderDOM())) : renderDOM();
871
+ };
872
+ exports["default"] = PromptColumnsConflicts;
873
+
874
+
875
+ /***/ }),
876
+
877
+ /***/ "./src/cli/components-api/components/PromptTablesConflicts.tsx":
878
+ /*!*********************************************************************!*\
879
+ !*** ./src/cli/components-api/components/PromptTablesConflicts.tsx ***!
880
+ \*********************************************************************/
881
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
882
+
883
+
884
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
885
+ if (k2 === undefined) k2 = k;
886
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
887
+ }) : (function(o, m, k, k2) {
888
+ if (k2 === undefined) k2 = k;
889
+ o[k2] = m[k];
890
+ }));
891
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
892
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
893
+ }) : function(o, v) {
894
+ o["default"] = v;
895
+ });
896
+ var __importStar = (this && this.__importStar) || function (mod) {
897
+ if (mod && mod.__esModule) return mod;
898
+ var result = {};
899
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
900
+ __setModuleDefault(result, mod);
901
+ return result;
902
+ };
903
+ var __importDefault = (this && this.__importDefault) || function (mod) {
904
+ return (mod && mod.__esModule) ? mod : { "default": mod };
905
+ };
906
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
907
+ const react_1 = __importDefault(__webpack_require__(/*! react */ "react"));
908
+ const ink_1 = __webpack_require__(/*! ink */ "ink");
909
+ const ink_select_input_1 = __importDefault(__webpack_require__(/*! ink-select-input */ "ink-select-input"));
910
+ const ink_table_1 = __importStar(__webpack_require__(/*! ink-table */ "ink-table"));
911
+ const react_2 = __webpack_require__(/*! @xstate/react */ "@xstate/react");
912
+ const resolveTablesMachine_1 = __importDefault(__webpack_require__(/*! cli/machines/resolveTablesMachine */ "./src/cli/machines/resolveTablesMachine.ts"));
913
+ const formatDataForTable_1 = __importDefault(__webpack_require__(/*! cli/utils/formatDataForTable */ "./src/cli/utils/formatDataForTable.ts"));
914
+ const valuesForPrompts_1 = __webpack_require__(/*! cli/utils/valuesForPrompts */ "./src/cli/utils/valuesForPrompts.ts");
915
+ const PromptTablesConflicts = ({ onDone, newTables: newProps, missingTables: missingProps, }) => {
916
+ const [current, send] = react_2.useMachine(resolveTablesMachine_1.default({
917
+ missingTables: missingProps,
918
+ newTables: newProps,
919
+ }));
920
+ const { missingItemIndex, newTables, missingTables, createdTables, renamedTables, deletedTables, } = current.context;
921
+ const selectItemIndex = (item) => {
922
+ send({ type: 'CHOICE_ITEM', itemIndex: item.value });
923
+ };
924
+ const selectNewItemIndex = (item) => {
925
+ send({ type: 'CHOICE_NEW_ITEM', itemIndex: item.value });
926
+ };
927
+ const selectAction = (action) => {
928
+ send({ type: action.value });
929
+ };
930
+ const confirm = (confirmationItem) => {
931
+ send({ type: confirmationItem.value });
932
+ };
933
+ const renderDOM = () => {
934
+ if (current.matches('table')) {
935
+ return (react_1.default.createElement(react_1.default.Fragment, null,
936
+ react_1.default.createElement(ink_1.Box, { display: "flex", flexDirection: "column" },
937
+ react_1.default.createElement(ink_1.Box, { display: "flex" },
938
+ react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
939
+ react_1.default.createElement(ink_table_1.Header, null, "Missing tables:"),
940
+ react_1.default.createElement(ink_select_input_1.default, { items: missingTables.map((table, i) => ({
941
+ key: String(i),
942
+ label: table.name,
943
+ value: i,
944
+ })), onSelect: selectItemIndex })),
945
+ !!newTables?.length && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingLeft: 5 },
946
+ react_1.default.createElement(ink_table_1.Header, null, "New tables:"),
947
+ react_1.default.createElement(ink_1.Box, { display: "flex", flexDirection: "column" }, newTables.map(({ name }, i) => react_1.default.createElement(ink_1.Text, { key: name + i }, name)))))))));
948
+ }
949
+ if (current.matches('action.actionChoice')) {
950
+ const tempActions = !newTables.length
951
+ ? valuesForPrompts_1.actions.filter(({ value }) => value !== valuesForPrompts_1.Action.RENAME)
952
+ : valuesForPrompts_1.actions;
953
+ return (react_1.default.createElement(react_1.default.Fragment, null,
954
+ react_1.default.createElement(ink_table_1.Header, null, `${missingTables[missingItemIndex]?.name} is:`),
955
+ react_1.default.createElement(ink_select_input_1.default, { items: tempActions, onSelect: selectAction })));
956
+ }
957
+ if (current.matches('confirmationDelete')) {
958
+ return (react_1.default.createElement(react_1.default.Fragment, null,
959
+ react_1.default.createElement(ink_table_1.Header, null, "!!! Data in table will be lost !!!"),
960
+ react_1.default.createElement(ink_1.Text, null, "Are you sure?"),
961
+ react_1.default.createElement(ink_select_input_1.default, { items: valuesForPrompts_1.confirmations, onSelect: confirm })));
962
+ }
963
+ if (current.matches('confirmationRename')) {
964
+ return (react_1.default.createElement(react_1.default.Fragment, null,
965
+ react_1.default.createElement(ink_table_1.Header, null, "Are you sure?"),
966
+ react_1.default.createElement(ink_select_input_1.default, { items: valuesForPrompts_1.confirmations, onSelect: confirm })));
967
+ }
968
+ if (current.matches('action.rename')) {
969
+ return (react_1.default.createElement(react_1.default.Fragment, null,
970
+ react_1.default.createElement(ink_table_1.Header, null, `${missingTables[missingItemIndex]?.name} was renamed to:`),
971
+ react_1.default.createElement(ink_select_input_1.default, { items: newTables.map((table, i) => ({
972
+ key: String(i),
973
+ label: table.name,
974
+ value: i,
975
+ })), onSelect: selectNewItemIndex })));
976
+ }
977
+ if (current.matches('done')) {
978
+ onDone({
979
+ created: createdTables,
980
+ renamed: renamedTables,
981
+ deleted: deletedTables,
982
+ });
983
+ }
984
+ return (react_1.default.createElement(react_1.default.Fragment, null));
985
+ };
986
+ return (!!deletedTables.length
987
+ || !!renamedTables.length
988
+ || !!createdTables.length) ? (react_1.default.createElement(ink_1.Box, { flexDirection: "column", margin: 1 },
989
+ react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 0 },
990
+ react_1.default.createElement(ink_table_1.Header, null, "Tables: "),
991
+ react_1.default.createElement(ink_table_1.default, { data: formatDataForTable_1.default([
992
+ {
993
+ title: 'Deleted',
994
+ values: deletedTables,
995
+ },
996
+ {
997
+ title: 'Renamed',
998
+ values: renamedTables,
999
+ },
1000
+ {
1001
+ title: 'Created',
1002
+ values: createdTables,
1003
+ },
1004
+ ]) })),
1005
+ renderDOM())) : renderDOM();
1006
+ };
1007
+ exports["default"] = PromptTablesConflicts;
1008
+
1009
+
1010
+ /***/ }),
1011
+
1012
+ /***/ "./src/cli/components-api/components/Task.tsx":
1013
+ /*!****************************************************!*\
1014
+ !*** ./src/cli/components-api/components/Task.tsx ***!
1015
+ \****************************************************/
1016
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1017
+
1018
+
1019
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
1020
+ if (k2 === undefined) k2 = k;
1021
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
1022
+ }) : (function(o, m, k, k2) {
1023
+ if (k2 === undefined) k2 = k;
1024
+ o[k2] = m[k];
1025
+ }));
1026
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
1027
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
1028
+ }) : function(o, v) {
1029
+ o["default"] = v;
1030
+ });
1031
+ var __importStar = (this && this.__importStar) || function (mod) {
1032
+ if (mod && mod.__esModule) return mod;
1033
+ var result = {};
1034
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
1035
+ __setModuleDefault(result, mod);
1036
+ return result;
1037
+ };
1038
+ var __importDefault = (this && this.__importDefault) || function (mod) {
1039
+ return (mod && mod.__esModule) ? mod : { "default": mod };
1040
+ };
1041
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1042
+ const react_1 = __importStar(__webpack_require__(/*! react */ "react"));
1043
+ const ink_1 = __webpack_require__(/*! ink */ "ink");
1044
+ const ink_spinner_1 = __importDefault(__webpack_require__(/*! ink-spinner */ "ink-spinner"));
1045
+ var StepState;
1046
+ (function (StepState) {
1047
+ StepState[StepState["IN_PROGRESS"] = 0] = "IN_PROGRESS";
1048
+ StepState[StepState["SUCCESS"] = 1] = "SUCCESS";
1049
+ StepState[StepState["FAIL"] = 2] = "FAIL";
1050
+ })(StepState || (StepState = {}));
1051
+ const Task = (props) => {
1052
+ const { func, onDone, titleStr, } = props;
1053
+ const [title, setTitle] = react_1.useState(titleStr);
1054
+ const [state, setState] = react_1.useState(StepState.IN_PROGRESS);
1055
+ const [error, setError] = react_1.useState(null);
1056
+ react_1.useEffect(() => {
1057
+ (async () => {
1058
+ try {
1059
+ const result = await func({ setTitle, setError });
1060
+ setState(StepState.SUCCESS);
1061
+ onDone(result);
1062
+ }
1063
+ catch (e) {
1064
+ console.error(e);
1065
+ // setError(e);
1066
+ // setState(StepState.FAIL);
1067
+ }
1068
+ })();
1069
+ }, []);
1070
+ return (react_1.default.createElement(ink_1.Box, { flexDirection: "row" },
1071
+ react_1.default.createElement(ink_1.Box, { marginRight: 1 },
1072
+ state === StepState.IN_PROGRESS ? (react_1.default.createElement(ink_1.Text, null,
1073
+ "[",
1074
+ react_1.default.createElement(ink_spinner_1.default, { type: "dots" }),
1075
+ "]")) : state === StepState.SUCCESS ? (react_1.default.createElement(ink_1.Text, null,
1076
+ "[",
1077
+ react_1.default.createElement(ink_1.Text, { color: "green" }, "\u2713"),
1078
+ "]")) : (react_1.default.createElement(ink_1.Text, null,
1079
+ "[",
1080
+ react_1.default.createElement(ink_1.Text, { color: "red" }, "\u00D7"),
1081
+ "]")),
1082
+ state === StepState.FAIL ? (react_1.default.createElement(ink_1.Text, null,
1083
+ title,
1084
+ react_1.default.createElement(ink_1.Newline, null),
1085
+ react_1.default.createElement(ink_1.Text, { color: "red" }, error.message))) : (react_1.default.createElement(react_1.default.Fragment, null,
1086
+ react_1.default.createElement(ink_1.Text, null, title))))));
1087
+ };
1088
+ exports["default"] = Task;
1089
+
1090
+
1091
+ /***/ }),
1092
+
1093
+ /***/ "./src/cli/components-api/index.tsx":
1094
+ /*!******************************************!*\
1095
+ !*** ./src/cli/components-api/index.tsx ***!
1096
+ \******************************************/
1097
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1098
+
1099
+
1100
+ var __importDefault = (this && this.__importDefault) || function (mod) {
1101
+ return (mod && mod.__esModule) ? mod : { "default": mod };
1102
+ };
1103
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1104
+ exports.promptColumnsConflicts = exports.promptTablesConflicts = exports.task = void 0;
1105
+ const react_1 = __importDefault(__webpack_require__(/*! react */ "react"));
1106
+ const valtio_1 = __webpack_require__(/*! valtio */ "valtio");
1107
+ const Task_1 = __importDefault(__webpack_require__(/*! cli/components-api/components/Task */ "./src/cli/components-api/components/Task.tsx"));
1108
+ const CreateApp_1 = __importDefault(__webpack_require__(/*! cli/components-api/CreateApp */ "./src/cli/components-api/CreateApp.tsx"));
1109
+ const PromptTablesConflicts_1 = __importDefault(__webpack_require__(/*! cli/components-api/components/PromptTablesConflicts */ "./src/cli/components-api/components/PromptTablesConflicts.tsx"));
1110
+ const PromptColumnsConflicts_1 = __importDefault(__webpack_require__(/*! cli/components-api/components/PromptColumnsConflicts */ "./src/cli/components-api/components/PromptColumnsConflicts.tsx"));
1111
+ const componentsList = valtio_1.proxy([]);
1112
+ let app;
1113
+ const prepareApp = () => {
1114
+ if (!app) {
1115
+ app = CreateApp_1.default(componentsList);
1116
+ componentsList.length = 0;
1117
+ }
1118
+ };
1119
+ const task = (titleStr, func) => new Promise((resolve) => {
1120
+ prepareApp();
1121
+ componentsList.push(react_1.default.createElement(Task_1.default, { titleStr: titleStr, func: func, onDone: (val) => resolve(val) }));
1122
+ });
1123
+ exports.task = task;
1124
+ const promptTablesConflicts = ({ missingTables, newTables }) => new Promise((resolve) => {
1125
+ prepareApp();
1126
+ componentsList.push(react_1.default.createElement(PromptTablesConflicts_1.default, { onDone: (val) => resolve(val), missingTables: missingTables, newTables: newTables }));
1127
+ });
1128
+ exports.promptTablesConflicts = promptTablesConflicts;
1129
+ const promptColumnsConflicts = (tableWithColumns) => new Promise((resolve) => {
1130
+ prepareApp();
1131
+ componentsList.push(react_1.default.createElement(PromptColumnsConflicts_1.default, { onDone: (val) => resolve(val), tableWithColumns: tableWithColumns }));
1132
+ });
1133
+ exports.promptColumnsConflicts = promptColumnsConflicts;
1134
+
1135
+
1136
+ /***/ }),
1137
+
1138
+ /***/ "./src/cli/index.tsx":
1139
+ /*!***************************!*\
1140
+ !*** ./src/cli/index.tsx ***!
1141
+ \***************************/
1142
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1143
+
1144
+
1145
+ var __importDefault = (this && this.__importDefault) || function (mod) {
1146
+ return (mod && mod.__esModule) ? mod : { "default": mod };
1147
+ };
1148
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1149
+ const commander_1 = __webpack_require__(/*! commander */ "commander");
1150
+ const migrate_1 = __importDefault(__webpack_require__(/*! ./commands/migrate */ "./src/cli/commands/migrate.tsx"));
1151
+ __webpack_require__(/*! source-map-support/register */ "source-map-support/register");
1152
+ __webpack_require__(/*! pretty-error/start */ "pretty-error/start");
1153
+ __webpack_require__(/*! ./commands/migrate */ "./src/cli/commands/migrate.tsx");
1154
+ const prepare_snapshot_1 = __importDefault(__webpack_require__(/*! ./commands/prepare-snapshot */ "./src/cli/commands/prepare-snapshot.ts"));
1155
+ const migrationCommand = new commander_1.Command('migrate')
1156
+ .alias('mg')
1157
+ .description('Migration')
1158
+ .action(migrate_1.default);
1159
+ const prepareSnapshotCommand = new commander_1.Command('prepare')
1160
+ .argument('<path>')
1161
+ .action((path) => {
1162
+ console.log(JSON.stringify(prepare_snapshot_1.default(path), null, 2));
1163
+ });
1164
+ commander_1.program.addCommand(migrationCommand);
1165
+ commander_1.program.addCommand(prepareSnapshotCommand);
1166
+ commander_1.program.parse();
1167
+
1168
+
1169
+ /***/ }),
1170
+
1171
+ /***/ "./src/cli/machines/resolveColumnsMachine.ts":
1172
+ /*!***************************************************!*\
1173
+ !*** ./src/cli/machines/resolveColumnsMachine.ts ***!
1174
+ \***************************************************/
1175
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1176
+
1177
+
1178
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1179
+ const xstate_1 = __webpack_require__(/*! xstate */ "xstate");
1180
+ const createResolveColumnsMachine = (props) => (xstate_1.createMachine({
1181
+ id: 'resolveColumns',
1182
+ initial: 'table',
1183
+ context: {
1184
+ tableName: props.tableWithColumns.name,
1185
+ addedColumns: props.tableWithColumns.added,
1186
+ deletedColumns: props.tableWithColumns.deleted,
1187
+ missingItemIndex: 0,
1188
+ newItemIndex: 0,
1189
+ created: [],
1190
+ renamed: [],
1191
+ deleted: [],
1192
+ },
1193
+ states: {
1194
+ table: {
1195
+ entry: xstate_1.send({ type: 'NEXT' }),
1196
+ on: {
1197
+ NEXT: [
1198
+ {
1199
+ target: 'done',
1200
+ cond: 'isMissingColumnsResolved',
1201
+ actions: ['resolveRemaining'],
1202
+ },
1203
+ {
1204
+ target: 'done',
1205
+ cond: 'isNewColumnsResolved',
1206
+ actions: ['resolveMissing'],
1207
+ },
1208
+ ],
1209
+ CHOICE_ITEM: { target: 'action', actions: ['choseItem'] },
1210
+ },
1211
+ },
1212
+ action: {
1213
+ initial: 'actionChoice',
1214
+ states: {
1215
+ actionChoice: {
1216
+ on: { DELETE: '#resolveColumns.confirmationDelete', RENAME: 'rename' },
1217
+ },
1218
+ rename: {
1219
+ on: {
1220
+ CHOICE_NEW_ITEM: { target: '#resolveColumns.confirmationRename', actions: ['choseNewItem'] },
1221
+ },
1222
+ },
1223
+ },
1224
+ },
1225
+ confirmationDelete: {
1226
+ on: {
1227
+ CANCEL: 'action.actionChoice',
1228
+ CONFIRM: [
1229
+ { target: 'final', actions: ['delete'] },
1230
+ ],
1231
+ },
1232
+ },
1233
+ confirmationRename: {
1234
+ on: {
1235
+ CANCEL: 'action.actionChoice',
1236
+ CONFIRM: [
1237
+ { target: 'final', actions: ['rename'] },
1238
+ ],
1239
+ },
1240
+ },
1241
+ final: {
1242
+ entry: xstate_1.send({ type: 'NEXT' }),
1243
+ on: {
1244
+ NEXT: [
1245
+ {
1246
+ target: 'done',
1247
+ cond: 'isMissingColumnsResolved',
1248
+ actions: ['resolveRemaining'],
1249
+ },
1250
+ {
1251
+ target: 'table',
1252
+ },
1253
+ ],
1254
+ },
1255
+ },
1256
+ done: {},
1257
+ },
1258
+ }, {
1259
+ guards: {
1260
+ isMissingColumnsResolved: ({ deletedColumns }) => !deletedColumns.length,
1261
+ isNewColumnsResolved: ({ addedColumns }) => !addedColumns.length,
1262
+ },
1263
+ actions: {
1264
+ choseItem: xstate_1.assign({
1265
+ missingItemIndex: (context, event) => (event.type === 'CHOICE_ITEM' ? event.itemIndex : 0),
1266
+ }),
1267
+ choseNewItem: xstate_1.assign({
1268
+ newItemIndex: (context, event) => (event.type === 'CHOICE_NEW_ITEM' ? event.itemIndex : 0),
1269
+ }),
1270
+ delete: xstate_1.assign({
1271
+ deleted: ({ missingItemIndex, deleted, deletedColumns, }) => [...deleted, deletedColumns[missingItemIndex]],
1272
+ deletedColumns: ({ missingItemIndex, deletedColumns, }) => deletedColumns.filter((_, index) => index !== missingItemIndex),
1273
+ }),
1274
+ rename: xstate_1.assign({
1275
+ renamed: ({ missingItemIndex, newItemIndex, renamed, addedColumns, deletedColumns, }) => [
1276
+ ...renamed,
1277
+ { old: deletedColumns[missingItemIndex], new: addedColumns[newItemIndex] },
1278
+ ],
1279
+ deletedColumns: ({ missingItemIndex, deletedColumns, }) => deletedColumns.filter((_, index) => index !== missingItemIndex),
1280
+ addedColumns: ({ newItemIndex, addedColumns, }) => addedColumns.filter((_, index) => index !== newItemIndex),
1281
+ }),
1282
+ resolveRemaining: xstate_1.assign({
1283
+ created: ({ addedColumns, created, }) => [...created, ...addedColumns],
1284
+ addedColumns: (context) => [],
1285
+ }),
1286
+ resolveMissing: xstate_1.assign({
1287
+ deleted: ({ deletedColumns, deleted, }) => [...deleted, ...deletedColumns],
1288
+ deletedColumns: (context) => [],
1289
+ }),
1290
+ },
1291
+ }));
1292
+ exports["default"] = createResolveColumnsMachine;
1293
+
1294
+
1295
+ /***/ }),
1296
+
1297
+ /***/ "./src/cli/machines/resolveTablesMachine.ts":
1298
+ /*!**************************************************!*\
1299
+ !*** ./src/cli/machines/resolveTablesMachine.ts ***!
1300
+ \**************************************************/
1301
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1302
+
1303
+
1304
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1305
+ const xstate_1 = __webpack_require__(/*! xstate */ "xstate");
1306
+ const createResolveTablesMachine = (props) => (xstate_1.createMachine({
1307
+ id: 'resolveTables',
1308
+ initial: 'table',
1309
+ context: {
1310
+ ...props,
1311
+ missingItemIndex: 0,
1312
+ newItemIndex: 0,
1313
+ createdTables: [],
1314
+ renamedTables: [],
1315
+ deletedTables: [],
1316
+ },
1317
+ states: {
1318
+ table: {
1319
+ entry: xstate_1.send({ type: 'NEXT' }),
1320
+ on: {
1321
+ NEXT: [
1322
+ {
1323
+ target: 'done',
1324
+ cond: 'isMissingTablesResolved',
1325
+ actions: ['resolveRemaining'],
1326
+ },
1327
+ {
1328
+ target: 'done',
1329
+ cond: 'isNewTablesResolved',
1330
+ actions: ['resolveMissing'],
1331
+ },
1332
+ ],
1333
+ CHOICE_ITEM: { target: 'action', actions: ['choseItem'] },
1334
+ },
1335
+ },
1336
+ action: {
1337
+ initial: 'actionChoice',
1338
+ states: {
1339
+ actionChoice: {
1340
+ on: { DELETE: '#resolveTables.confirmationDelete', RENAME: 'rename' },
1341
+ },
1342
+ rename: {
1343
+ on: {
1344
+ CHOICE_NEW_ITEM: { target: '#resolveTables.confirmationRename', actions: ['choseNewItem'] },
1345
+ },
1346
+ },
1347
+ },
1348
+ },
1349
+ confirmationDelete: {
1350
+ on: {
1351
+ CANCEL: 'action.actionChoice',
1352
+ CONFIRM: [
1353
+ { target: 'final', actions: ['delete'] },
1354
+ ],
1355
+ },
1356
+ },
1357
+ confirmationRename: {
1358
+ on: {
1359
+ CANCEL: 'action.actionChoice',
1360
+ CONFIRM: [
1361
+ { target: 'final', actions: ['rename'] },
1362
+ ],
1363
+ },
1364
+ },
1365
+ final: {
1366
+ entry: xstate_1.send({ type: 'NEXT' }),
1367
+ on: {
1368
+ NEXT: [
1369
+ {
1370
+ target: 'done',
1371
+ cond: 'isMissingTablesResolved',
1372
+ actions: ['resolveRemaining'],
1373
+ },
1374
+ {
1375
+ target: 'table',
1376
+ },
1377
+ ],
1378
+ },
1379
+ },
1380
+ done: {},
1381
+ },
1382
+ }, {
1383
+ guards: {
1384
+ isMissingTablesResolved: ({ missingTables }) => !missingTables.length,
1385
+ isNewTablesResolved: ({ newTables }) => !newTables.length,
1386
+ },
1387
+ actions: {
1388
+ choseItem: xstate_1.assign({
1389
+ missingItemIndex: (context, event) => (event.type === 'CHOICE_ITEM' ? event.itemIndex : 0),
1390
+ }),
1391
+ choseNewItem: xstate_1.assign({
1392
+ newItemIndex: (context, event) => (event.type === 'CHOICE_NEW_ITEM' ? event.itemIndex : 0),
1393
+ }),
1394
+ delete: xstate_1.assign({
1395
+ deletedTables: ({ missingItemIndex, deletedTables, missingTables, }) => [...deletedTables, missingTables[missingItemIndex]],
1396
+ missingTables: ({ missingItemIndex, missingTables, }) => missingTables.filter((_, index) => index !== missingItemIndex),
1397
+ }),
1398
+ rename: xstate_1.assign({
1399
+ renamedTables: ({ missingItemIndex, newItemIndex, renamedTables, newTables, missingTables, }) => [
1400
+ ...renamedTables,
1401
+ { old: missingTables[missingItemIndex], new: newTables[newItemIndex] },
1402
+ ],
1403
+ missingTables: ({ missingItemIndex, missingTables, }) => missingTables.filter((_, index) => index !== missingItemIndex),
1404
+ newTables: ({ newItemIndex, newTables, }) => newTables.filter((_, index) => index !== newItemIndex),
1405
+ }),
1406
+ resolveRemaining: xstate_1.assign({
1407
+ createdTables: ({ newTables, createdTables, }) => [...createdTables, ...newTables],
1408
+ newTables: (context) => [],
1409
+ }),
1410
+ resolveMissing: xstate_1.assign({
1411
+ deletedTables: ({ missingTables, deletedTables, }) => [...deletedTables, ...missingTables],
1412
+ missingTables: (context) => [],
1413
+ }),
1414
+ },
1415
+ }));
1416
+ exports["default"] = createResolveTablesMachine;
1417
+
1418
+
1419
+ /***/ }),
1420
+
1421
+ /***/ "./src/cli/utils/formatDataForTable.ts":
1422
+ /*!*********************************************!*\
1423
+ !*** ./src/cli/utils/formatDataForTable.ts ***!
1424
+ \*********************************************/
1425
+ /***/ ((__unused_webpack_module, exports) => {
1426
+
1427
+
1428
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1429
+ exports["default"] = (data) => {
1430
+ const array = [];
1431
+ array.length = data.reduce((acc, { values }) => {
1432
+ if (acc < values.length) {
1433
+ return values.length;
1434
+ }
1435
+ return acc;
1436
+ }, 0);
1437
+ array.fill({ '': '' });
1438
+ return array.map((_, i) => {
1439
+ const temp = {};
1440
+ data.forEach((item, ind) => {
1441
+ temp[data[ind].title] = item.values[i]?.old?.name
1442
+ ? `${item.values[i]?.old?.name} -> ${item.values[i]?.new?.name}`
1443
+ : item.values[i]?.name || '';
1444
+ });
1445
+ return temp;
1446
+ });
1447
+ };
1448
+
1449
+
1450
+ /***/ }),
1451
+
1452
+ /***/ "./src/cli/utils/valuesForPrompts.ts":
1453
+ /*!*******************************************!*\
1454
+ !*** ./src/cli/utils/valuesForPrompts.ts ***!
1455
+ \*******************************************/
1456
+ /***/ ((__unused_webpack_module, exports) => {
1457
+
1458
+
1459
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1460
+ exports.confirmations = exports.actions = exports.Confirmation = exports.Action = void 0;
1461
+ var Action;
1462
+ (function (Action) {
1463
+ Action["RENAME"] = "RENAME";
1464
+ Action["DELETE"] = "DELETE";
1465
+ })(Action = exports.Action || (exports.Action = {}));
1466
+ var Confirmation;
1467
+ (function (Confirmation) {
1468
+ Confirmation["CANCEL"] = "CANCEL";
1469
+ Confirmation["CONFIRM"] = "CONFIRM";
1470
+ })(Confirmation = exports.Confirmation || (exports.Confirmation = {}));
1471
+ exports.actions = [
1472
+ {
1473
+ key: Action.RENAME,
1474
+ label: 'Renamed',
1475
+ value: Action.RENAME,
1476
+ },
1477
+ {
1478
+ key: Action.DELETE,
1479
+ label: 'Deleted',
1480
+ value: Action.DELETE,
1481
+ },
1482
+ ];
1483
+ exports.confirmations = [
1484
+ {
1485
+ key: Confirmation.CONFIRM,
1486
+ label: 'Yes',
1487
+ value: Confirmation.CONFIRM,
1488
+ },
1489
+ {
1490
+ key: Confirmation.CANCEL,
1491
+ label: 'No',
1492
+ value: Confirmation.CANCEL,
1493
+ },
1494
+ ];
1495
+
1496
+
1497
+ /***/ }),
1498
+
1499
+ /***/ "./src/jsonStatements.ts":
1500
+ /*!*******************************!*\
1501
+ !*** ./src/jsonStatements.ts ***!
1502
+ \*******************************/
1503
+ /***/ ((__unused_webpack_module, exports) => {
1504
+
1505
+
1506
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1507
+ exports.prepareDropIndexesJson = exports.prepareCreateReferencesJson = exports.prepareCreateIndexesJson = exports.prepareAlterTableColumnsJson = exports.prepareAddValuesToEnumJson = exports.prepareCreateEnumJson = exports.prepareRenameTableJson = exports.prepareDropTableJson = exports.prepareCreateTableJson = exports.Types = void 0;
1508
+ class Types {
1509
+ }
1510
+ exports.Types = Types;
1511
+ Types.createTable = 'create_table';
1512
+ Types.dropTable = 'drop_table';
1513
+ Types.renameTable = 'rename_table';
1514
+ Types.alterTableDropColumn = 'alter_table_drop_column';
1515
+ Types.alterTableAddColumn = 'alter_table_add_column';
1516
+ Types.alterTableAlterColumnSetType = 'alter_table_alter_column_set_type';
1517
+ Types.alterTableAlterColumnSetDefault = 'alter_table_alter_column_set_default';
1518
+ Types.alterTableAlterColumnDropDefault = 'alter_table_alter_column_drop_default';
1519
+ Types.alterTableAlterColumnSetNotNull = 'alter_table_alter_column_set_notnull';
1520
+ Types.alterTableAlterColumnDropNotNull = 'alter_table_alter_column_drop_notnull';
1521
+ Types.createIndex = 'create_index';
1522
+ Types.createReference = 'create_reference';
1523
+ Types.dropIndex = 'drop_index';
1524
+ Types.createTypeEnum = 'create_type_enum';
1525
+ Types.alterTypeAddValue = 'alter_type_add_value';
1526
+ const prepareCreateTableJson = (table) => {
1527
+ const { name, columns } = table;
1528
+ return {
1529
+ type: Types.createTable,
1530
+ tableName: name,
1531
+ columns: columns
1532
+ };
1533
+ };
1534
+ exports.prepareCreateTableJson = prepareCreateTableJson;
1535
+ const prepareDropTableJson = (table) => {
1536
+ return {
1537
+ type: Types.dropTable,
1538
+ tableName: table.name
1539
+ };
1540
+ };
1541
+ exports.prepareDropTableJson = prepareDropTableJson;
1542
+ const prepareRenameTableJson = (tableFrom, tableTo) => {
1543
+ return {
1544
+ type: Types.renameTable,
1545
+ from: tableFrom.name,
1546
+ to: tableTo.name
1547
+ };
1548
+ };
1549
+ exports.prepareRenameTableJson = prepareRenameTableJson;
1550
+ const prepareCreateEnumJson = (name, values) => {
1551
+ return {
1552
+ type: Types.createTypeEnum,
1553
+ enumName: name,
1554
+ values
1555
+ };
1556
+ };
1557
+ exports.prepareCreateEnumJson = prepareCreateEnumJson;
1558
+ // https://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
1559
+ const prepareAddValuesToEnumJson = (name, values) => {
1560
+ return values.map(it => {
1561
+ return {
1562
+ type: Types.alterTypeAddValue,
1563
+ enumName: name,
1564
+ enumValue: it
1565
+ };
1566
+ });
1567
+ };
1568
+ exports.prepareAddValuesToEnumJson = prepareAddValuesToEnumJson;
1569
+ const prepareAlterTableColumnsJson = (tableName, deleted, added, altered) => {
1570
+ const statements = [];
1571
+ const dropColumns = _prepareDropColumns(tableName, deleted);
1572
+ const addColumns = _prepareAddColumns(tableName, added);
1573
+ const alterColumns = _prepareAlterColumns(tableName, altered);
1574
+ statements.push(...dropColumns);
1575
+ statements.push(...addColumns);
1576
+ statements.push(...alterColumns);
1577
+ return statements;
1578
+ };
1579
+ exports.prepareAlterTableColumnsJson = prepareAlterTableColumnsJson;
1580
+ const _prepareDropColumns = (taleName, columns) => {
1581
+ return columns.map(it => {
1582
+ return {
1583
+ type: Types.alterTableDropColumn,
1584
+ tableName: taleName,
1585
+ columnName: it.name
1586
+ };
1587
+ });
1588
+ };
1589
+ const _prepareAddColumns = (tableName, columns) => {
1590
+ return columns.map(it => {
1591
+ return {
1592
+ type: Types.alterTableAddColumn,
1593
+ tableName,
1594
+ column: it
1595
+ };
1596
+ });
1597
+ };
1598
+ const _prepareAlterColumns = (tableName, columns) => {
1599
+ let statements = [];
1600
+ for (const column of columns) {
1601
+ const columnName = column.name;
1602
+ if (column.type?.type === 'changed') {
1603
+ statements.push({
1604
+ type: Types.alterTableAlterColumnSetType,
1605
+ tableName,
1606
+ columnName,
1607
+ newDataType: column.type.new
1608
+ });
1609
+ }
1610
+ if (column.defaultValue?.type === 'added') {
1611
+ statements.push({
1612
+ type: Types.alterTableAlterColumnSetDefault,
1613
+ tableName,
1614
+ columnName,
1615
+ newDefault: column.defaultValue.value
1616
+ });
1617
+ }
1618
+ if (column.defaultValue?.type === 'changed') {
1619
+ statements.push({
1620
+ type: Types.alterTableAlterColumnSetDefault,
1621
+ tableName,
1622
+ columnName,
1623
+ newDefault: column.defaultValue.new
1624
+ });
1625
+ }
1626
+ if (column.defaultValue?.type === 'deleted') {
1627
+ statements.push({
1628
+ type: Types.alterTableAlterColumnDropDefault,
1629
+ tableName,
1630
+ columnName,
1631
+ });
1632
+ }
1633
+ if (column.notNull?.type === 'added') {
1634
+ statements.push({
1635
+ type: Types.alterTableAlterColumnSetNotNull,
1636
+ tableName,
1637
+ columnName
1638
+ });
1639
+ }
1640
+ if (column.notNull?.type === 'changed') {
1641
+ const type = column.notNull.new ? Types.alterTableAlterColumnSetNotNull : Types.alterTableAlterColumnDropNotNull;
1642
+ statements.push({
1643
+ type: type,
1644
+ tableName,
1645
+ columnName
1646
+ });
1647
+ }
1648
+ if (column.notNull?.type === 'deleted') {
1649
+ statements.push({
1650
+ type: Types.alterTableAlterColumnDropNotNull,
1651
+ tableName,
1652
+ columnName
1653
+ });
1654
+ }
1655
+ }
1656
+ return statements;
1657
+ };
1658
+ const prepareCreateIndexesJson = (tableName, indexes) => {
1659
+ return indexes.map(index => {
1660
+ return {
1661
+ type: Types.createIndex,
1662
+ tableName,
1663
+ indexName: index.name,
1664
+ indexValue: index.columns.join(', ')
1665
+ };
1666
+ });
1667
+ };
1668
+ exports.prepareCreateIndexesJson = prepareCreateIndexesJson;
1669
+ const prepareCreateReferencesJson = (tableName, columns) => {
1670
+ return columns.filter(it => {
1671
+ return it.references !== undefined;
1672
+ }).map(entry => {
1673
+ const column = entry;
1674
+ const references = column.references;
1675
+ return {
1676
+ type: Types.createReference,
1677
+ fromTable: tableName,
1678
+ toTable: references.table,
1679
+ fromColumn: column.name,
1680
+ toColum: references.column,
1681
+ foreignKeyName: references.foreignKeyName,
1682
+ onDelete: references.onDelete,
1683
+ onUpdate: references.onUpdate,
1684
+ };
1685
+ });
1686
+ };
1687
+ exports.prepareCreateReferencesJson = prepareCreateReferencesJson;
1688
+ const prepareDropIndexesJson = (tableName, indexes) => {
1689
+ return indexes.map(index => {
1690
+ return {
1691
+ type: Types.dropIndex,
1692
+ tableName,
1693
+ indexName: index.name,
1694
+ };
1695
+ });
1696
+ };
1697
+ exports.prepareDropIndexesJson = prepareDropIndexesJson;
1698
+
1699
+
1700
+ /***/ }),
1701
+
1702
+ /***/ "./src/migrationPreparator.ts":
1703
+ /*!************************************!*\
1704
+ !*** ./src/migrationPreparator.ts ***!
1705
+ \************************************/
1706
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1707
+
1708
+
1709
+ var __importDefault = (this && this.__importDefault) || function (mod) {
1710
+ return (mod && mod.__esModule) ? mod : { "default": mod };
1711
+ };
1712
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1713
+ const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
1714
+ const serializer_1 = __importDefault(__webpack_require__(/*! serializer */ "./src/serializer/index.ts"));
1715
+ // TODO: export as a function w
1716
+ const dry = {
1717
+ version: "1",
1718
+ tables: {},
1719
+ enums: {}
1720
+ };
1721
+ const prepareMigration = (migrationRootFolderName = 'drizzle', dataFolderPath) => {
1722
+ const root = migrationRootFolderName;
1723
+ const files = fs_1.default.readdirSync('./');
1724
+ const drizzleFolder = files.find((it) => {
1725
+ return it === root;
1726
+ });
1727
+ if (!drizzleFolder) {
1728
+ fs_1.default.mkdirSync(root);
1729
+ }
1730
+ const migrationFolders = fs_1.default.readdirSync(`./${root}`);
1731
+ let prevSnapshot;
1732
+ if (migrationFolders.length === 0) {
1733
+ prevSnapshot = dry;
1734
+ }
1735
+ else {
1736
+ migrationFolders.sort();
1737
+ const lastSnapshotFolder = migrationFolders[migrationFolders.length - 1];
1738
+ console.log(lastSnapshotFolder);
1739
+ prevSnapshot = JSON.parse(fs_1.default.readFileSync(`./${root}/${lastSnapshotFolder}/snapshot.json`).toString());
1740
+ }
1741
+ const tbls = `${dataFolderPath}/tables/`;
1742
+ const tps = `${dataFolderPath}/types/`;
1743
+ const result = serializer_1.default(tbls, tps);
1744
+ return { prev: prevSnapshot, cur: result };
1745
+ };
1746
+ exports["default"] = prepareMigration;
1747
+
1748
+
1749
+ /***/ }),
1750
+
1751
+ /***/ "./src/serializer/factory.ts":
1752
+ /*!***********************************!*\
1753
+ !*** ./src/serializer/factory.ts ***!
1754
+ \***********************************/
1755
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1756
+
1757
+
1758
+ var __importDefault = (this && this.__importDefault) || function (mod) {
1759
+ return (mod && mod.__esModule) ? mod : { "default": mod };
1760
+ };
1761
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1762
+ const typescript_1 = __importDefault(__webpack_require__(/*! typescript */ "typescript"));
1763
+ const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
1764
+ const printer = typescript_1.default.createPrinter();
1765
+ const prepareFabricFile = (tablesFolder, typesFolder) => {
1766
+ const staticImports = [
1767
+ typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(undefined, typescript_1.default.createNamespaceImport(typescript_1.default.createIdentifier('drizzle'))), typescript_1.default.createStringLiteral('drizzle-orm')),
1768
+ typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(typescript_1.default.createIdentifier('MigrationSerializer'), undefined), typescript_1.default.createStringLiteral('drizzle-orm/serializer/serializer')),
1769
+ typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(typescript_1.default.createIdentifier("Enum"), undefined), typescript_1.default.createStringLiteral("drizzle-orm/types/type")),
1770
+ typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(undefined, typescript_1.default.createNamespaceImport(typescript_1.default.createIdentifier('pg'))), typescript_1.default.createStringLiteral('pg')),
1771
+ ];
1772
+ const dynamicImports = [];
1773
+ const tablesFilenames = fs_1.default.readdirSync(tablesFolder);
1774
+ for (let i = 0; i < tablesFilenames.length; i++) {
1775
+ const filename = tablesFilenames[i];
1776
+ const importPath = `${tablesFolder}${filename.split(".")[0]}`;
1777
+ dynamicImports.push(typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(undefined, typescript_1.default.createNamespaceImport(typescript_1.default.createIdentifier(`i${i}`))), typescript_1.default.createStringLiteral(importPath)));
1778
+ }
1779
+ const typesFilenames = fs_1.default.readdirSync(typesFolder);
1780
+ for (let i = 0; i < typesFilenames.length; i++) {
1781
+ const filename = typesFilenames[i];
1782
+ const importPath = `${typesFolder}${filename.split(".")[0]}`;
1783
+ dynamicImports.push(typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(undefined, typescript_1.default.createNamespaceImport(typescript_1.default.createIdentifier(`t${i}`))), typescript_1.default.createStringLiteral(importPath)));
1784
+ }
1785
+ const variablesStatements = [
1786
+ typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1787
+ typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier("db"), undefined, typescript_1.default.createNew(typescript_1.default.createIdentifier("drizzle.DB"), undefined, [
1788
+ typescript_1.default.createNew(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier('pg'), typescript_1.default.createIdentifier('Pool')), undefined, []),
1789
+ ])),
1790
+ ], typescript_1.default.NodeFlags.Const)),
1791
+ typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1792
+ typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier("serializer"), undefined, typescript_1.default.createNew(typescript_1.default.createIdentifier("MigrationSerializer"), undefined, [])),
1793
+ ], typescript_1.default.NodeFlags.Const)),
1794
+ ];
1795
+ const blockStatements = [];
1796
+ // const tables = []
1797
+ blockStatements.push(typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1798
+ typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier('tables'), typescript_1.default.createArrayTypeNode(typescript_1.default.createTypeReferenceNode(typescript_1.default.createQualifiedName(typescript_1.default.createIdentifier('drizzle'), typescript_1.default.createIdentifier('AbstractTable')), [typescript_1.default.createKeywordTypeNode(typescript_1.default.SyntaxKind.AnyKeyword)])), typescript_1.default.createArrayLiteral([], false)),
1799
+ ], typescript_1.default.NodeFlags.Const)));
1800
+ for (let i = 0; i < tablesFilenames.length; i++) {
1801
+ // const t1 = (new i1.default(db) as unknown as AbstractTable<any>);
1802
+ // tables.push(t1)
1803
+ const blockStatement = [
1804
+ typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1805
+ typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier("table" + i), undefined, typescript_1.default.createParen(typescript_1.default.createAsExpression(typescript_1.default.createAsExpression(typescript_1.default.createNew(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier("i" + i), typescript_1.default.createIdentifier("default")), undefined, [typescript_1.default.createIdentifier("db")]), typescript_1.default.createKeywordTypeNode(typescript_1.default.SyntaxKind.UnknownKeyword)), typescript_1.default.createTypeReferenceNode(typescript_1.default.createQualifiedName(typescript_1.default.createIdentifier('drizzle'), typescript_1.default.createIdentifier('AbstractTable')), [
1806
+ typescript_1.default.createKeywordTypeNode(typescript_1.default.SyntaxKind.AnyKeyword)
1807
+ ])))),
1808
+ ], typescript_1.default.NodeFlags.Const)),
1809
+ typescript_1.default.createExpressionStatement(typescript_1.default.createCall(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier("tables"), typescript_1.default.createIdentifier("push")), undefined, [typescript_1.default.createIdentifier("table" + i)])),
1810
+ ];
1811
+ blockStatements.push(...blockStatement);
1812
+ }
1813
+ // const enums = []
1814
+ blockStatements.push(typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1815
+ typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier('enums'), typescript_1.default.createArrayTypeNode(typescript_1.default.createTypeReferenceNode(typescript_1.default.createIdentifier('Enum'), [typescript_1.default.createKeywordTypeNode(typescript_1.default.SyntaxKind.AnyKeyword)])), typescript_1.default.createArrayLiteral([], false))
1816
+ ], typescript_1.default.NodeFlags.Const)));
1817
+ // Object.values(t0).forEach((t) => {
1818
+ // enums.push(t as Enum<any>);
1819
+ // });
1820
+ if (typesFilenames.length > 0) {
1821
+ blockStatements.push(typescript_1.default.createExpressionStatement(typescript_1.default.createCall(typescript_1.default.createPropertyAccess(typescript_1.default.createCall(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier("Object"), typescript_1.default.createIdentifier("values")), undefined, [typescript_1.default.createIdentifier("t0")]), typescript_1.default.createIdentifier("forEach")), undefined, [
1822
+ typescript_1.default.createArrowFunction(undefined, undefined, [
1823
+ typescript_1.default.createParameter(undefined, undefined, undefined, typescript_1.default.createIdentifier("t"), undefined, undefined, undefined),
1824
+ ], undefined, typescript_1.default.createToken(typescript_1.default.SyntaxKind.EqualsGreaterThanToken), typescript_1.default.createBlock([
1825
+ typescript_1.default.createExpressionStatement(typescript_1.default.createCall(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier("enums"), typescript_1.default.createIdentifier("push")), undefined, [
1826
+ typescript_1.default.createAsExpression(typescript_1.default.createAsExpression(typescript_1.default.createIdentifier("t"), typescript_1.default.createKeywordTypeNode(typescript_1.default.SyntaxKind.UnknownKeyword)), typescript_1.default.createTypeReferenceNode(typescript_1.default.createIdentifier("Enum"), [
1827
+ typescript_1.default.createKeywordTypeNode(typescript_1.default.SyntaxKind.AnyKeyword),
1828
+ ])),
1829
+ ])),
1830
+ ], true)),
1831
+ ])));
1832
+ }
1833
+ // return serializer.generate(tables, enums)
1834
+ blockStatements.push(typescript_1.default.createReturn(typescript_1.default.createCall(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier("serializer"), typescript_1.default.createIdentifier("generate")), undefined, [
1835
+ typescript_1.default.createIdentifier("tables"),
1836
+ typescript_1.default.createIdentifier("enums"),
1837
+ ])));
1838
+ const funcStatement = [
1839
+ typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1840
+ typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier("testFun"), undefined, typescript_1.default.createArrowFunction(undefined, undefined, [], undefined, typescript_1.default.createToken(typescript_1.default.SyntaxKind.EqualsGreaterThanToken),
1841
+ // function body
1842
+ typescript_1.default.createBlock(blockStatements, true))),
1843
+ ], typescript_1.default.NodeFlags.Const)),
1844
+ ];
1845
+ const invocationStatement = [
1846
+ typescript_1.default.createExpressionStatement(typescript_1.default.createCall(typescript_1.default.createIdentifier("testFun"), undefined, [])),
1847
+ ];
1848
+ const outFile = typescript_1.default.createSourceFile("outfile.ts", "", typescript_1.default.ScriptTarget.ES2015, true, typescript_1.default.ScriptKind.TS);
1849
+ const source = [];
1850
+ source.push(...staticImports);
1851
+ source.push(...dynamicImports);
1852
+ source.push(...variablesStatements);
1853
+ source.push(...funcStatement);
1854
+ source.push(...invocationStatement);
1855
+ const newFile = typescript_1.default.factory.updateSourceFile(outFile, source);
1856
+ return printer.printFile(newFile);
1857
+ };
1858
+ exports["default"] = prepareFabricFile;
1859
+
1860
+
1861
+ /***/ }),
1862
+
1863
+ /***/ "./src/serializer/index.ts":
1864
+ /*!*********************************!*\
1865
+ !*** ./src/serializer/index.ts ***!
1866
+ \*********************************/
1867
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1868
+
1869
+
1870
+ var __importDefault = (this && this.__importDefault) || function (mod) {
1871
+ return (mod && mod.__esModule) ? mod : { "default": mod };
1872
+ };
1873
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1874
+ const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
1875
+ const string_decoder_1 = __webpack_require__(/*! string_decoder */ "string_decoder");
1876
+ const factory_1 = __importDefault(__webpack_require__(/*! ./factory */ "./src/serializer/factory.ts"));
1877
+ const esbuild = __webpack_require__(/*! esbuild */ "esbuild");
1878
+ const serialize = (pathToTables, pathToTypes) => {
1879
+ const decoder = new string_decoder_1.StringDecoder();
1880
+ // const preparedFarbic = prepareFabricFile("./examples/tables/", './examples/types/')
1881
+ const preparedFarbic = factory_1.default(pathToTables, pathToTypes);
1882
+ fs_1.default.writeFileSync("__out.ts", preparedFarbic, "utf-8");
1883
+ const result = esbuild.buildSync({
1884
+ entryPoints: ["__out.ts"],
1885
+ bundle: true,
1886
+ platform: "node",
1887
+ write: false,
1888
+ external: ["pg-native"],
1889
+ });
1890
+ fs_1.default.unlinkSync("__out.ts");
1891
+ return eval(decoder.write(result.outputFiles[0].contents));
1892
+ };
1893
+ exports["default"] = serialize;
1894
+
1895
+
1896
+ /***/ }),
1897
+
1898
+ /***/ "./src/snapshotsDiffer.ts":
1899
+ /*!********************************!*\
1900
+ !*** ./src/snapshotsDiffer.ts ***!
1901
+ \********************************/
1902
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1903
+
1904
+
1905
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1906
+ exports.applySnapshotsDiff = void 0;
1907
+ const sqlgenerator_1 = __webpack_require__(/*! ./sqlgenerator */ "./src/sqlgenerator.js");
1908
+ const jsonDiffer_1 = __webpack_require__(/*! ./jsonDiffer */ "./src/jsonDiffer.js");
1909
+ const jsonStatements_1 = __webpack_require__(/*! ./jsonStatements */ "./src/jsonStatements.ts");
1910
+ const applySnapshotsDiff = async (json1, json2, tablesResolver, columnsResolver) => {
1911
+ const diffResult = jsonDiffer_1.applyJsonDiff(json1, json2);
1912
+ const typedResult = diffResult;
1913
+ const { created, deleted, renamed } = await tablesResolver({ created: typedResult.addedTables, deleted: typedResult.deletedTables });
1914
+ const jsonStatements = [];
1915
+ const jsonCreateTables = created.map(it => {
1916
+ return jsonStatements_1.prepareCreateTableJson(it);
1917
+ });
1918
+ const jsonCreateIndexesForCreatedTables = created.map(it => {
1919
+ return jsonStatements_1.prepareCreateIndexesJson(it.name, it.indexes);
1920
+ }).flat();
1921
+ const jsonDropTables = deleted.map(it => {
1922
+ return jsonStatements_1.prepareDropTableJson(it);
1923
+ });
1924
+ const jsonRenameTables = renamed.map(it => {
1925
+ return jsonStatements_1.prepareRenameTableJson(it.from, it.to);
1926
+ });
1927
+ // const createNewTables = created.map(it => {
1928
+ // return prepareCreateTable(it)
1929
+ // })
1930
+ // console.log(createNewTables.join('\n').trim())
1931
+ // const deleteTables = deleted.map(it => {
1932
+ // return prepareDropTable(it)
1933
+ // })
1934
+ // console.log(deleteTables.join('\n').trim())
1935
+ const renamedWithAlternations = jsonDiffer_1.diffForRenamed(renamed);
1936
+ const allAltered = typedResult.alteredTablesWithColumns.concat(renamedWithAlternations);
1937
+ const allAlteredResolved = [];
1938
+ for (const table of allAltered) {
1939
+ const result = await columnsResolver({ tableName: table.name, created: table.added, deleted: table.deleted });
1940
+ const { deleted, added, ...ini } = table;
1941
+ allAlteredResolved.push({ ...ini, ...result });
1942
+ }
1943
+ // const renameTables = renamed.map(it => {
1944
+ // return prepareRenameTable(it.from, it.to)
1945
+ // })
1946
+ // console.log(renameTables.join('\n').trim())
1947
+ const jsonAlterTables = allAlteredResolved.map(it => {
1948
+ return jsonStatements_1.prepareAlterTableColumnsJson(it.name, it.deleted, it.created, it.altered);
1949
+ }).flat();
1950
+ const jsonCreateIndexesForAllAlteredTables = allAltered.map(it => {
1951
+ return jsonStatements_1.prepareCreateIndexesJson(it.name, it.addedIndexes || {});
1952
+ }).flat();
1953
+ const jsonDropIndexesForAllAlteredTables = allAltered.map(it => {
1954
+ return jsonStatements_1.prepareDropIndexesJson(it.name, it.deletedIndexes || {});
1955
+ }).flat();
1956
+ const jsonCreateReferencesForCreatedTables = created.map(it => {
1957
+ return jsonStatements_1.prepareCreateReferencesJson(it.name, Object.values(it.columns));
1958
+ }).flat();
1959
+ const jsonCreateReferencesForAllAlteredTables = allAltered.map(it => {
1960
+ return jsonStatements_1.prepareCreateReferencesJson(it.name, it.added);
1961
+ }).flat();
1962
+ const jsonCreateReferences = jsonCreateReferencesForCreatedTables.concat(jsonCreateReferencesForAllAlteredTables);
1963
+ // // Enums:
1964
+ // // - создание енама ✅
1965
+ // // - переименование енама (пока не делаю)⏳
1966
+ // // - добавление вэлью к енаму ✅
1967
+ // // - ренейм вейлью у енама (пока не делаю, это надо запрашивать опять же через слай)⏳
1968
+ // // - удаление енама -> чекать не используется ли где-то енам и сначала ранить миграции и в самом конце удаление енама⏳
1969
+ // // - удаление вэлью из енама -> блок ❌
1970
+ // const enums = result.addedEnums.map(it => {
1971
+ // return prepareCreateEnum(it.name, it.values)
1972
+ // })
1973
+ const createEnums = diffResult.addedEnums.map(it => {
1974
+ return jsonStatements_1.prepareCreateEnumJson(it.name, it.values);
1975
+ });
1976
+ //todo: block enum rename, enum value rename and enun deletion for now
1977
+ const jsonAlterEnumsWithAddedValues = diffResult.alteredEnums.map(it => {
1978
+ return jsonStatements_1.prepareAddValuesToEnumJson(it.name, it.addedValues);
1979
+ }).flat();
1980
+ jsonStatements.push(...createEnums);
1981
+ jsonStatements.push(...jsonAlterEnumsWithAddedValues);
1982
+ jsonStatements.push(...jsonCreateTables);
1983
+ jsonStatements.push(...jsonDropTables);
1984
+ jsonStatements.push(...jsonRenameTables);
1985
+ jsonStatements.push(...jsonAlterTables);
1986
+ jsonStatements.push(...jsonCreateReferences);
1987
+ jsonStatements.push(...jsonCreateIndexesForCreatedTables);
1988
+ jsonStatements.push(...jsonCreateIndexesForAllAlteredTables);
1989
+ jsonStatements.push(...jsonDropIndexesForAllAlteredTables);
1990
+ // console.log(JSON.stringify(jsonStatements, null, 2))
1991
+ // console.log(jsonStatements)
1992
+ const sqlStatements = sqlgenerator_1.fromJson(jsonStatements);
1993
+ return sqlStatements.join('\n');
1994
+ };
1995
+ exports.applySnapshotsDiff = applySnapshotsDiff;
1996
+ // console.log(enums.join('\n').trim())
1997
+ // console.log(alteredEnums.join('\n').trim())
1998
+ // explicitely ask if tables were renamed, if yes - add those to altered tables, otherwise - deleted
1999
+ // double check if user wants to delete particular table and warn him on data loss
2000
+
2001
+
2002
+ /***/ }),
2003
+
2004
+ /***/ "@xstate/react":
2005
+ /*!********************************!*\
2006
+ !*** external "@xstate/react" ***!
2007
+ \********************************/
2008
+ /***/ ((module) => {
2009
+
2010
+ module.exports = require("@xstate/react");
2011
+
2012
+ /***/ }),
2013
+
2014
+ /***/ "commander":
2015
+ /*!****************************!*\
2016
+ !*** external "commander" ***!
2017
+ \****************************/
2018
+ /***/ ((module) => {
2019
+
2020
+ module.exports = require("commander");
2021
+
2022
+ /***/ }),
2023
+
2024
+ /***/ "esbuild":
2025
+ /*!**************************!*\
2026
+ !*** external "esbuild" ***!
2027
+ \**************************/
2028
+ /***/ ((module) => {
2029
+
2030
+ module.exports = require("esbuild");
2031
+
2032
+ /***/ }),
2033
+
2034
+ /***/ "ink":
2035
+ /*!**********************!*\
2036
+ !*** external "ink" ***!
2037
+ \**********************/
2038
+ /***/ ((module) => {
2039
+
2040
+ module.exports = require("ink");
2041
+
2042
+ /***/ }),
2043
+
2044
+ /***/ "ink-select-input":
2045
+ /*!***********************************!*\
2046
+ !*** external "ink-select-input" ***!
2047
+ \***********************************/
2048
+ /***/ ((module) => {
2049
+
2050
+ module.exports = require("ink-select-input");
2051
+
2052
+ /***/ }),
2053
+
2054
+ /***/ "ink-spinner":
2055
+ /*!******************************!*\
2056
+ !*** external "ink-spinner" ***!
2057
+ \******************************/
2058
+ /***/ ((module) => {
2059
+
2060
+ module.exports = require("ink-spinner");
2061
+
2062
+ /***/ }),
2063
+
2064
+ /***/ "ink-table":
2065
+ /*!****************************!*\
2066
+ !*** external "ink-table" ***!
2067
+ \****************************/
2068
+ /***/ ((module) => {
2069
+
2070
+ module.exports = require("ink-table");
2071
+
2072
+ /***/ }),
2073
+
2074
+ /***/ "js-yaml":
2075
+ /*!**************************!*\
2076
+ !*** external "js-yaml" ***!
2077
+ \**************************/
2078
+ /***/ ((module) => {
2079
+
2080
+ module.exports = require("js-yaml");
2081
+
2082
+ /***/ }),
2083
+
2084
+ /***/ "json-diff":
2085
+ /*!****************************!*\
2086
+ !*** external "json-diff" ***!
2087
+ \****************************/
2088
+ /***/ ((module) => {
2089
+
2090
+ module.exports = require("json-diff");
2091
+
2092
+ /***/ }),
2093
+
2094
+ /***/ "pretty-error/start":
2095
+ /*!*************************************!*\
2096
+ !*** external "pretty-error/start" ***!
2097
+ \*************************************/
2098
+ /***/ ((module) => {
2099
+
2100
+ module.exports = require("pretty-error/start");
2101
+
2102
+ /***/ }),
2103
+
2104
+ /***/ "react":
2105
+ /*!************************!*\
2106
+ !*** external "react" ***!
2107
+ \************************/
2108
+ /***/ ((module) => {
2109
+
2110
+ module.exports = require("react");
2111
+
2112
+ /***/ }),
2113
+
2114
+ /***/ "source-map-support/register":
2115
+ /*!**********************************************!*\
2116
+ !*** external "source-map-support/register" ***!
2117
+ \**********************************************/
2118
+ /***/ ((module) => {
2119
+
2120
+ module.exports = require("source-map-support/register");
2121
+
2122
+ /***/ }),
2123
+
2124
+ /***/ "string_decoder":
2125
+ /*!*********************************!*\
2126
+ !*** external "string_decoder" ***!
2127
+ \*********************************/
2128
+ /***/ ((module) => {
2129
+
2130
+ module.exports = require("string_decoder");
2131
+
2132
+ /***/ }),
2133
+
2134
+ /***/ "typescript":
2135
+ /*!*****************************!*\
2136
+ !*** external "typescript" ***!
2137
+ \*****************************/
2138
+ /***/ ((module) => {
2139
+
2140
+ module.exports = require("typescript");
2141
+
2142
+ /***/ }),
2143
+
2144
+ /***/ "valtio":
2145
+ /*!*************************!*\
2146
+ !*** external "valtio" ***!
2147
+ \*************************/
2148
+ /***/ ((module) => {
2149
+
2150
+ module.exports = require("valtio");
2151
+
2152
+ /***/ }),
2153
+
2154
+ /***/ "xstate":
2155
+ /*!*************************!*\
2156
+ !*** external "xstate" ***!
2157
+ \*************************/
2158
+ /***/ ((module) => {
2159
+
2160
+ module.exports = require("xstate");
2161
+
2162
+ /***/ }),
2163
+
2164
+ /***/ "fs":
2165
+ /*!*********************!*\
2166
+ !*** external "fs" ***!
2167
+ \*********************/
2168
+ /***/ ((module) => {
2169
+
2170
+ module.exports = require("fs");
2171
+
2172
+ /***/ })
2173
+
2174
+ /******/ });
2175
+ /************************************************************************/
2176
+ /******/ // The module cache
2177
+ /******/ var __webpack_module_cache__ = {};
2178
+ /******/
2179
+ /******/ // The require function
2180
+ /******/ function __webpack_require__(moduleId) {
2181
+ /******/ // Check if module is in cache
2182
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
2183
+ /******/ if (cachedModule !== undefined) {
2184
+ /******/ return cachedModule.exports;
2185
+ /******/ }
2186
+ /******/ // Create a new module (and put it into the cache)
2187
+ /******/ var module = __webpack_module_cache__[moduleId] = {
2188
+ /******/ // no module.id needed
2189
+ /******/ // no module.loaded needed
2190
+ /******/ exports: {}
2191
+ /******/ };
2192
+ /******/
2193
+ /******/ // Execute the module function
2194
+ /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
2195
+ /******/
2196
+ /******/ // Return the exports of the module
2197
+ /******/ return module.exports;
2198
+ /******/ }
2199
+ /******/
2200
+ /************************************************************************/
2201
+ /******/ /* webpack/runtime/compat get default export */
2202
+ /******/ (() => {
2203
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
2204
+ /******/ __webpack_require__.n = (module) => {
2205
+ /******/ var getter = module && module.__esModule ?
2206
+ /******/ () => (module['default']) :
2207
+ /******/ () => (module);
2208
+ /******/ __webpack_require__.d(getter, { a: getter });
2209
+ /******/ return getter;
2210
+ /******/ };
2211
+ /******/ })();
2212
+ /******/
2213
+ /******/ /* webpack/runtime/define property getters */
2214
+ /******/ (() => {
2215
+ /******/ // define getter functions for harmony exports
2216
+ /******/ __webpack_require__.d = (exports, definition) => {
2217
+ /******/ for(var key in definition) {
2218
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
2219
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
2220
+ /******/ }
2221
+ /******/ }
2222
+ /******/ };
2223
+ /******/ })();
2224
+ /******/
2225
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
2226
+ /******/ (() => {
2227
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
2228
+ /******/ })();
2229
+ /******/
2230
+ /******/ /* webpack/runtime/make namespace object */
2231
+ /******/ (() => {
2232
+ /******/ // define __esModule on exports
2233
+ /******/ __webpack_require__.r = (exports) => {
2234
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
2235
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2236
+ /******/ }
2237
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
2238
+ /******/ };
2239
+ /******/ })();
2240
+ /******/
2241
+ /************************************************************************/
2242
+ /******/
2243
+ /******/ // startup
2244
+ /******/ // Load entry module and return exports
2245
+ /******/ // This entry module is referenced by other modules so it can't be inlined
2246
+ /******/ var __webpack_exports__ = __webpack_require__("./src/cli/index.tsx");
2247
+ /******/
2248
+ /******/ })()
2249
+ ;
2250
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FDQUE7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7QUNBQTs7Ozs7O1VDQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGlDQUFpQyxXQUFXO1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7O1VFTkE7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9qc29uRGlmZmVyLmpzIiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL3NxbGdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvY29tbWFuZHMvbWlncmF0ZS50c3giLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvLi9zcmMvY2xpL2NvbW1hbmRzL3ByZXBhcmUtc25hcHNob3QudHMiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvLi9zcmMvY2xpL2NvbXBvbmVudHMtYXBpL0NvbXBvbmVudHNMaXN0LnRzeCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvY29tcG9uZW50cy1hcGkvQ3JlYXRlQXBwLnRzeCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvY29tcG9uZW50cy1hcGkvY29tcG9uZW50cy9Qcm9tcHRDb2x1bW5zQ29uZmxpY3RzLnRzeCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvY29tcG9uZW50cy1hcGkvY29tcG9uZW50cy9Qcm9tcHRUYWJsZXNDb25mbGljdHMudHN4Iiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL2NsaS9jb21wb25lbnRzLWFwaS9jb21wb25lbnRzL1Rhc2sudHN4Iiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL2NsaS9jb21wb25lbnRzLWFwaS9pbmRleC50c3giLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvLi9zcmMvY2xpL2luZGV4LnRzeCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvbWFjaGluZXMvcmVzb2x2ZUNvbHVtbnNNYWNoaW5lLnRzIiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL2NsaS9tYWNoaW5lcy9yZXNvbHZlVGFibGVzTWFjaGluZS50cyIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvdXRpbHMvZm9ybWF0RGF0YUZvclRhYmxlLnRzIiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL2NsaS91dGlscy92YWx1ZXNGb3JQcm9tcHRzLnRzIiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL2pzb25TdGF0ZW1lbnRzLnRzIiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL21pZ3JhdGlvblByZXBhcmF0b3IudHMiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvLi9zcmMvc2VyaWFsaXplci9mYWN0b3J5LnRzIiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL3NlcmlhbGl6ZXIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvLi9zcmMvc25hcHNob3RzRGlmZmVyLnRzIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwiQHhzdGF0ZS9yZWFjdFwiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwiY29tbWFuZGVyXCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvZXh0ZXJuYWwgY29tbW9uanMgXCJlc2J1aWxkXCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvZXh0ZXJuYWwgY29tbW9uanMgXCJpbmtcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBjb21tb25qcyBcImluay1zZWxlY3QtaW5wdXRcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBjb21tb25qcyBcImluay1zcGlubmVyXCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvZXh0ZXJuYWwgY29tbW9uanMgXCJpbmstdGFibGVcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBjb21tb25qcyBcImpzLXlhbWxcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBjb21tb25qcyBcImpzb24tZGlmZlwiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwicHJldHR5LWVycm9yL3N0YXJ0XCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvZXh0ZXJuYWwgY29tbW9uanMgXCJyZWFjdFwiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwic291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyXCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvZXh0ZXJuYWwgY29tbW9uanMgXCJzdHJpbmdfZGVjb2RlclwiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwidHlwZXNjcmlwdFwiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwidmFsdGlvXCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvZXh0ZXJuYWwgY29tbW9uanMgXCJ4c3RhdGVcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiZnNcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2RyaXp6bGUta2l0L3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL2RyaXp6bGUta2l0L3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlLXN0cmljdCc7XG5cbmltcG9ydCB7IGRpZmYgfSBmcm9tICdqc29uLWRpZmYnXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZGb3JSZW5hbWVkKHBhaXJzKSB7XG4gICAgLy8gcmFuYW1lIHRhYmxlMSB0byBuYW1lIG9mIHRhYmxlMiwgc28gd2UgY2FuIGFwcGx5IGRpZmZzXG4gICAgY29uc3QgcmVuYW1lZCA9IHBhaXJzLm1hcChpdCA9PiB7XG4gICAgICAgIGNvbnN0IGZyb20gPSBpdC5mcm9tIHx8IGl0Lm9sZFxuICAgICAgICBjb25zdCB0byA9IGl0LnRvIHx8IGl0Lm5ld1xuICAgICAgICBjb25zdCBuZXdGcm9tID0geyAuLi5mcm9tLCBuYW1lOiB0by5uYW1lIH1cbiAgICAgICAgcmV0dXJuIFtuZXdGcm9tLCB0b11cbiAgICB9KVxuXG4gICAgLy8gZmluZCBhbnkgYWx0ZXJuYXRpb25zIG1hZGUgdG8gYSByZW5hbWVkIHRhYmxlXG4gICAgY29uc3QgYWx0ZXJlZCA9IHJlbmFtZWQubWFwKHBhaXIgPT4ge1xuICAgICAgICBjb25zdCBkaWZmZWQgPSBkaWZmKHBhaXJbMF0sIHBhaXJbMV0pO1xuICAgICAgICBkaWZmZWQubmFtZSA9IHBhaXJbMF0ubmFtZVxuXG4gICAgICAgIHJldHVybiBmaW5kQWx0ZXJuYXRpb25zSW5UYWJsZShkaWZmZWQpXG4gICAgfSlcblxuICAgIHJldHVybiBhbHRlcmVkXG59XG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uRGlmZihqc29uMSwganNvbjIpIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gZGlmZihqc29uMSwganNvbjIpO1xuXG4gICAgZGlmZmVyZW5jZS50YWJsZXMgPSBkaWZmZXJlbmNlLnRhYmxlcyA/IGRpZmZlcmVuY2UudGFibGVzIDoge31cbiAgICBkaWZmZXJlbmNlLmVudW1zID0gZGlmZmVyZW5jZS5lbnVtcyA/IGRpZmZlcmVuY2UuZW51bXMgOiB7fVxuXG4gICAgY29uc3QgdGFibGVFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGlmZmVyZW5jZS50YWJsZXMpXG4gICAgY29uc3QgYWRkZWRUYWJsZXMgPSB0YWJsZUVudHJpZXMuZmlsdGVyKGl0ID0+IGl0WzBdLmluY2x1ZGVzKCdfX2FkZGVkJykpXG4gICAgICAgIC5tYXAoaXQgPT4gaXRbMV0pXG4gICAgICAgIC5tYXAoaXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5pdCwgaW5kZXhlczogT2JqZWN0LmVudHJpZXMoaXQuaW5kZXhlcykubWFwKGluZGV4RW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSBpbmRleEVudHJ5WzFdXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpZHhbJ25hbWUnXVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyhpZHhbJ2NvbHVtbnMnXSkubWFwKGl0ID0+IGl0WyduYW1lJ10pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWUsIGNvbHVtbnMgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICBjb25zdCBkZWxldGVkVGFibGVzID0gdGFibGVFbnRyaWVzLmZpbHRlcihpdCA9PiBpdFswXS5pbmNsdWRlcygnX19kZWxldGVkJykpLm1hcChpdCA9PiBpdFsxXSlcblxuICAgIGNvbnN0IGVudW1zRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGRpZmZlcmVuY2UuZW51bXMpXG5cbiAgICBjb25zdCBhZGRlZEVudW1zID0gZW51bXNFbnRyaWVzLmZpbHRlcihpdCA9PiBpdFswXS5pbmNsdWRlcygnX19hZGRlZCcpKVxuICAgICAgICAubWFwKGl0ID0+IGl0WzFdKVxuICAgICAgICAubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIC8vIHZhbHVlczogeyB2YWwxOiAndmFsMScsIHZhbDI6ICd2YWwyJyB9ID0+IHZhbHVlczogWyd2YWwxJywgJ3ZhbDInXVxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmVudHJpZXMoaXQudmFsdWVzKS5tYXAodmUgPT4gdmVbMV0pXG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBpdC5uYW1lLCB2YWx1ZXM6IHZhbHVlcyB9XG4gICAgICAgIH0pXG5cbiAgICBjb25zdCBkZWxldGVkRW51bXMgPSBlbnVtc0VudHJpZXMuZmlsdGVyKGl0ID0+IGl0WzBdLmluY2x1ZGVzKCdfX2RlbGV0ZWQnKSlcbiAgICAgICAgLm1hcChpdCA9PiBpdFsxXSlcbiAgICAgICAgLm1hcChpdCA9PiB7XG5cbiAgICAgICAgICAgIC8vIHZhbHVlczogeyB2YWwxOiAndmFsMScsIHZhbDI6ICd2YWwyJyB9ID0+IHZhbHVlczogWyd2YWwxJywgJ3ZhbDInXVxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmVudHJpZXMoaXQudmFsdWVzKS5tYXAodmUgPT4gdmVbMV0pXG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBpdC5uYW1lLCB2YWx1ZXM6IHZhbHVlcyB9XG4gICAgICAgIH0pXG5cbiAgICBjb25zdCBhbHRlcmVkRW51bXMgPSBlbnVtc0VudHJpZXMuZmlsdGVyKGl0ID0+ICEoaXRbMF0uaW5jbHVkZXMoJ19fYWRkZWQnKSB8fCBpdFswXS5pbmNsdWRlcygnX19kZWxldGVkJykpKVxuICAgICAgICAubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHMgPSBpdFsxXS52YWx1ZXNcbiAgICAgICAgICAgIGNvbnN0IGFkZGVkVmFsdWVzID0gT2JqZWN0LmVudHJpZXModmFscykuZmlsdGVyKHZhbCA9PiB2YWxbMF0uaW5jbHVkZXMoJ19fYWRkZWQnKSkubWFwKHZhbCA9PiB2YWxbMV0pXG4gICAgICAgICAgICBjb25zdCBkZWxldGVkVmFsdWVzID0gT2JqZWN0LmVudHJpZXModmFscykuZmlsdGVyKHZhbCA9PiB2YWxbMF0uaW5jbHVkZXMoJ19fZGVsZXRlZCcpKS5tYXAodmFsID0+IHZhbFsxXSlcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGl0WzBdLCBhZGRlZFZhbHVlcywgZGVsZXRlZFZhbHVlcywgfVxuICAgICAgICB9KVxuXG4gICAgY29uc3QgYWx0ZXJlZFRhYmxlcyA9IE9iamVjdC5rZXlzKGRpZmZlcmVuY2UudGFibGVzKVxuICAgICAgICAuZmlsdGVyKGl0ID0+ICEoaXQuaW5jbHVkZXMoJ19fYWRkZWQnKSB8fCBpdC5pbmNsdWRlcygnX19kZWxldGVkJykpKVxuICAgICAgICAubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGl0LCAuLi5kaWZmZXJlbmNlLnRhYmxlc1tpdF0gfVxuICAgICAgICB9KVxuXG4gICAgY29uc3QgYWx0ZXJlZFRhYmxlc1dpdGhDb2x1bW5zID0gYWx0ZXJlZFRhYmxlcy5tYXAodGFibGUgPT4gZmluZEFsdGVybmF0aW9uc0luVGFibGUodGFibGUpKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkZWRUYWJsZXMsXG4gICAgICAgIGRlbGV0ZWRUYWJsZXMsXG4gICAgICAgIGFsdGVyZWRUYWJsZXNXaXRoQ29sdW1ucyxcbiAgICAgICAgYWRkZWRFbnVtcyxcbiAgICAgICAgZGVsZXRlZEVudW1zLFxuICAgICAgICBhbHRlcmVkRW51bXMsXG4gICAgfVxufVxuXG5jb25zdCBmaW5kQWx0ZXJuYXRpb25zSW5UYWJsZSA9ICh0YWJsZSkgPT4ge1xuICAgIC8vIG1hcCBlYWNoIHRhYmxlIHRvIGhhdmUgYWx0ZXJlZCwgZGVsZXRlZCBvciByZW5hbWVkIGNvbHVtbnNcbiAgICBjb25zdCBjb2x1bW5zID0gdGFibGUuY29sdW1uczsgLy9pbiBjYXNlIG5vIGNvbHVtbnMgd2VyZSBhbHRlcmVkLCBidXQgaW5kZXhlcyB3ZXJlXG5cbiAgICBjb25zdCBhZGRlZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpLmZpbHRlcihpdCA9PiBpdC5pbmNsdWRlcygnX19hZGRlZCcpKS5tYXAoaXQgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5jb2x1bW5zW2l0XSB9XG4gICAgfSlcbiAgICBjb25zdCBkZWxldGVkID0gT2JqZWN0LmtleXMoY29sdW1ucykuZmlsdGVyKGl0ID0+IGl0LmluY2x1ZGVzKCdfX2RlbGV0ZWQnKSkubWFwKGl0ID0+IHtcbiAgICAgICAgcmV0dXJuIHsgLi4uY29sdW1uc1tpdF0gfVxuICAgIH0pXG4gICAgY29uc3QgYWx0ZXJlZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpXG4gICAgICAgIC5maWx0ZXIoaXQgPT4gIShpdC5pbmNsdWRlcygnX19kZWxldGVkJykgfHwgaXQuaW5jbHVkZXMoJ19fYWRkZWQnKSkpXG4gICAgICAgIC5tYXAoaXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogaXQsIC4uLmNvbHVtbnNbaXRdIH1cbiAgICAgICAgfSlcblxuICAgIGNvbnN0IGRlbGV0ZWRJbmRleGVzID0gT2JqZWN0LnZhbHVlcyh0YWJsZS5pbmRleGVzX19kZWxldGVkIHx8IHt9KS5tYXAoaXQgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gaXRbJ25hbWUnXVxuICAgICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyhpdFsnY29sdW1ucyddKS5tYXAoaXQgPT4gaXRbJ25hbWUnXSlcbiAgICAgICAgcmV0dXJuIHsgbmFtZSwgY29sdW1ucyB9XG4gICAgfSkuY29uY2F0KFxuICAgICAgICBPYmplY3Qua2V5cyh0YWJsZS5pbmRleGVzIHx8IHt9KS5maWx0ZXIoaXQgPT4gaXQuaW5jbHVkZXMoJ19fZGVsZXRlZCcpKVxuICAgICAgICAgICAgLm1hcChpdCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gdGFibGUuaW5kZXhlc1tpdF1cbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaWR4WyduYW1lJ11cbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyhpZHhbJ2NvbHVtbnMnXSkubWFwKGl0ID0+IGl0WyduYW1lJ10pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbmFtZSwgY29sdW1ucyB9XG4gICAgICAgICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBhZGRlZEluZGV4ZXMgPSBPYmplY3QudmFsdWVzKHRhYmxlLmluZGV4ZXNfX2FkZGVkIHx8IHt9KS5tYXAoaXQgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gaXRbJ25hbWUnXVxuICAgICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyhpdFsnY29sdW1ucyddKS5tYXAoaXQgPT4gaXRbJ25hbWUnXSlcbiAgICAgICAgcmV0dXJuIHsgbmFtZSwgY29sdW1ucyB9XG4gICAgfSkuY29uY2F0KFxuICAgICAgICBPYmplY3Qua2V5cyh0YWJsZS5pbmRleGVzIHx8IHt9KS5maWx0ZXIoaXQgPT4gaXQuaW5jbHVkZXMoJ19fYWRkZWQnKSlcbiAgICAgICAgICAgIC5tYXAoaXQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRhYmxlLmluZGV4ZXNbaXRdXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGlkeFsnbmFtZSddXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IE9iamVjdC52YWx1ZXMoaWR4Wydjb2x1bW5zJ10pLm1hcChpdCA9PiBpdFsnbmFtZSddKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWUsIGNvbHVtbnMgfVxuICAgICAgICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbWFwcGVkQWx0ZXJlZCA9IGFsdGVyZWQubWFwKGl0ID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdC5uYW1lICE9PSAnc3RyaW5nJyAmJiAnX19vbGQnIGluIGl0Lm5hbWUpIHtcbiAgICAgICAgICAgIC8vIHJlbmFtZVxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXQsIG5hbWU6IHsgdHlwZTogJ2NoYW5nZWQnLCBvbGQ6IGl0Lm5hbWUuX19vbGQsIG5ldzogaXQubmFtZS5fX25ldyB9IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRcbiAgICB9KS5tYXAoaXQgPT4ge1xuICAgICAgICBpZiAoJ3R5cGUnIGluIGl0KSB7XG4gICAgICAgICAgICAvLyB0eXBlIGNoYW5nZVxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXQsIHR5cGU6IHsgdHlwZTogJ2NoYW5nZWQnLCBvbGQ6IGl0LnR5cGUuX19vbGQsIG5ldzogaXQudHlwZS5fX25ldyB9IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRcbiAgICB9KS5tYXAoaXQgPT4ge1xuICAgICAgICBpZiAoJ2RlZmF1bHRWYWx1ZScgaW4gaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLml0LCBkZWZhdWx0VmFsdWU6IHsgdHlwZTogJ2NoYW5nZWQnLCBvbGQ6IGl0LmRlZmF1bHRWYWx1ZS5fX29sZCwgbmV3OiBpdC5kZWZhdWx0VmFsdWUuX19uZXcgfSB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdkZWZhdWx0VmFsdWVfX2FkZGVkJyBpbiBpdCkge1xuICAgICAgICAgICAgY29uc3QgeyBkZWZhdWx0VmFsdWVfX2FkZGVkLCAuLi5vdGhlcnMgfSA9IGl0XG4gICAgICAgICAgICByZXR1cm4geyAuLi5vdGhlcnMsIGRlZmF1bHRWYWx1ZTogeyB0eXBlOiAnYWRkZWQnLCB2YWx1ZTogaXQuZGVmYXVsdFZhbHVlX19hZGRlZCB9IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2RlZmF1bHRWYWx1ZV9fZGVsZXRlZCcgaW4gaXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGVmYXVsdFZhbHVlX19kZWxldGVkLCAuLi5vdGhlcnMgfSA9IGl0XG4gICAgICAgICAgICByZXR1cm4geyAuLi5vdGhlcnMsIGRlZmF1bHRWYWx1ZTogeyB0eXBlOiAnZGVsZXRlZCcsIHZhbHVlOiBpdC5kZWZhdWx0VmFsdWVfX2RlbGV0ZWQgfSB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0XG4gICAgfSkubWFwKGl0ID0+IHtcbiAgICAgICAgaWYgKCdub3ROdWxsJyBpbiBpdCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXQsIG5vdE51bGw6IHsgdHlwZTogJ2NoYW5nZWQnLCBvbGQ6IGl0Lm5vdE51bGwuX19vbGQsIG5ldzogaXQubm90TnVsbC5fX25ldyB9IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ25vdE51bGxfX2FkZGVkJyBpbiBpdCkge1xuICAgICAgICAgICAgY29uc3QgeyBub3ROdWxsX19hZGRlZCwgLi4ub3RoZXJzIH0gPSBpdFxuICAgICAgICAgICAgcmV0dXJuIHsgLi4ub3RoZXJzLCBub3ROdWxsOiB7IHR5cGU6ICdhZGRlZCcsIHZhbHVlOiBpdC5ub3ROdWxsX19hZGRlZCB9IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ25vdE51bGxfX2RlbGV0ZWQnIGluIGl0KSB7XG4gICAgICAgICAgICBjb25zdCB7IG5vdE51bGxfX2RlbGV0ZWQsIC4uLm90aGVycyB9ID0gaXRcbiAgICAgICAgICAgIHJldHVybiB7IC4uLm90aGVycywgbm90TnVsbDogeyB0eXBlOiAnZGVsZXRlZCcsIHZhbHVlOiBpdC5ub3ROdWxsX19kZWxldGVkIH0gfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0XG4gICAgfSlcblxuICAgIHJldHVybiB7IG5hbWU6IHRhYmxlLm5hbWUsIGRlbGV0ZWQsIGFkZGVkLCBhbHRlcmVkOiBtYXBwZWRBbHRlcmVkLCBhZGRlZEluZGV4ZXMsIGRlbGV0ZWRJbmRleGVzIH1cbn0iLCJpbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL2pzb25TdGF0ZW1lbnRzXCI7XG5cbmNsYXNzIENvbnZlcnRvciB7XG4gICAgY29uc3RydWN0b3IodHlwZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlXG4gICAgfVxuXG4gICAgY2FuKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gdHlwZTtcbiAgICB9XG5cbiAgICBjb252ZXJ0KF8pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ292ZXJyaWRlIHRoZSBjb252ZXJ0IG1vdGhvZCcpXG4gICAgfVxufVxuXG5jbGFzcyBDcmVhdGVUYWJsZUNvbnZlcnRvciBleHRlbmRzIENvbnZlcnRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFR5cGVzLmNyZWF0ZVRhYmxlKVxuICAgIH1cblxuICAgIGNvbnZlcnQoanNvblN0YXRlbWVudCkge1xuICAgICAgICBjb25zdCB7IHRhYmxlTmFtZSwgY29sdW1ucyB9ID0ganNvblN0YXRlbWVudFxuICAgICAgICBjb25zdCBtYXBwZWRDb2x1bW5zID0gT2JqZWN0LmtleXMoY29sdW1ucylcbiAgICAgICAgICAgIC5tYXAoaXQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmNvbHVtbnNbaXRdIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbGV0IHN0YXRlbWVudCA9ICcnXG5cbiAgICAgICAgc3RhdGVtZW50ICs9IGBDUkVBVEUgVEFCTEUgJHt0YWJsZU5hbWV9IChcXG5gXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwcGVkQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gbWFwcGVkQ29sdW1uc1tpXVxuXG4gICAgICAgICAgICBjb25zdCBwcmltYXJ5S2V5U3RhdGVtZW50ID0gY29sdW1uLnByaW1hcnlLZXkgPyBcIlBSSU1BUlkgS0VZXCIgOiAnJ1xuICAgICAgICAgICAgY29uc3Qgbm90TnVsbFN0YXRlbWVudCA9IGNvbHVtbi5ub3ROdWxsID8gXCJOT1QgTlVMTFwiIDogXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTdGF0ZW1lbnQgPSBjb2x1bW4uZGVmYXVsdFZhbHVlID8gYERFRkFVTFQgJyR7Y29sdW1uLmRlZmF1bHRWYWx1ZX0nYCA6IFwiXCI7XG5cbiAgICAgICAgICAgIHN0YXRlbWVudCArPSAnXFx0JyArIGAke2NvbHVtbi5uYW1lfSAke2NvbHVtbi50eXBlfSAke3ByaW1hcnlLZXlTdGF0ZW1lbnR9ICR7ZGVmYXVsdFN0YXRlbWVudH0gJHtub3ROdWxsU3RhdGVtZW50fWAucmVwbGFjZSgvICArL2csICcgJykudHJpbSgpO1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9IChpID09PSBtYXBwZWRDb2x1bW5zLmxlbmd0aCAtIDEgPyAnJyA6ICcsJykgKyAnXFxuJ1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlbWVudCArPSBgKTtgXG4gICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7XG4gICAgfVxufVxuXG5jbGFzcyBDcmVhdGVUeXBlRW51bUNvbnZlcnRvciBleHRlbmRzIENvbnZlcnRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFR5cGVzLmNyZWF0ZVR5cGVFbnVtKVxuICAgIH1cblxuICAgIGNvbnZlcnQoanNvblN0YXRlbWVudCkge1xuICAgICAgICBjb25zdCB7IGVudW1OYW1lLCB2YWx1ZXMgfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgbGV0IHZhbHVlc1N0YXRlbWVudCA9ICcoJ1xuICAgICAgICB2YWx1ZXNTdGF0ZW1lbnQgKz0gdmFsdWVzLm1hcChpdCA9PiBgJyR7aXR9J2ApLmpvaW4oJywgJylcbiAgICAgICAgdmFsdWVzU3RhdGVtZW50ICs9ICcpJ1xuXG4gICAgICAgIHJldHVybiBgQ1JFQVRFIFRZUEUgJHtlbnVtTmFtZX0gQVMgRU5VTSR7dmFsdWVzU3RhdGVtZW50fTtgXG4gICAgfVxufVxuXG5jbGFzcyBBbHRlclR5cGVBZGRWYWx1ZUNvbnZlcnRvciBleHRlbmRzIENvbnZlcnRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFR5cGVzLmFsdGVyVHlwZUFkZFZhbHVlKVxuICAgIH1cblxuICAgIGNvbnZlcnQoanNvblN0YXRlbWVudCkge1xuICAgICAgICBjb25zdCB7IGVudW1OYW1lLCBlbnVtVmFsdWUgfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgcmV0dXJuIGBBTFRFUiBUWVBFICR7ZW51bU5hbWV9IEFERCBWQUxVRSAke2VudW1WYWx1ZX07YFxuICAgIH1cbn1cblxuY2xhc3MgRHJvcFRhYmxlQ29udmVydG9yIGV4dGVuZHMgQ29udmVydG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoVHlwZXMuZHJvcFRhYmxlKVxuICAgIH1cblxuICAgIGNvbnZlcnQoanNvblN0YXRlbWVudCkge1xuICAgICAgICBjb25zdCB7IHRhYmxlTmFtZSB9ID0ganNvblN0YXRlbWVudFxuICAgICAgICByZXR1cm4gYERST1AgVEFCTEUgJHt0YWJsZU5hbWV9YFxuICAgIH1cbn1cblxuY2xhc3MgUmVuYW1lVGFibGVDb252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5yZW5hbWVUYWJsZSlcbiAgICB9XG5cbiAgICBjb252ZXJ0KGpzb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyBmcm9tLCB0byB9ID0ganNvblN0YXRlbWVudFxuICAgICAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7ZnJvbX0gUkVOQU1FIFRPICR7dG99YFxuICAgIH1cbn1cblxuY2xhc3MgQWx0ZXJUYWJsZURyb3BDb2x1bW5Db252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5hbHRlclRhYmxlRHJvcENvbHVtbilcbiAgICB9XG5cbiAgICBjb252ZXJ0KGpzb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZU5hbWUsIGNvbHVtbk5hbWUgfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgcmV0dXJuIGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gRFJPUCBDT0xVTU4gSUYgRVhJU1RTICR7Y29sdW1uTmFtZX07YFxuICAgIH1cbn1cblxuY2xhc3MgQWx0ZXJUYWJsZUFkZENvbHVtbkNvbnZlcnRvciBleHRlbmRzIENvbnZlcnRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFR5cGVzLmFsdGVyVGFibGVBZGRDb2x1bW4pXG4gICAgfVxuXG4gICAgY29udmVydChqc29uU3RhdGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgdGFibGVOYW1lLCBjb2x1bW4gfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgY29uc3QgeyBuYW1lLCB0eXBlLCBkZWZhdWx0VmFsdWUsIG5vdE51bGwgfSA9IGNvbHVtbjtcblxuICAgICAgICBjb25zdCBkZWZhdWx0U3RhdGVtZW50ID0gYCR7ZGVmYXVsdFZhbHVlID8gYERFRkFVTFQgJHtkZWZhdWx0VmFsdWV9YCA6ICcnfWBcbiAgICAgICAgY29uc3Qgbm90TnVsbFN0YXRlbWVudCA9IGAke25vdE51bGwgPyAnTk9UIE5VTEwnIDogJyd9YFxuICAgICAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBREQgQ09MVU1OICR7bmFtZX0gJHt0eXBlfSAke2RlZmF1bHRTdGF0ZW1lbnR9ICR7bm90TnVsbFN0YXRlbWVudH1gLnJlcGxhY2UoLyAgKy9nLCAnICcpLnRyaW0oKSArICc7J1xuICAgIH1cbn1cblxuY2xhc3MgQWx0ZXJUYWJsZUFsdGVyQ29sdW1uU2V0VHlwZUNvbnZlcnRvciBleHRlbmRzIENvbnZlcnRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFR5cGVzLmFsdGVyVGFibGVBbHRlckNvbHVtblNldFR5cGUpXG4gICAgfVxuXG4gICAgY29udmVydChqc29uU3RhdGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgdGFibGVOYW1lLCBjb2x1bW5OYW1lLCBuZXdEYXRhVHlwZSB9ID0ganNvblN0YXRlbWVudFxuICAgICAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBTFRFUiBDT0xVTU4gJHtjb2x1bW5OYW1lfSBTRVQgREFUQSBUWVBFICR7bmV3RGF0YVR5cGV9O2BcbiAgICB9XG59XG5cbmNsYXNzIEFsdGVyVGFibGVBbHRlckNvbHVtblNldE5vdE51bGxDb252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5hbHRlclRhYmxlQWx0ZXJDb2x1bW5TZXROb3ROdWxsKVxuICAgIH1cblxuICAgIGNvbnZlcnQoanNvblN0YXRlbWVudCkge1xuICAgICAgICBjb25zdCB7IHRhYmxlTmFtZSwgY29sdW1uTmFtZSB9ID0ganNvblN0YXRlbWVudFxuICAgICAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBTFRFUiBDT0xVTU4gJHtjb2x1bW5OYW1lfSBTRVQgTk9UIE5VTEw7YFxuICAgIH1cbn1cblxuY2xhc3MgQWx0ZXJUYWJsZUFsdGVyQ29sdW1uRHJvcE5vdE51bGxDb252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5hbHRlclRhYmxlQWx0ZXJDb2x1bW5Ecm9wTm90TnVsbClcbiAgICB9XG5cbiAgICBjb252ZXJ0KGpzb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZU5hbWUsIGNvbHVtbk5hbWUgfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgcmV0dXJuIGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7Y29sdW1uTmFtZX0gRFJPUCBOT1QgTlVMTDtgXG4gICAgfVxufVxuXG5jbGFzcyBDcmVhdGVGb3JlaWduS2V5Q29udmVydG9yIGV4dGVuZHMgQ29udmVydG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoVHlwZXMuY3JlYXRlUmVmZXJlbmNlKVxuICAgIH1cblxuICAgIGNvbnZlcnQoanNvblN0YXRlbWVudCkge1xuICAgICAgICBjb25zdCB7IGZyb21UYWJsZSwgdG9UYWJsZSwgZnJvbUNvbHVtbiwgdG9Db2x1bW4sIGZvcmVpZ25LZXlOYW1lLCBvbkRlbGV0ZSwgb25VcGRhdGUgfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgY29uc3Qgb25EZWxldGVTdGF0ZW1lbnQgPSBvbkRlbGV0ZSB8fCBcIlwiXG4gICAgICAgIGNvbnN0IG9uVXBkYXRlU3RhdGVtZW50ID0gb25VcGRhdGUgfHwgXCJcIlxuICAgICAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7ZnJvbVRhYmxlfSBBREQgQ09OU1RSQUlOVCAke2ZvcmVpZ25LZXlOYW1lfSBGT1JFSUdOIEtFWSAoJHtmcm9tQ29sdW1ufSkgUkVGRVJFTkNFUyAke3RvVGFibGV9KCR7dG9Db2x1bW59KSAke29uRGVsZXRlU3RhdGVtZW50fSAke29uVXBkYXRlU3RhdGVtZW50fWAucmVwbGFjZSgvICArL2csICcgJykudHJpbSgpICsgJzsnXG4gICAgfVxufVxuXG5jbGFzcyBDcmVhdGVJbmRleENvbnZlcnRvciBleHRlbmRzIENvbnZlcnRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFR5cGVzLmNyZWF0ZUluZGV4KVxuICAgIH1cblxuICAgIGNvbnZlcnQoanNvblN0YXRlbWVudCkge1xuICAgICAgICBjb25zdCB7IHRhYmxlTmFtZSwgaW5kZXhOYW1lLCBpbmRleFZhbHVlIH0gPSBqc29uU3RhdGVtZW50XG4gICAgICAgIHJldHVybiBgQ1JFQVRFIElOREVYICR7aW5kZXhOYW1lfSBPTiAke3RhYmxlTmFtZX0gKCR7aW5kZXhWYWx1ZX0pO2BcbiAgICB9XG59XG5cbmNsYXNzIERyb3BJbmRleENvbnZlcnRvciBleHRlbmRzIENvbnZlcnRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFR5cGVzLmRyb3BJbmRleClcbiAgICB9XG5cbiAgICBjb252ZXJ0KGpzb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyBpbmRleE5hbWUgfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgcmV0dXJuIGBEUk9QIElOREVYIElGIEVYSVNUUyAke2luZGV4TmFtZX07YFxuICAgIH1cbn1cblxuY29uc3QgY29udmVydG9ycyA9IFtdXG5jb252ZXJ0b3JzLnB1c2gobmV3IENyZWF0ZVRhYmxlQ29udmVydG9yKCkpXG5jb252ZXJ0b3JzLnB1c2gobmV3IENyZWF0ZVR5cGVFbnVtQ29udmVydG9yKCkpXG5jb252ZXJ0b3JzLnB1c2gobmV3IERyb3BUYWJsZUNvbnZlcnRvcigpKVxuY29udmVydG9ycy5wdXNoKG5ldyBSZW5hbWVUYWJsZUNvbnZlcnRvcigpKVxuY29udmVydG9ycy5wdXNoKG5ldyBBbHRlclRhYmxlRHJvcENvbHVtbkNvbnZlcnRvcigpKVxuY29udmVydG9ycy5wdXNoKG5ldyBBbHRlclRhYmxlQWRkQ29sdW1uQ29udmVydG9yKCkpXG5jb252ZXJ0b3JzLnB1c2gobmV3IEFsdGVyVGFibGVBbHRlckNvbHVtblNldFR5cGVDb252ZXJ0b3IoKSlcbmNvbnZlcnRvcnMucHVzaChuZXcgQ3JlYXRlSW5kZXhDb252ZXJ0b3IoKSlcbmNvbnZlcnRvcnMucHVzaChuZXcgRHJvcEluZGV4Q29udmVydG9yKCkpXG5jb252ZXJ0b3JzLnB1c2gobmV3IEFsdGVyVHlwZUFkZFZhbHVlQ29udmVydG9yKCkpXG5jb252ZXJ0b3JzLnB1c2gobmV3IEFsdGVyVGFibGVBbHRlckNvbHVtblNldE5vdE51bGxDb252ZXJ0b3IoKSlcbmNvbnZlcnRvcnMucHVzaChuZXcgQWx0ZXJUYWJsZUFsdGVyQ29sdW1uRHJvcE5vdE51bGxDb252ZXJ0b3IoKSlcbmNvbnZlcnRvcnMucHVzaChuZXcgQ3JlYXRlRm9yZWlnbktleUNvbnZlcnRvcigpKVxuXG5leHBvcnQgY29uc3QgZnJvbUpzb24gPSAoc3RhdGVtZW50cykgPT4ge1xuICAgIHJldHVybiBzdGF0ZW1lbnRzLm1hcChzdGF0ZW1lbnQgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGNvbnZlcnRvcnMuZmlsdGVyKGl0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpdC5jYW4oc3RhdGVtZW50LnR5cGUpXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGNvbnZlcnRvciA9IGZpbHRlcmVkLmxlbmd0aCA9PT0gMSA/IGZpbHRlcmVkWzBdIDogdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKCFjb252ZXJ0b3IpIHtcblxuICAgICAgICAgICAgY29uc29sZS5sb2coJ25vIGNvbnZlcnRvcjonLCBzdGF0ZW1lbnQudHlwZSlcbiAgICAgICAgICAgIHJldHVybiAnZHJ5IHJ1bidcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb252ZXJ0b3IuY29udmVydChzdGF0ZW1lbnQpXG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVEZWxldGVDb2x1bW5zID0gKHRhYmxlTmFtZSwgY29sdW1ucykgPT4ge1xuICAgIGxldCBzdGF0ZW1lbnQgPSAnJ1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gRFJPUCBDT0xVTU4gSUYgRVhJU1RTICR7Y29sdW1uLm5hbWV9O2BcbiAgICAgICAgc3RhdGVtZW50ICs9ICdcXG4nXG4gICAgfVxuICAgIHJldHVybiBzdGF0ZW1lbnQudHJpbSgpXG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlQ3JlYXRlQ29sdW1ucyA9ICh0YWJsZU5hbWUsIGNvbHVtbnMpID0+IHtcbiAgICBsZXQgc3RhdGVtZW50ID0gJydcbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgZGVmYXVsdFZhbHVlLCBub3ROdWxsIH0gPSBjb2x1bW47XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdFN0YXRlbWVudCA9IGAke2RlZmF1bHRWYWx1ZSA/IGBERUZBVUxUICR7ZGVmYXVsdFZhbHVlfWAgOiAnJ31gXG4gICAgICAgIGNvbnN0IG5vdE51bGxTdGF0ZW1lbnQgPSBgJHtub3ROdWxsID8gJ05PVCBOVUxMJyA6ICcnfWBcbiAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUREIENPTFVNTiAke25hbWV9ICR7dHlwZX0gJHtkZWZhdWx0U3RhdGVtZW50fSAke25vdE51bGxTdGF0ZW1lbnR9YC5yZXBsYWNlKC8gICsvZywgJyAnKS50cmltKCkgKyAnOydcbiAgICAgICAgc3RhdGVtZW50ICs9ICdcXG4nXG4gICAgfVxuICAgIHJldHVybiBzdGF0ZW1lbnQudHJpbSgpXG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlQWx0ZXJDb2x1bW5zID0gKHRhYmxlTmFtZSwgY29sdW1ucykgPT4ge1xuICAgIGxldCBzdGF0ZW1lbnQgPSAnJ1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBjb2x1bW47XG5cbiAgICAgICAgaWYgKGNvbHVtblsndHlwZSddKSB7XG4gICAgICAgICAgICBjb25zdCB7IF9fbmV3IH0gPSBjb2x1bW4udHlwZVxuICAgICAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7bmFtZX0gU0VUIERBVEEgVFlQRSAke19fbmV3fTtgXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5bJ2RlZmF1bHRWYWx1ZSddKSB7XG4gICAgICAgICAgICBjb25zdCB7IF9fbmV3IH0gPSBjb2x1bW4uZGVmYXVsdFZhbHVlXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBTFRFUiBDT0xVTU4gJHtuYW1lfSBTRVQgREVGQVVMVCAke19fbmV3fTtgXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5bJ2RlZmF1bHRWYWx1ZV9fYWRkZWQnXSkge1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7bmFtZX0gU0VUIERFRkFVTFQgJHtjb2x1bW4uZGVmYXVsdFZhbHVlX19hZGRlZH07YFxuICAgICAgICAgICAgc3RhdGVtZW50ICs9ICdcXG4nXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uWydkZWZhdWx0VmFsdWVfX2RlbGV0ZWQnXSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYGRlZmF1bHQgdmFsdWUgZGVsZXRlZGApXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBTFRFUiBDT0xVTU4gJHtuYW1lfSBEUk9QIERFRkFVTFQ7YFxuICAgICAgICAgICAgc3RhdGVtZW50ICs9ICdcXG4nXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uWydub3ROdWxsJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgX19uZXcgfSA9IGNvbHVtbi5ub3ROdWxsXG4gICAgICAgICAgICBjb25zdCBkcm9wU3RhdGVtZW50ID0gX19uZXcgPyAnU0VUIE5PVCBOVUxMJyA6ICdEUk9QIE5PVCBOVUxMJ1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7bmFtZX0gJHtkcm9wU3RhdGVtZW50fTtgXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5bJ25vdE51bGxfX2FkZGVkJ10pIHtcbiAgICAgICAgICAgIHN0YXRlbWVudCArPSBgQUxURVIgVEFCTEUgJHt0YWJsZU5hbWV9IEFMVEVSIENPTFVNTiAke25hbWV9IFNFVCBOT1QgTlVMTDtgXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5bJ25vdE51bGxfX2RlbGV0ZWQnXSkge1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7bmFtZX0gRFJPUCBOT1QgTlVMTDtgXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGVtZW50LnRyaW0oKVxufVxuXG5leHBvcnQgY29uc3QgcHJlcGFyZUNyZWF0ZVRhYmxlID0gKHRhYmxlKSA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zIH0gPSB0YWJsZVxuICAgIGNvbnN0IG1hcHBlZENvbHVtbnMgPSBPYmplY3Qua2V5cyhjb2x1bW5zKVxuICAgICAgICAubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLmNvbHVtbnNbaXRdIH1cbiAgICAgICAgfSlcblxuICAgIGxldCBzdGF0ZW1lbnQgPSAnJ1xuXG4gICAgc3RhdGVtZW50ICs9IGBDUkVBVEUgVEFCTEUgJHtuYW1lfSAoXFxuYFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwcGVkQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBtYXBwZWRDb2x1bW5zW2ldXG4gICAgICAgIGNvbnN0IHByaW1hcnlLZXlTdGF0ZW1lbnQgPSBjb2x1bW4ucHJpbWFyeUtleSA/IFwiUFJJTUFSWSBLRVlcIiA6ICcnXG4gICAgICAgIGNvbnN0IG5vdE51bGxTdGF0ZW1lbnQgPSBjb2x1bW4ubm90TnVsbCA/IFwiTk9UIE5VTExcIiA6IFwiXCI7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRTdGF0ZW1lbnQgPSBjb2x1bW4uZGVmYXVsdFZhbHVlID8gYERFRkFVTFQgJyR7Y29sdW1uLmRlZmF1bHRWYWx1ZX0nYCA6IFwiXCI7XG4gICAgICAgIHN0YXRlbWVudCArPSAnXFx0JyArIGAke2NvbHVtbi5uYW1lfSAke2NvbHVtbi50eXBlfSAke3ByaW1hcnlLZXlTdGF0ZW1lbnR9ICR7ZGVmYXVsdFN0YXRlbWVudH0gJHtub3ROdWxsU3RhdGVtZW50fSAke2NvbHVtbn1gLnJlcGxhY2UoLyAgKy9nLCAnICcpLnRyaW0oKVxuXG4gICAgICAgIHN0YXRlbWVudCArPSAoaSA9PT0gbWFwcGVkQ29sdW1ucy5sZW5ndGggLSAxID8gJycgOiAnLCcpICsgJ1xcbidcbiAgICB9XG5cbiAgICBzdGF0ZW1lbnQgKz0gYCk7YFxuICAgIHJldHVybiBzdGF0ZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlQ3JlYXRlSW5kZXggPSAodGFibGUsIGluZGV4ZXMpID0+IHtcbiAgICBsZXQgc3RhdGVtZW50ID0gJydcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zIH0gPSBpbmRleFxuICAgICAgICBzdGF0ZW1lbnQgKz0gYENSRUFURSBJTkRFWCAke25hbWV9IE9OICR7dGFibGV9ICgke2NvbHVtbnMuam9pbignLCAnKX0pO2BcbiAgICAgICAgc3RhdGVtZW50ICs9ICdcXG4nXG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudC50cmltKClcbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVEcm9wSW5kZXggPSAodGFibGUsIGluZGV4ZXMpID0+IHtcbiAgICBsZXQgc3RhdGVtZW50ID0gJydcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBpbmRleFxuICAgICAgICBzdGF0ZW1lbnQgKz0gYERST1AgSU5ERVggSUYgRVhJU1RTICR7bmFtZX07YFxuICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlbWVudC50cmltKClcbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVSZW5hbWVUYWJsZSA9ICh0YWJsZUZyb20sIHRhYmxlVG8pID0+IHtcbiAgICBjb25zdCBuYW1lZnJvbSA9IHRhYmxlRnJvbS5uYW1lXG4gICAgY29uc3QgbmFtZVRvID0gdGFibGVUby5uYW1lXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gYEFMVEVSIFRBQkxFICR7bmFtZWZyb219IFJFTkFNRSBUTyAke25hbWVUb31gXG4gICAgcmV0dXJuIHN0YXRlbWVudFxufVxuXG5leHBvcnQgY29uc3QgcHJlcGFyZURyb3BUYWJsZSA9ICh0YWJsZSkgPT4ge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gdGFibGU7XG4gICAgcmV0dXJuIGBEUk9QIFRBQkxFICR7bmFtZX1gXG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlQ3JlYXRlRW51bSA9IChuYW1lLCB2YWx1ZXMpID0+IHtcbiAgICAvLyBjb25zb2xlLmxvZyhuYW1lLCB2YWx1ZXMpXG4gICAgbGV0IHZhbHVlc1N0YXRlbWVudCA9ICcoJ1xuICAgIHZhbHVlc1N0YXRlbWVudCArPSBPYmplY3QudmFsdWVzKHZhbHVlcykubWFwKGl0ID0+IGAnJHtpdH0nYCkuam9pbignLCAnKVxuICAgIHZhbHVlc1N0YXRlbWVudCArPSAnKSdcblxuICAgIGNvbnN0IHN0YXRlbWVudCA9IGBDUkVBVEUgVFlQRSAke25hbWV9IEFTIEVOVU0ke3ZhbHVlc1N0YXRlbWVudH07YFxuICAgIHJldHVybiBzdGF0ZW1lbnQ7XG59XG5cbi8vIGh0dHBzOi8vYmxvZy55bzEuZG9nL3VwZGF0aW5nLWVudW0tdmFsdWVzLWluLXBvc3RncmVzcWwtdGhlLXNhZmUtYW5kLWVhc3ktd2F5L1xuZXhwb3J0IGNvbnN0IHByZXBhcmVBZGRWYWx1ZXNUb0VudW0gPSAobmFtZSwgdmFsdWVzKSA9PiB7XG4gICAgbGV0IHN0YXRlbWVudCA9ICcnXG4gICAgZm9yIChjb25zdCBpZHggaW4gdmFsdWVzKSB7XG4gICAgICAgIHN0YXRlbWVudCArPSBgQUxURVIgVFlQRSAke25hbWV9IEFERCBWQUxVRSAke3ZhbHVlc1tpZHhdfTtgXG4gICAgICAgIHN0YXRlbWVudCArPSAnXFxuJ1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGVtZW50LnRyaW0oKTtcbn1cblxuXG5cblxuLy8gdGVzdCBjYXNlIGZvciBlbnVtIGFsdGVyaW5nXG5gXG5jcmVhdGUgdGFibGUgdXNlcnMgKFxuXHRpZCBpbnQsXG4gICAgbmFtZSBjaGFyYWN0ZXIgdmFyeWluZygxMjgpXG4pO1xuXG5jcmVhdGUgdHlwZSB2ZW51bSBhcyBlbnVtKCdvbmUnLCAndHdvJywgJ3RocmVlJyk7XG5hbHRlciB0YWJsZSB1c2VycyBhZGQgY29sdW1uIHR5cGVkIHZlbnVtO1xuXG5pbnNlcnQgaW50byB1c2VycyhpZCwgbmFtZSwgdHlwZWQpIHZhbHVlcyAoMSwgJ25hbWUxJywgJ29uZScpO1xuaW5zZXJ0IGludG8gdXNlcnMoaWQsIG5hbWUsIHR5cGVkKSB2YWx1ZXMgKDIsICduYW1lMicsICd0d28nKTtcbmluc2VydCBpbnRvIHVzZXJzKGlkLCBuYW1lLCB0eXBlZCkgdmFsdWVzICgzLCAnbmFtZTMnLCAndGhyZWUnKTtcblxuYWx0ZXIgdHlwZSB2ZW51bSByZW5hbWUgdG8gX192ZW51bTtcbmNyZWF0ZSB0eXBlIHZlbnVtIGFzIGVudW0gKCdvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInLCAnZml2ZScpO1xuXG5BTFRFUiBUQUJMRSB1c2VycyBBTFRFUiBDT0xVTU4gdHlwZWQgVFlQRSB2ZW51bSBVU0lORyB0eXBlZDo6dGV4dDo6dmVudW07XG5cbmluc2VydCBpbnRvIHVzZXJzKGlkLCBuYW1lLCB0eXBlZCkgdmFsdWVzICg0LCAnbmFtZTQnLCAnZm91cicpO1xuaW5zZXJ0IGludG8gdXNlcnMoaWQsIG5hbWUsIHR5cGVkKSB2YWx1ZXMgKDUsICduYW1lNScsICdmaXZlJyk7XG5cbmRyb3AgdHlwZSBfX3ZlbnVtO1xuYCIsImltcG9ydCB7IHRhc2ssIHByb21wdFRhYmxlc0NvbmZsaWN0cywgcHJvbXB0Q29sdW1uc0NvbmZsaWN0cyB9IGZyb20gJ2NsaS9jb21wb25lbnRzLWFwaSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCdcbmltcG9ydCBwcmVwYXJlTWlncmF0aW9uIGZyb20gJ21pZ3JhdGlvblByZXBhcmF0b3InO1xuaW1wb3J0IHsgYXBwbHlTbmFwc2hvdHNEaWZmLCBDb2x1bW4sIENvbHVtbnNSZXNvbHZlcklucHV0LCBDb2x1bW5zUmVzb2x2ZXJPdXRwdXQsIFRhYmxlLCBUYWJsZXNSZXNvbHZlcklucHV0LCBUYWJsZXNSZXNvbHZlck91dHB1dCB9IGZyb20gJ3NuYXBzaG90c0RpZmZlcic7XG5cbmludGVyZmFjZSBDb25maWcge1xuICBkYXRhRm9sZGVyOiBzdHJpbmc7XG4gIG1pZ3JhdGlvblJvb3RGb2xkZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVzUmVzdWx0RGF0YTxUPiB7XG4gIGNyZWF0ZWQ6IFRbXSxcbiAgcmVuYW1lZDogUmVuYW1lZE9iamVjdDxUPltdLFxuICBkZWxldGVkOiBUW10sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uc1Jlc3VsdERhdGE8VCBleHRlbmRzIE5hbWVkPiB7XG4gIGNyZWF0ZWQ6IFRbXSxcbiAgcmVuYW1lZDogUmVuYW1lZE9iamVjdDxUPltdLFxuICBkZWxldGVkOiBUW10sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZWQge1xuICBuYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW5hbWVkT2JqZWN0PFQ+IHtcbiAgb2xkOiBULFxuICBuZXc6IFRcbn1cblxuY29uc3QgbWlncmF0ZSA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgZHJpenpsZUNvbmZpZzogQ29uZmlnID0geWFtbC5sb2FkKGZzLnJlYWRGaWxlU3luYygnZHJpenpsZS5jb25maWcueW1sJywgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSkgYXMgQ29uZmlnO1xuICBjb25zdCBtaWdyYXRpb25Sb290Rm9sZGVyID0gZHJpenpsZUNvbmZpZy5taWdyYXRpb25Sb290Rm9sZGVyIHx8ICdkcml6emxlJyAvLyBvciBmcm9tIGNvbmZpZy9wYXJhbXNcbiAgY29uc3QgZGF0YUZvbGRlciA9IGRyaXp6bGVDb25maWcuZGF0YUZvbGRlclxuXG4gIGNvbnN0IHsgcHJldiwgY3VyIH0gPSBhd2FpdCB0YXNrKCdwcmVwYXJpbmcgZGF0YSBzY2hlbWEganNvbiBzbmFwc2hvdCcsIGFzeW5jICh7IHNldFRpdGxlIH0pID0+IHtcbiAgICByZXR1cm4gcHJlcGFyZU1pZ3JhdGlvbihtaWdyYXRpb25Sb290Rm9sZGVyLCBkYXRhRm9sZGVyKVxuICB9KTtcblxuICBjb25zdCB0YWJsZXNSZXNvbHZlciA9IGFzeW5jIChpbnB1dDogVGFibGVzUmVzb2x2ZXJJbnB1dDxUYWJsZT4pOiBQcm9taXNlPFRhYmxlc1Jlc29sdmVyT3V0cHV0PFRhYmxlPj4gPT4ge1xuICAgIGNvbnN0IHsgY3JlYXRlZCwgZGVsZXRlZCwgcmVuYW1lZCB9ID0gYXdhaXQgcHJvbXB0VGFibGVzQ29uZmxpY3RzKHtcbiAgICAgIG5ld1RhYmxlczogaW5wdXQuY3JlYXRlZCxcbiAgICAgIG1pc3NpbmdUYWJsZXM6IGlucHV0LmRlbGV0ZWQsXG4gICAgfSlcbiAgICBjb25zdCByZW5hbWVkTWFwcGVkID0gcmVuYW1lZC5tYXAoaXQgPT4ge1xuICAgICAgcmV0dXJuIHsgZnJvbTogaXQub2xkLCB0bzogaXQubmV3IH1cbiAgICB9KVxuICAgIHJldHVybiB7IGNyZWF0ZWQ6IGNyZWF0ZWQsIGRlbGV0ZWQ6IGRlbGV0ZWQsIHJlbmFtZWQ6IHJlbmFtZWRNYXBwZWQgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbHVtbnNSZXNvbHZlciA9IGFzeW5jIChpbnB1dDogQ29sdW1uc1Jlc29sdmVySW5wdXQ8Q29sdW1uPik6IFByb21pc2U8Q29sdW1uc1Jlc29sdmVyT3V0cHV0PENvbHVtbj4+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRDb2x1bW5zQ29uZmxpY3RzKHsgbmFtZTogaW5wdXQudGFibGVOYW1lLCBhZGRlZDogaW5wdXQuY3JlYXRlZCwgZGVsZXRlZDogaW5wdXQuZGVsZXRlZCB9KVxuICAgIGNvbnN0IHJlbmFtZWRNYXBwZWQgPSByZXN1bHQucmVuYW1lZC5tYXAoaXQgPT4ge1xuICAgICAgcmV0dXJuIHsgZnJvbTogaXQub2xkLCB0bzogaXQubmV3IH1cbiAgICB9KVxuICAgIHJldHVybiB7IHRhYmxlTmFtZTogaW5wdXQudGFibGVOYW1lLCBjcmVhdGVkOiByZXN1bHQuY3JlYXRlZCwgZGVsZXRlZDogaW5wdXQuZGVsZXRlZCwgcmVuYW1lZDogcmVuYW1lZE1hcHBlZCB9XG4gIH1cblxuICBjb25zdCBzcWwgPSBhd2FpdCB0YXNrKCdwcmVwYXJpbmcgc2NoZW1hcyBkaWZmJywgYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBhcHBseVNuYXBzaG90c0RpZmYocHJldiwgY3VyLCB0YWJsZXNSZXNvbHZlciwgY29sdW1uc1Jlc29sdmVyKTtcbiAgfSk7XG5cbiAgLy8gdG9kbzogc2F2ZSByZXN1bHRzIHRvIGEgbmV3IG1pZ3JhdGlvbiBmb2xkZXJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgLy8gY29uc3QgZm9sZGVyTmFtZSA9IGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHt0d28oZGF0ZS5nZXRNb250aCgpKX0tJHt0d28oZGF0ZS5nZXREYXRlKCkpfSAke3R3byhkYXRlLmdldEhvdXJzKCkpfToke3R3byhkYXRlLmdldE1pbnV0ZXMoKSl9OiR7dHdvKGRhdGUuZ2V0U2Vjb25kcygpKX1gXG4gIGNvbnN0IGZvbGRlck5hbWUgPSBkYXRlLnRvSVNPU3RyaW5nKClcbiAgY29uc3QgbWlncmF0aW9uRm9sZGVyUGF0aCA9IGAuLyR7bWlncmF0aW9uUm9vdEZvbGRlcn0vJHtmb2xkZXJOYW1lfWBcbiAgZnMubWtkaXJTeW5jKG1pZ3JhdGlvbkZvbGRlclBhdGgpXG4gIGZzLndyaXRlRmlsZVN5bmMoYCR7bWlncmF0aW9uRm9sZGVyUGF0aH0vc25hcHNob3QuanNvbmAsIEpTT04uc3RyaW5naWZ5KGN1ciwgbnVsbCwgMikpXG4gIGZzLndyaXRlRmlsZVN5bmMoYCR7bWlncmF0aW9uRm9sZGVyUGF0aH0vbWlncmF0aW9uLnNxbGAsIHNxbClcblxufTtcblxuZXhwb3J0IGRlZmF1bHQgbWlncmF0ZTtcbiIsImltcG9ydCBzZXJpYWxpemUgZnJvbSBcInNlcmlhbGl6ZXJcIlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwcmVwYXJlU25hcHNob3QocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXN1bHQgPSBzZXJpYWxpemUoYCR7cGF0aH0vdGFibGVzL2AsIGAke3BhdGh9L3R5cGVzL2ApXG4gICAgcmV0dXJuIHJlc3VsdFxufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTbmFwc2hvdCB9IGZyb20gJ3ZhbHRpbyc7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIGNvbXBvbmVudHNMaXN0OiBSZWFjdC5SZWFjdEVsZW1lbnQ8YW55LCBhbnk+W107XG59XG5cbmNvbnN0IENvbXBvbmVudHNMaXN0OiBSZWFjdC5GQzxQcm9wcz4gPSAoe1xuICBjb21wb25lbnRzTGlzdCxcbn0pID0+IHtcbiAgdXNlU25hcHNob3QoY29tcG9uZW50c0xpc3QpO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHtjb21wb25lbnRzTGlzdC5tYXAoKGNvbXBvbmVudCwgaSkgPT4gKHsgLi4uY29tcG9uZW50LCBrZXk6IGkgfSkpfVxuICAgIDwvPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9uZW50c0xpc3Q7XG4iLCJpbXBvcnQgeyByZW5kZXIgfSBmcm9tICdpbmsnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IENvbXBvbmVudHNMaXN0IGZyb20gJ2NsaS9jb21wb25lbnRzLWFwaS9Db21wb25lbnRzTGlzdCc7XG5cbmNvbnN0IGNyZWF0ZUFwcCA9IChjb21wb25lbnRzTGlzdDogUmVhY3QuUmVhY3RFbGVtZW50PGFueSwgYW55PltdKSA9PiB7XG4gIGNvbnN0IGlua0FwcCA9IHJlbmRlcig8Q29tcG9uZW50c0xpc3QgY29tcG9uZW50c0xpc3Q9e2NvbXBvbmVudHNMaXN0fSAvPik7XG5cbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBpbmtBcHAucmVyZW5kZXIobnVsbCk7XG4gICAgICBpbmtBcHAudW5tb3VudCgpO1xuICAgICAgaW5rQXBwLmNsZWFyKCk7XG4gICAgICBpbmtBcHAuY2xlYW51cCgpO1xuICAgIH0sXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVBcHA7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnaW5rJztcbmltcG9ydCBTZWxlY3RJbnB1dCBmcm9tICdpbmstc2VsZWN0LWlucHV0JztcbmltcG9ydCBUYWJsZSwgeyBIZWFkZXIgfSBmcm9tICdpbmstdGFibGUnO1xuaW1wb3J0IHsgdXNlTWFjaGluZSB9IGZyb20gJ0B4c3RhdGUvcmVhY3QnO1xuaW1wb3J0IHsgSXRlbSB9IGZyb20gJ2luay1zZWxlY3QtaW5wdXQvYnVpbGQvU2VsZWN0SW5wdXQnO1xuXG5pbXBvcnQgeyBDb2x1bW5zUmVzdWx0RGF0YSwgTmFtZWQgfSBmcm9tICdjbGkvY29tbWFuZHMvbWlncmF0ZSc7XG5pbXBvcnQgZm9ybWF0RGF0YUZvclRhYmxlIGZyb20gJ2NsaS91dGlscy9mb3JtYXREYXRhRm9yVGFibGUnO1xuaW1wb3J0IHtcbiAgQWN0aW9uLFxuICBDb25maXJtYXRpb24sXG4gIGFjdGlvbnMsXG4gIGNvbmZpcm1hdGlvbnMsXG59IGZyb20gJ2NsaS91dGlscy92YWx1ZXNGb3JQcm9tcHRzJztcbmltcG9ydCBjcmVhdGVSZXNvbHZlQ29sdW1uc01hY2hpbmUsIHsgVGFibGVXaXRoQ29sdW1uIH0gZnJvbSAnY2xpL21hY2hpbmVzL3Jlc29sdmVDb2x1bW5zTWFjaGluZSc7XG5cbmludGVyZmFjZSBQcm9wcyA8VCBleHRlbmRzIE5hbWVkPntcbiAgb25Eb25lOiAodmFsdWU6IENvbHVtbnNSZXN1bHREYXRhPFQ+KSA9PiB2b2lkXG4gIHRhYmxlV2l0aENvbHVtbnM6IFRhYmxlV2l0aENvbHVtbjxUPixcbn1cblxuY29uc3QgUHJvbXB0Q29sdW1uc0NvbmZsaWN0czogUmVhY3QuRkM8UHJvcHM8YW55Pj4gPSAoe1xuICBvbkRvbmUsXG4gIHRhYmxlV2l0aENvbHVtbnM6IHByb3BzLFxufSkgPT4ge1xuICBjb25zdCBbY3VycmVudCwgc2VuZF0gPSB1c2VNYWNoaW5lKFxuICAgIGNyZWF0ZVJlc29sdmVDb2x1bW5zTWFjaGluZSh7IHRhYmxlV2l0aENvbHVtbnM6IHByb3BzIH0pLFxuICApO1xuXG4gIGNvbnN0IHtcbiAgICB0YWJsZU5hbWUsXG4gICAgYWRkZWRDb2x1bW5zLFxuICAgIGRlbGV0ZWRDb2x1bW5zLFxuICAgIG1pc3NpbmdJdGVtSW5kZXgsXG4gICAgY3JlYXRlZCxcbiAgICByZW5hbWVkLFxuICAgIGRlbGV0ZWQsXG4gIH0gPSBjdXJyZW50LmNvbnRleHQ7XG5cbiAgY29uc3Qgc2VsZWN0SXRlbUluZGV4ID0gKGl0ZW06IEl0ZW08bnVtYmVyPikgPT4ge1xuICAgIHNlbmQoeyB0eXBlOiAnQ0hPSUNFX0lURU0nLCBpdGVtSW5kZXg6IGl0ZW0udmFsdWUgfSk7XG4gIH07XG5cbiAgY29uc3Qgc2VsZWN0TmV3SXRlbUluZGV4ID0gKGl0ZW06IEl0ZW08bnVtYmVyPikgPT4ge1xuICAgIHNlbmQoeyB0eXBlOiAnQ0hPSUNFX05FV19JVEVNJywgaXRlbUluZGV4OiBpdGVtLnZhbHVlIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNlbGVjdEFjdGlvbiA9IChhY3Rpb246IEl0ZW08QWN0aW9uPikgPT4ge1xuICAgIHNlbmQoeyB0eXBlOiBhY3Rpb24udmFsdWUgfSk7XG4gIH07XG5cbiAgY29uc3QgY29uZmlybSA9IChjb25maXJtYXRpb25JdGVtOiBJdGVtPENvbmZpcm1hdGlvbj4pID0+IHtcbiAgICBzZW5kKHsgdHlwZTogY29uZmlybWF0aW9uSXRlbS52YWx1ZSB9KTtcbiAgfTtcblxuICBjb25zdCByZW5kZXJET00gPSAoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnQubWF0Y2hlcygndGFibGUnKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICA8Qm94IGRpc3BsYXk9XCJmbGV4XCIgZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiPlxuICAgICAgICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgICAgICA8SGVhZGVyPntgVGFibGUgXCIke3RhYmxlTmFtZX1cIiBtaXNzaW5nIGNvbHVtbnM6YH08L0hlYWRlcj5cbiAgICAgICAgICAgICAgICA8U2VsZWN0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGl0ZW1zPXtkZWxldGVkQ29sdW1ucyEubWFwKChjb2x1bW4sIGk6IG51bWJlcikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBTdHJpbmcoaSksXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGksXG4gICAgICAgICAgICAgICAgICB9KSl9XG4gICAgICAgICAgICAgICAgICBvblNlbGVjdD17c2VsZWN0SXRlbUluZGV4fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgICB7ISFhZGRlZENvbHVtbnM/Lmxlbmd0aCAmJiAoXG4gICAgICAgICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgcGFkZGluZ0xlZnQ9ezV9PlxuICAgICAgICAgICAgICAgICAgPEhlYWRlcj5OZXcgdGFibGVzOjwvSGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAge2FkZGVkQ29sdW1ucy5tYXAoKHsgbmFtZSB9LCBpKSA9PiA8VGV4dCBrZXk9e25hbWUgKyBpfT57bmFtZX08L1RleHQ+KX1cbiAgICAgICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgIDwvPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC5tYXRjaGVzKCdhY3Rpb24uYWN0aW9uQ2hvaWNlJykpIHtcbiAgICAgIGNvbnN0IHRlbXBBY3Rpb25zID0gIWFkZGVkQ29sdW1ucyEubGVuZ3RoXG4gICAgICAgID8gYWN0aW9ucy5maWx0ZXIoKHsgdmFsdWUgfSkgPT4gdmFsdWUgIT09IEFjdGlvbi5SRU5BTUUpXG4gICAgICAgIDogYWN0aW9ucztcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICA8SGVhZGVyPntgJHtkZWxldGVkQ29sdW1ucyFbbWlzc2luZ0l0ZW1JbmRleF0/Lm5hbWV9IGlzOmB9PC9IZWFkZXI+XG4gICAgICAgICAgPFNlbGVjdElucHV0IGl0ZW1zPXt0ZW1wQWN0aW9uc30gb25TZWxlY3Q9e3NlbGVjdEFjdGlvbn0gLz5cbiAgICAgICAgPC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50Lm1hdGNoZXMoJ2NvbmZpcm1hdGlvbkRlbGV0ZScpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgIDxIZWFkZXI+ISEhIERhdGEgaW4gdGFibGUgd2lsbCBiZSBsb3N0ICEhITwvSGVhZGVyPlxuICAgICAgICAgIDxUZXh0PkFyZSB5b3Ugc3VyZT88L1RleHQ+XG4gICAgICAgICAgPFNlbGVjdElucHV0IGl0ZW1zPXtjb25maXJtYXRpb25zfSBvblNlbGVjdD17Y29uZmlybX0gLz5cbiAgICAgICAgPC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50Lm1hdGNoZXMoJ2NvbmZpcm1hdGlvblJlbmFtZScpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgIDxIZWFkZXI+QXJlIHlvdSBzdXJlPzwvSGVhZGVyPlxuICAgICAgICAgIDxTZWxlY3RJbnB1dCBpdGVtcz17Y29uZmlybWF0aW9uc30gb25TZWxlY3Q9e2NvbmZpcm19IC8+XG4gICAgICAgIDwvPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC5tYXRjaGVzKCdhY3Rpb24ucmVuYW1lJykpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPEhlYWRlcj57YCR7ZGVsZXRlZENvbHVtbnMhW21pc3NpbmdJdGVtSW5kZXhdPy5uYW1lfSB3YXMgcmVuYW1lZCB0bzpgfTwvSGVhZGVyPlxuICAgICAgICAgIDxTZWxlY3RJbnB1dFxuICAgICAgICAgICAgaXRlbXM9e2FkZGVkQ29sdW1ucyEubWFwKCh0YWJsZSwgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICBrZXk6IFN0cmluZyhpKSxcbiAgICAgICAgICAgICAgbGFiZWw6IHRhYmxlLm5hbWUsXG4gICAgICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgICAgfSkpfVxuICAgICAgICAgICAgb25TZWxlY3Q9e3NlbGVjdE5ld0l0ZW1JbmRleH1cbiAgICAgICAgICAvPlxuICAgICAgICA8Lz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQubWF0Y2hlcygnZG9uZScpKSB7XG4gICAgICBvbkRvbmUoeyBjcmVhdGVkLCByZW5hbWVkLCBkZWxldGVkIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoPD48Lz4pO1xuICB9O1xuXG4gIHJldHVybiAoISFkZWxldGVkLmxlbmd0aFxuICAgICAgfHwgISFyZW5hbWVkLmxlbmd0aFxuICAgICAgfHwgISFjcmVhdGVkLmxlbmd0aCkgPyAoXG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpbj17MX0+XG4gICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgbWFyZ2luQm90dG9tPXswfT5cbiAgICAgICAgICAgIDxIZWFkZXI+e2Ake3RhYmxlTmFtZX0gY29sdW1uczpgfTwvSGVhZGVyPlxuICAgICAgICAgICAgPFRhYmxlXG4gICAgICAgICAgICAgIGRhdGE9e2Zvcm1hdERhdGFGb3JUYWJsZShbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGl0bGU6ICdEZWxldGVkJyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlczogZGVsZXRlZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUmVuYW1lZCcsXG4gICAgICAgICAgICAgICAgICB2YWx1ZXM6IHJlbmFtZWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ0NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgdmFsdWVzOiBjcmVhdGVkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0pfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgICB7cmVuZGVyRE9NKCl9XG4gICAgICAgIDwvQm94PlxuICAgICkgOiByZW5kZXJET00oKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByb21wdENvbHVtbnNDb25mbGljdHM7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnaW5rJztcbmltcG9ydCBTZWxlY3RJbnB1dCBmcm9tICdpbmstc2VsZWN0LWlucHV0JztcbmltcG9ydCBUYWJsZSwgeyBIZWFkZXIgfSBmcm9tICdpbmstdGFibGUnO1xuaW1wb3J0IHsgdXNlTWFjaGluZSB9IGZyb20gJ0B4c3RhdGUvcmVhY3QnO1xuaW1wb3J0IHsgSXRlbSB9IGZyb20gJ2luay1zZWxlY3QtaW5wdXQvYnVpbGQvU2VsZWN0SW5wdXQnO1xuXG5pbXBvcnQgeyBOYW1lZCwgVGFibGVzUmVzdWx0RGF0YSB9IGZyb20gJ2NsaS9jb21tYW5kcy9taWdyYXRlJztcbmltcG9ydCBjcmVhdGVSZXNvbHZlVGFibGVzTWFjaGluZSBmcm9tICdjbGkvbWFjaGluZXMvcmVzb2x2ZVRhYmxlc01hY2hpbmUnO1xuaW1wb3J0IGZvcm1hdERhdGFGb3JUYWJsZSBmcm9tICdjbGkvdXRpbHMvZm9ybWF0RGF0YUZvclRhYmxlJztcbmltcG9ydCB7XG4gIEFjdGlvbixcbiAgQ29uZmlybWF0aW9uLFxuICBhY3Rpb25zLFxuICBjb25maXJtYXRpb25zLFxufSBmcm9tICdjbGkvdXRpbHMvdmFsdWVzRm9yUHJvbXB0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyVGFibGVzU2VsZWN0UHJvcHM8VCBleHRlbmRzIE5hbWVkPiB7XG4gIG1pc3NpbmdUYWJsZXM6IFRbXSxcbiAgbmV3VGFibGVzOiBUW10sXG59XG5cbmludGVyZmFjZSBQcm9wczxUIGV4dGVuZHMgTmFtZWQ+IGV4dGVuZHMgUmVuZGVyVGFibGVzU2VsZWN0UHJvcHM8VD4ge1xuICBvbkRvbmU6ICh2YWx1ZTogVGFibGVzUmVzdWx0RGF0YTxUPikgPT4gdm9pZDtcbn1cblxuY29uc3QgUHJvbXB0VGFibGVzQ29uZmxpY3RzOiBSZWFjdC5GQzxQcm9wczxhbnk+PiA9ICh7XG4gIG9uRG9uZSxcbiAgbmV3VGFibGVzOiBuZXdQcm9wcyxcbiAgbWlzc2luZ1RhYmxlczogbWlzc2luZ1Byb3BzLFxufSkgPT4ge1xuICBjb25zdCBbY3VycmVudCwgc2VuZF0gPSB1c2VNYWNoaW5lKGNyZWF0ZVJlc29sdmVUYWJsZXNNYWNoaW5lKHtcbiAgICBtaXNzaW5nVGFibGVzOiBtaXNzaW5nUHJvcHMsXG4gICAgbmV3VGFibGVzOiBuZXdQcm9wcyxcbiAgfSkpO1xuXG4gIGNvbnN0IHtcbiAgICBtaXNzaW5nSXRlbUluZGV4LFxuICAgIG5ld1RhYmxlcyxcbiAgICBtaXNzaW5nVGFibGVzLFxuICAgIGNyZWF0ZWRUYWJsZXMsXG4gICAgcmVuYW1lZFRhYmxlcyxcbiAgICBkZWxldGVkVGFibGVzLFxuICB9ID0gY3VycmVudC5jb250ZXh0O1xuXG4gIGNvbnN0IHNlbGVjdEl0ZW1JbmRleCA9IChpdGVtOiBJdGVtPG51bWJlcj4pID0+IHtcbiAgICBzZW5kKHsgdHlwZTogJ0NIT0lDRV9JVEVNJywgaXRlbUluZGV4OiBpdGVtLnZhbHVlIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNlbGVjdE5ld0l0ZW1JbmRleCA9IChpdGVtOiBJdGVtPG51bWJlcj4pID0+IHtcbiAgICBzZW5kKHsgdHlwZTogJ0NIT0lDRV9ORVdfSVRFTScsIGl0ZW1JbmRleDogaXRlbS52YWx1ZSB9KTtcbiAgfTtcblxuICBjb25zdCBzZWxlY3RBY3Rpb24gPSAoYWN0aW9uOiBJdGVtPEFjdGlvbj4pID0+IHtcbiAgICBzZW5kKHsgdHlwZTogYWN0aW9uLnZhbHVlIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNvbmZpcm0gPSAoY29uZmlybWF0aW9uSXRlbTogSXRlbTxDb25maXJtYXRpb24+KSA9PiB7XG4gICAgc2VuZCh7IHR5cGU6IGNvbmZpcm1hdGlvbkl0ZW0udmFsdWUgfSk7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyRE9NID0gKCkgPT4ge1xuICAgIGlmIChjdXJyZW50Lm1hdGNoZXMoJ3RhYmxlJykpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgIDxCb3ggZGlzcGxheT1cImZsZXhcIj5cbiAgICAgICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgPEhlYWRlcj5NaXNzaW5nIHRhYmxlczo8L0hlYWRlcj5cbiAgICAgICAgICAgICAgICA8U2VsZWN0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGl0ZW1zPXttaXNzaW5nVGFibGVzIS5tYXAoKHRhYmxlLCBpOiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogU3RyaW5nKGkpLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGFibGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGksXG4gICAgICAgICAgICAgICAgICB9KSl9XG4gICAgICAgICAgICAgICAgICBvblNlbGVjdD17c2VsZWN0SXRlbUluZGV4fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgICB7ISFuZXdUYWJsZXM/Lmxlbmd0aCAmJiAoXG4gICAgICAgICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgcGFkZGluZ0xlZnQ9ezV9PlxuICAgICAgICAgICAgICAgICAgPEhlYWRlcj5OZXcgdGFibGVzOjwvSGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAge25ld1RhYmxlcy5tYXAoKHsgbmFtZSB9LCBpKSA9PiA8VGV4dCBrZXk9e25hbWUgKyBpfT57bmFtZX08L1RleHQ+KX1cbiAgICAgICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgIDwvPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC5tYXRjaGVzKCdhY3Rpb24uYWN0aW9uQ2hvaWNlJykpIHtcbiAgICAgIGNvbnN0IHRlbXBBY3Rpb25zID0gIW5ld1RhYmxlcyEubGVuZ3RoXG4gICAgICAgID8gYWN0aW9ucy5maWx0ZXIoKHsgdmFsdWUgfSkgPT4gdmFsdWUgIT09IEFjdGlvbi5SRU5BTUUpXG4gICAgICAgIDogYWN0aW9ucztcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICA8SGVhZGVyPntgJHttaXNzaW5nVGFibGVzIVttaXNzaW5nSXRlbUluZGV4XT8ubmFtZX0gaXM6YH08L0hlYWRlcj5cbiAgICAgICAgICA8U2VsZWN0SW5wdXQgaXRlbXM9e3RlbXBBY3Rpb25zfSBvblNlbGVjdD17c2VsZWN0QWN0aW9ufSAvPlxuICAgICAgICA8Lz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQubWF0Y2hlcygnY29uZmlybWF0aW9uRGVsZXRlJykpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPEhlYWRlcj4hISEgRGF0YSBpbiB0YWJsZSB3aWxsIGJlIGxvc3QgISEhPC9IZWFkZXI+XG4gICAgICAgICAgPFRleHQ+QXJlIHlvdSBzdXJlPzwvVGV4dD5cbiAgICAgICAgICA8U2VsZWN0SW5wdXQgaXRlbXM9e2NvbmZpcm1hdGlvbnN9IG9uU2VsZWN0PXtjb25maXJtfSAvPlxuICAgICAgICA8Lz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQubWF0Y2hlcygnY29uZmlybWF0aW9uUmVuYW1lJykpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPEhlYWRlcj5BcmUgeW91IHN1cmU/PC9IZWFkZXI+XG4gICAgICAgICAgPFNlbGVjdElucHV0IGl0ZW1zPXtjb25maXJtYXRpb25zfSBvblNlbGVjdD17Y29uZmlybX0gLz5cbiAgICAgICAgPC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50Lm1hdGNoZXMoJ2FjdGlvbi5yZW5hbWUnKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICA8SGVhZGVyPntgJHttaXNzaW5nVGFibGVzIVttaXNzaW5nSXRlbUluZGV4XT8ubmFtZX0gd2FzIHJlbmFtZWQgdG86YH08L0hlYWRlcj5cbiAgICAgICAgICA8U2VsZWN0SW5wdXRcbiAgICAgICAgICAgIGl0ZW1zPXtuZXdUYWJsZXMhLm1hcCgodGFibGUsIGk6IG51bWJlcikgPT4gKHtcbiAgICAgICAgICAgICAga2V5OiBTdHJpbmcoaSksXG4gICAgICAgICAgICAgIGxhYmVsOiB0YWJsZS5uYW1lLFxuICAgICAgICAgICAgICB2YWx1ZTogaSxcbiAgICAgICAgICAgIH0pKX1cbiAgICAgICAgICAgIG9uU2VsZWN0PXtzZWxlY3ROZXdJdGVtSW5kZXh9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50Lm1hdGNoZXMoJ2RvbmUnKSkge1xuICAgICAgb25Eb25lKHtcbiAgICAgICAgY3JlYXRlZDogY3JlYXRlZFRhYmxlcyxcbiAgICAgICAgcmVuYW1lZDogcmVuYW1lZFRhYmxlcyxcbiAgICAgICAgZGVsZXRlZDogZGVsZXRlZFRhYmxlcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoPD48Lz4pO1xuICB9O1xuXG4gIHJldHVybiAoISFkZWxldGVkVGFibGVzLmxlbmd0aFxuICAgICAgfHwgISFyZW5hbWVkVGFibGVzLmxlbmd0aFxuICAgICAgfHwgISFjcmVhdGVkVGFibGVzLmxlbmd0aCkgPyAoXG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpbj17MX0+XG4gICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgbWFyZ2luQm90dG9tPXswfT5cbiAgICAgICAgICAgIDxIZWFkZXI+VGFibGVzOiA8L0hlYWRlcj5cbiAgICAgICAgICAgIDxUYWJsZVxuICAgICAgICAgICAgICBkYXRhPXtmb3JtYXREYXRhRm9yVGFibGUoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRGVsZXRlZCcsXG4gICAgICAgICAgICAgICAgICB2YWx1ZXM6IGRlbGV0ZWRUYWJsZXMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ1JlbmFtZWQnLFxuICAgICAgICAgICAgICAgICAgdmFsdWVzOiByZW5hbWVkVGFibGVzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGl0bGU6ICdDcmVhdGVkJyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlczogY3JlYXRlZFRhYmxlcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAge3JlbmRlckRPTSgpfVxuICAgICAgICA8L0JveD5cbiAgICApIDogcmVuZGVyRE9NKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9tcHRUYWJsZXNDb25mbGljdHM7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJveCwgTmV3bGluZSwgVGV4dCB9IGZyb20gJ2luayc7XG5pbXBvcnQgU3Bpbm5lciBmcm9tICdpbmstc3Bpbm5lcic7XG5pbXBvcnQgeyBDcmVhdGVUYXNrUGFyYW1zIH0gZnJvbSAnY2xpL2NvbXBvbmVudHMtYXBpL2luZGV4JztcblxuZW51bSBTdGVwU3RhdGUge1xuICBJTl9QUk9HUkVTUyxcbiAgU1VDQ0VTUyxcbiAgRkFJTFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxiYWNrUHJvcHMge1xuICBzZXRUaXRsZTogUmVhY3QuRGlzcGF0Y2g8UmVhY3QuU2V0U3RhdGVBY3Rpb248c3RyaW5nPj5cbiAgc2V0RXJyb3I6IFJlYWN0LkRpc3BhdGNoPFJlYWN0LlNldFN0YXRlQWN0aW9uPGFueT4+XG59XG5cbmludGVyZmFjZSBQcm9wczxUPiB7XG4gIGZ1bmM6IChwcm9wczogQ2FsbGJhY2tQcm9wcykgPT4gVDtcbiAgb25Eb25lOiAocmVzdWx0OiBUKSA9PiBUO1xuICB0aXRsZVN0cjogc3RyaW5nO1xufVxuXG5jb25zdCBUYXNrOiBSZWFjdC5GQzxQcm9wczxhbnk+PiA9IDxUIGV4dGVuZHMgdW5rbm93bj4ocHJvcHM6IFByb3BzPFQ+KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmdW5jLFxuICAgIG9uRG9uZSxcbiAgICB0aXRsZVN0cixcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbdGl0bGUsIHNldFRpdGxlXSA9IHVzZVN0YXRlPHN0cmluZz4odGl0bGVTdHIpO1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZVN0YXRlPFN0ZXBTdGF0ZT4oU3RlcFN0YXRlLklOX1BST0dSRVNTKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxhbnk+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZ1bmMoeyBzZXRUaXRsZSwgc2V0RXJyb3IgfSk7XG4gICAgICAgIHNldFN0YXRlKFN0ZXBTdGF0ZS5TVUNDRVNTKTtcbiAgICAgICAgb25Eb25lKHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgLy8gc2V0RXJyb3IoZSk7XG4gICAgICAgIC8vIHNldFN0YXRlKFN0ZXBTdGF0ZS5GQUlMKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJyb3dcIj5cbiAgICAgIDxCb3ggbWFyZ2luUmlnaHQ9ezF9PlxuICAgICAgICB7c3RhdGUgPT09IFN0ZXBTdGF0ZS5JTl9QUk9HUkVTUyA/IChcbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgIDxTcGlubmVyIHR5cGU9XCJkb3RzXCIgLz5cbiAgICAgICAgICAgIF1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICkgOiBzdGF0ZSA9PT0gU3RlcFN0YXRlLlNVQ0NFU1MgPyAoXG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICA8VGV4dCBjb2xvcj1cImdyZWVuXCI+4pyTPC9UZXh0PlxuICAgICAgICAgICAgXVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwicmVkXCI+w5c8L1RleHQ+XG4gICAgICAgICAgICBdXG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICApfVxuXG4gICAgICAgIHtzdGF0ZSA9PT0gU3RlcFN0YXRlLkZBSUwgPyAoXG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgICA8TmV3bGluZSAvPlxuICAgICAgICAgICAgPFRleHQgY29sb3I9XCJyZWRcIj57ZXJyb3IhLm1lc3NhZ2V9PC9UZXh0PlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFRleHQ+e3RpdGxlfTwvVGV4dD5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgIDwvQm94PlxuICAgIDwvQm94PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVGFzaztcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwcm94eSB9IGZyb20gJ3ZhbHRpbyc7XG5cbmltcG9ydCB7XG4gIENvbHVtbnNSZXN1bHREYXRhLFxuICBOYW1lZCxcbiAgVGFibGVzUmVzdWx0RGF0YSxcbn0gZnJvbSAnY2xpL2NvbW1hbmRzL21pZ3JhdGUnO1xuaW1wb3J0IFRhc2ssIHsgQ2FsbGJhY2tQcm9wcyB9IGZyb20gJ2NsaS9jb21wb25lbnRzLWFwaS9jb21wb25lbnRzL1Rhc2snO1xuaW1wb3J0IGNyZWF0ZUFwcCBmcm9tICdjbGkvY29tcG9uZW50cy1hcGkvQ3JlYXRlQXBwJztcbmltcG9ydCB7IFRhYmxlV2l0aENvbHVtbiB9IGZyb20gJ2NsaS9tYWNoaW5lcy9yZXNvbHZlQ29sdW1uc01hY2hpbmUnO1xuaW1wb3J0IFByb21wdFRhYmxlc0NvbmZsaWN0cywgeyBSZW5kZXJUYWJsZXNTZWxlY3RQcm9wcyB9IGZyb20gJ2NsaS9jb21wb25lbnRzLWFwaS9jb21wb25lbnRzL1Byb21wdFRhYmxlc0NvbmZsaWN0cyc7XG5pbXBvcnQgUHJvbXB0Q29sdW1uc0NvbmZsaWN0cyBmcm9tICdjbGkvY29tcG9uZW50cy1hcGkvY29tcG9uZW50cy9Qcm9tcHRDb2x1bW5zQ29uZmxpY3RzJztcblxuY29uc3QgY29tcG9uZW50c0xpc3QgPSBwcm94eTxSZWFjdC5SZWFjdEVsZW1lbnQ8YW55LCBhbnk+W10+KFtdKTtcbmxldCBhcHA6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUFwcD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVGFza1BhcmFtczxJbiwgQ2JzPiB7XG4gIGlucHV0OiBJbixcbiAgcnVuOiAoY2JzOiBDYnMpID0+IHZvaWRcbn1cblxuY29uc3QgcHJlcGFyZUFwcCA9ICgpID0+IHtcbiAgaWYgKCFhcHApIHtcbiAgICBhcHAgPSBjcmVhdGVBcHAoY29tcG9uZW50c0xpc3QpO1xuICAgIGNvbXBvbmVudHNMaXN0Lmxlbmd0aCA9IDA7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0YXNrID0gPFQgZXh0ZW5kcyB1bmtub3duPihcbiAgdGl0bGVTdHI6IHN0cmluZyxcbiAgZnVuYzogKHByb3BzOiBDYWxsYmFja1Byb3BzKSA9PiBULFxuKSA9PiBuZXcgUHJvbWlzZTxUPigoXG4gIHJlc29sdmUsXG4pID0+IHtcbiAgcHJlcGFyZUFwcCgpO1xuXG4gIGNvbXBvbmVudHNMaXN0LnB1c2goXG4gICAgPFRhc2tcbiAgICAgIHRpdGxlU3RyPXt0aXRsZVN0cn1cbiAgICAgIGZ1bmM9e2Z1bmN9XG4gICAgICBvbkRvbmU9eyh2YWw6IFQpID0+IHJlc29sdmUodmFsKX1cbiAgICAvPixcbiAgKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgcHJvbXB0VGFibGVzQ29uZmxpY3RzID0gPFQgZXh0ZW5kcyBOYW1lZD4oXG4gIHsgbWlzc2luZ1RhYmxlcywgbmV3VGFibGVzIH06IFJlbmRlclRhYmxlc1NlbGVjdFByb3BzPFQ+LFxuKSA9PiBuZXcgUHJvbWlzZTxUYWJsZXNSZXN1bHREYXRhPFQ+PigoXG4gIHJlc29sdmUsXG4pID0+IHtcbiAgcHJlcGFyZUFwcCgpO1xuXG4gIGNvbXBvbmVudHNMaXN0LnB1c2goXG4gICAgPFByb21wdFRhYmxlc0NvbmZsaWN0c1xuICAgICAgb25Eb25lPXsodmFsKSA9PiByZXNvbHZlKHZhbCl9XG4gICAgICBtaXNzaW5nVGFibGVzPXttaXNzaW5nVGFibGVzfVxuICAgICAgbmV3VGFibGVzPXtuZXdUYWJsZXN9XG4gICAgLz4sXG4gICk7XG59KTtcblxuZXhwb3J0IGNvbnN0IHByb21wdENvbHVtbnNDb25mbGljdHMgPSA8VCBleHRlbmRzIE5hbWVkPihcbiAgdGFibGVXaXRoQ29sdW1uczogVGFibGVXaXRoQ29sdW1uPFQ+LFxuKSA9PiBuZXcgUHJvbWlzZTxDb2x1bW5zUmVzdWx0RGF0YTxUPj4oKFxuICByZXNvbHZlLFxuKSA9PiB7XG4gIHByZXBhcmVBcHAoKTtcblxuICBjb21wb25lbnRzTGlzdC5wdXNoKFxuICAgIDxQcm9tcHRDb2x1bW5zQ29uZmxpY3RzXG4gICAgICBvbkRvbmU9eyh2YWwpID0+IHJlc29sdmUodmFsKX1cbiAgICAgIHRhYmxlV2l0aENvbHVtbnM9e3RhYmxlV2l0aENvbHVtbnN9XG4gICAgLz4sXG4gICk7XG59KTtcbiIsImltcG9ydCB7IENvbW1hbmQsIHByb2dyYW0gfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IG1pZ3JhdGUgZnJvbSAnLi9jb21tYW5kcy9taWdyYXRlJztcbmltcG9ydCAnc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyJztcbmltcG9ydCAncHJldHR5LWVycm9yL3N0YXJ0JztcbmltcG9ydCAnLi9jb21tYW5kcy9taWdyYXRlJztcbmltcG9ydCBwcmVwYXJlU25hcHNob3QgZnJvbSAnLi9jb21tYW5kcy9wcmVwYXJlLXNuYXBzaG90J1xuXG5cbmNvbnN0IG1pZ3JhdGlvbkNvbW1hbmQgPSBuZXcgQ29tbWFuZCgnbWlncmF0ZScpXG4gICAgLmFsaWFzKCdtZycpXG4gICAgLmRlc2NyaXB0aW9uKCdNaWdyYXRpb24nKVxuICAgIC5hY3Rpb24obWlncmF0ZSk7XG5cbmNvbnN0IHByZXBhcmVTbmFwc2hvdENvbW1hbmQgPSBuZXcgQ29tbWFuZCgncHJlcGFyZScpXG4gICAgLmFyZ3VtZW50KCc8cGF0aD4nKVxuICAgIC5hY3Rpb24oKHBhdGgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocHJlcGFyZVNuYXBzaG90KHBhdGgpLCBudWxsLCAyKSlcbiAgICB9KVxuXG5wcm9ncmFtLmFkZENvbW1hbmQobWlncmF0aW9uQ29tbWFuZClcbnByb2dyYW0uYWRkQ29tbWFuZChwcmVwYXJlU25hcHNob3RDb21tYW5kKVxucHJvZ3JhbS5wYXJzZSgpO1xuIiwiaW1wb3J0IHsgYXNzaWduLCBjcmVhdGVNYWNoaW5lLCBzZW5kIH0gZnJvbSAneHN0YXRlJztcbmltcG9ydCB7IE5hbWVkLCBSZW5hbWVkT2JqZWN0IH0gZnJvbSAnY2xpL2NvbW1hbmRzL21pZ3JhdGUnO1xuXG50eXBlIEV2ZW50ID1cbiAgfCB7IHR5cGU6ICdDSE9JQ0VfSVRFTScsIGl0ZW1JbmRleDogbnVtYmVyIH1cbiAgfCB7IHR5cGU6ICdERUxFVEUnIH1cbiAgfCB7IHR5cGU6ICdSRU5BTUUnIH1cbiAgfCB7IHR5cGU6ICdDQU5DRUwnIH1cbiAgfCB7IHR5cGU6ICdDT05GSVJNJyB9XG4gIHwgeyB0eXBlOiAnTkVYVCcgfVxuICB8IHsgdHlwZTogJ0NIT0lDRV9ORVdfSVRFTSc7IGl0ZW1JbmRleDogbnVtYmVyIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVXaXRoQ29sdW1uPFQgZXh0ZW5kcyBOYW1lZD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFkZGVkOiBUW10sXG4gIGRlbGV0ZWQ6IFRbXSxcbn1cblxuaW50ZXJmYWNlIFByb3BzPFQgZXh0ZW5kcyBOYW1lZD4ge1xuICB0YWJsZVdpdGhDb2x1bW5zOiBUYWJsZVdpdGhDb2x1bW48VD4sXG59XG5cbmludGVyZmFjZSBDb250ZXh0IHtcbiAgdGFibGVOYW1lOiBzdHJpbmcsXG4gIGFkZGVkQ29sdW1uczogTmFtZWRbXSxcbiAgZGVsZXRlZENvbHVtbnM6IE5hbWVkW10sXG4gIG1pc3NpbmdJdGVtSW5kZXg6IG51bWJlcixcbiAgbmV3SXRlbUluZGV4OiBudW1iZXIsXG4gIGNyZWF0ZWQ6IE5hbWVkW107XG4gIHJlbmFtZWQ6IFJlbmFtZWRPYmplY3Q8TmFtZWQ+W107XG4gIGRlbGV0ZWQ6IE5hbWVkW107XG59XG5cbmNvbnN0IGNyZWF0ZVJlc29sdmVDb2x1bW5zTWFjaGluZSA9IDxUIGV4dGVuZHMgTmFtZWQ+KHByb3BzOiBQcm9wczxUPikgPT4gKFxuICBjcmVhdGVNYWNoaW5lPENvbnRleHQsIEV2ZW50Pih7XG4gICAgaWQ6ICdyZXNvbHZlQ29sdW1ucycsXG4gICAgaW5pdGlhbDogJ3RhYmxlJyxcbiAgICBjb250ZXh0OiB7XG4gICAgICB0YWJsZU5hbWU6IHByb3BzLnRhYmxlV2l0aENvbHVtbnMubmFtZSxcbiAgICAgIGFkZGVkQ29sdW1uczogcHJvcHMudGFibGVXaXRoQ29sdW1ucy5hZGRlZCxcbiAgICAgIGRlbGV0ZWRDb2x1bW5zOiBwcm9wcy50YWJsZVdpdGhDb2x1bW5zLmRlbGV0ZWQsXG4gICAgICBtaXNzaW5nSXRlbUluZGV4OiAwLFxuICAgICAgbmV3SXRlbUluZGV4OiAwLFxuICAgICAgY3JlYXRlZDogW10sXG4gICAgICByZW5hbWVkOiBbXSxcbiAgICAgIGRlbGV0ZWQ6IFtdLFxuICAgIH0sXG4gICAgc3RhdGVzOiB7XG4gICAgICB0YWJsZToge1xuICAgICAgICBlbnRyeTogc2VuZCh7IHR5cGU6ICdORVhUJyB9KSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBORVhUOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRhcmdldDogJ2RvbmUnLFxuICAgICAgICAgICAgICBjb25kOiAnaXNNaXNzaW5nQ29sdW1uc1Jlc29sdmVkJyxcbiAgICAgICAgICAgICAgYWN0aW9uczogWydyZXNvbHZlUmVtYWluaW5nJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0YXJnZXQ6ICdkb25lJyxcbiAgICAgICAgICAgICAgY29uZDogJ2lzTmV3Q29sdW1uc1Jlc29sdmVkJyxcbiAgICAgICAgICAgICAgYWN0aW9uczogWydyZXNvbHZlTWlzc2luZyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIENIT0lDRV9JVEVNOiB7IHRhcmdldDogJ2FjdGlvbicsIGFjdGlvbnM6IFsnY2hvc2VJdGVtJ10gfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhY3Rpb246IHtcbiAgICAgICAgaW5pdGlhbDogJ2FjdGlvbkNob2ljZScsXG4gICAgICAgIHN0YXRlczoge1xuICAgICAgICAgIGFjdGlvbkNob2ljZToge1xuICAgICAgICAgICAgb246IHsgREVMRVRFOiAnI3Jlc29sdmVDb2x1bW5zLmNvbmZpcm1hdGlvbkRlbGV0ZScsIFJFTkFNRTogJ3JlbmFtZScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlbmFtZToge1xuICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgQ0hPSUNFX05FV19JVEVNOiB7IHRhcmdldDogJyNyZXNvbHZlQ29sdW1ucy5jb25maXJtYXRpb25SZW5hbWUnLCBhY3Rpb25zOiBbJ2Nob3NlTmV3SXRlbSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29uZmlybWF0aW9uRGVsZXRlOiB7XG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgQ0FOQ0VMOiAnYWN0aW9uLmFjdGlvbkNob2ljZScsXG4gICAgICAgICAgQ09ORklSTTogW1xuICAgICAgICAgICAgeyB0YXJnZXQ6ICdmaW5hbCcsIGFjdGlvbnM6IFsnZGVsZXRlJ10gfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbmZpcm1hdGlvblJlbmFtZToge1xuICAgICAgICBvbjoge1xuICAgICAgICAgIENBTkNFTDogJ2FjdGlvbi5hY3Rpb25DaG9pY2UnLFxuICAgICAgICAgIENPTkZJUk06IFtcbiAgICAgICAgICAgIHsgdGFyZ2V0OiAnZmluYWwnLCBhY3Rpb25zOiBbJ3JlbmFtZSddIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmaW5hbDoge1xuICAgICAgICBlbnRyeTogc2VuZCh7IHR5cGU6ICdORVhUJyB9KSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBORVhUOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRhcmdldDogJ2RvbmUnLFxuICAgICAgICAgICAgICBjb25kOiAnaXNNaXNzaW5nQ29sdW1uc1Jlc29sdmVkJyxcbiAgICAgICAgICAgICAgYWN0aW9uczogWydyZXNvbHZlUmVtYWluaW5nJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0YXJnZXQ6ICd0YWJsZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZG9uZToge30sXG4gICAgfSxcbiAgfSxcbiAgICB7XG4gICAgICBndWFyZHM6IHtcbiAgICAgICAgaXNNaXNzaW5nQ29sdW1uc1Jlc29sdmVkOiAoeyBkZWxldGVkQ29sdW1ucyB9KSA9PiAhZGVsZXRlZENvbHVtbnMubGVuZ3RoLFxuICAgICAgICBpc05ld0NvbHVtbnNSZXNvbHZlZDogKHsgYWRkZWRDb2x1bW5zIH0pID0+ICFhZGRlZENvbHVtbnMubGVuZ3RoLFxuICAgICAgfSxcbiAgICAgIGFjdGlvbnM6IHtcbiAgICAgICAgY2hvc2VJdGVtOiBhc3NpZ24oe1xuICAgICAgICAgIG1pc3NpbmdJdGVtSW5kZXg6IChjb250ZXh0LCBldmVudCkgPT4gKGV2ZW50LnR5cGUgPT09ICdDSE9JQ0VfSVRFTScgPyBldmVudC5pdGVtSW5kZXggOiAwKSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgY2hvc2VOZXdJdGVtOiBhc3NpZ24oe1xuICAgICAgICAgIG5ld0l0ZW1JbmRleDogKGNvbnRleHQsIGV2ZW50KSA9PiAoZXZlbnQudHlwZSA9PT0gJ0NIT0lDRV9ORVdfSVRFTScgPyBldmVudC5pdGVtSW5kZXggOiAwKSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgZGVsZXRlOiBhc3NpZ24oe1xuICAgICAgICAgIGRlbGV0ZWQ6ICh7XG4gICAgICAgICAgICBtaXNzaW5nSXRlbUluZGV4LFxuICAgICAgICAgICAgZGVsZXRlZCxcbiAgICAgICAgICAgIGRlbGV0ZWRDb2x1bW5zLFxuICAgICAgICAgIH0pID0+IFsuLi5kZWxldGVkLCBkZWxldGVkQ29sdW1uc1ttaXNzaW5nSXRlbUluZGV4XV0sXG4gICAgICAgICAgZGVsZXRlZENvbHVtbnM6ICh7XG4gICAgICAgICAgICBtaXNzaW5nSXRlbUluZGV4LFxuICAgICAgICAgICAgZGVsZXRlZENvbHVtbnMsXG4gICAgICAgICAgfSkgPT4gZGVsZXRlZENvbHVtbnMuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggIT09IG1pc3NpbmdJdGVtSW5kZXgpLFxuICAgICAgICB9KSxcblxuICAgICAgICByZW5hbWU6IGFzc2lnbih7XG4gICAgICAgICAgcmVuYW1lZDogKHtcbiAgICAgICAgICAgIG1pc3NpbmdJdGVtSW5kZXgsXG4gICAgICAgICAgICBuZXdJdGVtSW5kZXgsXG4gICAgICAgICAgICByZW5hbWVkLFxuICAgICAgICAgICAgYWRkZWRDb2x1bW5zLFxuICAgICAgICAgICAgZGVsZXRlZENvbHVtbnMsXG4gICAgICAgICAgfSkgPT4gW1xuICAgICAgICAgICAgICAuLi5yZW5hbWVkLFxuICAgICAgICAgICAgICB7IG9sZDogZGVsZXRlZENvbHVtbnNbbWlzc2luZ0l0ZW1JbmRleF0sIG5ldzogYWRkZWRDb2x1bW5zW25ld0l0ZW1JbmRleF0gfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgZGVsZXRlZENvbHVtbnM6ICh7XG4gICAgICAgICAgICBtaXNzaW5nSXRlbUluZGV4LFxuICAgICAgICAgICAgZGVsZXRlZENvbHVtbnMsXG4gICAgICAgICAgfSkgPT4gZGVsZXRlZENvbHVtbnMuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggIT09IG1pc3NpbmdJdGVtSW5kZXgpLFxuICAgICAgICAgIGFkZGVkQ29sdW1uczogKHtcbiAgICAgICAgICAgIG5ld0l0ZW1JbmRleCxcbiAgICAgICAgICAgIGFkZGVkQ29sdW1ucyxcbiAgICAgICAgICB9KSA9PiBhZGRlZENvbHVtbnMuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggIT09IG5ld0l0ZW1JbmRleCksXG4gICAgICAgIH0pLFxuXG4gICAgICAgIHJlc29sdmVSZW1haW5pbmc6IGFzc2lnbih7XG4gICAgICAgICAgY3JlYXRlZDogKHtcbiAgICAgICAgICAgIGFkZGVkQ29sdW1ucyxcbiAgICAgICAgICAgIGNyZWF0ZWQsXG4gICAgICAgICAgfSkgPT4gWy4uLmNyZWF0ZWQsIC4uLmFkZGVkQ29sdW1uc10sXG4gICAgICAgICAgYWRkZWRDb2x1bW5zOiAoY29udGV4dCkgPT4gW10sXG4gICAgICAgIH0pLFxuXG4gICAgICAgIHJlc29sdmVNaXNzaW5nOiBhc3NpZ24oe1xuICAgICAgICAgIGRlbGV0ZWQ6ICh7XG4gICAgICAgICAgICBkZWxldGVkQ29sdW1ucyxcbiAgICAgICAgICAgIGRlbGV0ZWQsXG4gICAgICAgICAgfSkgPT4gWy4uLmRlbGV0ZWQsIC4uLmRlbGV0ZWRDb2x1bW5zXSxcbiAgICAgICAgICBkZWxldGVkQ29sdW1uczogKGNvbnRleHQpID0+IFtdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSkpO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVSZXNvbHZlQ29sdW1uc01hY2hpbmU7XG4iLCJpbXBvcnQgeyBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIHNlbmQgfSBmcm9tICd4c3RhdGUnO1xuaW1wb3J0IHsgTmFtZWQsIFJlbmFtZWRPYmplY3QgfSBmcm9tICdjbGkvY29tbWFuZHMvbWlncmF0ZSc7XG5cbnR5cGUgRXZlbnQgPVxuICB8IHsgdHlwZTogJ0NIT0lDRV9JVEVNJywgaXRlbUluZGV4OiBudW1iZXIgfVxuICB8IHsgdHlwZTogJ0RFTEVURScgfVxuICB8IHsgdHlwZTogJ1JFTkFNRScgfVxuICB8IHsgdHlwZTogJ0NBTkNFTCcgfVxuICB8IHsgdHlwZTogJ0NPTkZJUk0nIH1cbiAgfCB7IHR5cGU6ICdORVhUJyB9XG4gIHwgeyB0eXBlOiAnQ0hPSUNFX05FV19JVEVNJzsgaXRlbUluZGV4OiBudW1iZXIgfTtcblxuaW50ZXJmYWNlIENvbnRleHQgZXh0ZW5kcyBQcm9wcyB7XG4gIG1pc3NpbmdJdGVtSW5kZXg6IG51bWJlcixcbiAgbmV3SXRlbUluZGV4OiBudW1iZXIsXG4gIGNyZWF0ZWRUYWJsZXM6IE5hbWVkW107XG4gIHJlbmFtZWRUYWJsZXM6IFJlbmFtZWRPYmplY3Q8TmFtZWQ+W107XG4gIGRlbGV0ZWRUYWJsZXM6IE5hbWVkW107XG59XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIG1pc3NpbmdUYWJsZXM6IE5hbWVkW10sXG4gIG5ld1RhYmxlczogTmFtZWRbXSxcbn1cblxuY29uc3QgY3JlYXRlUmVzb2x2ZVRhYmxlc01hY2hpbmUgPSAocHJvcHM6IFByb3BzKSA9PiAoXG4gIGNyZWF0ZU1hY2hpbmU8Q29udGV4dCwgRXZlbnQ+KHtcbiAgICBpZDogJ3Jlc29sdmVUYWJsZXMnLFxuICAgIGluaXRpYWw6ICd0YWJsZScsXG4gICAgY29udGV4dDoge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBtaXNzaW5nSXRlbUluZGV4OiAwLFxuICAgICAgbmV3SXRlbUluZGV4OiAwLFxuICAgICAgY3JlYXRlZFRhYmxlczogW10sXG4gICAgICByZW5hbWVkVGFibGVzOiBbXSxcbiAgICAgIGRlbGV0ZWRUYWJsZXM6IFtdLFxuICAgIH0sXG4gICAgc3RhdGVzOiB7XG4gICAgICB0YWJsZToge1xuICAgICAgICBlbnRyeTogc2VuZCh7IHR5cGU6ICdORVhUJyB9KSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBORVhUOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRhcmdldDogJ2RvbmUnLFxuICAgICAgICAgICAgICBjb25kOiAnaXNNaXNzaW5nVGFibGVzUmVzb2x2ZWQnLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ3Jlc29sdmVSZW1haW5pbmcnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRhcmdldDogJ2RvbmUnLFxuICAgICAgICAgICAgICBjb25kOiAnaXNOZXdUYWJsZXNSZXNvbHZlZCcsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsncmVzb2x2ZU1pc3NpbmcnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBDSE9JQ0VfSVRFTTogeyB0YXJnZXQ6ICdhY3Rpb24nLCBhY3Rpb25zOiBbJ2Nob3NlSXRlbSddIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWN0aW9uOiB7XG4gICAgICAgIGluaXRpYWw6ICdhY3Rpb25DaG9pY2UnLFxuICAgICAgICBzdGF0ZXM6IHtcbiAgICAgICAgICBhY3Rpb25DaG9pY2U6IHtcbiAgICAgICAgICAgIG9uOiB7IERFTEVURTogJyNyZXNvbHZlVGFibGVzLmNvbmZpcm1hdGlvbkRlbGV0ZScsIFJFTkFNRTogJ3JlbmFtZScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlbmFtZToge1xuICAgICAgICAgICAgb246IHtcbiAgICAgICAgICAgICAgQ0hPSUNFX05FV19JVEVNOiB7IHRhcmdldDogJyNyZXNvbHZlVGFibGVzLmNvbmZpcm1hdGlvblJlbmFtZScsIGFjdGlvbnM6IFsnY2hvc2VOZXdJdGVtJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb25maXJtYXRpb25EZWxldGU6IHtcbiAgICAgICAgb246IHtcbiAgICAgICAgICBDQU5DRUw6ICdhY3Rpb24uYWN0aW9uQ2hvaWNlJyxcbiAgICAgICAgICBDT05GSVJNOiBbXG4gICAgICAgICAgICB7IHRhcmdldDogJ2ZpbmFsJywgYWN0aW9uczogWydkZWxldGUnXSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29uZmlybWF0aW9uUmVuYW1lOiB7XG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgQ0FOQ0VMOiAnYWN0aW9uLmFjdGlvbkNob2ljZScsXG4gICAgICAgICAgQ09ORklSTTogW1xuICAgICAgICAgICAgeyB0YXJnZXQ6ICdmaW5hbCcsIGFjdGlvbnM6IFsncmVuYW1lJ10gfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGZpbmFsOiB7XG4gICAgICAgIGVudHJ5OiBzZW5kKHsgdHlwZTogJ05FWFQnIH0pLFxuICAgICAgICBvbjoge1xuICAgICAgICAgIE5FWFQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFyZ2V0OiAnZG9uZScsXG4gICAgICAgICAgICAgIGNvbmQ6ICdpc01pc3NpbmdUYWJsZXNSZXNvbHZlZCcsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsncmVzb2x2ZVJlbWFpbmluZyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFyZ2V0OiAndGFibGUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRvbmU6IHt9LFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBndWFyZHM6IHtcbiAgICAgIGlzTWlzc2luZ1RhYmxlc1Jlc29sdmVkOiAoeyBtaXNzaW5nVGFibGVzIH0pID0+ICFtaXNzaW5nVGFibGVzLmxlbmd0aCxcbiAgICAgIGlzTmV3VGFibGVzUmVzb2x2ZWQ6ICh7IG5ld1RhYmxlcyB9KSA9PiAhbmV3VGFibGVzLmxlbmd0aCxcbiAgICB9LFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIGNob3NlSXRlbTogYXNzaWduKHtcbiAgICAgICAgbWlzc2luZ0l0ZW1JbmRleDogKGNvbnRleHQsIGV2ZW50KSA9PiAoZXZlbnQudHlwZSA9PT0gJ0NIT0lDRV9JVEVNJyA/IGV2ZW50Lml0ZW1JbmRleCA6IDApLFxuICAgICAgfSksXG5cbiAgICAgIGNob3NlTmV3SXRlbTogYXNzaWduKHtcbiAgICAgICAgbmV3SXRlbUluZGV4OiAoY29udGV4dCwgZXZlbnQpID0+IChldmVudC50eXBlID09PSAnQ0hPSUNFX05FV19JVEVNJyA/IGV2ZW50Lml0ZW1JbmRleCA6IDApLFxuICAgICAgfSksXG5cbiAgICAgIGRlbGV0ZTogYXNzaWduKHtcbiAgICAgICAgZGVsZXRlZFRhYmxlczogKHtcbiAgICAgICAgICBtaXNzaW5nSXRlbUluZGV4LFxuICAgICAgICAgIGRlbGV0ZWRUYWJsZXMsXG4gICAgICAgICAgbWlzc2luZ1RhYmxlcyxcbiAgICAgICAgfSkgPT4gWy4uLmRlbGV0ZWRUYWJsZXMsIG1pc3NpbmdUYWJsZXNbbWlzc2luZ0l0ZW1JbmRleF1dLFxuICAgICAgICBtaXNzaW5nVGFibGVzOiAoe1xuICAgICAgICAgIG1pc3NpbmdJdGVtSW5kZXgsXG4gICAgICAgICAgbWlzc2luZ1RhYmxlcyxcbiAgICAgICAgfSkgPT4gbWlzc2luZ1RhYmxlcy5maWx0ZXIoKF8sIGluZGV4KSA9PiBpbmRleCAhPT0gbWlzc2luZ0l0ZW1JbmRleCksXG4gICAgICB9KSxcblxuICAgICAgcmVuYW1lOiBhc3NpZ24oe1xuICAgICAgICByZW5hbWVkVGFibGVzOiAoe1xuICAgICAgICAgIG1pc3NpbmdJdGVtSW5kZXgsXG4gICAgICAgICAgbmV3SXRlbUluZGV4LFxuICAgICAgICAgIHJlbmFtZWRUYWJsZXMsXG4gICAgICAgICAgbmV3VGFibGVzLFxuICAgICAgICAgIG1pc3NpbmdUYWJsZXMsXG4gICAgICAgIH0pID0+IFtcbiAgICAgICAgICAuLi5yZW5hbWVkVGFibGVzLFxuICAgICAgICAgIHsgb2xkOiBtaXNzaW5nVGFibGVzW21pc3NpbmdJdGVtSW5kZXhdLCBuZXc6IG5ld1RhYmxlc1tuZXdJdGVtSW5kZXhdIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG1pc3NpbmdUYWJsZXM6ICh7XG4gICAgICAgICAgbWlzc2luZ0l0ZW1JbmRleCxcbiAgICAgICAgICBtaXNzaW5nVGFibGVzLFxuICAgICAgICB9KSA9PiBtaXNzaW5nVGFibGVzLmZpbHRlcigoXywgaW5kZXgpID0+IGluZGV4ICE9PSBtaXNzaW5nSXRlbUluZGV4KSxcbiAgICAgICAgbmV3VGFibGVzOiAoe1xuICAgICAgICAgIG5ld0l0ZW1JbmRleCxcbiAgICAgICAgICBuZXdUYWJsZXMsXG4gICAgICAgIH0pID0+IG5ld1RhYmxlcy5maWx0ZXIoKF8sIGluZGV4KSA9PiBpbmRleCAhPT0gbmV3SXRlbUluZGV4KSxcbiAgICAgIH0pLFxuXG4gICAgICByZXNvbHZlUmVtYWluaW5nOiBhc3NpZ24oe1xuICAgICAgICBjcmVhdGVkVGFibGVzOiAoe1xuICAgICAgICAgIG5ld1RhYmxlcyxcbiAgICAgICAgICBjcmVhdGVkVGFibGVzLFxuICAgICAgICB9KSA9PiBbLi4uY3JlYXRlZFRhYmxlcywgLi4ubmV3VGFibGVzXSxcbiAgICAgICAgbmV3VGFibGVzOiAoY29udGV4dCkgPT4gW10sXG4gICAgICB9KSxcblxuICAgICAgcmVzb2x2ZU1pc3Npbmc6IGFzc2lnbih7XG4gICAgICAgIGRlbGV0ZWRUYWJsZXM6ICh7XG4gICAgICAgICAgbWlzc2luZ1RhYmxlcyxcbiAgICAgICAgICBkZWxldGVkVGFibGVzLFxuICAgICAgICB9KSA9PiBbLi4uZGVsZXRlZFRhYmxlcywgLi4ubWlzc2luZ1RhYmxlc10sXG4gICAgICAgIG1pc3NpbmdUYWJsZXM6IChjb250ZXh0KSA9PiBbXSxcbiAgICAgIH0pLFxuICAgIH0sXG4gIH0pKTtcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlUmVzb2x2ZVRhYmxlc01hY2hpbmU7XG4iLCJpbXBvcnQgeyBOYW1lZCwgUmVuYW1lZE9iamVjdCB9IGZyb20gJ2NsaS9jb21tYW5kcy9taWdyYXRlJztcblxuaW50ZXJmYWNlIFNjYWxhckRpY3Qge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgKFxuICBkYXRhOiB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICB2YWx1ZXM6IE5hbWVkW10gfCBSZW5hbWVkT2JqZWN0PE5hbWVkPltdXG4gIH1bXSxcbik6IFNjYWxhckRpY3RbXSA9PiB7XG4gIGNvbnN0IGFycmF5OiBTY2FsYXJEaWN0W10gPSBbXTtcblxuICBhcnJheS5sZW5ndGggPSBkYXRhLnJlZHVjZSgoYWNjOiBudW1iZXIsIHsgdmFsdWVzIH0pID0+IHtcbiAgICBpZiAoYWNjIDwgdmFsdWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHZhbHVlcy5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sXG4gIDApO1xuXG4gIGFycmF5LmZpbGwoeyAnJzogJycgfSk7XG5cbiAgcmV0dXJuIGFycmF5Lm1hcCgoXywgaSkgPT4ge1xuICAgIGNvbnN0IHRlbXAgPSB7fSBhcyBTY2FsYXJEaWN0O1xuXG4gICAgZGF0YS5mb3JFYWNoKChpdGVtOiBhbnksIGluZDogbnVtYmVyKSA9PiB7XG4gICAgICB0ZW1wW2RhdGFbaW5kXS50aXRsZV0gPSBpdGVtLnZhbHVlc1tpXT8ub2xkPy5uYW1lXG4gICAgICAgID8gYCR7aXRlbS52YWx1ZXNbaV0/Lm9sZD8ubmFtZX0gLT4gJHtpdGVtLnZhbHVlc1tpXT8ubmV3Py5uYW1lfWBcbiAgICAgICAgOiBpdGVtLnZhbHVlc1tpXT8ubmFtZSB8fCAnJztcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZW1wIGFzIFNjYWxhckRpY3Q7XG4gIH0pO1xufTtcbiIsImV4cG9ydCBlbnVtIEFjdGlvbiB7XG4gIFJFTkFNRSA9ICdSRU5BTUUnLFxuICBERUxFVEUgPSAnREVMRVRFJ1xufVxuXG5leHBvcnQgZW51bSBDb25maXJtYXRpb24ge1xuICBDQU5DRUwgPSAnQ0FOQ0VMJyxcbiAgQ09ORklSTSA9ICdDT05GSVJNJ1xufVxuXG5leHBvcnQgY29uc3QgYWN0aW9ucyA9IFtcbiAge1xuICAgIGtleTogQWN0aW9uLlJFTkFNRSxcbiAgICBsYWJlbDogJ1JlbmFtZWQnLFxuICAgIHZhbHVlOiBBY3Rpb24uUkVOQU1FLFxuICB9LFxuICB7XG4gICAga2V5OiBBY3Rpb24uREVMRVRFLFxuICAgIGxhYmVsOiAnRGVsZXRlZCcsXG4gICAgdmFsdWU6IEFjdGlvbi5ERUxFVEUsXG4gIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgY29uZmlybWF0aW9ucyA9IFtcbiAge1xuICAgIGtleTogQ29uZmlybWF0aW9uLkNPTkZJUk0sXG4gICAgbGFiZWw6ICdZZXMnLFxuICAgIHZhbHVlOiBDb25maXJtYXRpb24uQ09ORklSTSxcbiAgfSxcbiAge1xuICAgIGtleTogQ29uZmlybWF0aW9uLkNBTkNFTCxcbiAgICBsYWJlbDogJ05vJyxcbiAgICB2YWx1ZTogQ29uZmlybWF0aW9uLkNBTkNFTCxcbiAgfSxcbl07XG4iLCJpbXBvcnQgeyBBbHRlcmVkQ29sdW1uLCBBbHRlcmVkVGFibGUsIENvbHVtbiwgQ29sdW1uc09iamVjdCwgSW5kZXgsIFRhYmxlIH0gZnJvbSBcInNuYXBzaG90c0RpZmZlclwiXG5cbmV4cG9ydCBjbGFzcyBUeXBlcyB7XG4gICAgc3RhdGljIGNyZWF0ZVRhYmxlID0gJ2NyZWF0ZV90YWJsZSdcbiAgICBzdGF0aWMgZHJvcFRhYmxlID0gJ2Ryb3BfdGFibGUnXG4gICAgc3RhdGljIHJlbmFtZVRhYmxlID0gJ3JlbmFtZV90YWJsZSdcbiAgICBzdGF0aWMgYWx0ZXJUYWJsZURyb3BDb2x1bW4gPSAnYWx0ZXJfdGFibGVfZHJvcF9jb2x1bW4nXG4gICAgc3RhdGljIGFsdGVyVGFibGVBZGRDb2x1bW4gPSAnYWx0ZXJfdGFibGVfYWRkX2NvbHVtbidcbiAgICBzdGF0aWMgYWx0ZXJUYWJsZUFsdGVyQ29sdW1uU2V0VHlwZSA9ICdhbHRlcl90YWJsZV9hbHRlcl9jb2x1bW5fc2V0X3R5cGUnXG4gICAgc3RhdGljIGFsdGVyVGFibGVBbHRlckNvbHVtblNldERlZmF1bHQgPSAnYWx0ZXJfdGFibGVfYWx0ZXJfY29sdW1uX3NldF9kZWZhdWx0J1xuICAgIHN0YXRpYyBhbHRlclRhYmxlQWx0ZXJDb2x1bW5Ecm9wRGVmYXVsdCA9ICdhbHRlcl90YWJsZV9hbHRlcl9jb2x1bW5fZHJvcF9kZWZhdWx0J1xuICAgIHN0YXRpYyBhbHRlclRhYmxlQWx0ZXJDb2x1bW5TZXROb3ROdWxsID0gJ2FsdGVyX3RhYmxlX2FsdGVyX2NvbHVtbl9zZXRfbm90bnVsbCdcbiAgICBzdGF0aWMgYWx0ZXJUYWJsZUFsdGVyQ29sdW1uRHJvcE5vdE51bGwgPSAnYWx0ZXJfdGFibGVfYWx0ZXJfY29sdW1uX2Ryb3Bfbm90bnVsbCdcbiAgICBzdGF0aWMgY3JlYXRlSW5kZXggPSAnY3JlYXRlX2luZGV4J1xuICAgIHN0YXRpYyBjcmVhdGVSZWZlcmVuY2UgPSAnY3JlYXRlX3JlZmVyZW5jZSdcbiAgICBzdGF0aWMgZHJvcEluZGV4ID0gJ2Ryb3BfaW5kZXgnXG4gICAgc3RhdGljIGNyZWF0ZVR5cGVFbnVtID0gJ2NyZWF0ZV90eXBlX2VudW0nXG4gICAgc3RhdGljIGFsdGVyVHlwZUFkZFZhbHVlID0gJ2FsdGVyX3R5cGVfYWRkX3ZhbHVlJ1xufVxuXG5leHBvcnQgY29uc3QgcHJlcGFyZUNyZWF0ZVRhYmxlSnNvbiA9ICh0YWJsZTogVGFibGUpID0+IHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbHVtbnMgfSA9IHRhYmxlXG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBUeXBlcy5jcmVhdGVUYWJsZSxcbiAgICAgICAgdGFibGVOYW1lOiBuYW1lLFxuICAgICAgICBjb2x1bW5zOiBjb2x1bW5zXG4gICAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVEcm9wVGFibGVKc29uID0gKHRhYmxlOiBUYWJsZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFR5cGVzLmRyb3BUYWJsZSxcbiAgICAgICAgdGFibGVOYW1lOiB0YWJsZS5uYW1lXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJlcGFyZVJlbmFtZVRhYmxlSnNvbiA9ICh0YWJsZUZyb206IFRhYmxlLCB0YWJsZVRvOiBUYWJsZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFR5cGVzLnJlbmFtZVRhYmxlLFxuICAgICAgICBmcm9tOiB0YWJsZUZyb20ubmFtZSxcbiAgICAgICAgdG86IHRhYmxlVG8ubmFtZVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVDcmVhdGVFbnVtSnNvbiA9IChuYW1lOiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW10pID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBUeXBlcy5jcmVhdGVUeXBlRW51bSxcbiAgICAgICAgZW51bU5hbWU6IG5hbWUsXG4gICAgICAgIHZhbHVlc1xuICAgIH1cbn1cblxuLy8gaHR0cHM6Ly9ibG9nLnlvMS5kb2cvdXBkYXRpbmctZW51bS12YWx1ZXMtaW4tcG9zdGdyZXNxbC10aGUtc2FmZS1hbmQtZWFzeS13YXkvXG5leHBvcnQgY29uc3QgcHJlcGFyZUFkZFZhbHVlc1RvRW51bUpzb24gPSAobmFtZTogc3RyaW5nLCB2YWx1ZXM6IHN0cmluZ1tdKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlcy5tYXAoaXQgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVHlwZXMuYWx0ZXJUeXBlQWRkVmFsdWUsXG4gICAgICAgICAgICBlbnVtTmFtZTogbmFtZSxcbiAgICAgICAgICAgIGVudW1WYWx1ZTogaXRcbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlQWx0ZXJUYWJsZUNvbHVtbnNKc29uID0gKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGRlbGV0ZWQ6IENvbHVtbltdLFxuICAgIGFkZGVkOiBDb2x1bW5bXSxcbiAgICBhbHRlcmVkOiBBbHRlcmVkQ29sdW1uW11cbikgPT4ge1xuICAgIGNvbnN0IHN0YXRlbWVudHMgPSBbXVxuXG4gICAgY29uc3QgZHJvcENvbHVtbnMgPSBfcHJlcGFyZURyb3BDb2x1bW5zKHRhYmxlTmFtZSwgZGVsZXRlZClcbiAgICBjb25zdCBhZGRDb2x1bW5zID0gX3ByZXBhcmVBZGRDb2x1bW5zKHRhYmxlTmFtZSwgYWRkZWQpXG4gICAgY29uc3QgYWx0ZXJDb2x1bW5zID0gX3ByZXBhcmVBbHRlckNvbHVtbnModGFibGVOYW1lLCBhbHRlcmVkKVxuXG5cbiAgICBzdGF0ZW1lbnRzLnB1c2goLi4uZHJvcENvbHVtbnMpXG4gICAgc3RhdGVtZW50cy5wdXNoKC4uLmFkZENvbHVtbnMpXG4gICAgc3RhdGVtZW50cy5wdXNoKC4uLmFsdGVyQ29sdW1ucylcblxuICAgIHJldHVybiBzdGF0ZW1lbnRzO1xufVxuXG5jb25zdCBfcHJlcGFyZURyb3BDb2x1bW5zID0gKHRhbGVOYW1lOiBzdHJpbmcsIGNvbHVtbnM6IENvbHVtbltdKSA9PiB7XG4gICAgcmV0dXJuIGNvbHVtbnMubWFwKGl0ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFR5cGVzLmFsdGVyVGFibGVEcm9wQ29sdW1uLFxuICAgICAgICAgICAgdGFibGVOYW1lOiB0YWxlTmFtZSxcbiAgICAgICAgICAgIGNvbHVtbk5hbWU6IGl0Lm5hbWVcbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmNvbnN0IF9wcmVwYXJlQWRkQ29sdW1ucyA9ICh0YWJsZU5hbWU6IHN0cmluZywgY29sdW1uczogQ29sdW1uW10pID0+IHtcblxuICAgIHJldHVybiBjb2x1bW5zLm1hcChpdCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUeXBlcy5hbHRlclRhYmxlQWRkQ29sdW1uLFxuICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgY29sdW1uOiBpdFxuICAgICAgICB9XG4gICAgfSlcbn1cblxuY29uc3QgX3ByZXBhcmVBbHRlckNvbHVtbnMgPSAodGFibGVOYW1lOiBzdHJpbmcsIGNvbHVtbnM6IEFsdGVyZWRDb2x1bW5bXSkgPT4ge1xuICAgIGxldCBzdGF0ZW1lbnRzID0gW11cblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGNvbHVtbi5uYW1lO1xuXG4gICAgICAgIGlmIChjb2x1bW4udHlwZT8udHlwZSA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFR5cGVzLmFsdGVyVGFibGVBbHRlckNvbHVtblNldFR5cGUsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgbmV3RGF0YVR5cGU6IGNvbHVtbi50eXBlLm5ld1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW4uZGVmYXVsdFZhbHVlPy50eXBlID09PSAnYWRkZWQnKSB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFR5cGVzLmFsdGVyVGFibGVBbHRlckNvbHVtblNldERlZmF1bHQsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgbmV3RGVmYXVsdDogY29sdW1uLmRlZmF1bHRWYWx1ZS52YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW4uZGVmYXVsdFZhbHVlPy50eXBlID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgIHN0YXRlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogVHlwZXMuYWx0ZXJUYWJsZUFsdGVyQ29sdW1uU2V0RGVmYXVsdCxcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgY29sdW1uTmFtZSxcbiAgICAgICAgICAgICAgICBuZXdEZWZhdWx0OiBjb2x1bW4uZGVmYXVsdFZhbHVlLm5ld1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW4uZGVmYXVsdFZhbHVlPy50eXBlID09PSAnZGVsZXRlZCcpIHtcbiAgICAgICAgICAgIHN0YXRlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogVHlwZXMuYWx0ZXJUYWJsZUFsdGVyQ29sdW1uRHJvcERlZmF1bHQsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2x1bW4ubm90TnVsbD8udHlwZSA9PT0gJ2FkZGVkJykge1xuICAgICAgICAgICAgc3RhdGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBUeXBlcy5hbHRlclRhYmxlQWx0ZXJDb2x1bW5TZXROb3ROdWxsLFxuICAgICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICBjb2x1bW5OYW1lXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbi5ub3ROdWxsPy50eXBlID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4ubm90TnVsbC5uZXcgPyBUeXBlcy5hbHRlclRhYmxlQWx0ZXJDb2x1bW5TZXROb3ROdWxsIDogVHlwZXMuYWx0ZXJUYWJsZUFsdGVyQ29sdW1uRHJvcE5vdE51bGxcbiAgICAgICAgICAgIHN0YXRlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgY29sdW1uTmFtZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW4ubm90TnVsbD8udHlwZSA9PT0gJ2RlbGV0ZWQnKSB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFR5cGVzLmFsdGVyVGFibGVBbHRlckNvbHVtbkRyb3BOb3ROdWxsLFxuICAgICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICBjb2x1bW5OYW1lXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudHNcbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVDcmVhdGVJbmRleGVzSnNvbiA9ICh0YWJsZU5hbWU6IHN0cmluZywgaW5kZXhlczogSW5kZXhbXSkgPT4ge1xuICAgIHJldHVybiBpbmRleGVzLm1hcChpbmRleCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUeXBlcy5jcmVhdGVJbmRleCxcbiAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgIGluZGV4TmFtZTogaW5kZXgubmFtZSxcbiAgICAgICAgICAgIGluZGV4VmFsdWU6IGluZGV4LmNvbHVtbnMuam9pbignLCAnKVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVDcmVhdGVSZWZlcmVuY2VzSnNvbiA9ICh0YWJsZU5hbWU6IHN0cmluZywgY29sdW1uczogQ29sdW1uW10pID0+IHtcbiAgICByZXR1cm4gY29sdW1ucy5maWx0ZXIoaXQgPT4ge1xuICAgICAgICByZXR1cm4gaXQucmVmZXJlbmNlcyAhPT0gdW5kZWZpbmVkXG4gICAgfSkubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZW50cnlcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbHVtbi5yZWZlcmVuY2VzISFcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVHlwZXMuY3JlYXRlUmVmZXJlbmNlLFxuICAgICAgICAgICAgZnJvbVRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICB0b1RhYmxlOiByZWZlcmVuY2VzLnRhYmxlLFxuICAgICAgICAgICAgZnJvbUNvbHVtbjogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICB0b0NvbHVtOiByZWZlcmVuY2VzLmNvbHVtbixcbiAgICAgICAgICAgIGZvcmVpZ25LZXlOYW1lOiByZWZlcmVuY2VzLmZvcmVpZ25LZXlOYW1lLFxuICAgICAgICAgICAgb25EZWxldGU6IHJlZmVyZW5jZXMub25EZWxldGUsXG4gICAgICAgICAgICBvblVwZGF0ZTogcmVmZXJlbmNlcy5vblVwZGF0ZSxcbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlRHJvcEluZGV4ZXNKc29uID0gKHRhYmxlTmFtZTogc3RyaW5nLCBpbmRleGVzOiBJbmRleFtdKSA9PiB7XG4gICAgcmV0dXJuIGluZGV4ZXMubWFwKGluZGV4ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFR5cGVzLmRyb3BJbmRleCxcbiAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgIGluZGV4TmFtZTogaW5kZXgubmFtZSxcbiAgICAgICAgfVxuICAgIH0pXG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgc2VyaWFsaXplIGZyb20gJ3NlcmlhbGl6ZXInXG5cbi8vIFRPRE86IGV4cG9ydCBhcyBhIGZ1bmN0aW9uIHdcblxuY29uc3QgZHJ5ID0ge1xuICAgIHZlcnNpb246IFwiMVwiLFxuICAgIHRhYmxlczoge30sXG4gICAgZW51bXM6IHt9XG59XG5cbmNvbnN0IHByZXBhcmVNaWdyYXRpb24gPSAoXG4gICAgbWlncmF0aW9uUm9vdEZvbGRlck5hbWU6IHN0cmluZyA9ICdkcml6emxlJyxcbiAgICBkYXRhRm9sZGVyUGF0aDogc3RyaW5nXG4pOiB7IHByZXY6IGFueSwgY3VyOiBhbnkgfSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IG1pZ3JhdGlvblJvb3RGb2xkZXJOYW1lXG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYygnLi8nKVxuICAgIGNvbnN0IGRyaXp6bGVGb2xkZXIgPSBmaWxlcy5maW5kKChpdCkgPT4ge1xuICAgICAgICByZXR1cm4gaXQgPT09IHJvb3RcbiAgICB9KVxuXG4gICAgaWYgKCFkcml6emxlRm9sZGVyKSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyhyb290KVxuICAgIH1cblxuICAgIGNvbnN0IG1pZ3JhdGlvbkZvbGRlcnMgPSBmcy5yZWFkZGlyU3luYyhgLi8ke3Jvb3R9YClcblxuICAgIGxldCBwcmV2U25hcHNob3Q7XG5cbiAgICBpZiAobWlncmF0aW9uRm9sZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJldlNuYXBzaG90ID0gZHJ5XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbWlncmF0aW9uRm9sZGVycy5zb3J0KClcbiAgICAgICAgY29uc3QgbGFzdFNuYXBzaG90Rm9sZGVyID0gbWlncmF0aW9uRm9sZGVyc1ttaWdyYXRpb25Gb2xkZXJzLmxlbmd0aCAtIDFdXG4gICAgICAgIGNvbnNvbGUubG9nKGxhc3RTbmFwc2hvdEZvbGRlcilcbiAgICAgICAgcHJldlNuYXBzaG90ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoYC4vJHtyb290fS8ke2xhc3RTbmFwc2hvdEZvbGRlcn0vc25hcHNob3QuanNvbmApLnRvU3RyaW5nKCkpXG4gICAgfVxuXG4gICAgY29uc3QgdGJscyA9IGAke2RhdGFGb2xkZXJQYXRofS90YWJsZXMvYFxuICAgIGNvbnN0IHRwcyA9IGAke2RhdGFGb2xkZXJQYXRofS90eXBlcy9gXG5cbiAgICBjb25zdCByZXN1bHQgPSBzZXJpYWxpemUodGJscywgdHBzKVxuXG4gICAgcmV0dXJuIHsgcHJldjogcHJldlNuYXBzaG90LCBjdXI6IHJlc3VsdCB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHByZXBhcmVNaWdyYXRpb247IiwiaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5jb25zdCBwcmludGVyOiB0cy5QcmludGVyID0gdHMuY3JlYXRlUHJpbnRlcigpO1xuXG5jb25zdCBwcmVwYXJlRmFicmljRmlsZSA9ICh0YWJsZXNGb2xkZXI6IHN0cmluZywgdHlwZXNGb2xkZXI6IHN0cmluZykgPT4ge1xuICBjb25zdCBzdGF0aWNJbXBvcnRzID0gW1xuICAgIHRzLmNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlSW1wb3J0Q2xhdXNlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRzLmNyZWF0ZU5hbWVzcGFjZUltcG9ydCh0cy5jcmVhdGVJZGVudGlmaWVyKCdkcml6emxlJykpXG4gICAgICApLFxuICAgICAgdHMuY3JlYXRlU3RyaW5nTGl0ZXJhbCgnZHJpenpsZS1vcm0nKVxuICAgICksXG4gICAgdHMuY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0cy5jcmVhdGVJbXBvcnRDbGF1c2UoXG4gICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ01pZ3JhdGlvblNlcmlhbGl6ZXInKSxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApLFxuICAgICAgdHMuY3JlYXRlU3RyaW5nTGl0ZXJhbCgnZHJpenpsZS1vcm0vc2VyaWFsaXplci9zZXJpYWxpemVyJylcbiAgICApLFxuICAgIHRzLmNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlSW1wb3J0Q2xhdXNlKHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJFbnVtXCIpLCB1bmRlZmluZWQpLFxuICAgICAgdHMuY3JlYXRlU3RyaW5nTGl0ZXJhbChcImRyaXp6bGUtb3JtL3R5cGVzL3R5cGVcIiksXG4gICAgKSxcbiAgICB0cy5jcmVhdGVJbXBvcnREZWNsYXJhdGlvbihcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZUltcG9ydENsYXVzZShcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0cy5jcmVhdGVOYW1lc3BhY2VJbXBvcnQodHMuY3JlYXRlSWRlbnRpZmllcigncGcnKSlcbiAgICAgICksXG4gICAgICB0cy5jcmVhdGVTdHJpbmdMaXRlcmFsKCdwZycpXG4gICAgKSxcbiAgXTtcblxuICBjb25zdCBkeW5hbWljSW1wb3J0cyA9IFtdO1xuICBjb25zdCB0YWJsZXNGaWxlbmFtZXMgPSBmcy5yZWFkZGlyU3luYyh0YWJsZXNGb2xkZXIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlc0ZpbGVuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGFibGVzRmlsZW5hbWVzW2ldO1xuICAgIGNvbnN0IGltcG9ydFBhdGggPSBgJHt0YWJsZXNGb2xkZXJ9JHtmaWxlbmFtZS5zcGxpdChcIi5cIilbMF19YDtcbiAgICBkeW5hbWljSW1wb3J0cy5wdXNoKHRzLmNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlSW1wb3J0Q2xhdXNlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRzLmNyZWF0ZU5hbWVzcGFjZUltcG9ydCh0cy5jcmVhdGVJZGVudGlmaWVyKGBpJHtpfWApKSxcbiAgICAgICksXG4gICAgICB0cy5jcmVhdGVTdHJpbmdMaXRlcmFsKGltcG9ydFBhdGgpLFxuICAgICkpO1xuICB9XG4gIGNvbnN0IHR5cGVzRmlsZW5hbWVzID0gZnMucmVhZGRpclN5bmModHlwZXNGb2xkZXIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVzRmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB0eXBlc0ZpbGVuYW1lc1tpXTtcbiAgICBjb25zdCBpbXBvcnRQYXRoID0gYCR7dHlwZXNGb2xkZXJ9JHtmaWxlbmFtZS5zcGxpdChcIi5cIilbMF19YDtcbiAgICBkeW5hbWljSW1wb3J0cy5wdXNoKHRzLmNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlSW1wb3J0Q2xhdXNlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRzLmNyZWF0ZU5hbWVzcGFjZUltcG9ydCh0cy5jcmVhdGVJZGVudGlmaWVyKGB0JHtpfWApKSxcbiAgICAgICksXG4gICAgICB0cy5jcmVhdGVTdHJpbmdMaXRlcmFsKGltcG9ydFBhdGgpLFxuICAgICkpO1xuICB9XG5cbiAgY29uc3QgdmFyaWFibGVzU3RhdGVtZW50cyA9IFtcbiAgICB0cy5jcmVhdGVWYXJpYWJsZVN0YXRlbWVudChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFxuICAgICAgICBbXG4gICAgICAgICAgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJkYlwiKSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRzLmNyZWF0ZU5ldyh0cy5jcmVhdGVJZGVudGlmaWVyKFwiZHJpenpsZS5EQlwiKSwgdW5kZWZpbmVkLCBbXG4gICAgICAgICAgICAgIHRzLmNyZWF0ZU5ldyh0cy5jcmVhdGVQcm9wZXJ0eUFjY2VzcyhcbiAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKCdwZycpLFxuICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ1Bvb2wnKVxuICAgICAgICAgICAgICApLCB1bmRlZmluZWQsIFtdKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICAgIHRzLk5vZGVGbGFncy5Db25zdCxcbiAgICAgICksXG4gICAgKSxcbiAgICB0cy5jcmVhdGVWYXJpYWJsZVN0YXRlbWVudChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFxuICAgICAgICBbXG4gICAgICAgICAgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJzZXJpYWxpemVyXCIpLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHMuY3JlYXRlTmV3KHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJNaWdyYXRpb25TZXJpYWxpemVyXCIpLCB1bmRlZmluZWQsIFtdKSxcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgICB0cy5Ob2RlRmxhZ3MuQ29uc3QsXG4gICAgICApLFxuICAgICksXG4gIF07XG5cbiAgY29uc3QgYmxvY2tTdGF0ZW1lbnRzID0gW107XG5cbiAgLy8gY29uc3QgdGFibGVzID0gW11cbiAgYmxvY2tTdGF0ZW1lbnRzLnB1c2godHMuY3JlYXRlVmFyaWFibGVTdGF0ZW1lbnQoXG4gICAgdW5kZWZpbmVkLFxuICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFxuICAgICAgW1xuICAgICAgICB0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uKFxuICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ3RhYmxlcycpLFxuICAgICAgICAgIHRzLmNyZWF0ZUFycmF5VHlwZU5vZGUoXG4gICAgICAgICAgICB0cy5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShcbiAgICAgICAgICAgICAgdHMuY3JlYXRlUXVhbGlmaWVkTmFtZShcbiAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKCdkcml6emxlJyksXG4gICAgICAgICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcignQWJzdHJhY3RUYWJsZScpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIFt0cy5jcmVhdGVLZXl3b3JkVHlwZU5vZGUodHMuU3ludGF4S2luZC5BbnlLZXl3b3JkKV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIHRzLmNyZWF0ZUFycmF5TGl0ZXJhbChbXSwgZmFsc2UpXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgdHMuTm9kZUZsYWdzLkNvbnN0LFxuICAgICksXG4gICkpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGVzRmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gY29uc3QgdDEgPSAobmV3IGkxLmRlZmF1bHQoZGIpIGFzIHVua25vd24gYXMgQWJzdHJhY3RUYWJsZTxhbnk+KTtcbiAgICAvLyB0YWJsZXMucHVzaCh0MSlcbiAgICBjb25zdCBibG9ja1N0YXRlbWVudCA9IFtcbiAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlU3RhdGVtZW50KFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJ0YWJsZVwiICsgaSksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdHMuY3JlYXRlUGFyZW4oXG4gICAgICAgICAgICAgICAgdHMuY3JlYXRlQXNFeHByZXNzaW9uKFxuICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlQXNFeHByZXNzaW9uKFxuICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVOZXcoXG4gICAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwiaVwiICsgaSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwiZGVmYXVsdFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICBbdHMuY3JlYXRlSWRlbnRpZmllcihcImRiXCIpXSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgIHRzLlN5bnRheEtpbmQuVW5rbm93bktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoXG4gICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZVF1YWxpZmllZE5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcignZHJpenpsZScpLFxuICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ0Fic3RyYWN0VGFibGUnKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdHMuU3ludGF4S2luZC5BbnlLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHMuTm9kZUZsYWdzLkNvbnN0LFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIHRzLmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gICAgICAgIHRzLmNyZWF0ZUNhbGwoXG4gICAgICAgICAgdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MoXG4gICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwidGFibGVzXCIpLFxuICAgICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcihcInB1c2hcIiksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgW3RzLmNyZWF0ZUlkZW50aWZpZXIoXCJ0YWJsZVwiICsgaSldLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICBdO1xuXG4gICAgYmxvY2tTdGF0ZW1lbnRzLnB1c2goLi4uYmxvY2tTdGF0ZW1lbnQpO1xuICB9XG5cbiAgLy8gY29uc3QgZW51bXMgPSBbXVxuICBibG9ja1N0YXRlbWVudHMucHVzaCh0cy5jcmVhdGVWYXJpYWJsZVN0YXRlbWVudChcbiAgICB1bmRlZmluZWQsXG4gICAgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoXG4gICAgICBbXG4gICAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oXG4gICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcignZW51bXMnKSxcbiAgICAgICAgICB0cy5jcmVhdGVBcnJheVR5cGVOb2RlKFxuICAgICAgICAgICAgdHMuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoXG4gICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoJ0VudW0nKSxcbiAgICAgICAgICAgICAgW3RzLmNyZWF0ZUtleXdvcmRUeXBlTm9kZSh0cy5TeW50YXhLaW5kLkFueUtleXdvcmQpXVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgdHMuY3JlYXRlQXJyYXlMaXRlcmFsKFtdLCBmYWxzZSlcbiAgICAgICAgKVxuICAgICAgXSxcbiAgICAgIHRzLk5vZGVGbGFncy5Db25zdFxuICAgICksXG4gICkpO1xuXG4gIC8vIE9iamVjdC52YWx1ZXModDApLmZvckVhY2goKHQpID0+IHtcbiAgLy8gIGVudW1zLnB1c2godCBhcyBFbnVtPGFueT4pO1xuICAvLyB9KTtcbiAgaWYgKHR5cGVzRmlsZW5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBibG9ja1N0YXRlbWVudHMucHVzaChcbiAgICAgIHRzLmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gICAgICAgIHRzLmNyZWF0ZUNhbGwoXG4gICAgICAgICAgdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MoXG4gICAgICAgICAgICB0cy5jcmVhdGVDYWxsKFxuICAgICAgICAgICAgICB0cy5jcmVhdGVQcm9wZXJ0eUFjY2VzcyhcbiAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwiT2JqZWN0XCIpLFxuICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJ2YWx1ZXNcIiksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgW3RzLmNyZWF0ZUlkZW50aWZpZXIoXCJ0MFwiKV0sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcihcImZvckVhY2hcIiksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgdHMuY3JlYXRlQXJyb3dGdW5jdGlvbihcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB0cy5jcmVhdGVQYXJhbWV0ZXIoXG4gICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwidFwiKSxcbiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHRzLmNyZWF0ZVRva2VuKHRzLlN5bnRheEtpbmQuRXF1YWxzR3JlYXRlclRoYW5Ub2tlbiksXG4gICAgICAgICAgICAgIHRzLmNyZWF0ZUJsb2NrKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUNhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwiZW51bXNcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwicHVzaFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVBc0V4cHJlc3Npb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUFzRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwidFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy5TeW50YXhLaW5kLlVua25vd25LZXl3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJFbnVtXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuU3ludGF4S2luZC5BbnlLZXl3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0sXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyByZXR1cm4gc2VyaWFsaXplci5nZW5lcmF0ZSh0YWJsZXMsIGVudW1zKVxuICBibG9ja1N0YXRlbWVudHMucHVzaChcbiAgICB0cy5jcmVhdGVSZXR1cm4oXG4gICAgICB0cy5jcmVhdGVDYWxsKFxuICAgICAgICB0cy5jcmVhdGVQcm9wZXJ0eUFjY2VzcyhcbiAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwic2VyaWFsaXplclwiKSxcbiAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwiZ2VuZXJhdGVcIiksXG4gICAgICAgICksXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgW1xuICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJ0YWJsZXNcIiksXG4gICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcihcImVudW1zXCIpLFxuICAgICAgICBdLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIGNvbnN0IGZ1bmNTdGF0ZW1lbnQgPSBbXG4gICAgdHMuY3JlYXRlVmFyaWFibGVTdGF0ZW1lbnQoXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChcbiAgICAgICAgW1xuICAgICAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oXG4gICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwidGVzdEZ1blwiKSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRzLmNyZWF0ZUFycm93RnVuY3Rpb24oXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB0cy5jcmVhdGVUb2tlbih0cy5TeW50YXhLaW5kLkVxdWFsc0dyZWF0ZXJUaGFuVG9rZW4pLFxuICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBib2R5XG4gICAgICAgICAgICAgIHRzLmNyZWF0ZUJsb2NrKFxuICAgICAgICAgICAgICAgIGJsb2NrU3RhdGVtZW50cyxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgICB0cy5Ob2RlRmxhZ3MuQ29uc3QsXG4gICAgICApLFxuICAgICksXG4gIF07XG4gIGNvbnN0IGludm9jYXRpb25TdGF0ZW1lbnQgPSBbXG4gICAgdHMuY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgIHRzLmNyZWF0ZUNhbGwodHMuY3JlYXRlSWRlbnRpZmllcihcInRlc3RGdW5cIiksIHVuZGVmaW5lZCwgW10pLFxuICAgICksXG4gIF07XG5cbiAgY29uc3Qgb3V0RmlsZTogdHMuU291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgXCJvdXRmaWxlLnRzXCIsXG4gICAgXCJcIixcbiAgICB0cy5TY3JpcHRUYXJnZXQuRVMyMDE1LFxuICAgIHRydWUsXG4gICAgdHMuU2NyaXB0S2luZC5UUyxcbiAgKTtcblxuICBjb25zdCBzb3VyY2UgPSBbXTtcbiAgc291cmNlLnB1c2goLi4uc3RhdGljSW1wb3J0cyk7XG4gIHNvdXJjZS5wdXNoKC4uLmR5bmFtaWNJbXBvcnRzKTtcbiAgc291cmNlLnB1c2goLi4udmFyaWFibGVzU3RhdGVtZW50cyk7XG4gIHNvdXJjZS5wdXNoKC4uLmZ1bmNTdGF0ZW1lbnQpO1xuICBzb3VyY2UucHVzaCguLi5pbnZvY2F0aW9uU3RhdGVtZW50KTtcblxuICBjb25zdCBuZXdGaWxlID0gdHMuZmFjdG9yeS51cGRhdGVTb3VyY2VGaWxlKG91dEZpbGUsIHNvdXJjZSk7XG5cbiAgcmV0dXJuIHByaW50ZXIucHJpbnRGaWxlKG5ld0ZpbGUpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcHJlcGFyZUZhYnJpY0ZpbGU7XG4iLCJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBTdHJpbmdEZWNvZGVyIH0gZnJvbSBcInN0cmluZ19kZWNvZGVyXCI7XG5pbXBvcnQgcHJlcGFyZUZhYnJpY0ZpbGUgZnJvbSBcIi4vZmFjdG9yeVwiO1xuY29uc3QgZXNidWlsZCA9IHJlcXVpcmUoXCJlc2J1aWxkXCIpO1xuXG5jb25zdCBzZXJpYWxpemUgPSAocGF0aFRvVGFibGVzOiBzdHJpbmcsIHBhdGhUb1R5cGVzOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoKTtcbiAgLy8gY29uc3QgcHJlcGFyZWRGYXJiaWMgPSBwcmVwYXJlRmFicmljRmlsZShcIi4vZXhhbXBsZXMvdGFibGVzL1wiLCAnLi9leGFtcGxlcy90eXBlcy8nKVxuICBjb25zdCBwcmVwYXJlZEZhcmJpYyA9IHByZXBhcmVGYWJyaWNGaWxlKHBhdGhUb1RhYmxlcywgcGF0aFRvVHlwZXMpXG4gIFxuICBmcy53cml0ZUZpbGVTeW5jKFwiX19vdXQudHNcIiwgcHJlcGFyZWRGYXJiaWMsIFwidXRmLThcIik7XG4gIGNvbnN0IHJlc3VsdCA9IGVzYnVpbGQuYnVpbGRTeW5jKHtcbiAgICBlbnRyeVBvaW50czogW1wiX19vdXQudHNcIl0sXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgICB3cml0ZTogZmFsc2UsXG4gICAgZXh0ZXJuYWw6IFtcInBnLW5hdGl2ZVwiXSxcbiAgfSk7XG5cbiAgZnMudW5saW5rU3luYyhcIl9fb3V0LnRzXCIpO1xuICByZXR1cm4gZXZhbChkZWNvZGVyLndyaXRlKHJlc3VsdC5vdXRwdXRGaWxlc1swXS5jb250ZW50cykpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VyaWFsaXplO1xuIiwiaW1wb3J0IHsgZnJvbUpzb24gfSBmcm9tIFwiLi9zcWxnZW5lcmF0b3JcIjtcbmltcG9ydCB7IGFwcGx5SnNvbkRpZmYsIGRpZmZGb3JSZW5hbWVkIH0gZnJvbSBcIi4vanNvbkRpZmZlclwiO1xuaW1wb3J0IHtcbiAgcHJlcGFyZUFkZFZhbHVlc1RvRW51bUpzb24sXG4gIHByZXBhcmVBbHRlclRhYmxlQ29sdW1uc0pzb24sXG4gIHByZXBhcmVDcmVhdGVFbnVtSnNvbixcbiAgcHJlcGFyZUNyZWF0ZUluZGV4ZXNKc29uLFxuICBwcmVwYXJlQ3JlYXRlUmVmZXJlbmNlc0pzb24sXG4gIHByZXBhcmVDcmVhdGVUYWJsZUpzb24sXG4gIHByZXBhcmVEcm9wSW5kZXhlc0pzb24sXG4gIHByZXBhcmVEcm9wVGFibGVKc29uLFxuICBwcmVwYXJlUmVuYW1lVGFibGVKc29uXG59IGZyb20gXCIuL2pzb25TdGF0ZW1lbnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHByaW1hcnlLZXk/OiBib29sZWFuO1xuICB1bmlxdWU/OiBib29sZWFuO1xuICBkZWZhdWx0PzogYW55O1xuICBub3ROdWxsPzogYm9vbGVhbjtcbiAgcmVmZXJlbmNlcz86IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGNvbHVtbjogc3RyaW5nO1xuICAgIGZvcmVpZ25LZXlOYW1lOiBzdHJpbmc7XG4gICAgb25EZWxldGU/OiBzdHJpbmc7XG4gICAgb25VcGRhdGU/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkZWQ8VD4ge1xuICB0eXBlOiAnYWRkZWQnO1xuICB2YWx1ZTogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWxldGVkPFQ+IHtcbiAgdHlwZTogJ2RlbGV0ZWQnO1xuICB2YWx1ZTogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2VkPFQ+IHtcbiAgdHlwZTogJ2NoYW5nZWQnO1xuICBvbGQ6IFQ7XG4gIG5ldzogVDtcbn1cblxuZXhwb3J0IHR5cGUgUGF0Y2hlZFByb3BlcnR5PFQ+ID0gQWRkZWQ8VD4gfCBEZWxldGVkPFQ+IHwgQ2hhbmdlZDxUPjtcblxuZXhwb3J0IGludGVyZmFjZSBBbHRlcmVkQ29sdW1uIHtcbiAgbmFtZTogc3RyaW5nIHwgQ2hhbmdlZDxzdHJpbmc+XG4gIHR5cGU/OiBDaGFuZ2VkPHN0cmluZz5cbiAgZGVmYXVsdFZhbHVlPzogUGF0Y2hlZFByb3BlcnR5PHN0cmluZz4sXG4gIG5vdE51bGw/OiBQYXRjaGVkUHJvcGVydHk8Ym9vbGVhbj5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5zT2JqZWN0IHtcbiAgW25hbWU6IHN0cmluZ106IENvbHVtbjtcbn1cblxuaW50ZXJmYWNlIEVudW0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXgge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbHVtbnM6IHN0cmluZ1tdO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbHVtbnM6IENvbHVtbltdLFxuICBpbmRleGVzOiBJbmRleFtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWx0ZXJlZFRhYmxlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZWxldGVkOiBDb2x1bW5bXTtcbiAgYWRkZWQ6IENvbHVtbltdLFxuICBhbHRlcmVkOiBBbHRlcmVkQ29sdW1uW10sXG4gIGFkZGVkSW5kZXhlczogSW5kZXhbXSxcbiAgZGVsZXRlZEluZGV4ZXM6IEluZGV4W10sXG5cbn1cblxudHlwZSBEaWZmUmVzdWx0ID0ge1xuICBhZGRlZFRhYmxlczogVGFibGVbXVxuICBkZWxldGVkVGFibGVzOiBUYWJsZVtdXG4gIGFsdGVyZWRUYWJsZXNXaXRoQ29sdW1uczogQWx0ZXJlZFRhYmxlW11cbiAgYWRkZWRFbnVtczogRW51bVtdXG4gIGRlbGV0ZWRFbnVtczogRW51bVtdXG4gIGFsdGVyZWRFbnVtczogYW55W11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZXNSZXNvbHZlcklucHV0PFQgZXh0ZW5kcyB7IG5hbWU6IHN0cmluZyB9PiB7XG4gIGNyZWF0ZWQ6IFRbXSxcbiAgZGVsZXRlZDogVFtdXG59XG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlc1Jlc29sdmVyT3V0cHV0PFQgZXh0ZW5kcyB7IG5hbWU6IHN0cmluZyB9PiB7XG4gIGNyZWF0ZWQ6IFRbXSxcbiAgcmVuYW1lZDogeyBmcm9tOiBULCB0bzogVCB9W10sXG4gIGRlbGV0ZWQ6IFRbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbnNSZXNvbHZlcklucHV0PFQgZXh0ZW5kcyB7IG5hbWU6IHN0cmluZyB9PiB7XG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBjcmVhdGVkOiBUW10sXG4gIGRlbGV0ZWQ6IFRbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbnNSZXNvbHZlck91dHB1dDxUIGV4dGVuZHMgeyBuYW1lOiBzdHJpbmcgfT4ge1xuICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgY3JlYXRlZDogVFtdLFxuICByZW5hbWVkOiB7IGZyb206IFQsIHRvOiBUIH1bXSxcbiAgZGVsZXRlZDogVFtdXG59XG5cbmV4cG9ydCBjb25zdCBhcHBseVNuYXBzaG90c0RpZmYgPSBhc3luYyAoXG4gIGpzb24xOiBPYmplY3QsXG4gIGpzb24yOiBPYmplY3QsXG4gIHRhYmxlc1Jlc29sdmVyOiAoaW5wdXQ6IFRhYmxlc1Jlc29sdmVySW5wdXQ8VGFibGU+KSA9PiBQcm9taXNlPFRhYmxlc1Jlc29sdmVyT3V0cHV0PFRhYmxlPj4sXG4gIGNvbHVtbnNSZXNvbHZlcjogKGlucHV0OiBDb2x1bW5zUmVzb2x2ZXJJbnB1dDxDb2x1bW4+KSA9PiBQcm9taXNlPENvbHVtbnNSZXNvbHZlck91dHB1dDxDb2x1bW4+PlxuKSA9PiB7XG4gIGNvbnN0IGRpZmZSZXN1bHQgPSBhcHBseUpzb25EaWZmKGpzb24xLCBqc29uMilcblxuICBjb25zdCB0eXBlZFJlc3VsdDogRGlmZlJlc3VsdCA9IGRpZmZSZXN1bHRcbiAgY29uc3QgeyBjcmVhdGVkLCBkZWxldGVkLCByZW5hbWVkIH0gPSBhd2FpdCB0YWJsZXNSZXNvbHZlcih7IGNyZWF0ZWQ6IHR5cGVkUmVzdWx0LmFkZGVkVGFibGVzLCBkZWxldGVkOiB0eXBlZFJlc3VsdC5kZWxldGVkVGFibGVzIH0pXG5cbiAgY29uc3QganNvblN0YXRlbWVudHM6IGFueVtdID0gW11cbiAgY29uc3QganNvbkNyZWF0ZVRhYmxlcyA9IGNyZWF0ZWQubWFwKGl0ID0+IHtcbiAgICByZXR1cm4gcHJlcGFyZUNyZWF0ZVRhYmxlSnNvbihpdClcbiAgfSlcblxuICBjb25zdCBqc29uQ3JlYXRlSW5kZXhlc0ZvckNyZWF0ZWRUYWJsZXMgPSBjcmVhdGVkLm1hcChpdCA9PiB7XG4gICAgcmV0dXJuIHByZXBhcmVDcmVhdGVJbmRleGVzSnNvbihpdC5uYW1lLCBpdC5pbmRleGVzKVxuICB9KS5mbGF0KClcblxuICBjb25zdCBqc29uRHJvcFRhYmxlcyA9IGRlbGV0ZWQubWFwKGl0ID0+IHtcbiAgICByZXR1cm4gcHJlcGFyZURyb3BUYWJsZUpzb24oaXQpXG4gIH0pXG5cbiAgY29uc3QganNvblJlbmFtZVRhYmxlcyA9IHJlbmFtZWQubWFwKGl0ID0+IHtcbiAgICByZXR1cm4gcHJlcGFyZVJlbmFtZVRhYmxlSnNvbihpdC5mcm9tLCBpdC50bylcbiAgfSlcblxuICAvLyBjb25zdCBjcmVhdGVOZXdUYWJsZXMgPSBjcmVhdGVkLm1hcChpdCA9PiB7XG4gIC8vICAgcmV0dXJuIHByZXBhcmVDcmVhdGVUYWJsZShpdClcbiAgLy8gfSlcbiAgLy8gY29uc29sZS5sb2coY3JlYXRlTmV3VGFibGVzLmpvaW4oJ1xcbicpLnRyaW0oKSlcblxuICAvLyBjb25zdCBkZWxldGVUYWJsZXMgPSBkZWxldGVkLm1hcChpdCA9PiB7XG4gIC8vICAgcmV0dXJuIHByZXBhcmVEcm9wVGFibGUoaXQpXG4gIC8vIH0pXG4gIC8vIGNvbnNvbGUubG9nKGRlbGV0ZVRhYmxlcy5qb2luKCdcXG4nKS50cmltKCkpXG5cbiAgY29uc3QgcmVuYW1lZFdpdGhBbHRlcm5hdGlvbnM6IEFsdGVyZWRUYWJsZVtdID0gZGlmZkZvclJlbmFtZWQocmVuYW1lZClcbiAgY29uc3QgYWxsQWx0ZXJlZCA9IHR5cGVkUmVzdWx0LmFsdGVyZWRUYWJsZXNXaXRoQ29sdW1ucy5jb25jYXQocmVuYW1lZFdpdGhBbHRlcm5hdGlvbnMpXG5cbiAgY29uc3QgYWxsQWx0ZXJlZFJlc29sdmVkID0gW11cbiAgZm9yIChjb25zdCB0YWJsZSBvZiBhbGxBbHRlcmVkKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29sdW1uc1Jlc29sdmVyKHsgdGFibGVOYW1lOiB0YWJsZS5uYW1lLCBjcmVhdGVkOiB0YWJsZS5hZGRlZCwgZGVsZXRlZDogdGFibGUuZGVsZXRlZCB9KTtcblxuICAgIGNvbnN0IHsgZGVsZXRlZCwgYWRkZWQsIC4uLmluaSB9OiBBbHRlcmVkVGFibGUgPSB0YWJsZVxuICAgIGFsbEFsdGVyZWRSZXNvbHZlZC5wdXNoKHsgLi4uaW5pLCAuLi5yZXN1bHQgfSlcbiAgfVxuXG4gIC8vIGNvbnN0IHJlbmFtZVRhYmxlcyA9IHJlbmFtZWQubWFwKGl0ID0+IHtcbiAgLy8gICByZXR1cm4gcHJlcGFyZVJlbmFtZVRhYmxlKGl0LmZyb20sIGl0LnRvKVxuICAvLyB9KVxuICAvLyBjb25zb2xlLmxvZyhyZW5hbWVUYWJsZXMuam9pbignXFxuJykudHJpbSgpKVxuXG4gIGNvbnN0IGpzb25BbHRlclRhYmxlcyA9IGFsbEFsdGVyZWRSZXNvbHZlZC5tYXAoaXQgPT4ge1xuICAgIHJldHVybiBwcmVwYXJlQWx0ZXJUYWJsZUNvbHVtbnNKc29uKGl0Lm5hbWUsIGl0LmRlbGV0ZWQsIGl0LmNyZWF0ZWQsIGl0LmFsdGVyZWQpXG4gIH0pLmZsYXQoKVxuXG4gIGNvbnN0IGpzb25DcmVhdGVJbmRleGVzRm9yQWxsQWx0ZXJlZFRhYmxlcyA9IGFsbEFsdGVyZWQubWFwKGl0ID0+IHtcbiAgICByZXR1cm4gcHJlcGFyZUNyZWF0ZUluZGV4ZXNKc29uKGl0Lm5hbWUsIGl0LmFkZGVkSW5kZXhlcyB8fCB7fSlcbiAgfSkuZmxhdCgpXG5cbiAgY29uc3QganNvbkRyb3BJbmRleGVzRm9yQWxsQWx0ZXJlZFRhYmxlcyA9IGFsbEFsdGVyZWQubWFwKGl0ID0+IHtcbiAgICByZXR1cm4gcHJlcGFyZURyb3BJbmRleGVzSnNvbihpdC5uYW1lLCBpdC5kZWxldGVkSW5kZXhlcyB8fCB7fSlcbiAgfSkuZmxhdCgpXG5cbiAgY29uc3QganNvbkNyZWF0ZVJlZmVyZW5jZXNGb3JDcmVhdGVkVGFibGVzID0gY3JlYXRlZC5tYXAoaXQgPT4ge1xuICAgIHJldHVybiBwcmVwYXJlQ3JlYXRlUmVmZXJlbmNlc0pzb24oaXQubmFtZSwgT2JqZWN0LnZhbHVlcyhpdC5jb2x1bW5zKSlcbiAgfSkuZmxhdCgpXG5cbiAgY29uc3QganNvbkNyZWF0ZVJlZmVyZW5jZXNGb3JBbGxBbHRlcmVkVGFibGVzID0gYWxsQWx0ZXJlZC5tYXAoaXQgPT4ge1xuICAgIHJldHVybiBwcmVwYXJlQ3JlYXRlUmVmZXJlbmNlc0pzb24oaXQubmFtZSwgaXQuYWRkZWQpXG4gIH0pLmZsYXQoKVxuXG4gIGNvbnN0IGpzb25DcmVhdGVSZWZlcmVuY2VzID0ganNvbkNyZWF0ZVJlZmVyZW5jZXNGb3JDcmVhdGVkVGFibGVzLmNvbmNhdChqc29uQ3JlYXRlUmVmZXJlbmNlc0ZvckFsbEFsdGVyZWRUYWJsZXMpXG5cbiAgLy8gLy8gRW51bXM6XG4gIC8vIC8vIC0g0YHQvtC30LTQsNC90LjQtSDQtdC90LDQvNCwIOKchVxuICAvLyAvLyAtINC/0LXRgNC10LjQvNC10L3QvtCy0LDQvdC40LUg0LXQvdCw0LzQsCAo0L/QvtC60LAg0L3QtSDQtNC10LvQsNGOKeKPs1xuICAvLyAvLyAtINC00L7QsdCw0LLQu9C10L3QuNC1INCy0Y3Qu9GM0Y4g0Log0LXQvdCw0LzRgyDinIVcbiAgLy8gLy8gLSDRgNC10L3QtdC50Lwg0LLQtdC50LvRjNGOINGDINC10L3QsNC80LAgKNC/0L7QutCwINC90LUg0LTQtdC70LDRjiwg0Y3RgtC+INC90LDQtNC+INC30LDQv9GA0LDRiNC40LLQsNGC0Ywg0L7Qv9GP0YLRjCDQttC1INGH0LXRgNC10Lcg0YHQu9Cw0Lkp4o+zXG4gIC8vIC8vIC0g0YPQtNCw0LvQtdC90LjQtSDQtdC90LDQvNCwIC0+INGH0LXQutCw0YLRjCDQvdC1INC40YHQv9C+0LvRjNC30YPQtdGC0YHRjyDQu9C4INCz0LTQtS3RgtC+INC10L3QsNC8INC4INGB0L3QsNGH0LDQu9CwINGA0LDQvdC40YLRjCDQvNC40LPRgNCw0YbQuNC4INC4INCyINGB0LDQvNC+0Lwg0LrQvtC90YbQtSDRg9C00LDQu9C10L3QuNC1INC10L3QsNC80LDij7NcbiAgLy8gLy8gLSDRg9C00LDQu9C10L3QuNC1INCy0Y3Qu9GM0Y4g0LjQtyDQtdC90LDQvNCwIC0+INCx0LvQvtC6IOKdjFxuICAvLyBjb25zdCBlbnVtcyA9IHJlc3VsdC5hZGRlZEVudW1zLm1hcChpdCA9PiB7XG4gIC8vICAgcmV0dXJuIHByZXBhcmVDcmVhdGVFbnVtKGl0Lm5hbWUsIGl0LnZhbHVlcylcbiAgLy8gfSlcblxuICBjb25zdCBjcmVhdGVFbnVtcyA9IGRpZmZSZXN1bHQuYWRkZWRFbnVtcy5tYXAoaXQgPT4ge1xuICAgIHJldHVybiBwcmVwYXJlQ3JlYXRlRW51bUpzb24oaXQubmFtZSwgaXQudmFsdWVzKVxuICB9KVxuXG4gIC8vdG9kbzogYmxvY2sgZW51bSByZW5hbWUsIGVudW0gdmFsdWUgcmVuYW1lIGFuZCBlbnVuIGRlbGV0aW9uIGZvciBub3dcbiAgY29uc3QganNvbkFsdGVyRW51bXNXaXRoQWRkZWRWYWx1ZXMgPSBkaWZmUmVzdWx0LmFsdGVyZWRFbnVtcy5tYXAoaXQgPT4ge1xuICAgIHJldHVybiBwcmVwYXJlQWRkVmFsdWVzVG9FbnVtSnNvbihpdC5uYW1lLCBpdC5hZGRlZFZhbHVlcylcbiAgfSkuZmxhdCgpXG5cbiAganNvblN0YXRlbWVudHMucHVzaCguLi5jcmVhdGVFbnVtcylcbiAganNvblN0YXRlbWVudHMucHVzaCguLi5qc29uQWx0ZXJFbnVtc1dpdGhBZGRlZFZhbHVlcylcbiAganNvblN0YXRlbWVudHMucHVzaCguLi5qc29uQ3JlYXRlVGFibGVzKVxuICBqc29uU3RhdGVtZW50cy5wdXNoKC4uLmpzb25Ecm9wVGFibGVzKVxuICBqc29uU3RhdGVtZW50cy5wdXNoKC4uLmpzb25SZW5hbWVUYWJsZXMpXG4gIGpzb25TdGF0ZW1lbnRzLnB1c2goLi4uanNvbkFsdGVyVGFibGVzKVxuICBqc29uU3RhdGVtZW50cy5wdXNoKC4uLmpzb25DcmVhdGVSZWZlcmVuY2VzKVxuICBqc29uU3RhdGVtZW50cy5wdXNoKC4uLmpzb25DcmVhdGVJbmRleGVzRm9yQ3JlYXRlZFRhYmxlcylcbiAganNvblN0YXRlbWVudHMucHVzaCguLi5qc29uQ3JlYXRlSW5kZXhlc0ZvckFsbEFsdGVyZWRUYWJsZXMpXG4gIGpzb25TdGF0ZW1lbnRzLnB1c2goLi4uanNvbkRyb3BJbmRleGVzRm9yQWxsQWx0ZXJlZFRhYmxlcylcblxuICAvLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShqc29uU3RhdGVtZW50cywgbnVsbCwgMikpXG4gIC8vIGNvbnNvbGUubG9nKGpzb25TdGF0ZW1lbnRzKVxuXG4gIGNvbnN0IHNxbFN0YXRlbWVudHMgPSBmcm9tSnNvbihqc29uU3RhdGVtZW50cylcbiAgcmV0dXJuIHNxbFN0YXRlbWVudHMuam9pbignXFxuJylcbn1cblxuLy8gY29uc29sZS5sb2coZW51bXMuam9pbignXFxuJykudHJpbSgpKVxuLy8gY29uc29sZS5sb2coYWx0ZXJlZEVudW1zLmpvaW4oJ1xcbicpLnRyaW0oKSlcblxuLy8gZXhwbGljaXRlbHkgYXNrIGlmIHRhYmxlcyB3ZXJlIHJlbmFtZWQsIGlmIHllcyAtIGFkZCB0aG9zZSB0byBhbHRlcmVkIHRhYmxlcywgb3RoZXJ3aXNlIC0gZGVsZXRlZFxuLy8gZG91YmxlIGNoZWNrIGlmIHVzZXIgd2FudHMgdG8gZGVsZXRlIHBhcnRpY3VsYXIgdGFibGUgYW5kIHdhcm4gaGltIG9uIGRhdGEgbG9zc1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQHhzdGF0ZS9yZWFjdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb21tYW5kZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXNidWlsZFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJpbmtcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaW5rLXNlbGVjdC1pbnB1dFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJpbmstc3Bpbm5lclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJpbmstdGFibGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwianMteWFtbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJqc29uLWRpZmZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJldHR5LWVycm9yL3N0YXJ0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInNvdXJjZS1tYXAtc3VwcG9ydC9yZWdpc3RlclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzdHJpbmdfZGVjb2RlclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ0eXBlc2NyaXB0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInZhbHRpb1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ4c3RhdGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vc3JjL2NsaS9pbmRleC50c3hcIik7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=