UNPKG

@fdot/angular-staff

Version:

The angular-staff package wraps service calls to FDOT Staff API and also includes pipes and components based on bootstrap 4. ## Installation The angular staff package use a peer dependency of ng-bootstrap so you will need to also perform an NPM install

269 lines (268 loc) 35.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Injectable, Inject } from '@angular/core'; import { Observable, BehaviorSubject } from 'rxjs'; import { HttpHeaders, HttpParams, HttpClient } from '@angular/common/http'; import { map } from 'rxjs/operators'; import { Config } from './models/config'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; export class AngularStaffService { /** * @param {?} http * @param {?} config */ constructor(http, config) { this.http = http; this.config = config; this.staffByIdCache = new Map(); this.staffByRacfIdCache = new Map(); this.staffSearchCache = new Map(); if (!config) { throw Error('Call AngularStaffmodule with for root passing in the config object'); } } /** * @param {?} staff * @param {?} format * @return {?} */ Format(staff, format) { if (format) { let /** @type {?} */ formattedStr = format.replace('{firstName}', staff.firstName); formattedStr = formattedStr.replace('{lastName}', staff.lastName); formattedStr = formattedStr.replace('{racfId}', staff.racfId); formattedStr = formattedStr.replace('{emailAddress}', staff.emailAddress); formattedStr = formattedStr.replace('{phone}', staff.phone); return formattedStr; } return `${staff.firstName} ${staff.lastName}`; } /** * Method GetStaffById * @param {?} id Id for Staff to retrieve * @return {?} Full HTTP response as Observable */ GetStaffById(id) { if (!this.staffByIdCache.get(id)) { this.staffByIdCache.set(id, new BehaviorSubject(null)); const /** @type {?} */ uri = `/GetStaffById`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (id !== undefined && id !== null) { params = params.set('id', id + ''); } this.sendRequest('get', uri, headers, params, null).toPromise().then(r => { if (r && r.body) { this.staffByIdCache.get(id).next(r.body); } }); } return this.staffByIdCache.get(id); } /** * Method GetStaffByIds * @param {?} id Id for Staff to retrieve * @return {?} Full HTTP response as Observable */ GetStaffByIds(id) { const /** @type {?} */ uri = `/GetStaffByIds`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (id !== undefined && id !== null) { params = params.set('id', id + ''); } return this.sendRequest('get', uri, headers, params, null).pipe(map(r => { if (r && r.body) { return r.body; } })); } /** * Method GetStaffByRacfId * @param {?} racfId RacfId for Staff to retrieve * @return {?} Full HTTP response as Observable */ GetStaffByRacfId(racfId) { if (!this.staffByRacfIdCache.get(racfId)) { this.staffByRacfIdCache.set(racfId, new BehaviorSubject(null)); const /** @type {?} */ uri = `/GetStaffByRacfId`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (racfId !== undefined && racfId !== null) { params = params.set('racfId', racfId + ''); } this.sendRequest('get', uri, headers, params, null).pipe(map(r => { if (r && r.body) { this.staffByRacfIdCache.get(racfId).next(r.body); } })); } return this.staffByRacfIdCache.get(racfId); } /** * Method GetStaffByRacfIds * @param {?} racfId RacfId for Staff to retrieve * @return {?} Full HTTP response as Observable */ GetStaffByRacfIds(racfId) { const /** @type {?} */ uri = `/GetStaffByRacfIds`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (racfId !== undefined && racfId !== null) { params = params.set('racfId', racfId + ''); } return this.sendRequest('get', uri, headers, params, null).pipe(map(r => { if (r && r.body) { return r.body; } })); } /** * Method SearchStaffBySearchCriteriaGet * @param {?} racfId RacfId for Staff to retrieve * @param {?} peopleFirstId The people first id to Search for * @param {?} status The status code to search for * @param {?} partialName The partial name to search for * @param {?} firstName The first name to search for * @param {?} lastName The last name to search for * @param {?} districtCode The district to search for * @param {?} positionNumber The position number to search for * @param {?} organizationalCode The organization code to search for * @param {?} emailAddress The email address to search for * @param {?} staffTypeCode The staff type code to search for * @param {?} staffId The staff id to search for * @return {?} Full HTTP response as Observable */ SearchStaffBySearchCriteriaGet(racfId, peopleFirstId, status, partialName, firstName, lastName, districtCode, positionNumber, organizationalCode, emailAddress, staffTypeCode, staffId) { const /** @type {?} */ uri = `/SearchStaffBySearchCriteria`; const /** @type {?} */ headers = new HttpHeaders(); let /** @type {?} */ params = new HttpParams(); if (racfId !== undefined && racfId !== null) { params = params.set('racfId', racfId + ''); } if (peopleFirstId !== undefined && peopleFirstId !== null) { params = params.set('peopleFirstId', peopleFirstId + ''); } if (status !== undefined && status !== null) { params = params.set('status', status + ''); } if (partialName !== undefined && partialName !== null) { params = params.set('partialName', partialName + ''); } if (firstName !== undefined && firstName !== null) { params = params.set('firstName', firstName + ''); } if (lastName !== undefined && lastName !== null) { params = params.set('lastName', lastName + ''); } if (districtCode !== undefined && districtCode !== null) { params = params.set('districtCode', districtCode + ''); } if (positionNumber !== undefined && positionNumber !== null) { params = params.set('positionNumber', positionNumber + ''); } if (organizationalCode !== undefined && organizationalCode !== null) { params = params.set('organizationalCode', organizationalCode + ''); } if (emailAddress !== undefined && emailAddress !== null) { params = params.set('emailAddress', emailAddress + ''); } if (staffTypeCode !== undefined && staffTypeCode !== null) { params = params.set('staffTypeCode', staffTypeCode + ''); } if (staffId !== undefined && staffId !== null) { params = params.set('staffId', staffId + ''); } return this.sendRequest('get', uri, headers, params, null).pipe(map(r => { if (r && r.body) { return r.body; } })); } /** * @param {?} name * @return {?} */ SearchActiveStaffByName(name) { if (!this.staffSearchCache.get(name)) { this.staffSearchCache.set(name, new BehaviorSubject([])); this.SearchStaffBySearchCriteriaGet(null, null, 'active', name, null, null, null, null, null, null, null, null).toPromise().then((results) => { this.staffSearchCache.get(name).next(results); }); } return this.staffSearchCache.get(name); } /** * Method SearchStaffBySearchCriteriaPost * @param {?} searchCriteria RacfId for Staff to retrieve * @return {?} Full HTTP response as Observable */ SearchStaffBySearchCriteriaPost(searchCriteria) { const /** @type {?} */ uri = `/SearchStaffBySearchCriteria`; const /** @type {?} */ headers = new HttpHeaders(); const /** @type {?} */ params = new HttpParams(); return this.sendRequest('post', uri, headers, params, JSON.stringify(searchCriteria)); } /** * @template T * @param {?} method * @param {?} uri * @param {?} headers * @param {?} params * @param {?} body * @return {?} */ sendRequest(method, uri, headers, params, body) { headers = headers.set('Ocp-Apim-Subscription-Key', this.config.apiKey); if (method === 'get') { return this.http.get(this.config.host + uri, { headers: headers.set('Accept', 'application/json'), params: params, observe: 'response' }); } else if (method === 'put') { return this.http.put(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' }); } else if (method === 'post') { return this.http.post(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' }); } else if (method === 'delete') { return this.http.delete(this.config.host + uri, { headers: headers, params: params, observe: 'response' }); } else { console.error('Unsupported request: ' + method); return Observable.throw('Unsupported request: ' + method); } } } AngularStaffService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] }, ]; /** @nocollapse */ AngularStaffService.ctorParameters = () => [ { type: HttpClient, }, { type: Config, decorators: [{ type: Inject, args: ['config',] },] }, ]; /** @nocollapse */ AngularStaffService.ngInjectableDef = i0.defineInjectable({ factory: function AngularStaffService_Factory() { return new AngularStaffService(i0.inject(i1.HttpClient), i0.inject("config")); }, token: AngularStaffService, providedIn: "root" }); function AngularStaffService_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ AngularStaffService.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ AngularStaffService.ctorParameters; /** @type {?} */ AngularStaffService.prototype.staffByIdCache; /** @type {?} */ AngularStaffService.prototype.staffByRacfIdCache; /** @type {?} */ AngularStaffService.prototype.staffSearchCache; /** @type {?} */ AngularStaffService.prototype.http; /** @type {?} */ AngularStaffService.prototype.config; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zdGFmZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZkb3QvYW5ndWxhci1zdGFmZi8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLXN0YWZmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBZ0IsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFLekMsTUFBTTs7Ozs7SUFLSixZQUFvQixJQUFnQixFQUE0QjtRQUE1QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQTRCLFdBQU0sR0FBTixNQUFNOzhCQUo3QyxJQUFJLEdBQUcsRUFBd0M7a0NBQzNDLElBQUksR0FBRyxFQUF3QztnQ0FDakQsSUFBSSxHQUFHLEVBQTBDO1FBRzFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNaLE1BQU0sS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7U0FDbkY7S0FDRjs7Ozs7O0lBRU0sTUFBTSxDQUFDLEtBQWtCLEVBQUUsTUFBYztRQUM5QyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ1gscUJBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVsRSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xFLFlBQVksR0FBRyxZ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QyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztTQUM1QztRQUNELEVBQUUsQ0FBQyxDQUFDLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN0RDtRQUNELEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUNELEVBQUUsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNoRDtRQUNELEVBQUUsQ0FBQyxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDeEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN4RDtRQUNELEVBQUUsQ0FBQyxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsRUFBRSxDQUFDLENBQUMsa0JBQWtCLEtB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SSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDL0c7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLENBQUM7U0FDM0Q7Ozs7WUEvTkosVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7O1lBTitDLFVBQVU7WUFFakQsTUFBTSx1QkFVMEIsTUFBTSxTQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTdGFmZk1lbWJlciwgU2VhcmNoQ3JpdGVyaWEgfSBmcm9tICcuL21vZGVscyc7XHJcbmltcG9ydCB7IEh0dHBSZXNwb25zZSwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29uZmlnJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJTdGFmZlNlcnZpY2Uge1xyXG4gIHByaXZhdGUgc3RhZmZCeUlkQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgQmVoYXZpb3JTdWJqZWN0PFN0YWZmTWVtYmVyPj4oKTtcclxuICBwcml2YXRlIHN0YWZmQnlSYWNmSWRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBCZWhhdmlvclN1YmplY3Q8U3RhZmZNZW1iZXI+PigpO1xyXG4gIHByaXZhdGUgc3RhZmZTZWFyY2hDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBCZWhhdmlvclN1YmplY3Q8U3RhZmZNZW1iZXJbXT4+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSBjb25maWc6IENvbmZpZykge1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ0NhbGwgQW5ndWxhclN0YWZmbW9kdWxlIHdpdGggZm9yIHJvb3QgcGFzc2luZyBpbiB0aGUgY29uZmlnIG9iamVjdCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIEZvcm1hdChzdGFmZjogU3RhZmZNZW1iZXIsIGZvcm1hdDogc3RyaW5nKSB7XHJcbiAgICBpZiAoZm9ybWF0KSB7XHJcbiAgICAgIGxldCBmb3JtYXR0ZWRTdHIgPSBmb3JtYXQucmVwbGFjZSgne2ZpcnN0TmFtZX0nLCBzdGFmZi5maXJzdE5hbWUpO1xyXG5cclxuICAgICAgZm9ybWF0dGVkU3RyID0gZm9ybWF0dGVkU3RyLnJlcGxhY2UoJ3tsYXN0TmFtZX0nLCBzdGFmZi5sYXN0TmFtZSk7XHJcbiAgICAgIGZvcm1hdHRlZFN0ciA9IGZvcm1hdHRlZFN0ci5yZXBsYWNlKCd7cmFjZklkfScsIHN0YWZmLnJhY2ZJZCk7XHJcbiAgICAgIGZvcm1hdHRlZFN0ciA9IGZvcm1hdHRlZFN0ci5yZXBsYWNlKCd7ZW1haWxBZGRyZXNzfScsIHN0YWZmLmVtYWlsQWRkcmVzcyk7XHJcbiAgICAgIGZvcm1hdHRlZFN0ciA9IGZvcm1hdHRlZFN0ci5yZXBsYWNlKCd7cGhvbmV9Jywgc3RhZmYucGhvbmUpO1xyXG5cclxuICAgICAgcmV0dXJuIGZvcm1hdHRlZFN0cjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYCR7c3RhZmYuZmlyc3ROYW1lfSAke3N0YWZmLmxhc3ROYW1lfWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIE1ldGhvZCBHZXRTdGFmZkJ5SWRcclxuICAqIEBwYXJhbSBpZCBJZCBmb3IgU3RhZmYgdG8gcmV0cmlldmVcclxuICAqIEByZXR1cm4gRnVsbCBIVFRQIHJlc3BvbnNlIGFzIE9ic2VydmFibGVcclxuICAqL1xyXG4gIHB1YmxpYyBHZXRTdGFmZkJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8U3RhZmZNZW1iZXI+IHtcclxuICAgIGlmICghdGhpcy5zdGFmZkJ5SWRDYWNoZS5nZXQoaWQpKSB7XHJcbiAgICAgIHRoaXMuc3RhZmZCeUlkQ2FjaGUuc2V0KGlkLCBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0YWZmTWVtYmVyPihudWxsKSk7XHJcblxyXG4gICAgICBjb25zdCB1cmkgPSBgL0dldFN0YWZmQnlJZGA7XHJcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsKSB7XHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnaWQnLCBpZCArICcnKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbmRSZXF1ZXN0PFN0YWZmTWVtYmVyPignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnRvUHJvbWlzZSgpLnRoZW4ociA9PiB7XHJcbiAgICAgICAgaWYgKHIgJiYgci5ib2R5KSB7XHJcbiAgICAgICAgICB0aGlzLnN0YWZmQnlJZENhY2hlLmdldChpZCkubmV4dChyLmJvZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc3RhZmZCeUlkQ2FjaGUuZ2V0KGlkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldFN0YWZmQnlJZHNcclxuICAqIEBwYXJhbSBpZCBJZCBmb3IgU3RhZmYgdG8gcmV0cmlldmVcclxuICAqIEByZXR1cm4gRnVsbCBIVFRQIHJlc3BvbnNlIGFzIE9ic2VydmFibGVcclxuICAqL1xyXG4gIHB1YmxpYyBHZXRTdGFmZkJ5SWRzKGlkOiBudW1iZXJbXSk6IE9ic2VydmFibGU8U3RhZmZNZW1iZXJbXT4ge1xyXG4gICAgY29uc3QgdXJpID0gYC9HZXRTdGFmZkJ5SWRzYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgaWQgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnaWQnLCBpZCArICcnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0PGFueT4oJ2dldCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBudWxsKS5waXBlKG1hcChyID0+IHtcclxuICAgICAgaWYgKHIgJiYgci5ib2R5KSB7XHJcbiAgICAgICAgcmV0dXJuIHIuYm9keTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBNZXRob2QgR2V0U3RhZmZCeVJhY2ZJZFxyXG4gICogQHBhcmFtIHJhY2ZJZCBSYWNmSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0U3RhZmZCeVJhY2ZJZChyYWNmSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U3RhZmZNZW1iZXI+IHtcclxuICAgIGlmICghdGhpcy5zdGFmZkJ5UmFjZklkQ2FjaGUuZ2V0KHJhY2ZJZCkpIHtcclxuICAgICAgdGhpcy5zdGFmZkJ5UmFjZklkQ2FjaGUuc2V0KHJhY2ZJZCwgbmV3IEJlaGF2aW9yU3ViamVjdDxTdGFmZk1lbWJlcj4obnVsbCkpO1xyXG4gICAgICBjb25zdCB1cmkgPSBgL0dldFN0YWZmQnlSYWNmSWRgO1xyXG4gICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgICBpZiAocmFjZklkICE9PSB1bmRlZmluZWQgJiYgcmFjZklkICE9PSBudWxsKSB7XHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncmFjZklkJywgcmFjZklkICsgJycpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbmRSZXF1ZXN0PFN0YWZmTWVtYmVyPignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnBpcGUobWFwKHIgPT4ge1xyXG4gICAgICAgIGlmIChyICYmIHIuYm9keSkge1xyXG4gICAgICAgICAgdGhpcy5zdGFmZkJ5UmFjZklkQ2FjaGUuZ2V0KHJhY2ZJZCkubmV4dChyLmJvZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnN0YWZmQnlSYWNmSWRDYWNoZS5nZXQocmFjZklkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldFN0YWZmQnlSYWNmSWRzXHJcbiAgKiBAcGFyYW0gcmFjZklkIFJhY2ZJZCBmb3IgU3RhZmYgdG8gcmV0cmlldmVcclxuICAqIEByZXR1cm4gRnVsbCBIVFRQIHJlc3BvbnNlIGFzIE9ic2VydmFibGVcclxuICAqL1xyXG4gIHB1YmxpYyBHZXRTdGFmZkJ5UmFjZklkcyhyYWNmSWQ6IG51bWJlcltdKTogT2JzZXJ2YWJsZTxTdGFmZk1lbWJlcltdPiB7XHJcbiAgICBjb25zdCB1cmkgPSBgL0dldFN0YWZmQnlSYWNmSWRzYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaWYgKHJhY2ZJZCAhPT0gdW5kZWZpbmVkICYmIHJhY2ZJZCAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdyYWNmSWQnLCByYWNmSWQgKyAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxhbnk+KCdnZXQnLCB1cmksIGhlYWRlcnMsIHBhcmFtcywgbnVsbCkucGlwZShtYXAociA9PiB7XHJcbiAgICAgIGlmIChyICYmIHIuYm9keSkge1xyXG4gICAgICAgIHJldHVybiByLmJvZHk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIFNlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYUdldFxyXG4gICogQHBhcmFtIHJhY2ZJZCBSYWNmSWQgZm9yIFN0YWZmIHRvIHJldHJpZXZlXHJcbiAgKiBAcGFyYW0gcGVvcGxlRmlyc3RJZCBUaGUgcGVvcGxlIGZpcnN0IGlkIHRvIFNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBzdGF0dXMgVGhlIHN0YXR1cyBjb2RlIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBwYXJ0aWFsTmFtZSBUaGUgcGFydGlhbCBuYW1lIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBmaXJzdE5hbWUgVGhlIGZpcnN0IG5hbWUgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIGxhc3ROYW1lIFRoZSBsYXN0IG5hbWUgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIGRpc3RyaWN0Q29kZSBUaGUgZGlzdHJpY3QgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIHBvc2l0aW9uTnVtYmVyIFRoZSBwb3NpdGlvbiBudW1iZXIgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIG9yZ2FuaXphdGlvbmFsQ29kZSBUaGUgb3JnYW5pemF0aW9uIGNvZGUgdG8gc2VhcmNoIGZvclxyXG4gICogQHBhcmFtIGVtYWlsQWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcGFyYW0gc3RhZmZUeXBlQ29kZSBUaGUgc3RhZmYgdHlwZSBjb2RlIHRvIHNlYXJjaCBmb3JcclxuICAqIEBwYXJhbSBzdGFmZklkIFRoZSBzdGFmZiBpZCB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgU2VhcmNoU3RhZmZCeVNlYXJjaENyaXRlcmlhR2V0KHJhY2ZJZDogbnVtYmVyW10sIHBlb3BsZUZpcnN0SWQ6IHN0cmluZywgc3RhdHVzOiBzdHJpbmcsIHBhcnRpYWxOYW1lOiBzdHJpbmcsXHJcbiAgICBmaXJzdE5hbWU6IHN0cmluZywgbGFzdE5hbWU6IHN0cmluZywgZGlzdHJpY3RDb2RlOiBzdHJpbmcsIHBvc2l0aW9uTnVtYmVyOiBzdHJpbmcsIG9yZ2FuaXphdGlvbmFsQ29kZTogc3RyaW5nLFxyXG4gICAgZW1haWxBZGRyZXNzOiBzdHJpbmcsIHN0YWZmVHlwZUNvZGU6IHN0cmluZywgc3RhZmZJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTdGFmZk1lbWJlcltdPiB7XHJcbiAgICBjb25zdCB1cmkgPSBgL1NlYXJjaFN0YWZmQnlTZWFyY2hDcml0ZXJpYWA7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChyYWNmSWQgIT09IHVuZGVmaW5lZCAmJiByYWNmSWQgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncmFjZklkJywgcmFjZklkICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBlb3BsZUZpcnN0SWQgIT09IHVuZGVmaW5lZCAmJiBwZW9wbGVGaXJzdElkICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3Blb3BsZUZpcnN0SWQnLCBwZW9wbGVGaXJzdElkICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1cyAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdzdGF0dXMnLCBzdGF0dXMgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAocGFydGlhbE5hbWUgIT09IHVuZGVmaW5lZCAmJiBwYXJ0aWFsTmFtZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwYXJ0aWFsTmFtZScsIHBhcnRpYWxOYW1lICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpcnN0TmFtZSAhPT0gdW5kZWZpbmVkICYmIGZpcnN0TmFtZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdmaXJzdE5hbWUnLCBmaXJzdE5hbWUgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAobGFzdE5hbWUgIT09IHVuZGVmaW5lZCAmJiBsYXN0TmFtZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdsYXN0TmFtZScsIGxhc3ROYW1lICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGRpc3RyaWN0Q29kZSAhPT0gdW5kZWZpbmVkICYmIGRpc3RyaWN0Q29kZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdkaXN0cmljdENvZGUnLCBkaXN0cmljdENvZGUgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAocG9zaXRpb25OdW1iZXIgIT09IHVuZGVmaW5lZCAmJiBwb3NpdGlvbk51bWJlciAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwb3NpdGlvbk51bWJlcicsIHBvc2l0aW9uTnVtYmVyICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9yZ2FuaXphdGlvbmFsQ29kZSAhPT0gdW5kZWZpbmVkICYmIG9yZ2FuaXphdGlvbmFsQ29kZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdvcmdhbml6YXRpb25hbENvZGUnLCBvcmdhbml6YXRpb25hbENvZGUgKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoZW1haWxBZGRyZXNzICE9PSB1bmRlZmluZWQgJiYgZW1haWxBZGRyZXNzICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2VtYWlsQWRkcmVzcycsIGVtYWlsQWRkcmVzcyArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChzdGFmZlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgc3RhZmZUeXBlQ29kZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdzdGFmZlR5cGVDb2RlJywgc3RhZmZUeXBlQ29kZSArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChzdGFmZklkICE9PSB1bmRlZmluZWQgJiYgc3RhZmZJZCAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdzdGFmZklkJywgc3RhZmZJZCArICcnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxhbnk+KCdnZXQnLCB1cmksIGhlYWRlcnMsIHBhcmFtcywgbnVsbCkucGlwZShtYXAociA9PiB7XHJcbiAgICAgIGlmIChyICYmIHIuYm9keSkge1xyXG4gICAgICAgIHJldHVybiByLmJvZHk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBTZWFyY2hBY3RpdmVTdGFmZkJ5TmFtZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFN0YWZmTWVtYmVyW10+IHtcclxuICAgIGlmICghdGhpcy5zdGFmZlNlYXJjaENhY2hlLmdldChuYW1lKSkge1xyXG4gICAgICB0aGlzLnN0YWZmU2VhcmNoQ2FjaGUuc2V0KG5hbWUsIG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhZmZNZW1iZXJbXT4oW10pKTtcclxuXHJcbiAgICAgIHRoaXMuU2VhcmNoU3RhZmZCeVNlYXJjaENyaXRlcmlhR2V0KG51bGwsIG51bGwsICdhY3RpdmUnLCBuYW1lLFxyXG4gICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpLnRvUHJvbWlzZSgpLnRoZW4oKHJlc3VsdHMpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3RhZmZTZWFyY2hDYWNoZS5nZXQobmFtZSkubmV4dChyZXN1bHRzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnN0YWZmU2VhcmNoQ2FjaGUuZ2V0KG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBNZXRob2QgU2VhcmNoU3RhZmZCeVNlYXJjaENyaXRlcmlhUG9zdFxyXG4gICogQHBhcmFtIHNlYXJjaENyaXRlcmlhIFJhY2ZJZCBmb3IgU3RhZmYgdG8gcmV0cmlldmVcclxuICAqIEByZXR1cm4gRnVsbCBIVFRQIHJlc3BvbnNlIGFzIE9ic2VydmFibGVcclxuICAqL1xyXG4gIHB1YmxpYyBTZWFyY2hTdGFmZkJ5U2VhcmNoQ3JpdGVyaWFQb3N0KHNlYXJjaENyaXRlcmlhOiBTZWFyY2hDcml0ZXJpYSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPGFueT4+IHtcclxuICAgIGNvbnN0IHVyaSA9IGAvU2VhcmNoU3RhZmZCeVNlYXJjaENyaXRlcmlhYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxhbnk+KCdwb3N0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIEpTT04uc3RyaW5naWZ5KHNlYXJjaENyaXRlcmlhKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmRSZXF1ZXN0PFQ+KG1ldGhvZDogc3RyaW5nLCB1cmk6IHN0cmluZywgaGVhZGVyczogSHR0cEhlYWRlcnMsIHBhcmFtczogSHR0cFBhcmFtcywgYm9keTogYW55KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VD4+IHtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnT2NwLUFwaW0tU3Vic2NyaXB0aW9uLUtleScsIHRoaXMuY29uZmlnLmFwaUtleSk7XHJcbiAgICBpZiAobWV0aG9kID09PSAnZ2V0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdwdXQnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFQ+KHRoaXMuY29uZmlnLmhvc3QgKyB1cmksIGJvZHksXHJcbiAgICAgICAgeyBoZWFkZXJzOiBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKSwgcGFyYW1zOiBwYXJhbXMsIG9ic2VydmU6ICdyZXNwb25zZScgfSk7XHJcbiAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ3Bvc3QnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCBib2R5LFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdkZWxldGUnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPFQ+KHRoaXMuY29uZmlnLmhvc3QgKyB1cmksIHsgaGVhZGVyczogaGVhZGVycywgcGFyYW1zOiBwYXJhbXMsIG9ic2VydmU6ICdyZXNwb25zZScgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCByZXF1ZXN0OiAnICsgbWV0aG9kKTtcclxuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3coJ1Vuc3VwcG9ydGVkIHJlcXVlc3Q6ICcgKyBtZXRob2QpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=