UNPKG

@xivapi/angular-client

Version:

xivapi client library (service and models) for angular applications

271 lines 34.7 kB
import { Inject, Injectable } from '@angular/core'; import { HttpParams } from '@angular/common/http'; import { GCF_URL } from './xivapi-client.module'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; export class XivapiService { constructor(http, GCFUrl) { this.http = http; this.GCFUrl = GCFUrl; } /** * Makes a request on a given endpoint with an id. * * @param endpoint The endpoint to use for the request. * @param id The id of the resource for the request. * @param options The options of the request, optional. */ get(endpoint, id, options) { return this.request(`/${endpoint}/${id}`, options); } /** * Makes a request on a given endpoint with an id. * * @param query Text to search inside the lore. * @param lang * @param allLanguages should it include Text_*? * @param dataColumns Additional data you want to fetch. * @param page data page to get * @param options Options of the request. */ searchLore(query, lang = 'en', allLanguages = false, dataColumns = [], page = 1, options = {}) { if (!options.extraQueryParams) { options.extraQueryParams = {}; } Object.assign(options.extraQueryParams, { string: query, language: lang, page: page.toString() }); if (dataColumns && dataColumns.length > 0) { const columns = [ 'Context', 'Source', 'SourceID', 'Text', ...dataColumns.map(col => `Data.${col}`) ]; if (allLanguages) { columns.push('Text_*'); } options.extraQueryParams['columns'] = columns.join(','); } return this.request('/lore', options); } /** * Makes a request to a given endpoint to list resources available. * * @param endpoint The endpoint to use for the request. * @param options The options of the request, optional. */ getList(endpoint, options) { return this.request(`/${endpoint}`, options); } /** * Searches for something in the api using the /Search endpoint. * * @param options Search options, see http://xivapi.com/docs/Search for more details. */ search(options) { if (options.filters) { const filterChain = options.filters.reduce((chain, filter) => { const value = filter.value instanceof Array ? filter.value.join(';') : (filter.value || '').toString(); return `${chain}${filter.column}${filter.operator}${value},`; }, '').slice(0, -1); if (!options.extraQueryParams) { options.extraQueryParams = {}; } options.extraQueryParams['filters'] = filterChain; } return this.request('/Search', options); } /** * Gets a character using the /Character endpoint. * * @param lodestoneId LodestoneID of the character to get. * @param options Options of the request. * @param details Specific details you want to get. */ getCharacter(lodestoneId, options, details) { return this.request(`/character/${lodestoneId}${details ? '/' + details : ''}`, options); } /** * Gets character verification state using /character/<id>/verification endpoint * * @param lodestoneId LodestoneID of the character to verify. * @param options Options of the request. */ getCharacterVerification(lodestoneId, options) { return this.request(`/character/${lodestoneId}/verification`, options); } /** * Gets the current list of available servers. Useful for character search queries. */ getServerList() { return this.request(`/servers`); } /** * Gets the current list of available servers, per DC. */ getDCList() { return this.request(`/servers/dc`); } /** * Search for a character on **The Lodestone**. This does not search XIVAPI but instead it goes directly to * lodestone so the response will be "real-time". Responses are cached for 1 hour, * it is important to know that Lodestone has a ~6 hour varnish and CDN cache. * * @param name The name of the character to search, you can use + for spaces or let the API handle it for you. * If you search very short names you will get lots of responses. * This is an issue with The Lodestone and not much XIVAPI can do about it at this time. * @param server (optional) The server to search against, this is case sensitive. * You can obtain a list of valid servers via getServerList method. * @param page Search or move to a specific page. */ searchCharacter(name, server, page) { let url = `/character/search?name=${name}`; if (server !== undefined) { url += `&server=${server}`; } if (page !== undefined) { url += `&page=${page}`; } return this.request(url); } /** * Search for free companies on The Lodestone. This parses the lodestone in real time so it will be slow for non-cached responses. * All search queries are cached for 1 hour, it is important to know that Lodestone has a ~6 hour varnish and CDN cache. * This does not search XIVAPI so free companies found may not be on * the service and will be added when requested by their specified lodestone ID. * * @param name The name of the company to search, you can use + for spaces or let the API handle it for you. * If you search very short names you will get lots of responses. * This is an issue with The Lodestone and not much XIVAPI can do about it at this time. * @param server (optional) The server to search against, this is case sensitive. * You can obtain a list of valid servers via getServerList method. * @param page Search or move to a specific page. */ searchFreeCompany(name, server, page) { let url = `/freecompany/search?name=${name}`; if (server !== undefined) { url += `&server=${server}`; } if (page !== undefined) { url += `&page=${page}`; } return this.request(url); } /** * Gets character verification informations based on lodestoneId. * * @param lodestoneId LodestoneID of the character to get. * @param options Options of the request. */ verifyCharacter(lodestoneId, options) { return this.request(`/Character/${lodestoneId}/Verification`, options); } /** * Gets a free company using the /FreeCompany endpoint. * * @param lodestoneId LodestoneID of the free company to get. * @param options Options of the request. * @param details Specific details you want to get. */ getFreeCompany(lodestoneId, options, details) { return this.request(`/FreeCompany/${lodestoneId}${details ? '/' + details : ''}`, options); } /** * Gets a linkshell using the /Linkshell endpoint. * * @param lodestoneId LodestoneID of the linkshell to get. * @param options Options of the request. * @param details Specific details you want to get. */ getLinkshell(lodestoneId, options, details) { return this.request(`/Linkshell/${lodestoneId}${details ? '/' + details : ''}`, options); } /** * Gets a PvP team based on its lodestone id (string) * * @param id the id of the team to get. * @param options Options of the request */ getPvPTeam(id, options) { return this.request(`/PvPTeam/${id}`, options); } /** * Gets the list of patches using the /PatchList endpoint. * @param options Options of the request. */ getPatchList(options) { return this.request(`/PatchList`, options); } request(endpoint, params) { let queryParams = this.prepareQueryString(params); let baseUrl = XivapiService.API_BASE_URL; if (params) { if (params.baseUrl) { baseUrl = params.baseUrl; } else if (params.staging) { baseUrl = XivapiService.STAGING_API_BASE_URL; } ['staging', 'baseUrl'].forEach(key => { if (params.hasOwnProperty(key)) { queryParams.delete(key); } }); } return this.doGet(`${baseUrl}${endpoint}`, queryParams); } prepareQueryString(options) { let queryString = new HttpParams(); if (options === null || options === undefined) { return queryString; } const { extraQueryParams, ...rest } = options; Object.keys(rest) .forEach(optionKey => { if (extraQueryParams && Object.prototype.hasOwnProperty.call(extraQueryParams, optionKey)) { return; } // @ts-ignore const value = options[optionKey]; if (value instanceof Array) { queryString = queryString.set(optionKey, value.join(',')); } else { queryString = queryString.set(optionKey, value.toString()); } }); if (extraQueryParams) { Object.keys(extraQueryParams) .forEach(key => { // @ts-ignore queryString = queryString.set(key, extraQueryParams[key].toString()); }); } return queryString; } doGet(url, queryParams) { if (this.GCFUrl) { const queryString = queryParams.toString(); return this.http.get(this.GCFUrl, { params: { url: btoa(`${url}${queryString.length > 0 ? `?${queryString}` : ''}`) } }); } return this.http.get(url, { params: queryParams }); } } /** * Base url of xivapi. */ XivapiService.API_BASE_URL = 'https://xivapi.com'; XivapiService.STAGING_API_BASE_URL = 'https://staging.xivapi.com'; XivapiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: XivapiService, deps: [{ token: i1.HttpClient }, { token: GCF_URL }], target: i0.ɵɵFactoryTarget.Injectable }); XivapiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: XivapiService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: XivapiService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{ type: Inject, args: [GCF_URL] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGl2YXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNsaWVudC9zcmMvbGliL3hpdmFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBYSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQWM1RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7OztBQUkvQyxNQUFNLE9BQU8sYUFBYTtJQVF4QixZQUFvQixJQUFnQixFQUEyQixNQUFlO1FBQTFELFNBQUksR0FBSixJQUFJLENBQVk7UUFBMkIsV0FBTSxHQUFOLE1BQU0sQ0FBUztJQUM5RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksR0FBRyxDQUFVLFFBQXdCLEVBQUUsRUFBVSxFQUFFLE9BQThCO1FBQ3RGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBSSxJQUFJLFFBQVEsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksVUFBVSxDQUFDLEtBQWEsRUFBRSxPQUFlLElBQUksRUFBRSxlQUF3QixLQUFLLEVBQ2pFLGNBQXdCLEVBQUUsRUFBRSxPQUFlLENBQUMsRUFBRSxVQUF5QixFQUFFO1FBQ3pGLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7WUFDN0IsT0FBTyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztTQUMvQjtRQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFO1lBQ3RDLE1BQU0sRUFBRSxLQUFLO1lBQ2IsUUFBUSxFQUFFLElBQUk7WUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtTQUN0QixDQUFDLENBQUM7UUFFSCxJQUFJLFdB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LENBQUM7SUFDckIsQ0FBQztJQUVPLEtBQUssQ0FBSSxHQUFXLEVBQUUsV0FBdUI7UUFDbkQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsTUFBTSxXQUFXLEdBQVcsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25ELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7U0FDekg7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFJLEdBQUcsRUFBRSxFQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7O0FBMVJEOztHQUVHO0FBQ29CLDBCQUFZLEdBQVcsb0JBQXFCLENBQUE7QUFDNUMsa0NBQW9CLEdBQVcsNEJBQTZCLENBQUE7MkdBTnhFLGFBQWEsNENBUXNCLE9BQU87K0dBUjFDLGFBQWE7NEZBQWIsYUFBYTtrQkFEekIsVUFBVTs7MEJBUzhCLE1BQU07MkJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cFBhcmFtc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENoYXJhY3RlclNlYXJjaFJlc3VsdCxcbiAgUGFnaW5hdGlvbixcbiAgUHZwVGVhbSxcbiAgWGl2YXBpQ2hhcmFjdGVyT3B0aW9ucyxcbiAgWGl2YXBpRW5kcG9pbnQsXG4gIFhpdmFwaUxpc3QsXG4gIFhpdmFwaU9wdGlvbnMsXG4gIFhpdmFwaVJlcXVlc3RPcHRpb25zLFxuICBYaXZhcGlTZWFyY2hPcHRpb25zXG59IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtDaGFyYWN0ZXJSZXNwb25zZSwgQ2hhcmFjdGVyVmVyaWZpY2F0aW9ufSBmcm9tICcuL21vZGVsL3NjaGVtYS9jaGFyYWN0ZXInO1xuaW1wb3J0IHtHQ0ZfVVJMfSBmcm9tICcuL3hpdmFwaS1jbGllbnQubW9kdWxlJztcbmltcG9ydCB7TG9yZVNlYXJjaFJlc3VsdH0gZnJvbSAnLi9tb2RlbC9sb3JlLXNlYXJjaC1yZXN1bHQnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgWGl2YXBpU2VydmljZSB7XG5cbiAgLyoqXG4gICAqIEJhc2UgdXJsIG9mIHhpdmFwaS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQVBJX0JBU0VfVVJMOiBzdHJpbmcgPSAnaHR0cHM6Ly94aXZhcGkuY29tJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVEFHSU5HX0FQSV9CQVNFX1VSTDogc3RyaW5nID0gJ2h0dHBzOi8vc3RhZ2luZy54aXZhcGkuY29tJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIEBJbmplY3QoR0NGX1VSTCkgcHJpdmF0ZSBHQ0ZVcmw/OiBzdHJpbmcpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHJlcXVlc3Qgb24gYSBnaXZlbiBlbmRwb2ludCB3aXRoIGFuIGlkLlxuICAgKlxuICAgKiBAcGFyYW0gZW5kcG9pbnQgVGhlIGVuZHBvaW50IHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHJlc291cmNlIGZvciB0aGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIHJlcXVlc3QsIG9wdGlvbmFsLlxuICAgKi9cbiAgcHVibGljIGdldDxUID0gYW55PihlbmRwb2ludDogWGl2YXBpRW5kcG9pbnQsIGlkOiBudW1iZXIsIG9wdGlvbnM/OiBYaXZhcGlSZXF1ZXN0T3B0aW9ucyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oYC8ke2VuZHBvaW50fS8ke2lkfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgcmVxdWVzdCBvbiBhIGdpdmVuIGVuZHBvaW50IHdpdGggYW4gaWQuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeSBUZXh0IHRvIHNlYXJjaCBpbnNpZGUgdGhlIGxvcmUuXG4gICAqIEBwYXJhbSBsYW5nXG4gICAqIEBwYXJhbSBhbGxMYW5ndWFnZXMgc2hvdWxkIGl0IGluY2x1ZGUgVGV4dF8qP1xuICAgKiBAcGFyYW0gZGF0YUNvbHVtbnMgQWRkaXRpb25hbCBkYXRhIHlvdSB3YW50IHRvIGZldGNoLlxuICAgKiBAcGFyYW0gcGFnZSBkYXRhIHBhZ2UgdG8gZ2V0XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoTG9yZShxdWVyeTogc3RyaW5nLCBsYW5nOiBzdHJpbmcgPSAnZW4nLCBhbGxMYW5ndWFnZXM6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YUNvbHVtbnM6IHN0cmluZ1tdID0gW10sIHBhZ2U6IG51bWJlciA9IDEsIG9wdGlvbnM6IFhpdmFwaU9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8TG9yZVNlYXJjaFJlc3VsdD4ge1xuICAgIGlmICghb3B0aW9ucy5leHRyYVF1ZXJ5UGFyYW1zKSB7XG4gICAgICBvcHRpb25zLmV4dHJhUXVlcnlQYXJhbXMgPSB7fTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMuZXh0cmFRdWVyeVBhcmFtcywge1xuICAgICAgc3RyaW5nOiBxdWVyeSxcbiAgICAgIGxhbmd1YWdlOiBsYW5nLFxuICAgICAgcGFnZTogcGFnZS50b1N0cmluZygpXG4gICAgfSk7XG5cbiAgICBpZiAoZGF0YUNvbHVtbnMgJiYgZGF0YUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgICAgICdDb250ZXh0JyxcbiAgICAgICAgJ1NvdXJjZScsXG4gICAgICAgICdTb3VyY2VJRCcsXG4gICAgICAgICdUZXh0JyxcbiAgICAgICAgLi4uZGF0YUNvbHVtbnMubWFwKGNvbCA9PiBgRGF0YS4ke2NvbH1gKVxuICAgICAgXTtcbiAgICAgIGlmIChhbGxMYW5ndWFnZXMpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKCdUZXh0XyonKTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9ucy5leHRyYVF1ZXJ5UGFyYW1zWydjb2x1bW5zJ10gPSBjb2x1bW5zLmpvaW4oJywnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMb3JlU2VhcmNoUmVzdWx0PignL2xvcmUnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHJlcXVlc3QgdG8gYSBnaXZlbiBlbmRwb2ludCB0byBsaXN0IHJlc291cmNlcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCBUaGUgZW5kcG9pbnQgdG8gdXNlIGZvciB0aGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIHJlcXVlc3QsIG9wdGlvbmFsLlxuICAgKi9cbiAgcHVibGljIGdldExpc3Q8VCA9IGFueT4oZW5kcG9pbnQ6IFhpdmFwaUVuZHBvaW50LCBvcHRpb25zPzogWGl2YXBpUmVxdWVzdE9wdGlvbnMpOiBPYnNlcnZhYmxlPFhpdmFwaUxpc3Q8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFhpdmFwaUxpc3Q8VD4+KGAvJHtlbmRwb2ludH1gLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3Igc29tZXRoaW5nIGluIHRoZSBhcGkgdXNpbmcgdGhlIC9TZWFyY2ggZW5kcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFNlYXJjaCBvcHRpb25zLCBzZWUgaHR0cDovL3hpdmFwaS5jb20vZG9jcy9TZWFyY2ggZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBzZWFyY2gob3B0aW9uczogWGl2YXBpU2VhcmNoT3B0aW9ucyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKG9wdGlvbnMuZmlsdGVycykge1xuICAgICAgY29uc3QgZmlsdGVyQ2hhaW46IHN0cmluZyA9IG9wdGlvbnMuZmlsdGVycy5yZWR1Y2UoKGNoYWluLCBmaWx0ZXIpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyA9IGZpbHRlci52YWx1ZSBpbnN0YW5jZW9mIEFycmF5ID8gZmlsdGVyLnZhbHVlLmpvaW4oJzsnKSA6IChmaWx0ZXIudmFsdWUgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBgJHtjaGFpbn0ke2ZpbHRlci5jb2x1bW59JHtmaWx0ZXIub3BlcmF0b3J9JHt2YWx1ZX0sYDtcbiAgICAgIH0sICcnKS5zbGljZSgwLCAtMSk7XG5cbiAgICAgIGlmICghb3B0aW9ucy5leHRyYVF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIG9wdGlvbnMuZXh0cmFRdWVyeVBhcmFtcyA9IHt9O1xuICAgICAgfVxuICAgICAgb3B0aW9ucy5leHRyYVF1ZXJ5UGFyYW1zWydmaWx0ZXJzJ10gPSBmaWx0ZXJDaGFpbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PGFueT4oJy9TZWFyY2gnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgY2hhcmFjdGVyIHVzaW5nIHRoZSAvQ2hhcmFjdGVyIGVuZHBvaW50LlxuICAgKlxuICAgKiBAcGFyYW0gbG9kZXN0b25lSWQgTG9kZXN0b25lSUQgb2YgdGhlIGNoYXJhY3RlciB0byBnZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2YgdGhlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSBkZXRhaWxzIFNwZWNpZmljIGRldGFpbHMgeW91IHdhbnQgdG8gZ2V0LlxuICAgKi9cbiAgcHVibGljIGdldENoYXJhY3Rlcihsb2Rlc3RvbmVJZDogbnVtYmVyIHwgc3RyaW5nLCBvcHRpb25zPzogWGl2YXBpQ2hhcmFjdGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzPzogJ0ZyaWVuZHMnIHwgJ0FjaGlldmVtZW50cycgfCAnR2VhcnNldHMnIHwgJ1JlY29yZCcgfCAnRnJlZUNvbXBhbnknKTogT2JzZXJ2YWJsZTxDaGFyYWN0ZXJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8Q2hhcmFjdGVyUmVzcG9uc2U+KGAvY2hhcmFjdGVyLyR7bG9kZXN0b25lSWR9JHtkZXRhaWxzID8gJy8nICsgZGV0YWlscyA6ICcnfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY2hhcmFjdGVyIHZlcmlmaWNhdGlvbiBzdGF0ZSB1c2luZyAvY2hhcmFjdGVyLzxpZD4vdmVyaWZpY2F0aW9uIGVuZHBvaW50XG4gICAqXG4gICAqIEBwYXJhbSBsb2Rlc3RvbmVJZCBMb2Rlc3RvbmVJRCBvZiB0aGUgY2hhcmFjdGVyIHRvIHZlcmlmeS5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHB1YmxpYyBnZXRDaGFyYWN0ZXJWZXJpZmljYXRpb24obG9kZXN0b25lSWQ6IG51bWJlciB8IHN0cmluZywgb3B0aW9ucz86IFhpdmFwaUNoYXJhY3Rlck9wdGlvbnMpOiBPYnNlcnZhYmxlPENoYXJhY3RlclZlcmlmaWNhdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8Q2hhcmFjdGVyVmVyaWZpY2F0aW9uPihgL2NoYXJhY3Rlci8ke2xvZGVzdG9uZUlkfS92ZXJpZmljYXRpb25gLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpc3Qgb2YgYXZhaWxhYmxlIHNlcnZlcnMuIFVzZWZ1bCBmb3IgY2hhcmFjdGVyIHNlYXJjaCBxdWVyaWVzLlxuICAgKi9cbiAgcHVibGljIGdldFNlcnZlckxpc3QoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8c3RyaW5nW10+KGAvc2VydmVyc2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgbGlzdCBvZiBhdmFpbGFibGUgc2VydmVycywgcGVyIERDLlxuICAgKi9cbiAgcHVibGljIGdldERDTGlzdCgpOiBPYnNlcnZhYmxlPHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDx7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nW10gfT4oYC9zZXJ2ZXJzL2RjYCk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGZvciBhIGNoYXJhY3RlciBvbiAqKlRoZSBMb2Rlc3RvbmUqKi4gVGhpcyBkb2VzIG5vdCBzZWFyY2ggWElWQVBJIGJ1dCBpbnN0ZWFkIGl0IGdvZXMgZGlyZWN0bHkgdG9cbiAgICogbG9kZXN0b25lIHNvIHRoZSByZXNwb25zZSB3aWxsIGJlIFwicmVhbC10aW1lXCIuIFJlc3BvbnNlcyBhcmUgY2FjaGVkIGZvciAxIGhvdXIsXG4gICAqIGl0IGlzIGltcG9ydGFudCB0byBrbm93IHRoYXQgTG9kZXN0b25lIGhhcyBhIH42IGhvdXIgdmFybmlzaCBhbmQgQ0ROIGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHRvIHNlYXJjaCwgeW91IGNhbiB1c2UgKyBmb3Igc3BhY2VzIG9yIGxldCB0aGUgQVBJIGhhbmRsZSBpdCBmb3IgeW91LlxuICAgKiAgSWYgeW91IHNlYXJjaCB2ZXJ5IHNob3J0IG5hbWVzIHlvdSB3aWxsIGdldCBsb3RzIG9mIHJlc3BvbnNlcy5cbiAgICogIFRoaXMgaXMgYW4gaXNzdWUgd2l0aCBUaGUgTG9kZXN0b25lIGFuZCBub3QgbXVjaCBYSVZBUEkgY2FuIGRvIGFib3V0IGl0IGF0IHRoaXMgdGltZS5cbiAgICogQHBhcmFtIHNlcnZlciAob3B0aW9uYWwpIFRoZSBzZXJ2ZXIgdG8gc2VhcmNoIGFnYWluc3QsIHRoaXMgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAqICBZb3UgY2FuIG9idGFpbiBhIGxpc3Qgb2YgdmFsaWQgc2VydmVycyB2aWEgZ2V0U2VydmVyTGlzdCBtZXRob2QuXG4gICAqIEBwYXJhbSBwYWdlIFNlYXJjaCBvciBtb3ZlIHRvIGEgc3BlY2lmaWMgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBzZWFyY2hDaGFyYWN0ZXIobmFtZTogc3RyaW5nLCBzZXJ2ZXI/OiBzdHJpbmcsIHBhZ2U/OiBudW1iZXIpOiBPYnNlcnZhYmxlPENoYXJhY3RlclNlYXJjaFJlc3VsdD4ge1xuICAgIGxldCB1cmw6IHN0cmluZyA9IGAvY2hhcmFjdGVyL3NlYXJjaD9uYW1lPSR7bmFtZX1gO1xuICAgIGlmIChzZXJ2ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXJsICs9IGAmc2VydmVyPSR7c2VydmVyfWA7XG4gICAgfVxuICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVybCArPSBgJnBhZ2U9JHtwYWdlfWA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8Q2hhcmFjdGVyU2VhcmNoUmVzdWx0Pih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBmb3IgZnJlZSBjb21wYW5pZXMgb24gVGhlIExvZGVzdG9uZS4gVGhpcyBwYXJzZXMgdGhlIGxvZGVzdG9uZSBpbiByZWFsIHRpbWUgc28gaXQgd2lsbCBiZSBzbG93IGZvciBub24tY2FjaGVkIHJlc3BvbnNlcy5cbiAgICogQWxsIHNlYXJjaCBxdWVyaWVzIGFyZSBjYWNoZWQgZm9yIDEgaG91ciwgaXQgaXMgaW1wb3J0YW50IHRvIGtub3cgdGhhdCBMb2Rlc3RvbmUgaGFzIGEgfjYgaG91ciB2YXJuaXNoIGFuZCBDRE4gY2FjaGUuXG4gICAqIFRoaXMgZG9lcyBub3Qgc2VhcmNoIFhJVkFQSSBzbyBmcmVlIGNvbXBhbmllcyBmb3VuZCBtYXkgbm90IGJlIG9uXG4gICAqIHRoZSBzZXJ2aWNlIGFuZCB3aWxsIGJlIGFkZGVkIHdoZW4gcmVxdWVzdGVkIGJ5IHRoZWlyIHNwZWNpZmllZCBsb2Rlc3RvbmUgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb21wYW55IHRvIHNlYXJjaCwgeW91IGNhbiB1c2UgKyBmb3Igc3BhY2VzIG9yIGxldCB0aGUgQVBJIGhhbmRsZSBpdCBmb3IgeW91LlxuICAgKiAgSWYgeW91IHNlYXJjaCB2ZXJ5IHNob3J0IG5hbWVzIHlvdSB3aWxsIGdldCBsb3RzIG9mIHJlc3BvbnNlcy5cbiAgICogIFRoaXMgaXMgYW4gaXNzdWUgd2l0aCBUaGUgTG9kZXN0b25lIGFuZCBub3QgbXVjaCBYSVZBUEkgY2FuIGRvIGFib3V0IGl0IGF0IHRoaXMgdGltZS5cbiAgICogQHBhcmFtIHNlcnZlciAob3B0aW9uYWwpIFRoZSBzZXJ2ZXIgdG8gc2VhcmNoIGFnYWluc3QsIHRoaXMgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAqICBZb3UgY2FuIG9idGFpbiBhIGxpc3Qgb2YgdmFsaWQgc2VydmVycyB2aWEgZ2V0U2VydmVyTGlzdCBtZXRob2QuXG4gICAqIEBwYXJhbSBwYWdlIFNlYXJjaCBvciBtb3ZlIHRvIGEgc3BlY2lmaWMgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBzZWFyY2hGcmVlQ29tcGFueShuYW1lOiBzdHJpbmcsIHNlcnZlcj86IHN0cmluZywgcGFnZT86IG51bWJlcik6IE9ic2VydmFibGU8eyBSZXN1bHRzOiBhbnlbXSwgUGFnaW5hdGlvbjogUGFnaW5hdGlvbiB9PiB7XG4gICAgbGV0IHVybDogc3RyaW5nID0gYC9mcmVlY29tcGFueS9zZWFyY2g/bmFtZT0ke25hbWV9YDtcbiAgICBpZiAoc2VydmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVybCArPSBgJnNlcnZlcj0ke3NlcnZlcn1gO1xuICAgIH1cbiAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cmwgKz0gYCZwYWdlPSR7cGFnZX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PHsgUmVzdWx0czogYW55W10sIFBhZ2luYXRpb246IFBhZ2luYXRpb24gfT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNoYXJhY3RlciB2ZXJpZmljYXRpb24gaW5mb3JtYXRpb25zIGJhc2VkIG9uIGxvZGVzdG9uZUlkLlxuICAgKlxuICAgKiBAcGFyYW0gbG9kZXN0b25lSWQgTG9kZXN0b25lSUQgb2YgdGhlIGNoYXJhY3RlciB0byBnZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBwdWJsaWMgdmVyaWZ5Q2hhcmFjdGVyKGxvZGVzdG9uZUlkOiBudW1iZXIsIG9wdGlvbnM/OiBYaXZhcGlDaGFyYWN0ZXJPcHRpb25zKTogT2JzZXJ2YWJsZTxDaGFyYWN0ZXJWZXJpZmljYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PGFueT4oYC9DaGFyYWN0ZXIvJHtsb2Rlc3RvbmVJZH0vVmVyaWZpY2F0aW9uYCwgb3B0aW9ucyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXRzIGEgZnJlZSBjb21wYW55IHVzaW5nIHRoZSAvRnJlZUNvbXBhbnkgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSBsb2Rlc3RvbmVJZCBMb2Rlc3RvbmVJRCBvZiB0aGUgZnJlZSBjb21wYW55IHRvIGdldC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBvZiB0aGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIGRldGFpbHMgU3BlY2lmaWMgZGV0YWlscyB5b3Ugd2FudCB0byBnZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0RnJlZUNvbXBhbnkobG9kZXN0b25lSWQ6IG51bWJlciB8IHN0cmluZywgb3B0aW9ucz86IFhpdmFwaU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzPzogJ21lbWJlcnMnIHwgJ3JlY29yZCcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8YW55PihgL0ZyZWVDb21wYW55LyR7bG9kZXN0b25lSWR9JHtkZXRhaWxzID8gJy8nICsgZGV0YWlscyA6ICcnfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBsaW5rc2hlbGwgdXNpbmcgdGhlIC9MaW5rc2hlbGwgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSBsb2Rlc3RvbmVJZCBMb2Rlc3RvbmVJRCBvZiB0aGUgbGlua3NoZWxsIHRvIGdldC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBvZiB0aGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIGRldGFpbHMgU3BlY2lmaWMgZGV0YWlscyB5b3Ugd2FudCB0byBnZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0TGlua3NoZWxsKGxvZGVzdG9uZUlkOiBudW1iZXIgfCBzdHJpbmcsIG9wdGlvbnM/OiBYaXZhcGlPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM/OiAncmVjb3JkJyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxhbnk+KGAvTGlua3NoZWxsLyR7bG9kZXN0b25lSWR9JHtkZXRhaWxzID8gJy8nICsgZGV0YWlscyA6ICcnfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBQdlAgdGVhbSBiYXNlZCBvbiBpdHMgbG9kZXN0b25lIGlkIChzdHJpbmcpXG4gICAqXG4gICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHRlYW0gdG8gZ2V0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIG9mIHRoZSByZXF1ZXN0XG4gICAqL1xuICBwdWJsaWMgZ2V0UHZQVGVhbShpZDogc3RyaW5nLCBvcHRpb25zPzogWGl2YXBpT3B0aW9ucyk6IE9ic2VydmFibGU8UHZwVGVhbT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8UHZwVGVhbT4oYC9QdlBUZWFtLyR7aWR9YCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBwYXRjaGVzIHVzaW5nIHRoZSAvUGF0Y2hMaXN0IGVuZHBvaW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIG9mIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgcHVibGljIGdldFBhdGNoTGlzdChvcHRpb25zPzogWGl2YXBpT3B0aW9ucyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxhbnk+KGAvUGF0Y2hMaXN0YCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVxdWVzdDxUPihlbmRwb2ludDogc3RyaW5nLCBwYXJhbXM/OiBYaXZhcGlPcHRpb25zKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gdGhpcy5wcmVwYXJlUXVlcnlTdHJpbmcocGFyYW1zKTtcbiAgICBsZXQgYmFzZVVybDogc3RyaW5nID0gWGl2YXBpU2VydmljZS5BUElfQkFTRV9VUkw7XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgaWYgKHBhcmFtcy5iYXNlVXJsKSB7XG4gICAgICAgIGJhc2VVcmwgPSBwYXJhbXMuYmFzZVVybDtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnN0YWdpbmcpIHtcbiAgICAgICAgYmFzZVVybCA9IFhpdmFwaVNlcnZpY2UuU1RBR0lOR19BUElfQkFTRV9VUkw7XG4gICAgICB9XG5cbiAgICAgIFsnc3RhZ2luZycsICdiYXNlVXJsJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBxdWVyeVBhcmFtcy5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRvR2V0PGFueT4oYCR7YmFzZVVybH0ke2VuZHBvaW50fWAsIHF1ZXJ5UGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVF1ZXJ5U3RyaW5nKG9wdGlvbnM/OiBYaXZhcGlPcHRpb25zKTogSHR0cFBhcmFtcyB7XG4gICAgbGV0IHF1ZXJ5U3RyaW5nOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBxdWVyeVN0cmluZztcbiAgICB9XG5cbiAgICBjb25zdCB7ZXh0cmFRdWVyeVBhcmFtcywgLi4ucmVzdH0gPSBvcHRpb25zO1xuICAgIE9iamVjdC5rZXlzKHJlc3QpXG4gICAgICAuZm9yRWFjaChvcHRpb25LZXkgPT4ge1xuICAgICAgICBpZiAoZXh0cmFRdWVyeVBhcmFtcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXh0cmFRdWVyeVBhcmFtcywgb3B0aW9uS2V5KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgdmFsdWU6IGFueSA9IG9wdGlvbnNbb3B0aW9uS2V5XSBhcyBhbnk7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZy5zZXQob3B0aW9uS2V5LCB2YWx1ZS5qb2luKCcsJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmcuc2V0KG9wdGlvbktleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGlmIChleHRyYVF1ZXJ5UGFyYW1zKSB7XG4gICAgICBPYmplY3Qua2V5cyhleHRyYVF1ZXJ5UGFyYW1zKVxuICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nLnNldChrZXksIGV4dHJhUXVlcnlQYXJhbXNba2V5XS50b1N0cmluZygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVyeVN0cmluZztcbiAgfVxuXG4gIHByaXZhdGUgZG9HZXQ8VD4odXJsOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgaWYgKHRoaXMuR0NGVXJsKSB7XG4gICAgICBjb25zdCBxdWVyeVN0cmluZzogc3RyaW5nID0gcXVlcnlQYXJhbXMudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHRoaXMuR0NGVXJsLCB7cGFyYW1zOiB7dXJsOiBidG9hKGAke3VybH0ke3F1ZXJ5U3RyaW5nLmxlbmd0aCA+IDAgPyBgPyR7cXVlcnlTdHJpbmd9YCA6ICcnfWApfX0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih1cmwsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSk7XG4gIH1cbn1cbiJdfQ==