@slmdevs/celeraone
Version:
This is a NPM Package to use for all the CeleraOne interactions.
270 lines • 31 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.changeUserLoginAlias = exports.getUserSingleProperty = exports.searchUser = exports.getUserIdFromSessionId = exports.purgeUser = exports.updateUserMasterData = exports.updateUserLogin = exports.updateUserPassword = exports.findUser = exports.deleteUserProperty = exports.addUserProperty = exports.importUser = void 0;
const API_1 = __importStar(require("../API"));
const printf_1 = __importDefault(require("printf"));
const ServiceId_1 = __importDefault(require("../ServiceId"));
const UrlUtil_1 = require("../Utils/UrlUtil");
const PasswordType_1 = __importDefault(require("./PasswordType"));
/**
* Import a new user into CeleraOne
*
* @param { UserInterface } user The user object that should be imported
* @returns { Promise<ImportUserResponse> }
*/
exports.importUser = async (user) => {
const bodyReq = {
login: user.email,
login_alias: user.socialSecurityNumber,
contractor_id: user.contractorId,
hash_algorithm: 'default',
active: true,
activated_services: [ServiceId_1.default.GP, ServiceId_1.default.HN, ServiceId_1.default.HP, ServiceId_1.default.TT, ServiceId_1.default.BN, ServiceId_1.default.ST, ServiceId_1.default.AT],
master_data: {
first_name: user.firstName,
last_name: user.lastName,
email: user.email
}
};
if (user.passwordType === PasswordType_1.default.HASHED) {
bodyReq.hashed_password = user.password;
}
else if (user.passwordType === PasswordType_1.default.PLAIN) {
bodyReq.password = user.password;
}
const request = await API_1.default(API_1.Endpoints.IMPORT_USER, 'POST', bodyReq);
const response = await request.json();
if (request.status === 200) {
return response.data.user_id;
}
throw response.errors;
};
/**
* Add a property to the user in CeleraOne
*
* @param { string } userId The userId of the CeleraOne user
* @param { string } name The name of the property
* @param { string } value The value of the property
* @throws { InternalErrorResponse[] }
* @returns { Promise<UserPropertyResponse> } a boolean if the operation was successfull or not
*/
exports.addUserProperty = async (userId, name, value) => {
const apiUrl = printf_1.default(API_1.Endpoints.SAVE_USER_PROPERTY, userId, 'GP');
const request = await API_1.default(apiUrl, 'POST', { name, value });
const response = await request.json();
if (request.status === 200) {
return true;
}
throw response.errors;
};
/**
* Delete a property from the user in CeleraOne
*
* @param { string } userId The userId of the CeleraOne user
* @param { string } name The name of the property
* @returns { Promise<boolean> } a boolean if the operation was successfull or not
*/
exports.deleteUserProperty = async (userId, name) => {
const apiUrl = printf_1.default(API_1.Endpoints.DELETE_USER_PROPERTY, userId, 'GP', name);
const request = await API_1.default(apiUrl, 'DELETE');
return request.status === 204;
};
/**
* Find and return a user object from CeleraOne
*
* @param { string } contractorId The contractorId of the user
* @throws { InternalErrorResponse[] }
* @returns { Promise<UserResponse> } Promise object of UserResponse type
*/
exports.findUser = async (contractorId) => {
const apiUrl = printf_1.default(API_1.Endpoints.FIND_USER, contractorId);
const request = await API_1.default(apiUrl, 'GET');
const response = await request.json();
if (request.status === 200) {
const { user_id, login, account_state, login_alias } = response.data.user;
const { first_name, last_name, email } = response.data.user.masterdata;
return {
userId: user_id,
login,
accountState: account_state,
socialSecurityNumber: login_alias,
firstName: first_name,
lastName: last_name,
email
};
}
throw response.errors;
};
/**
* Update the users password with a new bcrypt hash in CeleraOne
*
* @param userId The userId of the CeleraOne user
* @param passwordHash The bcrypt password hash
* @throws { InternalErrorResponse[] }
* @returns { Promise<boolean> } a boolean if the operation as successfull or not
*/
exports.updateUserPassword = async (userId, passwordType, password) => {
const endpointType = passwordType === PasswordType_1.default.HASHED ? 'password_hash' : 'password';
const apiUrl = printf_1.default(API_1.Endpoints.UPDATE_USER_PASSWORD, userId, endpointType);
let reqParams;
if (passwordType === PasswordType_1.default.HASHED) {
reqParams = {
password_hash: password,
hash_algorithm: 'default'
};
}
else if (passwordType === PasswordType_1.default.PLAIN) {
reqParams = {
new_password: password
};
}
const request = await API_1.default(apiUrl, 'PUT', reqParams);
if (request.status === 200) {
return true;
}
return false;
};
/**
* Update the users login
*
* @param { string } userId The userId of the CeleraOne user
* @param { string } newLogin The new login for the user
* @throws { InternalErrorResponse[] }
* @returns { Promise<boolean> } a boolean if the operation was successfull or not
*/
exports.updateUserLogin = async (userId, newLogin) => {
const apiUrl = printf_1.default(API_1.Endpoints.UPDATE_USER_LOGIN, userId);
const request = await API_1.default(apiUrl, 'PUT', { login: newLogin });
if (request.status === 200) {
return true;
}
const response = await request.json();
throw response.errors;
};
/**
* Update the MasterData for the selected CeleraOne user
*
* @param { string } userId The userId of the CeleraOne user
* @param { MasterDataInterface } data The data that will be updated for the user
* @throws { InternalErrorResponse[] }
* @returns { Promise<boolean> } a boolean if the operation was successfull or not
*/
exports.updateUserMasterData = async (userId, data) => {
const apiUrl = printf_1.default(API_1.Endpoints.UPDATE_USER_MASTER_DATA, userId);
const request = await API_1.default(apiUrl, 'PATCH', data);
if (request.status === 200) {
return true;
}
const response = await request.json();
throw response.errors;
};
/**
* Purge/Delete the user from CeleraOne
*
* @param { string } userId The userId of the CeleraOne user
* @throws { InternalErrorResponse[] }
* @returns { Promise<boolean> } a boolean if the operation was successfull or not
*/
exports.purgeUser = async (userId) => {
const apiUrl = printf_1.default(API_1.Endpoints.PURGE_USER, userId);
const request = await API_1.default(apiUrl, 'POST');
if (request.status === 200) {
return true;
}
return false;
};
/**
* Get the userId via the users session_id value
*
* @param { string } sessionId The users CeleraOne session_id
* @param { ServiceId } serviceId CeleraOne's service_id
* @throws { InternalErrorResponse[] }
* @returns { Promise<string> } the userId for the user
*/
exports.getUserIdFromSessionId = async (sessionId, serviceId) => {
const apiUrl = printf_1.default(API_1.Endpoints.USER_SESSION, serviceId, sessionId);
const request = await API_1.default(apiUrl, 'GET');
if (request.status === 200) {
const response = await request.json();
const userId = response.data.session.user.id;
return userId;
}
return '';
};
/**
* Search for users in CeleraOne
*
* @param { SearchUserOptions } query Query parameters
* @throws { InternalErrorResponse[] }
* @returns { Promise<SearchUserResponse> } a object of the users and total found
*/
exports.searchUser = async (query) => {
const apiUrl = UrlUtil_1.buildQueryString(API_1.Endpoints.SEARCH_USER, query);
const request = await API_1.default(apiUrl, 'GET');
if (request.status === 200) {
const response = await request.json();
const result = {
count: response.data.count_total,
users: response.data.users
};
return result;
}
return { count: 0, users: [] };
};
/**
* Get a single User Property of a CeleraOne User
*
* @param { string } userId The CelereaOne userId
* @param { string } property The User Propety
* @throws { InternalErrorResponse[] }
* @returns { Promise<string> } a string of the User Property value
*/
exports.getUserSingleProperty = async (userId, property) => {
const apiUrl = printf_1.default(API_1.Endpoints.GET_USER_SINGLE_PROPERTY, userId, property);
const request = await API_1.default(apiUrl, 'GET');
if (request.status === 200) {
const response = await request.json();
return response.data.value;
}
return '';
};
/**
* Change the Login Alias for the CeleraOne User
*
* @param userId The CeleraOne userID
* @param loginAlias The Login Alias that the user will change to
* @throws { InternalErrorResponse[] }
* @returns { Promise<string> } a string if the operation was successfull
*/
exports.changeUserLoginAlias = async (userId, login_alias) => {
const apiUrl = printf_1.default(API_1.Endpoints.CHANGE_USER_LOGIN_ALIAS, userId);
const request = await API_1.default(apiUrl, 'PUT', { login_alias });
if (request.status === 200) {
const response = await request.json();
return response.status;
}
return '';
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVXNlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUF1QztBQUd2QyxvREFBMkI7QUFHM0IsNkRBQW9DO0FBR3BDLDhDQUFtRDtBQUNuRCxrRUFBeUM7QUFFekM7Ozs7O0dBS0c7QUFDVSxRQUFBLFVBQVUsR0FBRyxLQUFLLEVBQUUsSUFBbUIsRUFBbUIsRUFBRTtJQUN4RSxNQUFNLE9BQU8sR0FBUTtRQUNwQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0I7UUFDdEMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZO1FBQ2hDLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLE1BQU0sRUFBRSxJQUFJO1FBQ1osa0JBQWtCLEVBQUUsQ0FBQyxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsRUFBRSxtQkFBUyxDQUFDLEVBQUUsQ0FBQztRQUN0SCxXQUFXLEVBQUU7WUFDWixVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3hCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNqQjtLQUNELENBQUE7SUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssc0JBQVksQ0FBQyxNQUFNLEVBQUU7UUFDOUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFBO0tBQ3ZDO1NBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLHNCQUFZLENBQUMsS0FBSyxFQUFFO1FBQ3BELE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFD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QUFFLEtBQUssQ0FBQyxDQUFBO0lBRXhDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7UUFDM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDckMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQTtLQUMxQjtJQUVELE9BQU8sRUFBRSxDQUFBO0FBQ1YsQ0FBQyxDQUFBO0FBRUQ7Ozs7Ozs7R0FPRztBQUNVLFFBQUEsb0JBQW9CLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBRSxXQUFtQixFQUFtQixFQUFFO0lBQ2xHLE1BQU0sTUFBTSxHQUFHLGdCQUFNLENBQUMsZUFBUyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBRXpELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7UUFDM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDckMsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFBO0tBQ3RCO0lBRUQsT0FBTyxFQUFFLENBQUE7QUFDVixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQVBJLCB7IEVuZHBvaW50cyB9IGZyb20gJy4uL0FQSSdcbmltcG9ydCBVc2VySW50ZXJmYWNlIGZyb20gJy4uL0FQSS9JbnRlcm5hbC9Vc2VySW50ZXJmYWNlJ1xuaW1wb3J0IEFkZFVzZXJQcm9wZXJ0eVJlc3BvbnNlIGZyb20gJy4uL0FQSS9JbnRlcm5hbC9BZGRVc2VyUHJvcGVydHlSZXNwb25zZSdcbmltcG9ydCBwcmludGYgZnJvbSAncHJpbnRmJ1xuaW1wb3J0IFVzZXJSZXNwb25zZSBmcm9tICcuL1VzZXJSZXNwb25zZSdcbmltcG9ydCBNYXN0ZXJEYXRhSW50ZXJmYWNlIGZyb20gJy4uL0FQSS9JbnRlcm5hbC9NYXN0ZXJEYXRhSW50ZXJmYWNlJ1xuaW1wb3J0IFNlcnZpY2VJZCBmcm9tICcuLi9TZXJ2aWNlSWQnXG5pbXBvcnQgU2VhcmNoVXNlck9wdGlvbnMgZnJvbSAnLi4vQVBJL0ludGVybmFsL1NlYXJjaFVzZXJPcHRpb25zJ1xuaW1wb3J0IFNlYXJjaFVzZXJSZXNwb25zZSBmcm9tICcuL1NlYXJjaFVzZXJSZXNwb25zZSdcbmltcG9ydCB7IGJ1aWxkUXVlcnlTdHJpbmcgfSBmcm9tICcuLi9VdGlscy9VcmxVdGlsJ1xuaW1wb3J0IFBhc3N3b3JkVHlwZSBmcm9tICcuL1Bhc3N3b3JkVHlwZSdcblxuLyoqXG4gKiBJbXBvcnQgYSBuZXcgdXNlciBpbnRvIENlbGVyYU9uZVxuICpcbiAqIEBwYXJhbSB7IFVzZXJJbnRlcmZhY2UgfSB1c2VyIFRoZSB1c2VyIG9iamVjdCB0aGF0IHNob3VsZCBiZSBpbXBvcnRlZFxuICogQHJldHVybnMgeyBQcm9taXNlPEltcG9ydFVzZXJSZXNwb25zZT4gfVxuICovXG5leHBvcnQgY29uc3QgaW1wb3J0VXNlciA9IGFzeW5jICh1c2VyOiBVc2VySW50ZXJmYWNlKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcblx0Y29uc3QgYm9keVJlcTogYW55ID0ge1xuXHRcdGxvZ2luOiB1c2VyLmVtYWlsLFxuXHRcdGxvZ2luX2FsaWFzOiB1c2VyLnNvY2lhbFNlY3VyaXR5TnVtYmVyLFxuXHRcdGNvbnRyYWN0b3JfaWQ6IHVzZXIuY29udHJhY3RvcklkLFxuXHRcdGhhc2hfYWxnb3JpdGhtOiAnZGVmYXVsdCcsXG5cdFx0YWN0aXZlOiB0cnVlLFxuXHRcdGFjdGl2YXRlZF9zZXJ2aWNlczogW1NlcnZpY2VJZC5HUCwgU2VydmljZUlkLkhOLCBTZXJ2aWNlSWQuSFAsIFNlcnZpY2VJZC5UVCwgU2VydmljZUlkLkJOLCBTZXJ2aWNlSWQuU1QsIFNlcnZpY2VJZC5BVF0sXG5cdFx0bWFzdGVyX2RhdGE6IHtcblx0XHRcdGZpcnN0X25hbWU6IHVzZXIuZmlyc3ROYW1lLFxuXHRcdFx0bGFzdF9uYW1lOiB1c2VyLmxhc3ROYW1lLFxuXHRcdFx0ZW1haWw6IHVzZXIuZW1haWxcblx0XHR9XG5cdH1cblxuXHRpZiAodXNlci5wYXNzd29yZFR5cGUgPT09IFBhc3N3b3JkVHlwZS5IQVNIRUQpIHtcblx0XHRib2R5UmVxLmhhc2hlZF9wYXNzd29yZCA9IHVzZXIucGFzc3dvcmRcblx0fSBlbHNlIGlmICh1c2VyLnBhc3N3b3JkVHlwZSA9PT0gUGFzc3dvcmRUeXBlLlBMQUlOKSB7XG5cdFx0Ym9keVJlcS5wYXNzd29yZCA9IHVzZXIucGFzc3dvcmRcblx0fVxuXHRjb25zdCByZXF1ZXN0ID0gYXdhaXQgQVBJKEVuZHBvaW50cy5JTVBPUlRfVVNFUiwgJ1BPU1QnLCBib2R5UmVxKVxuXHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuanNvbigpXG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0XHRyZXR1cm4gcmVzcG9uc2UuZGF0YS51c2VyX2lkXG5cdH1cblxuXHR0aHJvdyByZXNwb25zZS5lcnJvcnNcbn1cblxuLyoqXG4gKiBBZGQgYSBwcm9wZXJ0eSB0byB0aGUgdXNlciBpbiBDZWxlcmFPbmVcbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSB1c2VySWQgVGhlIHVzZXJJZCBvZiB0aGUgQ2VsZXJhT25lIHVzZXJcbiAqIEBwYXJhbSB7IHN0cmluZyB9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0geyBzdHJpbmcgfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAdGhyb3dzIHsgSW50ZXJuYWxFcnJvclJlc3BvbnNlW10gfVxuICogQHJldHVybnMgeyBQcm9taXNlPFVzZXJQcm9wZXJ0eVJlc3BvbnNlPiB9IGEgYm9vbGVhbiBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsbCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZFVzZXJQcm9wZXJ0eSA9IGFzeW5jICh1c2VySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuU0FWRV9VU0VSX1BST1BFUlRZLCB1c2VySWQsICdHUCcpXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnUE9TVCcsIHsgbmFtZSwgdmFsdWUgfSlcblx0Y29uc3QgcmVzcG9uc2U6IEFkZFVzZXJQcm9wZXJ0eVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5qc29uKClcblxuXHRpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuXHRcdHJldHVybiB0cnVlXG5cdH1cblxuXHR0aHJvdyByZXNwb25zZS5lcnJvcnNcbn1cblxuLyoqXG4gKiBEZWxldGUgYSBwcm9wZXJ0eSBmcm9tIHRoZSB1c2VyIGluIENlbGVyYU9uZVxuICpcbiAqIEBwYXJhbSB7IHN0cmluZyB9IHVzZXJJZCBUaGUgdXNlcklkIG9mIHRoZSBDZWxlcmFPbmUgdXNlclxuICogQHBhcmFtIHsgc3RyaW5nIH0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAqIEByZXR1cm5zIHsgUHJvbWlzZTxib29sZWFuPiB9IGEgYm9vbGVhbiBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsbCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXJQcm9wZXJ0eSA9IGFzeW5jICh1c2VySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuREVMRVRFX1VTRVJfUFJPUEVSVFksIHVzZXJJZCwgJ0dQJywgbmFtZSlcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IEFQSShhcGlVcmwsICdERUxFVEUnKVxuXHRyZXR1cm4gcmVxdWVzdC5zdGF0dXMgPT09IDIwNFxufVxuXG4vKipcbiAqIEZpbmQgYW5kIHJldHVybiBhIHVzZXIgb2JqZWN0IGZyb20gQ2VsZXJhT25lXG4gKlxuICogQHBhcmFtIHsgc3RyaW5nIH0gY29udHJhY3RvcklkIFRoZSBjb250cmFjdG9ySWQgb2YgdGhlIHVzZXJcbiAqIEB0aHJvd3MgeyBJbnRlcm5hbEVycm9yUmVzcG9uc2VbXSB9XG4gKiBAcmV0dXJucyB7IFByb21pc2U8VXNlclJlc3BvbnNlPiB9IFByb21pc2Ugb2JqZWN0IG9mIFVzZXJSZXNwb25zZSB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBmaW5kVXNlciA9IGFzeW5jIChjb250cmFjdG9ySWQ6IHN0cmluZyk6IFByb21pc2U8VXNlclJlc3BvbnNlPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuRklORF9VU0VSLCBjb250cmFjdG9ySWQpXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnR0VUJylcblx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKVxuXG5cdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0Y29uc3QgeyB1c2VyX2lkLCBsb2dpbiwgYWNjb3VudF9zdGF0ZSwgbG9naW5fYWxpYXMgIH0gPSByZXNwb25zZS5kYXRhLnVzZXJcblx0XHRjb25zdCB7IGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgZW1haWwgfSA9IHJlc3BvbnNlLmRhdGEudXNlci5tYXN0ZXJkYXRhXG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dXNlcklkOiB1c2VyX2lkLFxuXHRcdFx0bG9naW4sXG5cdFx0XHRhY2NvdW50U3RhdGU6IGFjY291bnRfc3RhdGUsXG5cdFx0XHRzb2NpYWxTZWN1cml0eU51bWJlcjogbG9naW5fYWxpYXMsXG5cdFx0XHRmaXJzdE5hbWU6IGZpcnN0X25hbWUsXG5cdFx0XHRsYXN0TmFtZTogbGFzdF9uYW1lLFxuXHRcdFx0ZW1haWxcblx0XHR9IGFzIFVzZXJSZXNwb25zZVxuXHR9XG5cblx0dGhyb3cgcmVzcG9uc2UuZXJyb3JzXG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSB1c2VycyBwYXNzd29yZCB3aXRoIGEgbmV3IGJjcnlwdCBoYXNoIGluIENlbGVyYU9uZVxuICpcbiAqIEBwYXJhbSB1c2VySWQgVGhlIHVzZXJJZCBvZiB0aGUgQ2VsZXJhT25lIHVzZXJcbiAqIEBwYXJhbSBwYXNzd29yZEhhc2ggVGhlIGJjcnlwdCBwYXNzd29yZCBoYXNoXG4gKiBAdGhyb3dzIHsgSW50ZXJuYWxFcnJvclJlc3BvbnNlW10gfVxuICogQHJldHVybnMgeyBQcm9taXNlPGJvb2xlYW4+IH0gYSBib29sZWFuIGlmIHRoZSBvcGVyYXRpb24gYXMgc3VjY2Vzc2Z1bGwgb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVVc2VyUGFzc3dvcmQgPSBhc3luYyAodXNlcklkOiBzdHJpbmcsIHBhc3N3b3JkVHlwZTogUGFzc3dvcmRUeXBlLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdGNvbnN0IGVuZHBvaW50VHlwZSA9IHBhc3N3b3JkVHlwZSA9PT0gUGFzc3dvcmRUeXBlLkhBU0hFRCA/ICdwYXNzd29yZF9oYXNoJyA6ICdwYXNzd29yZCdcblx0Y29uc3QgYXBpVXJsID0gcHJpbnRmKEVuZHBvaW50cy5VUERBVEVfVVNFUl9QQVNTV09SRCwgdXNlcklkLCBlbmRwb2ludFR5cGUpXG5cblx0bGV0IHJlcVBhcmFtc1xuXHRpZiAocGFzc3dvcmRUeXBlID09PSBQYXNzd29yZFR5cGUuSEFTSEVEKSB7XG5cdFx0cmVxUGFyYW1zID0ge1xuXHRcdFx0cGFzc3dvcmRfaGFzaDogcGFzc3dvcmQsXG5cdFx0XHRoYXNoX2FsZ29yaXRobTogJ2RlZmF1bHQnXG5cdFx0fVxuXHR9IGVsc2UgaWYgKHBhc3N3b3JkVHlwZSA9PT0gUGFzc3dvcmRUeXBlLlBMQUlOKSB7XG5cdFx0cmVxUGFyYW1zID0ge1xuXHRcdFx0bmV3X3Bhc3N3b3JkOiBwYXNzd29yZFxuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnUFVUJywgcmVxUGFyYW1zKVxuXG5cdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0cmV0dXJuIHRydWVcblx0fVxuXG5cdHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgdXNlcnMgbG9naW5cbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSB1c2VySWQgVGhlIHVzZXJJZCBvZiB0aGUgQ2VsZXJhT25lIHVzZXJcbiAqIEBwYXJhbSB7IHN0cmluZyB9IG5ld0xvZ2luIFRoZSBuZXcgbG9naW4gZm9yIHRoZSB1c2VyXG4gKiBAdGhyb3dzIHsgSW50ZXJuYWxFcnJvclJlc3BvbnNlW10gfVxuICogQHJldHVybnMgeyBQcm9taXNlPGJvb2xlYW4+IH0gYSBib29sZWFuIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWxsIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgdXBkYXRlVXNlckxvZ2luID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCBuZXdMb2dpbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuVVBEQVRFX1VTRVJfTE9HSU4sIHVzZXJJZClcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IEFQSShhcGlVcmwsICdQVVQnLCB7IGxvZ2luOiBuZXdMb2dpbiB9KVxuXG5cdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0cmV0dXJuIHRydWVcblx0fVxuXG5cdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5qc29uKClcblx0dGhyb3cgcmVzcG9uc2UuZXJyb3JzXG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSBNYXN0ZXJEYXRhIGZvciB0aGUgc2VsZWN0ZWQgQ2VsZXJhT25lIHVzZXJcbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSB1c2VySWQgVGhlIHVzZXJJZCBvZiB0aGUgQ2VsZXJhT25lIHVzZXJcbiAqIEBwYXJhbSB7IE1hc3RlckRhdGFJbnRlcmZhY2UgfSBkYXRhIFRoZSBkYXRhIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGZvciB0aGUgdXNlclxuICogQHRocm93cyB7IEludGVybmFsRXJyb3JSZXNwb25zZVtdIH1cbiAqIEByZXR1cm5zIHsgUHJvbWlzZTxib29sZWFuPiB9IGEgYm9vbGVhbiBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsbCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZVVzZXJNYXN0ZXJEYXRhID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCBkYXRhOiBNYXN0ZXJEYXRhSW50ZXJmYWNlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuVVBEQVRFX1VTRVJfTUFTVEVSX0RBVEEsIHVzZXJJZClcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IEFQSShhcGlVcmwsICdQQVRDSCcsIGRhdGEpXG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0XHRyZXR1cm4gdHJ1ZVxuXHR9XG5cblx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKVxuXHR0aHJvdyByZXNwb25zZS5lcnJvcnNcbn1cblxuLyoqXG4gKiBQdXJnZS9EZWxldGUgdGhlIHVzZXIgZnJvbSBDZWxlcmFPbmVcbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSB1c2VySWQgVGhlIHVzZXJJZCBvZiB0aGUgQ2VsZXJhT25lIHVzZXJcbiAqIEB0aHJvd3MgeyBJbnRlcm5hbEVycm9yUmVzcG9uc2VbXSB9XG4gKiBAcmV0dXJucyB7IFByb21pc2U8Ym9vbGVhbj4gfSBhIGJvb2xlYW4gaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bGwgb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBwdXJnZVVzZXIgPSBhc3luYyAodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcblx0Y29uc3QgYXBpVXJsID0gcHJpbnRmKEVuZHBvaW50cy5QVVJHRV9VU0VSLCB1c2VySWQpXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnUE9TVCcpXG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0XHRyZXR1cm4gdHJ1ZVxuXHR9XG5cblx0cmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogR2V0IHRoZSB1c2VySWQgdmlhIHRoZSB1c2VycyBzZXNzaW9uX2lkIHZhbHVlXG4gKlxuICogQHBhcmFtIHsgc3RyaW5nIH0gc2Vzc2lvbklkIFRoZSB1c2VycyBDZWxlcmFPbmUgc2Vzc2lvbl9pZFxuICogQHBhcmFtIHsgU2VydmljZUlkIH0gc2VydmljZUlkIENlbGVyYU9uZSdzIHNlcnZpY2VfaWRcbiAqIEB0aHJvd3MgeyBJbnRlcm5hbEVycm9yUmVzcG9uc2VbXSB9XG4gKiBAcmV0dXJucyB7IFByb21pc2U8c3RyaW5nPiB9IHRoZSB1c2VySWQgZm9yIHRoZSB1c2VyXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRVc2VySWRGcm9tU2Vzc2lvbklkID0gYXN5bmMgKHNlc3Npb25JZDogc3RyaW5nLCBzZXJ2aWNlSWQ6IFNlcnZpY2VJZCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuVVNFUl9TRVNTSU9OLCBzZXJ2aWNlSWQsIHNlc3Npb25JZClcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IEFQSShhcGlVcmwsICdHRVQnKVxuXG5cdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKVxuXHRcdGNvbnN0IHVzZXJJZCA9IHJlc3BvbnNlLmRhdGEuc2Vzc2lvbi51c2VyLmlkXG5cblx0XHRyZXR1cm4gdXNlcklkXG5cdH1cblxuXHRyZXR1cm4gJydcbn1cblxuLyoqXG4gKiBTZWFyY2ggZm9yIHVzZXJzIGluIENlbGVyYU9uZVxuICpcbiAqIEBwYXJhbSB7IFNlYXJjaFVzZXJPcHRpb25zIH0gcXVlcnkgUXVlcnkgcGFyYW1ldGVyc1xuICogQHRocm93cyB7IEludGVybmFsRXJyb3JSZXNwb25zZVtdIH1cbiAqIEByZXR1cm5zIHsgUHJvbWlzZTxTZWFyY2hVc2VyUmVzcG9uc2U+IH0gYSBvYmplY3Qgb2YgdGhlIHVzZXJzIGFuZCB0b3RhbCBmb3VuZFxuICovXG5leHBvcnQgY29uc3Qgc2VhcmNoVXNlciA9IGFzeW5jIChxdWVyeTogU2VhcmNoVXNlck9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFVzZXJSZXNwb25zZT4gPT4ge1xuXHRjb25zdCBhcGlVcmwgPSBidWlsZFF1ZXJ5U3RyaW5nKEVuZHBvaW50cy5TRUFSQ0hfVVNFUiwgcXVlcnkpXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnR0VUJylcblxuXHRpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5qc29uKClcblxuXHRcdGNvbnN0IHJlc3VsdDogU2VhcmNoVXNlclJlc3BvbnNlID0ge1xuXHRcdFx0Y291bnQ6IHJlc3BvbnNlLmRhdGEuY291bnRfdG90YWwsXG5cdFx0XHR1c2VyczogcmVzcG9uc2UuZGF0YS51c2Vyc1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHRcblx0fVxuXG5cdHJldHVybiB7IGNvdW50OiAwLCB1c2VyczogW10gfVxufVxuXG4vKipcbiAqIEdldCBhIHNpbmdsZSBVc2VyIFByb3BlcnR5IG9mIGEgQ2VsZXJhT25lIFVzZXJcbiAqXG4gKiBAcGFyYW0geyBzdHJpbmcgfSB1c2VySWQgVGhlIENlbGVyZWFPbmUgdXNlcklkXG4gKiBAcGFyYW0geyBzdHJpbmcgfSBwcm9wZXJ0eSBUaGUgVXNlciBQcm9wZXR5XG4gKiBAdGhyb3dzIHsgSW50ZXJuYWxFcnJvclJlc3BvbnNlW10gfVxuICogQHJldHVybnMgeyBQcm9taXNlPHN0cmluZz4gfSBhIHN0cmluZyBvZiB0aGUgVXNlciBQcm9wZXJ0eSB2YWx1ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0VXNlclNpbmdsZVByb3BlcnR5ID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCBwcm9wZXJ0eTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcblx0Y29uc3QgYXBpVXJsID0gcHJpbnRmKEVuZHBvaW50cy5HRVRfVVNFUl9TSU5HTEVfUFJPUEVSVFksIHVzZXJJZCwgcHJvcGVydHkpXG5cdGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBBUEkoYXBpVXJsLCAnR0VUJylcblxuXHRpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5qc29uKClcblx0XHRyZXR1cm4gcmVzcG9uc2UuZGF0YS52YWx1ZVxuXHR9XG5cblx0cmV0dXJuICcnXG59XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBMb2dpbiBBbGlhcyBmb3IgdGhlIENlbGVyYU9uZSBVc2VyXG4gKlxuICogQHBhcmFtIHVzZXJJZCBUaGUgQ2VsZXJhT25lIHVzZXJJRFxuICogQHBhcmFtIGxvZ2luQWxpYXMgVGhlIExvZ2luIEFsaWFzIHRoYXQgdGhlIHVzZXIgd2lsbCBjaGFuZ2UgdG9cbiAqIEB0aHJvd3MgeyBJbnRlcm5hbEVycm9yUmVzcG9uc2VbXSB9XG4gKiBAcmV0dXJucyB7IFByb21pc2U8c3RyaW5nPiB9IGEgc3RyaW5nIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWxsXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFuZ2VVc2VyTG9naW5BbGlhcyA9IGFzeW5jICh1c2VySWQ6IHN0cmluZywgbG9naW5fYWxpYXM6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG5cdGNvbnN0IGFwaVVybCA9IHByaW50ZihFbmRwb2ludHMuQ0hBTkdFX1VTRVJfTE9HSU5fQUxJQVMsIHVzZXJJZClcblx0Y29uc3QgcmVxdWVzdCA9IGF3YWl0IEFQSShhcGlVcmwsICdQVVQnLCB7IGxvZ2luX2FsaWFzIH0pXG5cblx0aWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDApIHtcblx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuanNvbigpXG5cdFx0cmV0dXJuIHJlc3BvbnNlLnN0YXR1c1xuXHR9XG5cblx0cmV0dXJuICcnXG59Il19