@dashkite/tempo
Version:
Mono/polyrepo project management
527 lines (526 loc) • 73.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: Object.getOwnPropertyDescriptor(all, name).get
});
}
_export(exports, {
get Repo () {
return Repo;
},
get Repos () {
return Repos;
}
});
const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
const _nodecrypto = /*#__PURE__*/ _interop_require_default(require("node:crypto"));
const _function = /*#__PURE__*/ _interop_require_wildcard(require("@dashkite/joy/function"));
const _iterable = /*#__PURE__*/ _interop_require_wildcard(require("@dashkite/joy/iterable"));
const _type = /*#__PURE__*/ _interop_require_wildcard(require("@dashkite/joy/type"));
const _text = /*#__PURE__*/ _interop_require_wildcard(require("@dashkite/joy/text"));
const _generic = require("@dashkite/joy/generic");
const _bake = require("@dashkite/bake");
const _zephyr = /*#__PURE__*/ _interop_require_default(require("@dashkite/zephyr"));
const _kaiko = /*#__PURE__*/ _interop_require_default(require("@dashkite/kaiko"));
const _plimit = /*#__PURE__*/ _interop_require_default(require("p-limit"));
const _progress = /*#__PURE__*/ _interop_require_default(require("./progress"));
const _scripts = require("./scripts");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interop_require_wildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {
__proto__: null
};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var Hash, Memos, Repo, Repos, has, partition, push, remove, slice, indexOf = [].indexOf;
has = function(keys) {
if (!_type.isArray(keys)) {
keys = [
keys
];
}
return function(value) {
return keys.every(function(key) {
return value[key] != null;
});
};
};
push = function(stack, value) {
stack.unshift(value);
return value;
};
remove = function(list, target) {
var index;
if ((index = list.indexOf(target)) > -1) {
return list.splice(index, 1);
}
};
slice = function(stack, start, skip) {
return stack.slice(start, start + skip);
};
partition = function*(size, list) {
var i, j, results;
i = 0;
j = Math.ceil(list.length / size);
results = [];
while(i < j){
results.push((yield slice(list, i++ * size, size)));
}
return results;
};
Hash = {
md5: function(buffer) {
return (0, _bake.convert)({
from: "bytes",
to: "base36"
}, new Uint8Array(function() {
return _nodecrypto.default.createHash("md5").update(buffer).digest().buffer;
}()));
},
array: function(array) {
return _text.truncate(8, Hash.md5(array.sort().join(",")));
}
};
Memos = {
path: _nodepath.default.join(".tempo", "memos.json")
};
Repos = {
path: _nodepath.default.join(".tempo", "repos.yaml"),
initialize: function() {
return _zephyr.default.update(Repos.path, function(repos) {
return repos != null ? repos : repos = [];
});
},
load: function() {
return _zephyr.default.read(Repos.path);
},
get: async function(name) {
var repos;
repos = await Repos.load();
return repos.find(function(repo) {
return repo.name === name;
});
},
add: function({ organization, name }) {
return _zephyr.default.update(Repos.path, function(repos) {
repos.push({
organization,
name
});
return repos;
});
},
remove: function({ organization, name }) {
return _zephyr.default.update(Repos.path, function(repos) {
var repo;
repo = repos.find(function(repo) {
return repo.organization === organization && repo.name === name;
});
remove(repos, repo);
return repos;
});
},
tag: async function(repos, tags) {
var k, len, repo, results;
results = [];
for(k = 0, len = repos.length; k < len; k++){
repo = repos[k];
results.push(await Repo.tag(repo, tags));
}
return results;
},
untag: async function(repos, tags) {
var k, len, repo, results;
results = [];
for(k = 0, len = repos.length; k < len; k++){
repo = repos[k];
results.push(await Repo.untag(repo, tags));
}
return results;
},
find: function({ find }) {
find = (0, _generic.generic)({
name: "Repos.find",
default: function() {
return Repos.load();
}
});
(0, _generic.generic)(find, has("repos"), function({ repos, ...options }) {
return _function.flow([
function() {
return Repos.find(options);
},
_iterable.select(function(repo) {
var ref;
return ref = repo.name, indexOf.call(repos, ref) >= 0;
})
])();
});
(0, _generic.generic)(find, has("include"), async function({ include, ...options }) {
var repos;
repos = await _zephyr.default.read(include);
return Repos.find({
repos,
...options
});
});
(0, _generic.generic)(find, has([
"repos",
"include"
]), function({ repos, include }) {
return _function.flow([
Repos.find({
include: repos
}),
async function(result) {
return result.concat(await Repos.find({
include
}));
}
])();
});
(0, _generic.generic)(find, has("tags"), function({ tags, ...options }) {
return _function.flow([
function() {
return Repos.find(options);
},
_iterable.select(function(repo) {
return repo.tags != null && tags.some(function(tag) {
return indexOf.call(repo.tags, tag) >= 0;
});
})
])();
});
(0, _generic.generic)(find, has("exclude"), async function({ exclude, ...options }) {
exclude = await _zephyr.default.read(exclude);
return _function.flow([
function() {
return Repos.find(options);
},
_iterable.select(function(repo) {
var ref;
return !(ref = repo.name, indexOf.call(exclude, ref) >= 0);
})
])();
});
return find;
}({}),
run: function({ run }) {
run = (0, _generic.generic)({
name: "Repos.run"
});
(0, _generic.generic)(run, _type.isObject, async function({ repos, command, key, batch, retry }) {
var before, count, done, failed, failures, found, group, groups, hash, history, index, k, l, len, len1, len2, len3, limiter, m, memos, mulligan, n, name1, pending, progress, repo, retries, succeeded;
if (batch == null) {
batch = 6; // max parallel builds
}
if (retry == null) {
retry = true;
}
if (retry) {
memos = await _zephyr.default.read(Memos.path);
if (memos == null) {
memos = {};
}
groups = memos[key];
}
// default the trivial group
if (groups == null) {
groups = [
repos.map(function({ name }) {
return name;
})
];
}
// check for missing repos
// add to first group if we find any
for(k = 0, len = repos.length; k < len; k++){
repo = repos[k];
found = groups.find(function(group) {
var ref;
return ref = repo.name, indexOf.call(group, ref) >= 0;
}) != null;
if (!found) {
push(groups[0], repo.name);
}
}
// remove repos that are not in the target repos list
groups = groups.map(function(group) {
return group.filter(function(name) {
return repos.find(function(repo) {
return repo.name === name;
}) != null;
});
// remove empty groups since they will halt the run loop
}).filter(function(group) {
return group.length !== 0;
});
failed = void 0;
hash = void 0;
retries = retry ? 6 : 0;
history = [];
// initialize failures lookup
failures = {};
for(l = 0, len1 = repos.length; l < len1; l++){
repo = repos[l];
failures[repo.name] = 0;
}
_kaiko.default.info({
console: true,
message: `Running [ ${_text.elide(40, "...", command)} ]`,
command: command
});
limiter = (0, _plimit.default)(batch);
done = function() {
var ref;
return failed != null && (failed.length === 0 || (ref = hash = Hash.array(failed), indexOf.call(history, ref) >= 0));
};
count = 0;
while(!done()){
if (hash != null) {
history.push(hash);
}
if (failed != null) {
groups.push(failed);
}
index = 0;
succeeded = 0;
before = -1;
if (typeof progress !== "undefined" && progress !== null) {
progress.stop();
}
console.log(`Attempt #${++count}`);
progress = _progress.default.make({
count: repos.length
});
progress.start();
mulligan = true;
while((group = groups[index]) != null && (succeeded > before || mulligan)){
if (succeeded === before) {
mulligan = false;
}
before = succeeded;
failed = [];
pending = function() {
var len2, m, results;
results = [];
for(m = 0, len2 = group.length; m < len2; m++){
repo = group[m];
results.push(function(repo) {
return limiter(async function() {
var error, result;
_kaiko.default.debug({
repo,
command
});
if (failures[repo] <= retries) {
try {
result = await _scripts.Script.run(command, {
cwd: repo
});
_kaiko.default.debug({
repo,
result
});
succeeded++;
return progress.increment();
} catch (error1) {
error = error1;
_kaiko.default.error({
repo: repo,
message: error.message,
error: error
});
return push(failed, repo);
}
} else {
_kaiko.default.error({
repo: repo,
failures: failures[repo],
retries: retries,
message: "Too many failures"
});
return push(failed, repo);
}
});
}(repo));
}
return results;
}();
await Promise.all(pending);
// demote failures
if (succeeded > before && failed.length > 0) {
if (groups[name1 = index + 1] == null) {
groups[name1] = [];
}
for(m = 0, len2 = failed.length; m < len2; m++){
repo = failed[m];
_kaiko.default.debug({
message: "demoting repo",
repo
});
failures[repo]++;
remove(group, repo);
push(groups[index + 1], repo);
}
}
index++;
}
}
progress.stop();
for(n = 0, len3 = failed.length; n < len3; n++){
repo = failed[n];
_kaiko.default.error({
console: true,
repo: repo,
message: "failed"
});
}
_kaiko.default.info({
console: true,
message: `succeeded: ${succeeded}, failed: ${repos.length - succeeded}`
});
memos[key] = groups;
return _zephyr.default.write(".tempo/memos.json", memos);
});
(0, _generic.generic)(run, has("serial"), function({ serial, ...options }) {
return Repos.run({
batch: 1,
...options
});
});
(0, _generic.generic)(run, has([
"command",
"args"
]), function({ command, args, ...options }) {
if (_type.isObject(command)) {
({ command } = command);
options = {
...options,
...command.options
};
}
return Repos.run({
command: _scripts.Script.expand(command, args),
...options
});
});
(0, _generic.generic)(run, has("script"), async function({ script, ...options }) {
return Repos.run({
command: await _scripts.Scripts.find(script),
...options
});
});
return run;
}({})
};
Repo = {
parse: function(specifier) {
var name, organization;
[organization, name] = specifier.split("/");
return {
organization,
name
};
},
same: function(a, b) {
return a.organization === b.organization && a.name === b.name;
},
save: function(repo) {
return _zephyr.default.update(Repos.path, function(repos) {
var _repo, k, len, results;
results = [];
for(k = 0, len = repos.length; k < len; k++){
_repo = repos[k];
if (Repo.same(_repo, repo)) {
results.push(repo);
} else {
results.push(_repo);
}
}
return results;
});
},
tag: function(repo, tags) {
if (repo.tags == null) {
repo.tags = [];
}
repo.tags = Array.from(new Set([
...repo.tags,
...tags
]));
return Repo.save(repo);
},
untag: function(repo, tags) {
repo.tags = function() {
var k, len, ref, results, tag;
ref = repo.tags;
results = [];
for(k = 0, len = ref.length; k < len; k++){
tag = ref[k];
if (!(indexOf.call(tags, tag) >= 0)) {
results.push(tag);
}
}
return results;
}();
return Repo.save(repo);
},
changed: async function(name) {
try {
// returns non-zero status if there are changes in the repo
await _scripts.Script.run("git diff-index --quiet HEAD", {
cwd: name
});
return false;
} catch (error1) {
return true;
}
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiL0BkYXNoa2l0ZS90ZW1wby9zcmMvaGVscGVycy9yZXBvcy5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxFQUFBLElBQUEsRUFBQSxLQUFBLEVBQUEsR0FBQSxFQUFBLFNBQUEsRUFBQSxJQUFBLEVBQUEsTUFBQSxFQUFBLEtBQUE7RUFBQTs7QUFBQSxPQUFPLElBQVAsTUFBQTs7QUFDQSxPQUFPLE1BQVAsTUFBQTs7QUFDQSxPQUFPLENBQUEsTUFBUCxNQUFBOztBQUNBLE9BQU8sQ0FBQSxNQUFQLE1BQUE7O0FBQ0EsT0FBTyxDQUFBLFFBQVAsTUFBQTs7QUFDQSxPQUFPLENBQUEsUUFBUCxNQUFBOztBQUNBLE9BQUE7RUFBUyxPQUFUO0NBQUEsTUFBQTs7QUFDQSxPQUFBO0VBQVMsT0FBVDtDQUFBLE1BQUE7O0FBQ0EsT0FBTyxNQUFQLE1BQUE7O0FBQ0EsT0FBTyxHQUFQLE1BQUE7O0FBQ0EsT0FBTyxNQUFQLE1BQUE7O0FBQ0EsT0FBTyxRQUFQLE1BQUE7O0FBQ0EsT0FBQTtFQUFTLE9BQVQ7RUFBa0IsTUFBbEI7Q0FBQSxNQUFBOztBQUVBLEdBQUEsR0FBTSxRQUFBLENBQUUsSUFBRixDQUFBO0VBQ0osSUFBRyxDQUFDLENBQUUsSUFBSSxDQUFDLE9BQUwsQ0FBYSxJQUFiLENBQUYsQ0FBSjtJQUNFLElBQUEsR0FBTyxDQUFFLElBQUYsRUFEVDs7U0FFQSxRQUFBLENBQUUsS0FBRixDQUFBO1dBQWEsSUFBSSxDQUFDLEtBQUwsQ0FBVyxRQUFBLENBQUUsR0FBRixDQUFBO2FBQVc7SUFBWCxDQUFYO0VBQWI7QUFISTs7QUFLTixJQUFBLEdBQU8sUUFBQSxDQUFFLEtBQUYsRUFBUyxLQUFULENBQUE7RUFBb0IsS0FBSyxDQUFDLE9BQU4sQ0FBYyxLQUFkO1NBQXNCO0FBQTFDOztBQUVQLE1BQUEsR0FBUyxRQUFBLENBQUUsSUFBRixFQUFRLE1BQVIs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O01BQUwsQ0FBMUM7YUFDTixNQUhGO0tBSUEsY0FBQTthQUNFLEtBREY7O0VBTE87QUF6QlQ7O0FBaUNGLE9BQUE7RUFBUyxLQUFUO0VBQWdCLElBQWhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgQ3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgKiBhcyBGbiBmcm9tIFwiQGRhc2hraXRlL2pveS9mdW5jdGlvblwiXG5pbXBvcnQgKiBhcyBJdCBmcm9tIFwiQGRhc2hraXRlL2pveS9pdGVyYWJsZVwiXG5pbXBvcnQgKiBhcyBUeXBlIGZyb20gXCJAZGFzaGtpdGUvam95L3R5cGVcIlxuaW1wb3J0ICogYXMgVGV4dCBmcm9tIFwiQGRhc2hraXRlL2pveS90ZXh0XCJcbmltcG9ydCB7IGdlbmVyaWMgfSBmcm9tIFwiQGRhc2hraXRlL2pveS9nZW5lcmljXCJcbmltcG9ydCB7IGNvbnZlcnQgfSBmcm9tIFwiQGRhc2hraXRlL2Jha2VcIlxuaW1wb3J0IFplcGh5ciBmcm9tIFwiQGRhc2hraXRlL3plcGh5clwiXG5pbXBvcnQgbG9nIGZyb20gXCJAZGFzaGtpdGUva2Fpa29cIlxuaW1wb3J0IHBMaW1pdCBmcm9tIFwicC1saW1pdFwiXG5pbXBvcnQgUHJvZ3Jlc3MgZnJvbSBcIi4vcHJvZ3Jlc3NcIlxuaW1wb3J0IHsgU2NyaXB0cywgU2NyaXB0IH0gZnJvbSBcIi4vc2NyaXB0c1wiXG5cbmhhcyA9ICgga2V5cyApIC0+IFxuICBpZiAhKCBUeXBlLmlzQXJyYXkga2V5cyApXG4gICAga2V5cyA9IFsga2V5cyBdXG4gICggdmFsdWUgKSAtPiBrZXlzLmV2ZXJ5ICgga2V5ICkgLT4gdmFsdWVbIGtleSBdP1xuXG5wdXNoID0gKCBzdGFjaywgdmFsdWUgKSAtPiBzdGFjay51bnNoaWZ0IHZhbHVlIDsgdmFsdWVcblxucmVtb3ZlID0gKCBsaXN0LCB0YXJnZXQgKSAtPlxuICBpZiAoIGluZGV4ID0gbGlzdC5pbmRleE9mIHRhcmdldCApID4gLTFcbiAgICBsaXN0LnNwbGljZSBpbmRleCwgMVxuXG5zbGljZSA9ICggc3RhY2ssIHN0YXJ0LCBza2lwICkgLT5cbiAgc3RhY2suc2xpY2Ugc3RhcnQsIHN0YXJ0ICsgc2tpcFxuXG5wYXJ0aXRpb24gPSAoIHNpemUsIGxpc3QgKSAtPlxuICBpID0gMFxuICBqID0gTWF0aC5jZWlsIGxpc3QubGVuZ3RoIC8gc2l6ZVxuICB3aGlsZSBpIDwgalxuICAgIHlpZWxkIHNsaWNlIGxpc3QsICggaSsrICogc2l6ZSApLCBzaXplXG5cblxuSGFzaCA9XG5cbiAgbWQ1OiAoIGJ1ZmZlciApIC0+XG4gICAgY29udmVydCBmcm9tOiBcImJ5dGVzXCIsIHRvOiBcImJhc2UzNlwiLFxuICAgICAgbmV3IFVpbnQ4QXJyYXkgZG8gLT5cbiAgICAgICAgQ3J5cHRvXG4gICAgICAgICAgLmNyZWF0ZUhhc2ggXCJtZDVcIlxuICAgICAgICAgIC51cGRhdGUgYnVmZmVyXG4gICAgICAgICAgLmRpZ2VzdCgpXG4gICAgICAgICAgLmJ1ZmZlclxuXG4gIGFycmF5OiAoIGFycmF5ICkgLT5cbiAgICBUZXh0LnRydW5jYXRlIDgsIFxuICAgICAgSGFzaC5tZDUgYXJyYXkuc29ydCgpLmpvaW4gXCIsXCJcblxuTWVtb3MgPVxuXG4gIHBhdGg6IFBhdGguam9pbiBcIi50ZW1wb1wiLCBcIm1lbW9zLmpzb25cIlxuXG5SZXBvcyA9XG4gIFxuICBwYXRoOiBQYXRoLmpvaW4gXCIudGVtcG9cIiwgXCJyZXBvcy55YW1sXCJcblxuICBpbml0aWFsaXplOiAtPlxuICAgIFplcGh5ci51cGRhdGUgUmVwb3MucGF0aCwgKCByZXBvcyApIC0+IHJlcG9zID89IFtdXG5cbiAgbG9hZDogLT4gWmVwaHlyLnJlYWQgUmVwb3MucGF0aFxuXG4gIGdldDogKCBuYW1lICkgLT5cbiAgICByZXBvcyA9IGF3YWl0IGRvIFJlcG9zLmxvYWRcbiAgICByZXBvcy5maW5kICggcmVwbyApIC0+IHJlcG8ubmFtZSA9PSBuYW1lXG5cbiAgYWRkOiAoeyBvcmdhbml6YXRpb24sIG5hbWUgfSkgLT5cbiAgICBaZXBoeXIudXBkYXRlIFJlcG9zLnBhdGgsICggcmVwb3MgKSAtPlxuICAgICAgcmVwb3MucHVzaCB7IG9yZ2FuaXphdGlvbiwgbmFtZSB9XG4gICAgICByZXBvc1xuXG4gIHJlbW92ZTogKHsgb3JnYW5pemF0aW9uLCBuYW1lIH0pIC0+XG4gICAgWmVwaHlyLnVwZGF0ZSBSZXBvcy5wYXRoLCAoIHJlcG9zICkgLT5cbiAgICAgIHJlcG8gPSByZXBvcy5maW5kICggcmVwbyApIC0+XG4gICAgICAgIHJlcG8ub3JnYW5pemF0aW9uID09IG9yZ2FuaXphdGlvbiAmJlxuICAgICAgICAgIHJlcG8ubmFtZSA9PSBuYW1lXG4gICAgICByZW1vdmUgcmVwb3MsIHJlcG9cbiAgICAgIHJlcG9zXG5cbiAgdGFnOiAoIHJlcG9zLCB0YWdzICkgLT5cbiAgICBmb3IgcmVwbyBpbiByZXBvc1xuICAgICAgYXdhaXQgUmVwby50YWcgcmVwbywgdGFnc1xuXG4gIHVudGFnOiAoIHJlcG9zLCB0YWdzICkgLT5cbiAgICBmb3IgcmVwbyBpbiByZXBvc1xuICAgICAgYXdhaXQgUmVwby51bnRhZyByZXBvLCB0YWdzXG5cbiAgZmluZDogZG8gKHsgZmluZCB9ID0ge30pIC0+XG5cbiAgICBmaW5kID0gZ2VuZXJpY1xuICAgICAgbmFtZTogXCJSZXBvcy5maW5kXCJcbiAgICAgIGRlZmF1bHQ6IC0+IGRvIFJlcG9zLmxvYWRcblxuICAgIGdlbmVyaWMgZmluZCxcbiAgICAgICggaGFzIFwicmVwb3NcIiApLFxuICAgICAgKHsgcmVwb3MsIG9wdGlvbnMuLi4gfSkgLT4gXG4gICAgICAgIGRvIEZuLmZsb3cgW1xuICAgICAgICAgIC0+IFJlcG9zLmZpbmQgb3B0aW9uc1xuICAgICAgICAgIEl0LnNlbGVjdCAoIHJlcG8gKSAtPiByZXBvLm5hbWUgaW4gcmVwb3NcbiAgICAgICAgXVxuICAgICAgICBcbiAgICBnZW5lcmljIGZpbmQsXG4gICAgICAoIGhhcyBcImluY2x1ZGVcIiApLFxuICAgICAgKHsgaW5jbHVkZSwgb3B0aW9ucy4uLiB9KSAtPlxuICAgICAgICByZXBvcyA9IGF3YWl0IFplcGh5ci5yZWFkIGluY2x1ZGVcbiAgICAgICAgUmVwb3MuZmluZCB7IHJlcG9zLCBvcHRpb25zLi4uIH1cblxuICAgIGdlbmVyaWMgZmluZCxcbiAgICAgICggaGFzIFsgXCJyZXBvc1wiLCBcImluY2x1ZGVcIiBdICksXG4gICAgICAoeyByZXBvcywgaW5jbHVkZSB9KSAtPlxuICAgICAgICBkbyBGbi5mbG93IFtcbiAgICAgICAgICBSZXBvcy5maW5kIGluY2x1ZGU6IHJlcG9zXG4gICAgICAgICAgKCByZXN1bHQgKSAtPiBcbiAgICAgICAgICAgIHJlc3VsdC5jb25jYXQgYXdhaXQgUmVwb3MuZmluZCB7IGluY2x1ZGUgfVxuICAgICAgICBdXG5cbiAgICBnZW5lcmljIGZpbmQsXG4gICAgICAoIGhhcyBcInRhZ3NcIiApLFxuICAgICAgKHsgdGFncywgb3B0aW9ucy4uLiB9KSAtPlxuICAgICAgICBkbyBGbi5mbG93IFtcbiAgICAgICAgICAtPiBSZXBvcy5maW5kIG9wdGlvbnNcbiAgICAgICAgICBJdC5zZWxlY3QgKCByZXBvICkgLT4gXG4gICAgICAgICAgICByZXBvLnRhZ3M/ICYmICggdGFncy5zb21lICggdGFnICkgLT4gdGFnIGluIHJlcG8udGFncyApXG4gICAgICAgIF1cblxuICAgIGdlbmVyaWMgZmluZCxcbiAgICAgICggaGFzIFwiZXhjbHVkZVwiICksXG4gICAgICAoeyBleGNsdWRlLCBvcHRpb25zLi4uIH0pIC0+XG4gICAgICAgIGV4Y2x1ZGUgPSBhd2FpdCBaZXBoeXIucmVhZCBleGNsdWRlXG4gICAgICAgIGRvIEZuLmZsb3cgW1xuICAgICAgICAgIC0+IFJlcG9zLmZpbmQgb3B0aW9uc1xuICAgICAgICAgIEl0LnNlbGVjdCAoIHJlcG8gKSAtPiAhKCByZXBvLm5hbWUgaW4gZXhjbHVkZSApXG4gICAgICAgIF1cblxuICAgIGZpbmRcblxuICBydW46IGRvICh7IHJ1biB9ID0ge30pIC0+XG4gIFxuICAgIHJ1biA9IGdlbmVyaWMgbmFtZTogXCJSZXBvcy5ydW5cIlxuXG4gICAgZ2VuZXJpYyBydW4sIFR5cGUuaXNPYmplY3QsXG4gICAgICAoeyByZXBvcywgY29tbWFuZCwga2V5LCBiYXRjaCwgcmV0cnkgfSkgLT5cblxuICAgICAgICBiYXRjaCA/PSA2ICMgbWF4IHBhcmFsbGVsIGJ1aWxkc1xuICAgICAgICByZXRyeSA/PSB0cnVlXG5cbiAgICAgICAgaWYgcmV0cnlcbiAgICAgICAgICBtZW1vcyA9IGF3YWl0IFplcGh5ci5yZWFkIE1lbW9zLnBhdGhcbiAgICAgICAgICBtZW1vcyA/PSB7fVxuICAgICAgICAgIGdyb3VwcyA9IG1lbW9zWyBrZXkgXVxuXG4gICAgICAgICMgZGVmYXVsdCB0aGUgdHJpdmlhbCBncm91cFxuICAgICAgICBncm91cHMgPz0gWyggcmVwb3MubWFwICh7IG5hbWUgfSkgLT4gbmFtZSApXVxuXG4gICAgICAgICMgY2hlY2sgZm9yIG1pc3NpbmcgcmVwb3NcbiAgICAgICAgIyBhZGQgdG8gZmlyc3QgZ3JvdXAgaWYgd2UgZmluZCBhbnlcbiAgICAgICAgZm9yIHJlcG8gaW4gcmVwb3NcbiAgICAgICAgICBmb3VuZCA9ICggZ3JvdXBzLmZpbmQgKCBncm91cCApIC0+IHJlcG8ubmFtZSBpbiBncm91cCApP1xuICAgICAgICAgIHVubGVzcyBmb3VuZFxuICAgICAgICAgICAgcHVzaCBncm91cHNbIDAgXSwgcmVwby5uYW1lXG4gICAgICAgIFxuICAgICAgICBncm91cHMgPSBncm91cHNcbiAgICAgICAgICAjIHJlbW92ZSByZXBvcyB0aGF0IGFyZSBub3QgaW4gdGhlIHRhcmdldCByZXBvcyBsaXN0XG4gICAgICAgICAgLm1hcCAoIGdyb3VwICkgLT5cbiAgICAgICAgICAgIGdyb3VwLmZpbHRlciAoIG5hbWUgKSAtPlxuICAgICAgICAgICAgICAoIHJlcG9zLmZpbmQgKCByZXBvICkgLT4gcmVwby5uYW1lID09IG5hbWUgKT9cbiAgICAgICAgICAjIHJlbW92ZSBlbXB0eSBncm91cHMgc2luY2UgdGhleSB3aWxsIGhhbHQgdGhlIHJ1biBsb29wXG4gICAgICAgICAgLmZpbHRlciAoIGdyb3VwICkgLT4gZ3JvdXAubGVuZ3RoICE9IDBcblxuICAgICAgICBmYWlsZWQgPSB1bmRlZmluZWRcbiAgICAgICAgaGFzaCA9IHVuZGVmaW5lZFxuICAgICAgICByZXRyaWVzID0gaWYgcmV0cnkgdGhlbiA2IGVsc2UgMFxuICAgICAgICBoaXN0b3J5ID0gW11cblxuICAgICAgICAjIGluaXRpYWxpemUgZmFpbHVyZXMgbG9va3VwXG4gICAgICAgIGZhaWx1cmVzID0ge31cbiAgICAgICAgKCBmYWlsdXJlc1sgcmVwby5uYW1lIF0gPSAwICkgZm9yIHJlcG8gaW4gcmVwb3MgIFxuXG4gIFxuXG4gICAgICAgIGxvZy5pbmZvIFxuICAgICAgICAgIGNvbnNvbGU6IHRydWVcbiAgICAgICAgICBtZXNzYWdlOiBcIlJ1bm5pbmcgWyAjeyBUZXh0LmVsaWRlIDQwLCBcIi4uLlwiLCBjb21tYW5kIH0gXVwiXG4gICAgICAgICAgY29tbWFuZDogY29tbWFuZFxuXG4gICAgICAgIGxpbWl0ZXIgPSBwTGltaXQgYmF0Y2hcblxuICAgICAgICBkb25lID0gLT5cbiAgICAgICAgICBmYWlsZWQ/ICYmXG4gICAgICAgICAgICAoKCBmYWlsZWQubGVuZ3RoID09IDAgKSB8fFxuICAgICAgICAgICAgICAoKCBoYXNoID0gSGFzaC5hcnJheSBmYWlsZWQgKSBpbiBoaXN0b3J5ICkpXG5cbiAgICAgICAgY291bnQgPSAwXG4gICAgICAgIHdoaWxlICFkb25lKClcblxuICAgICAgICAgICggaGlzdG9yeS5wdXNoIGhhc2ggKSBpZiBoYXNoP1xuICAgICAgICAgICggZ3JvdXBzLnB1c2ggZmFpbGVkICkgaWYgZmFpbGVkP1xuXG4gICAgICAgICAgaW5kZXggPSAwXG4gICAgICAgICAgc3VjY2VlZGVkID0gMFxuICAgICAgICAgIGJlZm9yZSA9IC0xXG5cbiAgICAgICAgICBwcm9ncmVzcy5zdG9wKCkgaWYgcHJvZ3Jlc3M/XG4gICAgICAgICAgY29uc29sZS5sb2cgXCJBdHRlbXB0ICMjeyArK2NvdW50IH1cIlxuICAgICAgICAgIHByb2dyZXNzID0gUHJvZ3Jlc3MubWFrZSBjb3VudDogcmVwb3MubGVuZ3RoXG4gICAgICAgICAgcHJvZ3Jlc3Muc3RhcnQoKVxuXG4gICAgICAgICAgbXVsbGlnYW4gPSB0cnVlXG4gICAgICAgICAgd2hpbGUgKCBncm91cCA9IGdyb3Vwc1sgaW5kZXggXSk/ICYmICgoIHN1Y2NlZWRlZCA+IGJlZm9yZSApIHx8IG11bGxpZ2FuKVxuICAgICAgICAgICAgbXVsbGlnYW4gPSBmYWxzZSBpZiBzdWNjZWVkZWQgPT0gYmVmb3JlXG4gICAgICAgICAgICBiZWZvcmUgPSBzdWNjZWVkZWRcbiAgICAgICAgICAgIGZhaWxlZCA9IFtdXG5cbiAgICAgICAgICAgIHBlbmRpbmcgPSBcbiAgICAgICAgICAgICAgZm9yIHJlcG8gaW4gZ3JvdXBcbiAgICAgICAgICAgICAgICBkbyAoIHJlcG8gKSAtPlxuICAgICAgICAgICAgICAgICAgbGltaXRlciAtPlxuICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcgeyByZXBvLCBjb21tYW5kIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgZmFpbHVyZXNbIHJlcG8gXSA8PSByZXRyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgdHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBTY3JpcHQucnVuIGNvbW1hbmQsIGN3ZDogcmVwb1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnIHsgcmVwbywgcmVzdWx0IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRlZCsrXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5pbmNyZW1lbnQoKVxuICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbzogcmVwb1xuICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBmYWlsZWQsIHJlcG9cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbzogcmVwbyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzOiBmYWlsdXJlc1sgcmVwbyBdXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiByZXRyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIlRvbyBtYW55IGZhaWx1cmVzXCJcbiAgICAgICAgICAgICAgICAgICAgICBwdXNoIGZhaWxlZCwgcmVwb1xuXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCBwZW5kaW5nXG5cbiAgICAgICAgICAgICMgZGVtb3RlIGZhaWx1cmVzXG4gICAgICAgICAgICBpZiAoIHN1Y2NlZWRlZCA+IGJlZm9yZSApICYmICggZmFpbGVkLmxlbmd0aCA+IDAgKVxuICAgICAgICAgICAgICBncm91cHNbIGluZGV4ICsgMSBdID89IFtdXG4gICAgICAgICAgICAgIGZvciByZXBvIGluIGZhaWxlZFxuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyB7XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcImRlbW90aW5nIHJlcG9cIlxuICAgICAgICAgICAgICAgICAgcmVwb1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmYWlsdXJlc1sgcmVwbyBdKytcbiAgICAgICAgICAgICAgICByZW1vdmUgZ3JvdXAsIHJlcG9cbiAgICAgICAgICAgICAgICBwdXNoIGdyb3Vwc1sgaW5kZXggKyAxIF0sIHJlcG9cblxuICAgICAgICAgICAgaW5kZXgrK1xuXG4gICAgICAgIHByb2dyZXNzLnN0b3AoKVxuXG4gICAgICAgIGZvciByZXBvIGluIGZhaWxlZFxuICAgICAgICAgIGxvZy5lcnJvclxuICAgICAgICAgICAgY29uc29sZTp0cnVlXG4gICAgICAgICAgICByZXBvOiByZXBvXG4gICAgICAgICAgICBtZXNzYWdlOiBcImZhaWxlZFwiXG5cblxuICAgICAgICBsb2cuaW5mbyBcbiAgICAgICAgICBjb25zb2xlOiB0cnVlXG4gICAgICAgICAgbWVzc2FnZTogXCJzdWNjZWVkZWQ6ICN7IHN1Y2NlZWRlZCB9LFxuICAgICAgICAgICAgZmFpbGVkOiAjeyByZXBvcy5sZW5ndGggLSBzdWNjZWVkZWQgfVwiXG5cbiAgICAgICAgbWVtb3NbIGtleSBdID0gZ3JvdXBzXG4gICAgICAgIFplcGh5ci53cml0ZSBcIi50ZW1wby9tZW1vcy5qc29uXCIsIG1lbW9zXG5cbiAgICBnZW5lcmljIHJ1biwgXG4gICAgICAoIGhhcyBcInNlcmlhbFwiICksXG4gICAgICAoeyBzZXJpYWwsIG9wdGlvbnMuLi4gfSkgLT5cbiAgICAgICAgUmVwb3MucnVuIHsgYmF0Y2g6IDEsIG9wdGlvbnMuLi4gfVxuXG4gICAgZ2VuZXJpYyBydW4sIFxuICAgICAgKCBoYXMgWyBcImNvbW1hbmRcIiwgXCJhcmdzXCIgIF0pLFxuICAgICAgKHsgY29tbWFuZCwgYXJncywgb3B0aW9ucy4uLiB9KSAtPlxuICAgICAgICBpZiBUeXBlLmlzT2JqZWN0IGNvbW1hbmRcbiAgICAgICAgICB7IGNvbW1hbmQgfSA9IGNvbW1hbmRcbiAgICAgICAgICBvcHRpb25zID0geyBvcHRpb25zLi4uLCBjb21tYW5kLm9wdGlvbnMuLi4gfVxuICAgICAgICBSZXBvcy5ydW4ge1xuICAgICAgICAgIGNvbW1hbmQ6IFNjcmlwdC5leHBhbmQgY29tbWFuZCwgYXJnc1xuICAgICAgICAgIG9wdGlvbnMuLi5cbiAgICAgICAgfVxuXG4gICAgZ2VuZXJpYyBydW4sIFxuICAgICAgKCBoYXMgXCJzY3JpcHRcIiApLFxuICAgICAgKHsgc2NyaXB0LCBvcHRpb25zLi4uIH0pIC0+XG4gICAgICAgIFJlcG9zLnJ1biB7XG4gICAgICAgICAgY29tbWFuZDogYXdhaXQgU2NyaXB0cy5maW5kIHNjcmlwdFxuICAgICAgICAgIG9wdGlvbnMuLi5cbiAgICAgICAgfVxuXG4gICAgcnVuXG5cblJlcG8gPVxuXG4gIHBhcnNlOiAoIHNwZWNpZmllciApIC0+XG4gICAgWyBvcmdhbml6YXRpb24sIG5hbWUgXSA9IHNwZWNpZmllci5zcGxpdCBcIi9cIlxuICAgIHsgb3JnYW5pemF0aW9uLCBuYW1lIH1cblxuICBzYW1lOiAoIGEsIGIgKSAtPlxuICAgIGEub3JnYW5pemF0aW9uID09IGIub3JnYW5pemF0aW9uICYmIGEubmFtZSA9PSBiLm5hbWVcblxuICBzYXZlOiAoIHJlcG8gKSAtPlxuICAgIFplcGh5ci51cGRhdGUgUmVwb3MucGF0aCwgKCByZXBvcyApIC0+XG4gICAgICBmb3IgX3JlcG8gaW4gcmVwb3MgICAgICBcbiAgICAgICAgaWYgUmVwby5zYW1lIF9yZXBvLCByZXBvXG4gICAgICAgICAgcmVwb1xuICAgICAgICBlbHNlXG4gICAgICAgICAgX3JlcG9cblxuICB0YWc6ICggcmVwbywgdGFncyApIC0+XG4gICAgcmVwby50YWdzID89IFtdXG4gICAgcmVwby50YWdzID0gQXJyYXkuZnJvbSBuZXcgU2V0IFsgcmVwby50YWdzLi4uLCB0YWdzLi4uIF1cbiAgICBSZXBvLnNhdmUgcmVwb1xuXG4gIHVudGFnOiAoIHJlcG8sIHRhZ3MgKSAtPlxuICAgIHJlcG8udGFncyA9IGRvIC0+XG4gICAgICB0YWcgZm9yIHRhZyBpbiByZXBvLnRhZ3Mgd2hlbiAhKCB0YWcgaW4gdGFncyApXG4gICAgUmVwby5zYXZlIHJlcG9cblxuICBjaGFuZ2VkOiAoIG5hbWUgKSAtPlxuICAgIHRyeVxuICAgICAgIyByZXR1cm5zIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGVyZSBhcmUgY2hhbmdlcyBpbiB0aGUgcmVwb1xuICAgICAgYXdhaXQgU2NyaXB0LnJ1biBcImdpdCBkaWZmLWluZGV4IC0tcXVpZXQgSEVBRFwiLCBjd2Q6IG5hbWVcbiAgICAgIGZhbHNlXG4gICAgY2F0Y2hcbiAgICAgIHRydWVcblxuZXhwb3J0IHsgUmVwb3MsIFJlcG8gfSJdfQ==
//# sourceURL=/@dashkite/tempo/src/helpers/repos.coffee
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlcyI6WyIvQGRhc2hraXRlL3RlbXBvL3NyYy9oZWxwZXJzL3JlcG9zLmNvZmZlZSJdLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgQ3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgKiBhcyBGbiBmcm9tIFwiQGRhc2hraXRlL2pveS9mdW5jdGlvblwiXG5pbXBvcnQgKiBhcyBJdCBmcm9tIFwiQGRhc2hraXRlL2pveS9pdGVyYWJsZVwiXG5pbXBvcnQgKiBhcyBUeXBlIGZyb20gXCJAZGFzaGtpdGUvam95L3R5cGVcIlxuaW1wb3J0ICogYXMgVGV4dCBmcm9tIFwiQGRhc2hraXRlL2pveS90ZXh0XCJcbmltcG9ydCB7IGdlbmVyaWMgfSBmcm9tIFwiQGRhc2hraXRlL2pveS9nZW5lcmljXCJcbmltcG9ydCB7IGNvbnZlcnQgfSBmcm9tIFwiQGRhc2hraXRlL2Jha2VcIlxuaW1wb3J0IFplcGh5ciBmcm9tIFwiQGRhc2hraXRlL3plcGh5clwiXG5pbXBvcnQgbG9nIGZyb20gXCJAZGFzaGtpdGUva2Fpa29cIlxuaW1wb3J0IHBMaW1pdCBmcm9tIFwicC1saW1pdFwiXG5pbXBvcnQgUHJvZ3Jlc3MgZnJvbSBcIi4vcHJvZ3Jlc3NcIlxuaW1wb3J0IHsgU2NyaXB0cywgU2NyaXB0IH0gZnJvbSBcIi4vc2NyaXB0c1wiXG5cbmhhcyA9ICgga2V5cyApIC0+IFxuICBpZiAhKCBUeXBlLmlzQXJyYXkga2V5cyApXG4gICAga2V5cyA9IFsga2V5cyBdXG4gICggdmFsdWUgKSAtPiBrZXlzLmV2ZXJ5ICgga2V5ICkgLT4gdmFsdWVbIGtleSBdP1xuXG5wdXNoID0gKCBzdGFjaywgdmFsdWUgKSAtPiBzdGFjay51bnNoaWZ0IHZhbHVlIDsgdmFsdWVcblxucmVtb3ZlID0gKCBsaXN0LCB0YXJnZXQgKSAtPlxuICBpZiAoIGluZGV4ID0gbGlzdC5pbmRleE9mIHRhcmdldCApID4gLTFcbiAgICBsaXN0LnNwbGljZSBpbmRleCwgMVxuXG5zbGljZSA9ICggc3RhY2ssIHN0YXJ0LCBza2lwICkgLT5cbiAgc3RhY2suc2xpY2Ugc3RhcnQsIHN0YXJ0ICsgc2tpcFxuXG5wYXJ0aXRpb24gPSAoIHNpemUsIGxpc3QgKSAtPlxuICBpID0gMFxuICBqID0gTWF0aC5jZWlsIGxpc3QubGVuZ3RoIC8gc2l6ZVxuICB3aGlsZSBpIDwgalxuICAgIHlpZWxkIHNsaWNlIGxpc3QsICggaSsrICogc2l6ZSApLCBzaXplXG5cblxuSGFzaCA9XG5cbiAgbWQ1OiAoIGJ1ZmZlciApIC0+XG4gICAgY29udmVydCBmcm9tOiBcImJ5dGVzXCIsIHRvOiBcImJhc2UzNlwiLFxuICAgICAgbmV3IFVpbnQ4QXJyYXkgZG8gLT5cbiAgICAgICAgQ3J5cHRvXG4gICAgICAgICAgLmNyZWF0ZUhhc2ggXCJtZDVcIlxuICAgICAgICAgIC51cGRhdGUgYnVmZmVyXG4gICAgICAgICAgLmRpZ2VzdCgpXG4gICAgICAgICAgLmJ1ZmZlclxuXG4gIGFycmF5OiAoIGFycmF5ICkgLT5cbiAgICBUZXh0LnRydW5jYXRlIDgsIFxuICAgICAgSGFzaC5tZDUgYXJyYXkuc29ydCgpLmpvaW4gXCIsXCJcblxuTWVtb3MgPVxuXG4gIHBhdGg6IFBhdGguam9pbiBcIi50ZW1wb1wiLCBcIm1lbW9zLmpzb25cIlxuXG5SZXBvcyA9XG4gIFxuICBwYXRoOiBQYXRoLmpvaW4gXCIudGVtcG9cIiwgXCJyZXBvcy55YW1sXCJcblxuICBpbml0aWFsaXplOiAtPlxuICAgIFplcGh5ci51cGRhdGUgUmVwb3MucGF0aCwgKCByZXBvcyApIC0+IHJlcG9zID89IFtdXG5cbiAgbG9hZDogLT4gWmVwaHlyLnJlYWQgUmVwb3MucGF0aFxuXG4gIGdldDogKCBuYW1lICkgLT5cbiAgICByZXBvcyA9IGF3YWl0IGRvIFJlcG9zLmxvYWRcbiAgICByZXBvcy5maW5kICggcmVwbyApIC0+IHJlcG8ubmFtZSA9PSBuYW1lXG5cbiAgYWRkOiAoeyBvcmdhbml6YXRpb24sIG5hbWUgfSkgLT5cbiAgICBaZXBoeXIudXBkYXRlIFJlcG9zLnBhdGgsICggcmVwb3MgKSAtPlxuICAgICAgcmVwb3MucHVzaCB7IG9yZ2FuaXphdGlvbiwgbmFtZSB9XG4gICAgICByZXBvc1xuXG4gIHJlbW92ZTogKHsgb3JnYW5pemF0aW9uLCBuYW1lIH0pIC0+XG4gICAgWmVwaHlyLnVwZGF0ZSBSZXBvcy5wYXRoLCAoIHJlcG9zICkgLT5cbiAgICAgIHJlcG8gPSByZXBvcy5maW5kICggcmVwbyApIC0+XG4gICAgICAgIHJlcG8ub3JnYW5pemF0aW9uID09IG9yZ2FuaXphdGlvbiAmJlxuICAgICAgICAgIHJlcG8ubmFtZSA9PSBuYW1lXG4gICAgICByZW1vdmUgcmVwb3MsIHJlcG9cbiAgICAgIHJlcG9zXG5cbiAgdGFnOiAoIHJlcG9zLCB0YWdzICkgLT5cbiAgICBmb3IgcmVwbyBpbiByZXBvc1xuICAgICAgYXdhaXQgUmVwby50YWcgcmVwbywgdGFnc1xuXG4gIHVudGFnOiAoIHJlcG9zLCB0YWdzICkgLT5cbiAgICBmb3IgcmVwbyBpbiByZXBvc1xuICAgICAgYXdhaXQgUmVwby51bnRhZyByZXBvLCB0YWdzXG5cbiAgZmluZDogZG8gKHsgZmluZCB9ID0ge30pIC0+XG5cbiAgICBmaW5kID0gZ2VuZXJpY1xuICAgICAgbmFtZTogXCJSZXBvcy5maW5kXCJcbiAgICAgIGRlZmF1bHQ6IC0+IGRvIFJlcG9zLmxvYWRcblxuICAgIGdlbmVyaWMgZmluZCxcbiAgICAgICggaGFzIFwicmVwb3NcIiApLFxuICAgICAgKHsgcmVwb3MsIG9wdGlvbnMuLi4gfSkgLT4gXG4gICAgICAgIGRvIEZuLmZsb3cgW1xuICAgICAgICAgIC0+IFJlcG9zLmZpbmQgb3B0aW9uc1xuICAgICAgICAgIEl0LnNlbGVjdCAoIHJlcG8gKSAtPiByZXBvLm5hbWUgaW4gcmVwb3NcbiAgICAgICAgXVxuICAgICAgICBcbiAgICBnZW5lcmljIGZpbmQsXG4gICAgICAoIGhhcyBcImluY2x1ZGVcIiApLFxuICAgICAgKHsgaW5jbHVkZSwgb3B0aW9ucy4uLiB9KSAtPlxuICAgICAgICByZXBvcyA9IGF3YWl0IFplcGh5ci5yZWFkIGluY2x1ZGVcbiAgICAgICAgUmVwb3MuZmluZCB7IHJlcG9zLCBvcHRpb25zLi4uIH1cblxuICAgIGdlbmVyaWMgZmluZCxcbiAgICAgICggaGFzIFsgXCJyZXBvc1wiLCBcImluY2x1ZGVcIiBdICksXG4gICAgICAoeyByZXBvcywgaW5jbHVkZSB9KSAtPlxuICAgICAgICBkbyBGbi5mbG93IFtcbiAgICAgICAgICBSZXBvcy5maW5kIGluY2x1ZGU6IHJlcG9zXG4gICAgICAgICAgKCByZXN1bHQgKSAtPiBcbiAgICAgICAgICAgIHJlc3VsdC5jb25jYXQgYXdhaXQgUmVwb3MuZmluZCB7IGluY2x1ZGUgfVxuICAgICAgICBdXG5cbiAgICBnZW5lcmljIGZpbmQsXG4gICAgICAoIGhhcyBcInRhZ3NcIiApLFxuICAgICAgKHsgdGFncywgb3B0aW9ucy4uLiB9KSAtPlxuICAgICAgICBkbyBGbi5mbG93IFtcbiAgICAgICAgICAtPiBSZXBvcy5maW5kIG9wdGlvbnNcbiAgICAgICAgICBJdC5zZWxlY3QgKCByZXBvICkgLT4gXG4gICAgICAgICAgICByZXBvLnRhZ3M/ICYmICggdGFncy5zb21lICggdGFnICkgLT4gdGFnIGluIHJlcG8udGFncyApXG4gICAgICAgIF1cblxuICAgIGdlbmVyaWMgZmluZCxcbiAgI