cdk-amazon-chime-resources
Version:

197 lines • 27.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeletePhoneNumber = exports.CreatePhoneNumber = void 0;
const client_chime_sdk_voice_1 = require("@aws-sdk/client-chime-sdk-voice");
const client_ssm_1 = require("@aws-sdk/client-ssm");
const chimeSDKVoiceClient = new client_chime_sdk_voice_1.ChimeSDKVoiceClient({
region: 'us-east-1',
});
const ssmClient = new client_ssm_1.SSMClient({ region: process.env.AWS_REGION });
let searchAvailableNumbersParam;
let searchAvailablePhoneNumberResponse;
let createPhoneNumberOrderResponse;
let getParameterCommandOutput;
let getPhoneNumberResponse;
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const CreatePhoneNumber = async (uid, props) => {
searchAvailableNumbersParam = {
...(props.phoneAreaCode && { AreaCode: props.phoneAreaCode }),
...(props.phoneNumberType && { PhoneNumberType: props.phoneNumberType }),
...(props.phoneState && { State: props.phoneState }),
...(props.phoneCity && { City: props.phoneCity }),
...(props.phoneCountry && { Country: props.phoneCountry }),
...(props.phoneNumberTollFreePrefix && {
TollFreePrefix: props.phoneNumberTollFreePrefix,
}),
};
console.info(`Search Available Numbers: ${JSON.stringify(searchAvailableNumbersParam)}`);
let orderSuccessful = false;
let searchAttempts = 1;
while (searchAttempts < 16) {
try {
console.log(`Searching for available numbers. Search # ${searchAttempts}`);
searchAvailablePhoneNumberResponse = await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.SearchAvailablePhoneNumbersCommand(searchAvailableNumbersParam));
console.log(`Search Available Numbers Response: ${JSON.stringify(searchAvailablePhoneNumberResponse)}`);
}
catch (error) {
if (error instanceof Error) {
console.error(error);
throw error;
}
}
if (searchAvailablePhoneNumberResponse &&
searchAvailablePhoneNumberResponse.E164PhoneNumbers &&
searchAvailablePhoneNumberResponse.E164PhoneNumbers.length === 0) {
throw new Error('No numbers were found with this search parameters. Please try a different search.');
}
try {
console.log('Creating New Phone Number Order');
createPhoneNumberOrderResponse = await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.CreatePhoneNumberOrderCommand({
ProductType: props.phoneProductType,
E164PhoneNumbers: [
searchAvailablePhoneNumberResponse.E164PhoneNumbers[0],
],
}));
console.log(`CreatePhoneNumberOrder Response: ${JSON.stringify(createPhoneNumberOrderResponse)}`);
}
catch (error) {
if (error instanceof client_chime_sdk_voice_1.ChimeSDKVoiceServiceException) {
if (error.name === 'BadRequestException') {
console.log('Bad Request Exception. Retrying');
console.error(error);
searchAttempts++;
await sleep(10000);
continue;
}
else {
console.error(error);
throw error;
}
}
}
let orderAttempts = 0;
let orderResults = '';
while (orderAttempts < 20) {
orderResults = await checkPhoneNumber(createPhoneNumberOrderResponse.PhoneNumberOrder.PhoneNumberOrderId);
if (orderResults === 'Processing') {
orderAttempts++;
await sleep(10000);
console.log('Still processing phone number order. Looping');
continue;
}
else if (orderResults === 'Failed') {
console.log('Phone number order failed');
break;
}
else if (orderResults === 'Successful') {
orderSuccessful = true;
console.log('Phone number order successful');
break;
}
else {
console.log('Unknown phone number order status');
break;
}
}
if (orderSuccessful) {
break;
}
}
if (!orderSuccessful) {
throw new Error('The phone number order failed to process. Please try again.');
}
try {
await ssmClient.send(new client_ssm_1.PutParameterCommand({
Name: '/chime/phoneNumber' + uid,
Value: searchAvailablePhoneNumberResponse.E164PhoneNumbers[0],
Description: 'Phone Number',
Overwrite: true,
Type: 'String',
}));
}
catch (error) {
if (error instanceof Error) {
console.error(error);
throw error;
}
}
return {
phoneNumber: searchAvailablePhoneNumberResponse.E164PhoneNumbers[0],
};
};
exports.CreatePhoneNumber = CreatePhoneNumber;
const DeletePhoneNumber = async (uid) => {
try {
getParameterCommandOutput = await ssmClient.send(new client_ssm_1.GetParameterCommand({ Name: '/chime/phoneNumber' + uid }));
}
catch (error) {
if (error instanceof Error) {
console.error(error);
throw error;
}
}
try {
getPhoneNumberResponse = await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.GetPhoneNumberCommand({
PhoneNumberId: getParameterCommandOutput.Parameter.Value,
}));
}
catch (error) {
if (error instanceof Error) {
console.error(error);
throw error;
}
}
try {
if (getPhoneNumberResponse.PhoneNumber.Status === 'Assigned') {
if (getPhoneNumberResponse.PhoneNumber.ProductType === 'VoiceConnector') {
await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.DisassociatePhoneNumbersFromVoiceConnectorCommand({
E164PhoneNumbers: [
getPhoneNumberResponse.PhoneNumber.E164PhoneNumber,
],
VoiceConnectorId: getPhoneNumberResponse.PhoneNumber.Associations[0].Value,
}));
}
else if (getPhoneNumberResponse.PhoneNumber.ProductType ===
'SipMediaApplicationDialIn') {
await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.UpdateSipRuleCommand({
Name: getPhoneNumberResponse.PhoneNumber.E164PhoneNumber,
SipRuleId: getPhoneNumberResponse.PhoneNumber.Associations[0].Value,
Disabled: true,
}));
}
else {
throw new Error('Could not disassociate number');
}
}
}
catch (error) {
if (error instanceof Error) {
console.error(error);
throw error;
}
}
await sleep(10000);
try {
await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.DeletePhoneNumberCommand({
PhoneNumberId: getParameterCommandOutput.Parameter.Value,
}));
await ssmClient.send(new client_ssm_1.DeleteParameterCommand({ Name: '/chime/phoneNumber' + uid }));
}
catch (error) { }
};
exports.DeletePhoneNumber = DeletePhoneNumber;
async function checkPhoneNumber(phoneOrderId) {
try {
const getPhoneNumberOrderResponse = await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.GetPhoneNumberOrderCommand({ PhoneNumberOrderId: phoneOrderId }));
console.info(`Get Phone Number Order: ${JSON.stringify(getPhoneNumberOrderResponse)}`);
return getPhoneNumberOrderResponse.PhoneNumberOrder?.Status;
}
catch (error) {
if (error instanceof Error) {
console.error(error);
throw error;
}
return;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmVOdW1iZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzb3VyY2VzL3BzdG4vcGhvbmVOdW1iZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNEVBY3lDO0FBRXpDLG9EQU02QjtBQUc3QixNQUFNLG1CQUFtQixHQUFHLElBQUksNENBQW1CLENBQUM7SUFDbEQsTUFBTSxFQUFFLFdBQVc7Q0FDcEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsSUFBSSxzQkFBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUVwRSxJQUFJLDJCQUFvRSxDQUFDO0FBQ3pFLElBQUksa0NBQTRFLENBQUM7QUFDakYsSUFBSSw4QkFBbUUsQ0FBQztBQUN4RSxJQUFJLHlCQUFvRCxDQUFDO0FBQ3pELElBQUksc0JBQW1ELENBQUM7QUFFeEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFZN0QsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLEVBQ3BDLEdBQVcsRUFDWCxLQUE2QixFQUM3QixFQUFFO0lBQ0YsMkJBQTJCLEdBQUc7UUFDNUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdELEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxJQUFJLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4RSxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEQsR0FBRyxDQUFDLEtBQUssQ0FB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aURBQXdCLENBQUM7WUFDM0IsYUFBYSxFQUFFLHlCQUF5QixDQUFDLFNBQVUsQ0FBQyxLQUFLO1NBQzFELENBQUMsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUNsQixJQUFJLG1DQUFzQixDQUFDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixHQUFHLEdBQUcsRUFBRSxDQUFDLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFBLENBQUM7QUFDcEIsQ0FBQyxDQUFDO0FBekVXLFFBQUEsaUJBQWlCLHFCQXlFNUI7QUFFRixLQUFLLFVBQVUsZ0JBQWdCLENBQUMsWUFBb0I7SUFDbEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLG1CQUFtQixDQUFDLElBQUksQ0FDaEUsSUFBSSxtREFBMEIsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxDQUFDLENBQ3JFLENBQUM7UUFDRixPQUFPLENBQUMsSUFBSSxDQUNWLDJCQUEyQixJQUFJLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FDekUsQ0FBQztRQUNGLE9BQU8sMkJBQTJCLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBQzlELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPO0lBQ1QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7XG4gIENoaW1lU0RLVm9pY2VDbGllbnQsXG4gIENyZWF0ZVBob25lTnVtYmVyT3JkZXJDb21tYW5kLFxuICBDcmVhdGVQaG9uZU51bWJlck9yZGVyQ29tbWFuZE91dHB1dCxcbiAgRGVsZXRlUGhvbmVOdW1iZXJDb21tYW5kLFxuICBEaXNhc3NvY2lhdGVQaG9uZU51bWJlcnNGcm9tVm9pY2VDb25uZWN0b3JDb21tYW5kLFxuICBHZXRQaG9uZU51bWJlckNvbW1hbmQsXG4gIEdldFBob25lTnVtYmVyQ29tbWFuZE91dHB1dCxcbiAgR2V0UGhvbmVOdW1iZXJPcmRlckNvbW1hbmQsXG4gIFNlYXJjaEF2YWlsYWJsZVBob25lTnVtYmVyc0NvbW1hbmQsXG4gIFNlYXJjaEF2YWlsYWJsZVBob25lTnVtYmVyc0NvbW1hbmRJbnB1dCxcbiAgU2VhcmNoQXZhaWxhYmxlUGhvbmVOdW1iZXJzQ29tbWFuZE91dHB1dCxcbiAgVXBkYXRlU2lwUnVsZUNvbW1hbmQsXG4gIENoaW1lU0RLVm9pY2VTZXJ2aWNlRXhjZXB0aW9uLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2hpbWUtc2RrLXZvaWNlJztcblxuaW1wb3J0IHtcbiAgU1NNQ2xpZW50LFxuICBEZWxldGVQYXJhbWV0ZXJDb21tYW5kLFxuICBHZXRQYXJhbWV0ZXJDb21tYW5kLFxuICBHZXRQYXJhbWV0ZXJDb21tYW5kT3V0cHV0LFxuICBQdXRQYXJhbWV0ZXJDb21tYW5kLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtc3NtJztcbmltcG9ydCB7IFBob25lTnVtYmVyVHlwZSwgUGhvbmVQcm9kdWN0VHlwZSB9IGZyb20gJy4uLy4uL3BzdG4vcGhvbmVOdW1iZXInO1xuXG5jb25zdCBjaGltZVNES1ZvaWNlQ2xpZW50ID0gbmV3IENoaW1lU0RLVm9pY2VDbGllbnQoe1xuICByZWdpb246ICd1cy1lYXN0LTEnLFxufSk7XG5cbmNvbnN0IHNzbUNsaWVudCA9IG5ldyBTU01DbGllbnQoeyByZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT04gfSk7XG5cbmxldCBzZWFyY2hBdmFpbGFibGVOdW1iZXJzUGFyYW06IFNlYXJjaEF2YWlsYWJsZVBob25lTnVtYmVyc0NvbW1hbmRJbnB1dDtcbmxldCBzZWFyY2hBdmFpbGFibGVQaG9uZU51bWJlclJlc3BvbnNlOiBTZWFyY2hBdmFpbGFibGVQaG9uZU51bWJlcnNDb21tYW5kT3V0cHV0O1xubGV0IGNyZWF0ZVBob25lTnVtYmVyT3JkZXJSZXNwb25zZTogQ3JlYXRlUGhvbmVOdW1iZXJPcmRlckNvbW1hbmRPdXRwdXQ7XG5sZXQgZ2V0UGFyYW1ldGVyQ29tbWFuZE91dHB1dDogR2V0UGFyYW1ldGVyQ29tbWFuZE91dHB1dDtcbmxldCBnZXRQaG9uZU51bWJlclJlc3BvbnNlOiBHZXRQaG9uZU51bWJlckNvbW1hbmRPdXRwdXQ7XG5cbmNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUGhvbmVOdW1iZXJQcm9wcyB7XG4gIHBob25lU3RhdGU/OiBzdHJpbmc7XG4gIHBob25lQXJlYUNvZGU/OiBzdHJpbmc7XG4gIHBob25lQ2l0eT86IHN0cmluZztcbiAgcGhvbmVDb3VudHJ5Pzogc3RyaW5nO1xuICBwaG9uZU51bWJlclRvbGxGcmVlUHJlZml4Pzogc3RyaW5nO1xuICBwaG9uZVByb2R1Y3RUeXBlPzogUGhvbmVQcm9kdWN0VHlwZTtcbiAgcGhvbmVOdW1iZXJUeXBlPzogUGhvbmVOdW1iZXJUeXBlO1xufVxuXG5leHBvcnQgY29uc3QgQ3JlYXRlUGhvbmVOdW1iZXIgPSBhc3luYyAoXG4gIHVpZDogc3RyaW5nLFxuICBwcm9wczogQ3JlYXRlUGhvbmVOdW1iZXJQcm9wcyxcbikgPT4ge1xuICBzZWFyY2hBdmFpbGFibGVOdW1iZXJzUGFyYW0gPSB7XG4gICAgLi4uKHByb3BzLnBob25lQXJlYUNvZGUgJiYgeyBBcmVhQ29kZTogcHJvcHMucGhvbmVBcmVhQ29kZSB9KSxcbiAgICAuLi4ocHJvcHMucGhvbmVOdW1iZXJUeXBlICYmIHsgUGhvbmVOdW1iZXJUeXBlOiBwcm9wcy5waG9uZU51bWJlclR5cGUgfSksXG4gICAgLi4uKHByb3BzLnBob25lU3RhdGUgJiYgeyBTdGF0ZTogcHJvcHMucGhvbmVTdGF0ZSB9KSxcbiAgICAuLi4ocHJvcHMucGhvbmVDaXR5ICYmIHsgQ2l0eTogcHJvcHMucGhvbmVDaXR5IH0pLFxuICAgIC4uLihwcm9wcy5waG9uZUNvdW50cnkgJiYgeyBDb3VudHJ5OiBwcm9wcy5waG9uZUNvdW50cnkgfSksXG4gICAgLi4uKHByb3BzLnBob25lTnVtYmVyVG9sbEZyZWVQcmVmaXggJiYge1xuICAgICAgVG9sbEZyZWVQcmVmaXg6IHByb3BzLnBob25lTnVtYmVyVG9sbEZyZWVQcmVmaXgsXG4gICAgfSksXG4gIH07XG4gIGNvbnNvbGUuaW5mbyhcbiAgICBgU2VhcmNoIEF2YWlsYWJsZSBOdW1iZXJzOiAke0pTT04uc3RyaW5naWZ5KHNlYXJjaEF2YWlsYWJsZU51bWJlcnNQYXJhbSl9YCxcbiAgKTtcblxuICBsZXQgb3JkZXJTdWNjZXNzZnVsOiBib29sZWFuID0gZmFsc2U7XG4gIGxldCBzZWFyY2hBdHRlbXB0cyA9IDE7XG5cbiAgd2hpbGUgKHNlYXJjaEF0dGVtcHRzIDwgMTYpIHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBTZWFyY2hpbmcgZm9yIGF2YWlsYWJsZSBudW1iZXJzLiAgU2VhcmNoICMgJHtzZWFyY2hBdHRlbXB0c31gLFxuICAgICAgKTtcbiAgICAgIHNlYXJjaEF2YWlsYWJsZVBob25lTnVtYmVyUmVzcG9uc2UgPSBhd2FpdCBjaGltZVNES1ZvaWNlQ2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBTZWFyY2hBdmFpbGFibGVQaG9uZU51bWJlcnNDb21tYW5kKHNlYXJjaEF2YWlsYWJsZU51bWJlcnNQYXJhbSksXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBTZWFyY2ggQXZhaWxhYmxlIE51bWJlcnMgUmVzcG9uc2U6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgc2VhcmNoQXZhaWxhYmxlUGhvbmVOdW1iZXJSZXNwb25zZSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHNlYXJjaEF2YWlsYWJsZVBob25lTnVtYmVyUmVzcG9uc2UgJiZcbiAgICAgIHNlYXJjaEF2YWlsYWJsZVBob25lTnVtYmVyUmVzcG9uc2UuRTE2NFBob25lTnVtYmVycyAmJlxuICAgICAgc2VhcmNoQXZhaWxhYmxlUGhvbmVOdW1iZXJSZXNwb25zZS5FMTY0UGhvbmVOdW1iZXJzLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnTm8gbnVtYmVycyB3ZXJlIGZvdW5kIHdpdGggdGhpcyBzZWFyY2ggcGFyYW1ldGVycy4gIFBsZWFzZSB0cnkgYSBkaWZmZXJlbnQgc2VhcmNoLicsXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2coJ0NyZWF0aW5nIE5ldyBQaG9uZSBOdW1iZXIgT3JkZXInKTtcbiAgICAgIGNyZWF0ZVBob25lTnVtYmVyT3JkZXJSZXNwb25zZSA9IGF3YWl0IGNoaW1lU0RLVm9pY2VDbGllbnQuc2VuZChcbiAgICAgICAgbmV3IENyZWF0ZVBob25lTnVtYmVyT3JkZXJDb21tYW5kKHtcbiAgICAgICAgICBQcm9kdWN0VHlwZTogcHJvcHMucGhvbmVQcm9kdWN0VHlwZSxcbiAgICAgICAgICBFMTY0UGhvbmVOdW1iZXJzOiBbXG4gICAgICAgICAgICBzZWFyY2hBdmFpbGFibGVQaG9uZU51bWJlclJlc3BvbnNlLkUxNjRQaG9uZU51bWJlcnMhWzBdLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgQ3JlYXRlUGhvbmVOdW1iZXJPcmRlciBSZXNwb25zZTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBjcmVhdGVQaG9uZU51bWJlck9yZGVyUmVzcG9uc2UsXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENoaW1lU0RLVm9pY2VTZXJ2aWNlRXhjZXB0aW9uKSB7XG4gICAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQmFkUmVxdWVzdEV4Y2VwdGlvbicpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQmFkIFJlcXVlc3QgRXhjZXB0aW9uLiAgUmV0cnlpbmcnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICBzZWFyY2hBdHRlbXB0cysrO1xuICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDAwKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgb3JkZXJBdHRlbXB0cyA9IDA7XG4gICAgbGV0IG9yZGVyUmVzdWx0czogc3RyaW5nIHwgdW5kZWZpbmVkID0gJyc7XG4gICAgd2hpbGUgKG9yZGVyQXR0ZW1wdHMgPCAyMCkge1xuICAgICAgb3JkZXJSZXN1bHRzID0gYXdhaXQgY2hlY2tQaG9uZU51bWJlcihcbiAgICAgICAgY3JlYXRlUGhvbmVOdW1iZXJPcmRlclJlc3BvbnNlLlBob25lTnVtYmVyT3JkZXIhLlBob25lTnVtYmVyT3JkZXJJZCEsXG4gICAgICApO1xuXG4gICAgICBpZiAob3JkZXJSZXN1bHRzID09PSAnUHJvY2Vzc2luZycpIHtcbiAgICAgICAgb3JkZXJBdHRlbXB0cysrO1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDAwMCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTdGlsbCBwcm9jZXNzaW5nIHBob25lIG51bWJlciBvcmRlci4gIExvb3BpbmcnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKG9yZGVyUmVzdWx0cyA9PT0gJ0ZhaWxlZCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1Bob25lIG51bWJlciBvcmRlciBmYWlsZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKG9yZGVyUmVzdWx0cyA9PT0gJ1N1Y2Nlc3NmdWwnKSB7XG4gICAgICAgIG9yZGVyU3VjY2Vzc2Z1bCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUubG9nKCdQaG9uZSBudW1iZXIgb3JkZXIgc3VjY2Vzc2Z1bCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdVbmtub3duIHBob25lIG51bWJlciBvcmRlciBzdGF0dXMnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcmRlclN1Y2Nlc3NmdWwpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICghb3JkZXJTdWNjZXNzZnVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1RoZSBwaG9uZSBudW1iZXIgb3JkZXIgZmFpbGVkIHRvIHByb2Nlc3MuICBQbGVhc2UgdHJ5IGFnYWluLicsXG4gICAgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgc3NtQ2xpZW50LnNlbmQoXG4gICAgICBuZXcgUHV0UGFyYW1ldGVyQ29tbWFuZCh7XG4gICAgICAgIE5hbWU6ICcvY2hpbWUvcGhvbmVOdW1iZXInICsgdWlkLFxuICAgICAgICBWYWx1ZTogc2VhcmNoQXZhaWxhYmxlUGhvbmVOdW1iZXJSZXNwb25zZS5FMTY0UGhvbmVOdW1iZXJzIVswXSxcbiAgICAgICAgRGVzY3JpcHRpb246ICdQaG9uZSBOdW1iZXInLFxuICAgICAgICBPdmVyd3JpdGU6IHRydWUsXG4gICAgICAgIFR5cGU6ICdTdHJpbmcnLFxuICAgICAgfSksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBob25lTnVtYmVyOiBzZWFyY2hBdmFpbGFibGVQaG9uZU51bWJlclJlc3BvbnNlLkUxNjRQaG9uZU51bWJlcnMhWzBdLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IERlbGV0ZVBob25lTnVtYmVyID0gYXN5bmMgKHVpZDogc3RyaW5nKSA9PiB7XG4gIHRyeSB7XG4gICAgZ2V0UGFyYW1ldGVyQ29tbWFuZE91dHB1dCA9IGF3YWl0IHNzbUNsaWVudC5zZW5kKFxuICAgICAgbmV3IEdldFBhcmFtZXRlckNvbW1hbmQoeyBOYW1lOiAnL2NoaW1lL3Bob25lTnVtYmVyJyArIHVpZCB9KSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgZ2V0UGhvbmVOdW1iZXJSZXNwb25zZSA9IGF3YWl0IGNoaW1lU0RLVm9pY2VDbGllbnQuc2VuZChcbiAgICAgIG5ldyBHZXRQaG9uZU51bWJlckNvbW1hbmQoe1xuICAgICAgICBQaG9uZU51bWJlcklkOiBnZXRQYXJhbWV0ZXJDb21tYW5kT3V0cHV0LlBhcmFtZXRlciEuVmFsdWUsXG4gICAgICB9KSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGdldFBob25lTnVtYmVyUmVzcG9uc2UuUGhvbmVOdW1iZXIhLlN0YXR1cyA9PT0gJ0Fzc2lnbmVkJykge1xuICAgICAgaWYgKFxuICAgICAgICBnZXRQaG9uZU51bWJlclJlc3BvbnNlLlBob25lTnVtYmVyIS5Qcm9kdWN0VHlwZSEgPT09ICdWb2ljZUNvbm5lY3RvcidcbiAgICAgICkge1xuICAgICAgICBhd2FpdCBjaGltZVNES1ZvaWNlQ2xpZW50LnNlbmQoXG4gICAgICAgICAgbmV3IERpc2Fzc29jaWF0ZVBob25lTnVtYmVyc0Zyb21Wb2ljZUNvbm5lY3RvckNvbW1hbmQoe1xuICAgICAgICAgICAgRTE2NFBob25lTnVtYmVyczogW1xuICAgICAgICAgICAgICBnZXRQaG9uZU51bWJlclJlc3BvbnNlLlBob25lTnVtYmVyIS5FMTY0UGhvbmVOdW1iZXIhLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFZvaWNlQ29ubmVjdG9ySWQ6XG4gICAgICAgICAgICAgIGdldFBob25lTnVtYmVyUmVzcG9uc2UuUGhvbmVOdW1iZXIhLkFzc29jaWF0aW9ucyFbMF0uVmFsdWUhLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZ2V0UGhvbmVOdW1iZXJSZXNwb25zZS5QaG9uZU51bWJlciEuUHJvZHVjdFR5cGUhID09PVxuICAgICAgICAnU2lwTWVkaWFBcHBsaWNhdGlvbkRpYWxJbidcbiAgICAgICkge1xuICAgICAgICBhd2FpdCBjaGltZVNES1ZvaWNlQ2xpZW50LnNlbmQoXG4gICAgICAgICAgbmV3IFVwZGF0ZVNpcFJ1bGVDb21tYW5kKHtcbiAgICAgICAgICAgIE5hbWU6IGdldFBob25lTnVtYmVyUmVzcG9uc2UuUGhvbmVOdW1iZXIhLkUxNjRQaG9uZU51bWJlciEsXG4gICAgICAgICAgICBTaXBSdWxlSWQ6XG4gICAgICAgICAgICAgIGdldFBob25lTnVtYmVyUmVzcG9uc2UuUGhvbmVOdW1iZXIhLkFzc29jaWF0aW9ucyFbMF0uVmFsdWUhLFxuICAgICAgICAgICAgRGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBkaXNhc3NvY2lhdGUgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBhd2FpdCBzbGVlcCgxMDAwMCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBjaGltZVNES1ZvaWNlQ2xpZW50LnNlbmQoXG4gICAgICBuZXcgRGVsZXRlUGhvbmVOdW1iZXJDb21tYW5kKHtcbiAgICAgICAgUGhvbmVOdW1iZXJJZDogZ2V0UGFyYW1ldGVyQ29tbWFuZE91dHB1dC5QYXJhbWV0ZXIhLlZhbHVlLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBhd2FpdCBzc21DbGllbnQuc2VuZChcbiAgICAgIG5ldyBEZWxldGVQYXJhbWV0ZXJDb21tYW5kKHsgTmFtZTogJy9jaGltZS9waG9uZU51bWJlcicgKyB1aWQgfSksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHt9XG59O1xuXG5hc3luYyBmdW5jdGlvbiBjaGVja1Bob25lTnVtYmVyKHBob25lT3JkZXJJZDogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZ2V0UGhvbmVOdW1iZXJPcmRlclJlc3BvbnNlID0gYXdhaXQgY2hpbWVTREtWb2ljZUNsaWVudC5zZW5kKFxuICAgICAgbmV3IEdldFBob25lTnVtYmVyT3JkZXJDb21tYW5kKHsgUGhvbmVOdW1iZXJPcmRlcklkOiBwaG9uZU9yZGVySWQgfSksXG4gICAgKTtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgR2V0IFBob25lIE51bWJlciBPcmRlcjogJHtKU09OLnN0cmluZ2lmeShnZXRQaG9uZU51bWJlck9yZGVyUmVzcG9uc2UpfWAsXG4gICAgKTtcbiAgICByZXR1cm4gZ2V0UGhvbmVOdW1iZXJPcmRlclJlc3BvbnNlLlBob25lTnVtYmVyT3JkZXI/LlN0YXR1cztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG59XG4iXX0=