n8n-nodes-uazapi-api
Version:
N8N Community Node para integração com UAZAPI API
399 lines • 49.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UazapiApi = void 0;
const n8n_workflow_1 = require("n8n-workflow");
class UazapiApi {
constructor() {
this.description = {
displayName: 'UAZAPI',
name: 'uazapiApi',
icon: 'file:uazapi.svg',
group: ['transform'],
version: 1,
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
description: 'Integração com a API UAZAPI para WhatsApp Business',
defaults: {
name: 'UAZAPI',
},
inputs: ['main'],
outputs: ['main'],
credentials: [
{
name: 'uazapiAdminApi',
required: true,
},
],
properties: [
{
displayName: 'Recurso',
name: 'resource',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Administração',
value: 'admin',
},
{
name: 'Grupos E Comunidade',
value: 'groups',
},
{
name: 'Instância',
value: 'instance',
},
{
name: 'Mensagem',
value: 'message',
},
{
name: 'Webhook',
value: 'webhook',
},
],
default: 'message',
},
{
displayName: 'Operação',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['admin'],
},
},
options: [
{
name: 'Criar Instância',
value: 'createInstance',
description: 'Criar uma nova instância',
action: 'Criar inst ncia',
},
{
name: 'Listar Todas as Instâncias',
value: 'listAllInstances',
action: 'Listar inst ncias',
},
],
default: 'listAllInstances',
},
{
displayName: 'Operação',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['message'],
},
},
options: [
{
name: 'Enviar Texto',
value: 'sendText',
description: 'Enviar mensagem de texto',
action: 'Enviar texto',
},
{
name: 'Enviar Mídia',
value: 'sendMedia',
description: 'Enviar arquivo de mídia',
action: 'Enviar m dia',
},
],
default: 'sendText',
},
// Campos para criar instância
{
displayName: 'Nome Da Instância',
name: 'instanceName',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['admin'],
operation: ['createInstance'],
},
},
default: '',
description: 'Nome para a nova instância',
},
// Campos para mensagem
{
displayName: 'Número Do Telefone',
name: 'phoneNumber',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendText', 'sendMedia'],
},
},
default: '',
description: 'Número do telefone com código do país (ex: 5511999999999)',
},
{
displayName: 'Mensagem',
name: 'message',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendText'],
},
},
default: '',
description: 'Texto da mensagem a ser enviada',
},
{
displayName: 'URL Da Mídia',
name: 'mediaUrl',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendMedia'],
},
},
default: '',
description: 'URL do arquivo de mídia',
},
{
displayName: 'Tipo De Mídia',
name: 'mediaType',
type: 'options',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendMedia'],
},
},
options: [
{
name: 'Imagem',
value: 'image',
},
{
name: 'Vídeo',
value: 'video',
},
{
name: 'Áudio',
value: 'audio',
},
{
name: 'Documento',
value: 'document',
},
],
default: 'image',
description: 'Tipo do arquivo de mídia',
},
{
displayName: 'Legenda',
name: 'caption',
type: 'string',
displayOptions: {
show: {
resource: ['message'],
operation: ['sendMedia'],
},
},
default: '',
description: 'Legenda para o arquivo de mídia (opcional)',
},
// Seleção de Token da Instância
{
displayName: 'Token Da Instância Name or ID',
name: 'instanceToken',
type: 'options',
required: true,
displayOptions: {
show: {
resource: ['message'],
},
},
typeOptions: {
loadOptionsMethod: 'loadInstanceTokens',
},
default: '',
description: 'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
},
],
};
}
async loadInstanceTokens() {
var _a, _b;
const returnData = [];
try {
// Obtém credenciais administrativas para montar a baseURL e autenticar
const adminCreds = (await this.getCredentials('uazapiAdminApi'));
if (!adminCreds || !adminCreds.subdomain) {
returnData.push({
name: '⚠️ Configure suas credenciais administrativas (subdomínio e admin token)',
value: '',
description: 'Credenciais não configuradas. Vá até Credenciais → UAZAPI Admin e informe Subdomínio e Admin Token.',
});
return returnData;
}
const baseURL = `https://${adminCreds.subdomain}.uazapi.com`;
// Busca as instâncias reais
const instances = (await this.helpers.requestWithAuthentication.call(this, 'uazapiAdminApi', {
method: 'GET',
url: '/instance/all',
baseURL,
}));
if (!Array.isArray(instances) || instances.length === 0) {
returnData.push({
name: 'Nenhuma instância encontrada neste subdomínio',
value: '',
description: 'Crie uma instância primeiro usando a operação "Criar Instância" ou no painel da UAZAPI',
});
return returnData;
}
for (const inst of instances) {
const status = inst.status || 'unknown';
const isConnected = status === 'connected';
const platform = String((_b = (_a = inst.plataform) !== null && _a !== void 0 ? _a : inst.platform) !== null && _b !== void 0 ? _b : '').toLowerCase();
const isBusiness = !!inst.isBusiness;
const token = inst.token || '';
const name = inst.name || inst.id || (token === null || token === void 0 ? void 0 : token.slice(0, 8)) || 'instância';
const owner = inst.owner || '';
const profileName = inst.profileName || '';
const statusEmoji = isConnected ? '🟢' : '🔴';
const accountEmoji = isBusiness ? '🏢' : '👤';
const platformEmoji = platform === 'smba' ? '📱' : platform === 'android' ? '💻' : '📦';
returnData.push({
name: `${statusEmoji} ${accountEmoji} ${platformEmoji} ${name}${profileName ? ` - ${profileName}` : ''}${!isConnected ? ' (DESCONECTADA)' : ''}`,
value: token,
description: `Token: ${token === null || token === void 0 ? void 0 : token.slice(0, 8)}... | Status: ${status} | Owner: ${owner}${platform ? ` | ${platform.toUpperCase()}` : ''}.`,
});
}
return returnData;
}
catch (error) {
let errMsg = 'erro desconhecido';
if (error && typeof error === 'object' && 'message' in error) {
const m = error.message;
errMsg = typeof m === 'string' ? m : JSON.stringify(m);
}
returnData.push({
name: `⚠️ Erro ao carregar instâncias: ${errMsg}`,
value: '',
description: 'Verifique suas credenciais administrativas e conectividade com a API',
});
return returnData;
}
}
async execute() {
const items = this.getInputData();
const returnData = [];
// Função auxiliar para obter baseURL das credenciais admin
const getBaseURL = async () => {
const creds = (await this.getCredentials('uazapiAdminApi'));
if (!creds || !creds.subdomain) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Credenciais uazapiAdminApi não encontradas. Verifique se as credenciais estão configuradas no node.');
}
// Remove qualquer protocolo se o usuário digitou por engano
const cleanSubdomain = creds.subdomain.replace(/^https?:\/\//, '').replace(/\.uazapi\.com.*$/, '');
return `https://${cleanSubdomain}.uazapi.com`;
};
for (let i = 0; i < items.length; i++) {
try {
const resource = this.getNodeParameter('resource', i);
const operation = this.getNodeParameter('operation', i);
let responseData;
if (resource === 'admin') {
if (operation === 'createInstance') {
// POST /instance/init - Criar nova instância
const instanceName = this.getNodeParameter('instanceName', i);
const baseURL = await getBaseURL();
responseData = await this.helpers.requestWithAuthentication.call(this, 'uazapiAdminApi', {
method: 'POST',
url: '/instance/init',
baseURL,
body: { name: instanceName },
});
}
else if (operation === 'listAllInstances') {
// GET /instance/all - Listar todas as instâncias
const baseURL = await getBaseURL();
responseData = await this.helpers.requestWithAuthentication.call(this, 'uazapiAdminApi', {
method: 'GET',
url: '/instance/all',
baseURL,
});
}
}
else if (resource === 'message') {
const instanceToken = this.getNodeParameter('instanceToken', i);
const baseURL = await getBaseURL();
if (operation === 'sendText') {
// POST /send/text - Enviar mensagem de texto
const phoneNumber = this.getNodeParameter('phoneNumber', i);
const message = this.getNodeParameter('message', i);
responseData = await this.helpers.requestWithAuthentication.call(this, 'uazapiAdminApi', {
method: 'POST',
url: '/send/text',
baseURL,
headers: {
'token': instanceToken,
},
body: {
number: phoneNumber,
text: message,
},
});
}
else if (operation === 'sendMedia') {
// POST /send/media - Enviar mídia
const phoneNumber = this.getNodeParameter('phoneNumber', i);
const mediaUrl = this.getNodeParameter('mediaUrl', i);
const mediaType = this.getNodeParameter('mediaType', i);
const caption = this.getNodeParameter('caption', i);
responseData = await this.helpers.requestWithAuthentication.call(this, 'uazapiAdminApi', {
method: 'POST',
url: '/send/media',
baseURL,
headers: {
'token': instanceToken,
},
body: {
number: phoneNumber,
type: mediaType,
file: mediaUrl,
text: caption,
},
});
}
}
// Garante que responseData seja sempre um objeto JSON válido
const jsonResponse = typeof responseData === 'string'
? { message: responseData, raw: responseData }
: responseData || { success: true };
returnData.push({
json: jsonResponse,
pairedItem: { item: i },
});
}
catch (error) {
if (this.continueOnFail()) {
returnData.push({
json: { error: error instanceof Error ? error.message : String(error) },
pairedItem: { item: i },
});
continue;
}
throw error;
}
}
return [returnData];
}
}
exports.UazapiApi = UazapiApi;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVWF6YXBpQXBpLm5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbm9kZXMvVWF6YXBpQXBpL1VhemFwaUFwaS5ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQVFzQjtBQUV0QixNQUFhLFNBQVM7SUFBdEI7UUFDQyxnQkFBVyxHQUF5QjtZQUNuQyxXQUFXLEVBQUUsUUFBUTtZQUNyQixJQUFJLEVBQUUsV0FBVztZQUNqQixJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUNwQixPQUFPLEVBQUUsQ0FBQztZQUNWLFFBQVEsRUFBRSw4REFBOEQ7WUFDeEUsV0FBVyxFQUFFLG9EQUFvRDtZQUNqRSxRQUFRLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLFFBQVE7YUFDZDtZQUNELE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNoQixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFO2dCQUNaO29CQUNDLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLFFBQVEsRUFBRSxJQUFJO2lCQUNkO2FBQ0Q7WUFDRCxVQUFVLEVBQUU7Z0JBQ1g7b0JBQ0MsV0FBVyxFQUFFLFNBQVM7b0JBQ3RCLElBQUksRUFBRSxVQUFVO29CQUNoQixJQUFJLEVBQUUsU0FBUztvQkFDZixnQkFBZ0IsRUFBRSxJQUFJO29CQUN0QixPQUFPLEVBQUU7d0JBQ1I7NEJBQ0MsSUFBSSxFQUFFLGVBQWU7NEJBQ3JCLEtBQUssRUFBRSxPQUFPO3lCQUNkO3dCQUNEOzRCQUNDLElBQUksRUFBRSxxQkFBcUI7NEJBQzNCLEtBQUssRUFBRSxRQUFRO3lCQUNmO3dCQUNEOzRCQUNDLElBQUksRUFBRSxXQUFXOzRCQUNqQixLQUFLLEVBQUUsVUFBVTt5QkFDakI7d0JBQ0Q7NEJBQ0MsSUFBSSxFQUFFLFVBQVU7NEJBQ2hCLEtBQUssRUFBRSxTQUFTO3lCQUNoQjt3QkFDRDs0QkFDQyxJ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VSxDQUFDLENBQUM7SUFDckIsQ0FBQztDQUNEO0FBdGJELDhCQXNiQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdElFeGVjdXRlRnVuY3Rpb25zLFxuXHRJTG9hZE9wdGlvbnNGdW5jdGlvbnMsXG5cdElOb2RlRXhlY3V0aW9uRGF0YSxcblx0SU5vZGVQcm9wZXJ0eU9wdGlvbnMsXG5cdElOb2RlVHlwZSxcblx0SU5vZGVUeXBlRGVzY3JpcHRpb24sXG5cdE5vZGVPcGVyYXRpb25FcnJvcixcbn0gZnJvbSAnbjhuLXdvcmtmbG93JztcblxuZXhwb3J0IGNsYXNzIFVhemFwaUFwaSBpbXBsZW1lbnRzIElOb2RlVHlwZSB7XG5cdGRlc2NyaXB0aW9uOiBJTm9kZVR5cGVEZXNjcmlwdGlvbiA9IHtcblx0XHRkaXNwbGF5TmFtZTogJ1VBWkFQSScsXG5cdFx0bmFtZTogJ3VhemFwaUFwaScsXG5cdFx0aWNvbjogJ2ZpbGU6dWF6YXBpLnN2ZycsXG5cdFx0Z3JvdXA6IFsndHJhbnNmb3JtJ10sXG5cdFx0dmVyc2lvbjogMSxcblx0XHRzdWJ0aXRsZTogJz17eyRwYXJhbWV0ZXJbXCJvcGVyYXRpb25cIl0gKyBcIjogXCIgKyAkcGFyYW1ldGVyW1wicmVzb3VyY2VcIl19fScsXG5cdFx0ZGVzY3JpcHRpb246ICdJbnRlZ3Jhw6fDo28gY29tIGEgQVBJIFVBWkFQSSBwYXJhIFdoYXRzQXBwIEJ1c2luZXNzJyxcblx0XHRkZWZhdWx0czoge1xuXHRcdFx0bmFtZTogJ1VBWkFQSScsXG5cdFx0fSxcblx0XHRpbnB1dHM6IFsnbWFpbiddLFxuXHRcdG91dHB1dHM6IFsnbWFpbiddLFxuXHRcdGNyZWRlbnRpYWxzOiBbXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6ICd1YXphcGlBZG1pbkFwaScsXG5cdFx0XHRcdHJlcXVpcmVkOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRdLFxuXHRcdHByb3BlcnRpZXM6IFtcblx0XHRcdHtcblx0XHRcdFx0ZGlzcGxheU5hbWU6ICdSZWN1cnNvJyxcblx0XHRcdFx0bmFtZTogJ3Jlc291cmNlJyxcblx0XHRcdFx0dHlwZTogJ29wdGlvbnMnLFxuXHRcdFx0XHRub0RhdGFFeHByZXNzaW9uOiB0cnVlLFxuXHRcdFx0XHRvcHRpb25zOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogJ0FkbWluaXN0cmHDp8OjbycsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ2FkbWluJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6ICdHcnVwb3MgRSBDb211bmlkYWRlJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnZ3JvdXBzJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6ICdJbnN0w6JuY2lhJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnaW5zdGFuY2UnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogJ01lbnNhZ2VtJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnbWVzc2FnZScsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiAnV2ViaG9vaycsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ3dlYmhvb2snLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHRcdGRlZmF1bHQ6ICdtZXNzYWdlJyxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRpc3BsYXlOYW1lOiAnT3BlcmHDp8OjbycsXG5cdFx0XHRcdG5hbWU6ICdvcGVyYXRpb24nLFxuXHRcdFx0XHR0eXBlOiAnb3B0aW9ucycsXG5cdFx0XHRcdG5vRGF0YUV4cHJlc3Npb246IHRydWUsXG5cdFx0XHRcdGRpc3BsYXlPcHRpb25zOiB7XG5cdFx0XHRcdFx0c2hvdzoge1xuXHRcdFx0XHRcdFx0cmVzb3VyY2U6IFsnYWRtaW4nXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvcHRpb25zOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogJ0NyaWFyIEluc3TDom5jaWEnLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICdjcmVhdGVJbnN0YW5jZScsXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogJ0NyaWFyIHVtYSBub3ZhIGluc3TDom5jaWEnLFxuXHRcdFx0XHRcdFx0YWN0aW9uOiAnQ3JpYXIgaW5zdCBuY2lhJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6ICdMaXN0YXIgVG9kYXMgYXMgSW5zdMOibmNpYXMnLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICdsaXN0QWxsSW5zdGFuY2VzJyxcblx0XHRcdFx0XHRcdGFjdGlvbjogJ0xpc3RhciBpbnN0IG5jaWFzJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRkZWZhdWx0OiAnbGlzdEFsbEluc3RhbmNlcycsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkaXNwbGF5TmFtZTogJ09wZXJhw6fDo28nLFxuXHRcdFx0XHRuYW1lOiAnb3BlcmF0aW9uJyxcblx0XHRcdFx0dHlwZTogJ29wdGlvbnMnLFxuXHRcdFx0XHRub0RhdGFFeHByZXNzaW9uOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5T3B0aW9uczoge1xuXHRcdFx0XHRcdHNob3c6IHtcblx0XHRcdFx0XHRcdHJlc291cmNlOiBbJ21lc3NhZ2UnXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvcHRpb25zOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogJ0VudmlhciBUZXh0bycsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ3NlbmRUZXh0Jyxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiAnRW52aWFyIG1lbnNhZ2VtIGRlIHRleHRvJyxcblx0XHRcdFx0XHRcdGFjdGlvbjogJ0VudmlhciB0ZXh0bycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiAnRW52aWFyIE3DrWRpYScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ3NlbmRNZWRpYScsXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogJ0VudmlhciBhcnF1aXZvIGRlIG3DrWRpYScsXG5cdFx0XHRcdFx0XHRhY3Rpb246ICdFbnZpYXIgbSBkaWEnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHRcdGRlZmF1bHQ6ICdzZW5kVGV4dCcsXG5cdFx0XHR9LFxuXHRcdFx0Ly8gQ2FtcG9zIHBhcmEgY3JpYXIgaW5zdMOibmNpYVxuXHRcdFx0e1xuXHRcdFx0XHRkaXNwbGF5TmFtZTogJ05vbWUgRGEgSW5zdMOibmNpYScsXG5cdFx0XHRcdG5hbWU6ICdpbnN0YW5jZU5hbWUnLFxuXHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHRcdGRpc3BsYXlPcHRpb25zOiB7XG5cdFx0XHRcdFx0c2hvdzoge1xuXHRcdFx0XHRcdFx0cmVzb3VyY2U6IFsnYWRtaW4nXSxcblx0XHRcdFx0XHRcdG9wZXJhdGlvbjogWydjcmVhdGVJbnN0YW5jZSddLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRlZmF1bHQ6ICcnLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogJ05vbWUgcGFyYSBhIG5vdmEgaW5zdMOibmNpYScsXG5cdFx0XHR9LFxuXHRcdFx0Ly8gQ2FtcG9zIHBhcmEgbWVuc2FnZW1cblx0XHRcdHtcblx0XHRcdFx0ZGlzcGxheU5hbWU6ICdOw7ptZXJvIERvIFRlbGVmb25lJyxcblx0XHRcdFx0bmFtZTogJ3Bob25lTnVtYmVyJyxcblx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdHJlcXVpcmVkOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5T3B0aW9uczoge1xuXHRcdFx0XHRcdHNob3c6IHtcblx0XHRcdFx0XHRcdHJlc291cmNlOiBbJ21lc3NhZ2UnXSxcblx0XHRcdFx0XHRcdG9wZXJhdGlvbjogWydzZW5kVGV4dCcsICdzZW5kTWVkaWEnXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRkZWZhdWx0OiAnJyxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICdOw7ptZXJvIGRvIHRlbGVmb25lIGNvbSBjw7NkaWdvIGRvIHBhw61zIChleDogNTUxMTk5OTk5OTk5OSknLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGlzcGxheU5hbWU6ICdNZW5zYWdlbScsXG5cdFx0XHRcdG5hbWU6ICdtZXNzYWdlJyxcblx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdHJlcXVpcmVkOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5T3B0aW9uczoge1xuXHRcdFx0XHRcdHNob3c6IHtcblx0XHRcdFx0XHRcdHJlc291cmNlOiBbJ21lc3NhZ2UnXSxcblx0XHRcdFx0XHRcdG9wZXJhdGlvbjogWydzZW5kVGV4dCddLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRlZmF1bHQ6ICcnLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogJ1RleHRvIGRhIG1lbnNhZ2VtIGEgc2VyIGVudmlhZGEnLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGlzcGxheU5hbWU6ICdVUkwgRGEgTcOtZGlhJyxcblx0XHRcdFx0bmFtZTogJ21lZGlhVXJsJyxcblx0XHRcdFx0dHlwZTogJ3N0cmluZycsXG5cdFx0XHRcdHJlcXVpcmVkOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5T3B0aW9uczoge1xuXHRcdFx0XHRcdHNob3c6IHtcblx0XHRcdFx0XHRcdHJlc291cmNlOiBbJ21lc3NhZ2UnXSxcblx0XHRcdFx0XHRcdG9wZXJhdGlvbjogWydzZW5kTWVkaWEnXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRkZWZhdWx0OiAnJyxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICdVUkwgZG8gYXJxdWl2byBkZSBtw61kaWEnLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGlzcGxheU5hbWU6ICdUaXBvIERlIE3DrWRpYScsXG5cdFx0XHRcdG5hbWU6ICdtZWRpYVR5cGUnLFxuXHRcdFx0XHR0eXBlOiAnb3B0aW9ucycsXG5cdFx0XHRcdHJlcXVpcmVkOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5T3B0aW9uczoge1xuXHRcdFx0XHRcdHNob3c6IHtcblx0XHRcdFx0XHRcdHJlc291cmNlOiBbJ21lc3NhZ2UnXSxcblx0XHRcdFx0XHRcdG9wZXJhdGlvbjogWydzZW5kTWVkaWEnXSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvcHRpb25zOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogJ0ltYWdlbScsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ2ltYWdlJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6ICdWw61kZW8nLFxuXHRcdFx0XHRcdFx0dmFsdWU6ICd2aWRlbycsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiAnw4F1ZGlvJyxcblx0XHRcdFx0XHRcdHZhbHVlOiAnYXVkaW8nLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogJ0RvY3VtZW50bycsXG5cdFx0XHRcdFx0XHR2YWx1ZTogJ2RvY3VtZW50Jyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRkZWZhdWx0OiAnaW1hZ2UnLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogJ1RpcG8gZG8gYXJxdWl2byBkZSBtw61kaWEnLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGlzcGxheU5hbWU6ICdMZWdlbmRhJyxcblx0XHRcdFx0bmFtZTogJ2NhcHRpb24nLFxuXHRcdFx0XHR0eXBlOiAnc3RyaW5nJyxcblx0XHRcdFx0ZGlzcGxheU9wdGlvbnM6IHtcblx0XHRcdFx0XHRzaG93OiB7XG5cdFx0XHRcdFx0XHRyZXNvdXJjZTogWydtZXNzYWdlJ10sXG5cdFx0XHRcdFx0XHRvcGVyYXRpb246IFsnc2VuZE1lZGlhJ10sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0ZGVmYXVsdDogJycsXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAnTGVnZW5kYSBwYXJhIG8gYXJxdWl2byBkZSBtw61kaWEgKG9wY2lvbmFsKScsXG5cdFx0XHR9LFxuXHRcdFx0Ly8gU2VsZcOnw6NvIGRlIFRva2VuIGRhIEluc3TDom5jaWFcblx0XHRcdHtcblx0XHRcdFx0ZGlzcGxheU5hbWU6ICdUb2tlbiBEYSBJbnN0w6JuY2lhIE5hbWUgb3IgSUQnLFxuXHRcdFx0XHRuYW1lOiAnaW5zdGFuY2VUb2tlbicsXG5cdFx0XHRcdHR5cGU6ICdvcHRpb25zJyxcblx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHRcdGRpc3BsYXlPcHRpb25zOiB7XG5cdFx0XHRcdFx0c2hvdzoge1xuXHRcdFx0XHRcdFx0cmVzb3VyY2U6IFsnbWVzc2FnZSddLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHR5cGVPcHRpb25zOiB7XG5cdFx0XHRcdFx0bG9hZE9wdGlvbnNNZXRob2Q6ICdsb2FkSW5zdGFuY2VUb2tlbnMnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRkZWZhdWx0OiAnJyxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICdDaG9vc2UgZnJvbSB0aGUgbGlzdCwgb3Igc3BlY2lmeSBhbiBJRCB1c2luZyBhbiA8YSBocmVmPVwiaHR0cHM6Ly9kb2NzLm44bi5pby9jb2RlL2V4cHJlc3Npb25zL1wiPmV4cHJlc3Npb248L2E+Jyxcblx0XHRcdH0sXG5cdFx0XSxcblx0fTtcblxuXHRhc3luYyBsb2FkSW5zdGFuY2VUb2tlbnModGhpczogSUxvYWRPcHRpb25zRnVuY3Rpb25zKTogUHJvbWlzZTxJTm9kZVByb3BlcnR5T3B0aW9uc1tdPiB7XG5cdFx0Y29uc3QgcmV0dXJuRGF0YTogSU5vZGVQcm9wZXJ0eU9wdGlvbnNbXSA9IFtdO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIE9idMOpbSBjcmVkZW5jaWFpcyBhZG1pbmlzdHJhdGl2YXMgcGFyYSBtb250YXIgYSBiYXNlVVJMIGUgYXV0ZW50aWNhclxuXHRcdFx0Y29uc3QgYWRtaW5DcmVkcyA9IChhd2FpdCB0aGlzLmdldENyZWRlbnRpYWxzKCd1YXphcGlBZG1pbkFwaScpKSBhcyB7XG5cdFx0XHRcdGFkbWluVG9rZW46IHN0cmluZztcblx0XHRcdFx0c3ViZG9tYWluOiBzdHJpbmc7XG5cdFx0XHR9IHwgbnVsbDtcblxuXHRcdFx0aWYgKCFhZG1pbkNyZWRzIHx8ICFhZG1pbkNyZWRzLnN1YmRvbWFpbikge1xuXHRcdFx0XHRyZXR1cm5EYXRhLnB1c2goe1xuXHRcdFx0XHRcdG5hbWU6ICfimqDvuI8gQ29uZmlndXJlIHN1YXMgY3JlZGVuY2lhaXMgYWRtaW5pc3RyYXRpdmFzIChzdWJkb23DrW5pbyBlIGFkbWluIHRva2VuKScsXG5cdFx0XHRcdFx0dmFsdWU6ICcnLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiAnQ3JlZGVuY2lhaXMgbsOjbyBjb25maWd1cmFkYXMuIFbDoSBhdMOpIENyZWRlbmNpYWlzIOKGkiBVQVpBUEkgQWRtaW4gZSBpbmZvcm1lIFN1YmRvbcOtbmlvIGUgQWRtaW4gVG9rZW4uJyxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiByZXR1cm5EYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBiYXNlVVJMID0gYGh0dHBzOi8vJHthZG1pbkNyZWRzLnN1YmRvbWFpbn0udWF6YXBpLmNvbWA7XG5cblx0XHRcdC8vIEJ1c2NhIGFzIGluc3TDom5jaWFzIHJlYWlzXG5cdFx0XHRjb25zdCBpbnN0YW5jZXMgPSAoYXdhaXQgdGhpcy5oZWxwZXJzLnJlcXVlc3RXaXRoQXV0aGVudGljYXRpb24uY2FsbCh0aGlzLCAndWF6YXBpQWRtaW5BcGknLCB7XG5cdFx0XHRcdG1ldGhvZDogJ0dFVCcsXG5cdFx0XHRcdHVybDogJy9pbnN0YW5jZS9hbGwnLFxuXHRcdFx0XHRiYXNlVVJMLFxuXHRcdFx0fSkpIGFzIEFycmF5PHtcblx0XHRcdFx0c3RhdHVzPzogc3RyaW5nO1xuXHRcdFx0XHRwbGF0YWZvcm0/OiBzdHJpbmc7XG5cdFx0XHRcdHBsYXRmb3JtPzogc3RyaW5nO1xuXHRcdFx0XHRpc0J1c2luZXNzPzogYm9vbGVhbjtcblx0XHRcdFx0dG9rZW46IHN0cmluZztcblx0XHRcdFx0bmFtZT86IHN0cmluZztcblx0XHRcdFx0aWQ/OiBzdHJpbmc7XG5cdFx0XHRcdG93bmVyPzogc3RyaW5nO1xuXHRcdFx0XHRwcm9maWxlTmFtZT86IHN0cmluZztcblx0XHRcdH0+O1xuXG5cdFx0XHRpZiAoIUFycmF5LmlzQXJyYXkoaW5zdGFuY2VzKSB8fCBpbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybkRhdGEucHVzaCh7XG5cdFx0XHRcdFx0bmFtZTogJ05lbmh1bWEgaW5zdMOibmNpYSBlbmNvbnRyYWRhIG5lc3RlIHN1YmRvbcOtbmlvJyxcblx0XHRcdFx0XHR2YWx1ZTogJycsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246ICdDcmllIHVtYSBpbnN0w6JuY2lhIHByaW1laXJvIHVzYW5kbyBhIG9wZXJhw6fDo28gXCJDcmlhciBJbnN0w6JuY2lhXCIgb3Ugbm8gcGFpbmVsIGRhIFVBWkFQSScsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gcmV0dXJuRGF0YTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBpbnN0IG9mIGluc3RhbmNlcykge1xuXHRcdFx0XHRjb25zdCBzdGF0dXMgPSBpbnN0LnN0YXR1cyB8fCAndW5rbm93bic7XG5cdFx0XHRcdGNvbnN0IGlzQ29ubmVjdGVkID0gc3RhdHVzID09PSAnY29ubmVjdGVkJztcblx0XHRcdFx0Y29uc3QgcGxhdGZvcm0gPSBTdHJpbmcoaW5zdC5wbGF0YWZvcm0gPz8gaW5zdC5wbGF0Zm9ybSA/PyAnJykudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0Y29uc3QgaXNCdXNpbmVzcyA9ICEhaW5zdC5pc0J1c2luZXNzO1xuXHRcdFx0XHRjb25zdCB0b2tlbiA9IGluc3QudG9rZW4gfHwgJyc7XG5cdFx0XHRcdGNvbnN0IG5hbWUgPSBpbnN0Lm5hbWUgfHwgaW5zdC5pZCB8fCB0b2tlbj8uc2xpY2UoMCwgOCkgfHwgJ2luc3TDom5jaWEnO1xuXHRcdFx0XHRjb25zdCBvd25lciA9IGluc3Qub3duZXIgfHwgJyc7XG5cdFx0XHRcdGNvbnN0IHByb2ZpbGVOYW1lID0gaW5zdC5wcm9maWxlTmFtZSB8fCAnJztcblxuXHRcdFx0XHRjb25zdCBzdGF0dXNFbW9qaSA9IGlzQ29ubmVjdGVkID8gJ/Cfn6InIDogJ/CflLQnO1xuXHRcdFx0XHRjb25zdCBhY2NvdW50RW1vamkgPSBpc0J1c2luZXNzID8gJ/Cfj6InIDogJ/CfkaQnO1xuXHRcdFx0XHRjb25zdCBwbGF0Zm9ybUVtb2ppID0gcGxhdGZvcm0gPT09ICdzbWJhJyA/ICfwn5OxJyA6IHBsYXRmb3JtID09PSAnYW5kcm9pZCcgPyAn8J+SuycgOiAn8J+Tpic7XG5cblx0XHRcdFx0cmV0dXJuRGF0YS5wdXNoKHtcblx0XHRcdFx0XHRuYW1lOiBgJHtzdGF0dXNFbW9qaX0gJHthY2NvdW50RW1vaml9ICR7cGxhdGZvcm1FbW9qaX0gJHtuYW1lfSR7cHJvZmlsZU5hbWUgPyBgIC0gJHtwcm9maWxlTmFtZX1gIDogJyd9JHshaXNDb25uZWN0ZWQgPyAnIChERVNDT05FQ1RBREEpJyA6ICcnfWAsXG5cdFx0XHRcdFx0dmFsdWU6IHRva2VuLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBgVG9rZW46ICR7dG9rZW4/LnNsaWNlKDAsIDgpfS4uLiB8IFN0YXR1czogJHtzdGF0dXN9IHwgT3duZXI6ICR7b3duZXJ9JHtwbGF0Zm9ybSA/IGAgfCAke3BsYXRmb3JtLnRvVXBwZXJDYXNlKCl9YCA6ICcnfS5gLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJldHVybkRhdGE7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdGxldCBlcnJNc2cgPSAnZXJybyBkZXNjb25oZWNpZG8nO1xuXHRcdFx0aWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ21lc3NhZ2UnIGluIGVycm9yKSB7XG5cdFx0XHRcdGNvbnN0IG0gPSAoZXJyb3IgYXMgeyBtZXNzYWdlPzogdW5rbm93biB9KS5tZXNzYWdlO1xuXHRcdFx0XHRlcnJNc2cgPSB0eXBlb2YgbSA9PT0gJ3N0cmluZycgPyBtIDogSlNPTi5zdHJpbmdpZnkobSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm5EYXRhLnB1c2goe1xuXHRcdFx0XHRuYW1lOiBg4pqg77iPIEVycm8gYW8gY2FycmVnYXIgaW5zdMOibmNpYXM6ICR7ZXJyTXNnfWAsXG5cdFx0XHRcdHZhbHVlOiAnJyxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICdWZXJpZmlxdWUgc3VhcyBjcmVkZW5jaWFpcyBhZG1pbmlzdHJhdGl2YXMgZSBjb25lY3RpdmlkYWRlIGNvbSBhIEFQSScsXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiByZXR1cm5EYXRhO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGV4ZWN1dGUodGhpczogSUV4ZWN1dGVGdW5jdGlvbnMpOiBQcm9taXNlPElOb2RlRXhlY3V0aW9uRGF0YVtdW10+IHtcblx0XHRjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SW5wdXREYXRhKCk7XG5cdFx0Y29uc3QgcmV0dXJuRGF0YTogSU5vZGVFeGVjdXRpb25EYXRhW10gPSBbXTtcblxuXHRcdC8vIEZ1bsOnw6NvIGF1eGlsaWFyIHBhcmEgb2J0ZXIgYmFzZVVSTCBkYXMgY3JlZGVuY2lhaXMgYWRtaW5cblx0XHRjb25zdCBnZXRCYXNlVVJMID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG5cdFx0XHRjb25zdCBjcmVkcyA9IChhd2FpdCB0aGlzLmdldENyZWRlbnRpYWxzKCd1YXphcGlBZG1pbkFwaScpKSBhcyB7IHN1YmRvbWFpbj86IHN0cmluZyB9IHwgbnVsbDtcblx0XHRcdFxuXHRcdFx0aWYgKCFjcmVkcyB8fCAhY3JlZHMuc3ViZG9tYWluKSB7XG5cdFx0XHRcdHRocm93IG5ldyBOb2RlT3BlcmF0aW9uRXJyb3IodGhpcy5nZXROb2RlKCksICdDcmVkZW5jaWFpcyB1YXphcGlBZG1pbkFwaSBuw6NvIGVuY29udHJhZGFzLiBWZXJpZmlxdWUgc2UgYXMgY3JlZGVuY2lhaXMgZXN0w6NvIGNvbmZpZ3VyYWRhcyBubyBub2RlLicpO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHQvLyBSZW1vdmUgcXVhbHF1ZXIgcHJvdG9jb2xvIHNlIG8gdXN1w6FyaW8gZGlnaXRvdSBwb3IgZW5nYW5vXG5cdFx0XHRjb25zdCBjbGVhblN1YmRvbWFpbiA9IGNyZWRzLnN1YmRvbWFpbi5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcLy8sICcnKS5yZXBsYWNlKC9cXC51YXphcGlcXC5jb20uKiQvLCAnJyk7XG5cdFx0XHRyZXR1cm4gYGh0dHBzOi8vJHtjbGVhblN1YmRvbWFpbn0udWF6YXBpLmNvbWA7XG5cdFx0fTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlID0gdGhpcy5nZXROb2RlUGFyYW1ldGVyKCdyZXNvdXJjZScsIGkpIGFzIHN0cmluZztcblx0XHRcdFx0Y29uc3Qgb3BlcmF0aW9uID0gdGhpcy5nZXROb2RlUGFyYW1ldGVyKCdvcGVyYXRpb24nLCBpKSBhcyBzdHJpbmc7XG5cblx0XHRcdFx0bGV0IHJlc3BvbnNlRGF0YTogdW5rbm93bjtcblxuXHRcdFx0XHRpZiAocmVzb3VyY2UgPT09ICdhZG1pbicpIHtcblx0XHRcdFx0XHRpZiAob3BlcmF0aW9uID09PSAnY3JlYXRlSW5zdGFuY2UnKSB7XG5cdFx0XHRcdFx0XHQvLyBQT1NUIC9pbnN0YW5jZS9pbml0IC0gQ3JpYXIgbm92YSBpbnN0w6JuY2lhXG5cdFx0XHRcdFx0XHRjb25zdCBpbnN0YW5jZU5hbWUgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ2luc3RhbmNlTmFtZScsIGkpIGFzIHN0cmluZztcblx0XHRcdFx0XHRcdGNvbnN0IGJhc2VVUkwgPSBhd2FpdCBnZXRCYXNlVVJMKCk7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdHJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuaGVscGVycy5yZXF1ZXN0V2l0aEF1dGhlbnRpY2F0aW9uLmNhbGwoXG5cdFx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRcdCd1YXphcGlBZG1pbkFwaScsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6ICdQT1NUJyxcblx0XHRcdFx0XHRcdFx0XHR1cmw6ICcvaW5zdGFuY2UvaW5pdCcsXG5cdFx0XHRcdFx0XHRcdFx0YmFzZVVSTCxcblx0XHRcdFx0XHRcdFx0XHRib2R5OiB7IG5hbWU6IGluc3RhbmNlTmFtZSB9LFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJ2xpc3RBbGxJbnN0YW5jZXMnKSB7XG5cdFx0XHRcdFx0XHQvLyBHRVQgL2luc3RhbmNlL2FsbCAtIExpc3RhciB0b2RhcyBhcyBpbnN0w6JuY2lhc1xuXHRcdFx0XHRcdFx0Y29uc3QgYmFzZVVSTCA9IGF3YWl0IGdldEJhc2VVUkwoKTtcblx0XHRcdFx0XHRcdHJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuaGVscGVycy5yZXF1ZXN0V2l0aEF1dGhlbnRpY2F0aW9uLmNhbGwoXG5cdFx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRcdCd1YXphcGlBZG1pbkFwaScsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6ICdHRVQnLFxuXHRcdFx0XHRcdFx0XHRcdHVybDogJy9pbnN0YW5jZS9hbGwnLFxuXHRcdFx0XHRcdFx0XHRcdGJhc2VVUkwsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChyZXNvdXJjZSA9PT0gJ21lc3NhZ2UnKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5zdGFuY2VUb2tlbiA9IHRoaXMuZ2V0Tm9kZVBhcmFtZXRlcignaW5zdGFuY2VUb2tlbicsIGkpIGFzIHN0cmluZztcblx0XHRcdFx0XHRjb25zdCBiYXNlVVJMID0gYXdhaXQgZ2V0QmFzZVVSTCgpO1xuXG5cdFx0XHRcdFx0aWYgKG9wZXJhdGlvbiA9PT0gJ3NlbmRUZXh0Jykge1xuXHRcdFx0XHRcdFx0Ly8gUE9TVCAvc2VuZC90ZXh0IC0gRW52aWFyIG1lbnNhZ2VtIGRlIHRleHRvXG5cdFx0XHRcdFx0XHRjb25zdCBwaG9uZU51bWJlciA9IHRoaXMuZ2V0Tm9kZVBhcmFtZXRlcigncGhvbmVOdW1iZXInLCBpKSBhcyBzdHJpbmc7XG5cdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlID0gdGhpcy5nZXROb2RlUGFyYW1ldGVyKCdtZXNzYWdlJywgaSkgYXMgc3RyaW5nO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRyZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmhlbHBlcnMucmVxdWVzdFdpdGhBdXRoZW50aWNhdGlvbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHQndWF6YXBpQWRtaW5BcGknLFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRcdFx0XHRcdFx0dXJsOiAnL3NlbmQvdGV4dCcsXG5cdFx0XHRcdFx0XHRcdFx0YmFzZVVSTCxcblx0XHRcdFx0XHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHQndG9rZW4nOiBpbnN0YW5jZVRva2VuLFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0Ym9keToge1xuXHRcdFx0XHRcdFx0XHRcdFx0bnVtYmVyOiBwaG9uZU51bWJlcixcblx0XHRcdFx0XHRcdFx0XHRcdHRleHQ6IG1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdzZW5kTWVkaWEnKSB7XG5cdFx0XHRcdFx0XHQvLyBQT1NUIC9zZW5kL21lZGlhIC0gRW52aWFyIG3DrWRpYVxuXHRcdFx0XHRcdFx0Y29uc3QgcGhvbmVOdW1iZXIgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ3Bob25lTnVtYmVyJywgaSkgYXMgc3RyaW5nO1xuXHRcdFx0XHRcdFx0Y29uc3QgbWVkaWFVcmwgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ21lZGlhVXJsJywgaSkgYXMgc3RyaW5nO1xuXHRcdFx0XHRcdFx0Y29uc3QgbWVkaWFUeXBlID0gdGhpcy5nZXROb2RlUGFyYW1ldGVyKCdtZWRpYVR5cGUnLCBpKSBhcyBzdHJpbmc7XG5cdFx0XHRcdFx0XHRjb25zdCBjYXB0aW9uID0gdGhpcy5nZXROb2RlUGFyYW1ldGVyKCdjYXB0aW9uJywgaSkgYXMgc3RyaW5nO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRyZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmhlbHBlcnMucmVxdWVzdFdpdGhBdXRoZW50aWNhdGlvbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHQndWF6YXBpQWRtaW5BcGknLFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRcdFx0XHRcdFx0dXJsOiAnL3NlbmQvbWVkaWEnLFxuXHRcdFx0XHRcdFx0XHRcdGJhc2VVUkwsXG5cdFx0XHRcdFx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0J3Rva2VuJzogaW5zdGFuY2VUb2tlbixcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdGJvZHk6IHtcblx0XHRcdFx0XHRcdFx0XHRcdG51bWJlcjogcGhvbmVOdW1iZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBtZWRpYVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRmaWxlOiBtZWRpYVVybCxcblx0XHRcdFx0XHRcdFx0XHRcdHRleHQ6IGNhcHRpb24sXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gR2FyYW50ZSBxdWUgcmVzcG9uc2VEYXRhIHNlamEgc2VtcHJlIHVtIG9iamV0byBKU09OIHbDoWxpZG9cblx0XHRcdFx0Y29uc3QganNvblJlc3BvbnNlID0gdHlwZW9mIHJlc3BvbnNlRGF0YSA9PT0gJ3N0cmluZycgXG5cdFx0XHRcdFx0PyB7IG1lc3NhZ2U6IHJlc3BvbnNlRGF0YSwgcmF3OiByZXNwb25zZURhdGEgfVxuXHRcdFx0XHRcdDogKHJlc3BvbnNlRGF0YSBhcyBvYmplY3QpIHx8IHsgc3VjY2VzczogdHJ1ZSB9O1xuXG5cdFx0XHRcdHJldHVybkRhdGEucHVzaCh7XG5cdFx0XHRcdFx0anNvbjoganNvblJlc3BvbnNlIGFzIGFueSxcblx0XHRcdFx0XHRwYWlyZWRJdGVtOiB7IGl0ZW06IGkgfSxcblx0XHRcdFx0fSk7XG5cblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdGlmICh0aGlzLmNvbnRpbnVlT25GYWlsKCkpIHtcblx0XHRcdFx0XHRyZXR1cm5EYXRhLnB1c2goe1xuXHRcdFx0XHRcdFx0anNvbjogeyBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpIH0sXG5cdFx0XHRcdFx0XHRwYWlyZWRJdGVtOiB7IGl0ZW06IGkgfSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gW3JldHVybkRhdGFdO1xuXHR9XG59XG4iXX0=