UNPKG

@harbor/ui

Version:

Harbor shared UI components based on Clarity and Angular6

436 lines (435 loc) 38 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Http } from "@angular/http"; import { Injectable, Inject } from "@angular/core"; import { SERVICE_CONFIG } from "../service.config"; import { buildHttpRequestOptions, HTTP_JSON_OPTIONS, HTTP_GET_OPTIONS } from "../utils"; import { RequestQueryParams } from "./RequestQueryParams"; /** * Define the service methods to handle the replication (rule and job) related things. * * * * @abstract * class ReplicationService * @abstract */ export class ReplicationService { } if (false) { /** * Get the replication rules. * Set the argument 'projectId' to limit the data scope to the specified project; * set the argument 'ruleName' to return the rule only match the name pattern; * if pagination needed, use the queryParams to add query parameters. * * @abstract * ** deprecated param {(number | string)} [projectId] * ** deprecated param {string} [ruleName] * ** deprecated param {RequestQueryParams} [queryParams] * returns {(Observable<ReplicationRule[]> | Promise<ReplicationRule[]> | ReplicationRule[])} * * \@memberOf ReplicationService * @abstract * @param {?=} projectId * @param {?=} ruleName * @param {?=} queryParams * @return {?} */ ReplicationService.prototype.getReplicationRules = function (projectId, ruleName, queryParams) { }; /** * Get the specified replication rule. * * @abstract * ** deprecated param {(number | string)} ruleId * returns {(Observable<ReplicationRule> | Promise<ReplicationRule> | ReplicationRule)} * * \@memberOf ReplicationService * @abstract * @param {?} ruleId * @return {?} */ ReplicationService.prototype.getReplicationRule = function (ruleId) { }; /** * Create new replication rule. * * @abstract * ** deprecated param {ReplicationRule} replicationRule * returns {(Observable<any> | Promise<any> | any)} * * \@memberOf ReplicationService * @abstract * @param {?} replicationRule * @return {?} */ ReplicationService.prototype.createReplicationRule = function (replicationRule) { }; /** * Update the specified replication rule. * * @abstract * ** deprecated param {ReplicationRule} replicationRule * returns {(Observable<any> | Promise<any> | any)} * * \@memberOf ReplicationService * @abstract * @param {?} id * @param {?} rep * @return {?} */ ReplicationService.prototype.updateReplicationRule = function (id, rep) { }; /** * Delete the specified replication rule. * * @abstract * ** deprecated param {(number | string)} ruleId * returns {(Observable<any> | Promise<any> | any)} * * \@memberOf ReplicationService * @abstract * @param {?} ruleId * @return {?} */ ReplicationService.prototype.deleteReplicationRule = function (ruleId) { }; /** * Enable the specified replication rule. * * @abstract * ** deprecated param {(number | string)} ruleId * returns {(Observable<any> | Promise<any> | any)} * * \@memberOf ReplicationService * @abstract * @param {?} ruleId * @param {?} enablement * @return {?} */ ReplicationService.prototype.enableReplicationRule = function (ruleId, enablement) { }; /** * Disable the specified replication rule. * * @abstract * ** deprecated param {(number | string)} ruleId * returns {(Observable<any> | Promise<any> | any)} * * \@memberOf ReplicationService * @abstract * @param {?} ruleId * @return {?} */ ReplicationService.prototype.disableReplicationRule = function (ruleId) { }; /** * @abstract * @param {?} ruleId * @return {?} */ ReplicationService.prototype.replicateRule = function (ruleId) { }; /** * Get the jobs for the specified replication rule. * Set query parameters through 'queryParams', support: * - status * - repository * - startTime and endTime * - page * - pageSize * * @abstract * ** deprecated param {(number | string)} ruleId * ** deprecated param {RequestQueryParams} [queryParams] * returns {(Observable<ReplicationJob> | Promise<ReplicationJob> | ReplicationJob)} * * \@memberOf ReplicationService * @abstract * @param {?} ruleId * @param {?=} queryParams * @return {?} */ ReplicationService.prototype.getJobs = function (ruleId, queryParams) { }; /** * Get the log of the specified job. * * @abstract * ** deprecated param {(number | string)} jobId * returns {(Observable<string> | Promise<string> | string)} * \@memberof ReplicationService * @abstract * @param {?} jobId * @return {?} */ ReplicationService.prototype.getJobLog = function (jobId) { }; /** * @abstract * @param {?} jobId * @return {?} */ ReplicationService.prototype.stopJobs = function (jobId) { }; /** * @abstract * @return {?} */ ReplicationService.prototype.getJobBaseUrl = function () { }; } /** * Implement default service for replication rule and job. * * * * class ReplicationDefaultService * extends {ReplicationService} */ export class ReplicationDefaultService extends ReplicationService { /** * @param {?} http * @param {?} config */ constructor(http, config) { super(); this.http = http; this._ruleBaseUrl = config.replicationRuleEndpoint ? config.replicationRuleEndpoint : "/api/policies/replication"; this._jobBaseUrl = config.replicationJobEndpoint ? config.replicationJobEndpoint : "/api/jobs/replication"; this._replicateUrl = config.replicationBaseEndpoint ? config.replicationBaseEndpoint : "/api/replications"; } /** * @param {?} rule * @return {?} */ _isValidRule(rule) { return (rule !== undefined && rule != null && rule.name !== undefined && rule.name.trim() !== "" && rule.targets.length !== 0); } /** * @return {?} */ getJobBaseUrl() { return this._jobBaseUrl; } /** * @param {?=} projectId * @param {?=} ruleName * @param {?=} queryParams * @return {?} */ getReplicationRules(projectId, ruleName, queryParams) { if (!queryParams) { queryParams = new RequestQueryParams(); } if (projectId) { queryParams.set("project_id", "" + projectId); } if (ruleName) { queryParams.set("name", ruleName); } return this.http .get(this._ruleBaseUrl, buildHttpRequestOptions(queryParams)) .toPromise() .then(response => /** @type {?} */ (response.json())) .catch(error => Promise.reject(error)); } /** * @param {?} ruleId * @return {?} */ getReplicationRule(ruleId) { if (!ruleId) { return Promise.reject("Bad argument"); } /** @type {?} */ let url = `${this._ruleBaseUrl}/${ruleId}`; return this.http .get(url, HTTP_GET_OPTIONS) .toPromise() .then(response => /** @type {?} */ (response.json())) .catch(error => Promise.reject(error)); } /** * @param {?} replicationRule * @return {?} */ createReplicationRule(replicationRule) { if (!this._isValidRule(replicationRule)) { return Promise.reject("Bad argument"); } return this.http .post(this._ruleBaseUrl, JSON.stringify(replicationRule), HTTP_JSON_OPTIONS) .toPromise() .then(response => response) .catch(error => Promise.reject(error)); } /** * @param {?} id * @param {?} rep * @return {?} */ updateReplicationRule(id, rep) { if (!this._isValidRule(rep)) { return Promise.reject("Bad argument"); } /** @type {?} */ let url = `${this._ruleBaseUrl}/${id}`; return this.http .put(url, JSON.stringify(rep), HTTP_JSON_OPTIONS) .toPromise() .then(response => response) .catch(error => Promise.reject(error)); } /** * @param {?} ruleId * @return {?} */ deleteReplicationRule(ruleId) { if (!ruleId || ruleId <= 0) { return Promise.reject("Bad argument"); } /** @type {?} */ let url = `${this._ruleBaseUrl}/${ruleId}`; return this.http .delete(url, HTTP_JSON_OPTIONS) .toPromise() .then(response => response) .catch(error => Promise.reject(error)); } /** * @param {?} ruleId * @return {?} */ replicateRule(ruleId) { if (!ruleId) { return Promise.reject("Bad argument"); } /** @type {?} */ let url = `${this._replicateUrl}`; return this.http .post(url, { policy_id: ruleId }, HTTP_JSON_OPTIONS) .toPromise() .then(response => response) .catch(error => Promise.reject(error)); } /** * @param {?} ruleId * @param {?} enablement * @return {?} */ enableReplicationRule(ruleId, enablement) { if (!ruleId || ruleId <= 0) { return Promise.reject("Bad argument"); } /** @type {?} */ let url = `${this._ruleBaseUrl}/${ruleId}/enablement`; return this.http .put(url, { enabled: enablement }, HTTP_JSON_OPTIONS) .toPromise() .then(response => response) .catch(error => Promise.reject(error)); } /** * @param {?} ruleId * @return {?} */ disableReplicationRule(ruleId) { if (!ruleId || ruleId <= 0) { return Promise.reject("Bad argument"); } /** @type {?} */ let url = `${this._ruleBaseUrl}/${ruleId}/enablement`; return this.http .put(url, { enabled: 0 }, HTTP_JSON_OPTIONS) .toPromise() .then(response => response) .catch(error => Promise.reject(error)); } /** * @param {?} ruleId * @param {?=} queryParams * @return {?} */ getJobs(ruleId, queryParams) { if (!ruleId || ruleId <= 0) { return Promise.reject("Bad argument"); } if (!queryParams) { queryParams = new RequestQueryParams(); } queryParams.set("policy_id", "" + ruleId); return this.http .get(this._jobBaseUrl, buildHttpRequestOptions(queryParams)) .toPromise() .then(response => { /** @type {?} */ let result = { metadata: { xTotalCount: 0 }, data: [] }; if (response && response.headers) { /** @type {?} */ let xHeader = response.headers.get("X-Total-Count"); if (xHeader) { result.metadata.xTotalCount = parseInt(xHeader, 0); } } result.data = /** @type {?} */ (response.json()); if (result.metadata.xTotalCount === 0) { if (result.data && result.data.length > 0) { result.metadata.xTotalCount = result.data.length; } } return result; }) .catch(error => Promise.reject(error)); } /** * @param {?} jobId * @return {?} */ getJobLog(jobId) { if (!jobId || jobId <= 0) { return Promise.reject("Bad argument"); } /** @type {?} */ let logUrl = `${this._jobBaseUrl}/${jobId}/log`; return this.http .get(logUrl, HTTP_GET_OPTIONS) .toPromise() .then(response => response.text()) .catch(error => Promise.reject(error)); } /** * @param {?} jobId * @return {?} */ stopJobs(jobId) { return this.http .put(this._jobBaseUrl, JSON.stringify({ policy_id: jobId, status: "stop" }), HTTP_JSON_OPTIONS) .toPromise() .then(response => response) .catch(error => Promise.reject(error)); } } ReplicationDefaultService.decorators = [ { type: Injectable } ]; /** @nocollapse */ ReplicationDefaultService.ctorParameters = () => [ { type: Http }, { type: undefined, decorators: [{ type: Inject, args: [SERVICE_CONFIG,] }] } ]; if (false) { /** @type {?} */ ReplicationDefaultService.prototype._ruleBaseUrl; /** @type {?} */ ReplicationDefaultService.prototype._jobBaseUrl; /** @type {?} */ ReplicationDefaultService.prototype._replicateUrl; /** @type {?} */ ReplicationDefaultService.prototype.http; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGljYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoYXJib3IvdWkvIiwic291cmNlcyI6WyJzcmMvc2VydmljZS9yZXBsaWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25ELE9BQU8sRUFBRSxjQUFjLEVBQWtCLE1BQU0sbUJBQW1CLENBQUM7QUFDbkUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2pCLE1BQU0sVUFBVSxDQUFDO0FBTWxCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7QUFTMUQsTUFBTTtDQWtKTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVELE1BQU0sZ0NBQWlDLFNBQVEsa0JBQWtCOzs7OztJQUsvRCxZQUNVLE1BQ2dCLE1BQXNCO1FBRTlDLEtBQUssRUFBRSxDQUFDO1FBSEEsU0FBSSxHQUFKLElBQUk7UUFJWixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUI7WUFDaEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUI7WUFDaEMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLHNCQUFzQjtZQUM5QyxDQUFDLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtZQUMvQixDQUFDLENBQUMsdUJBQXVCLENBQUM7UUFDNUIsSUFB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QUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQzthQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Ozs7WUFuUDVDLFVBQVU7Ozs7WUFuTEYsSUFBSTs0Q0EyTFIsTUFBTSxTQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwIH0gZnJvbSBcIkBhbmd1bGFyL2h0dHBcIjtcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgU0VSVklDRV9DT05GSUcsIElTZXJ2aWNlQ29uZmlnIH0gZnJvbSBcIi4uL3NlcnZpY2UuY29uZmlnXCI7XG5pbXBvcnQge1xuICBidWlsZEh0dHBSZXF1ZXN0T3B0aW9ucyxcbiAgSFRUUF9KU09OX09QVElPTlMsXG4gIEhUVFBfR0VUX09QVElPTlNcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBSZXBsaWNhdGlvbkpvYixcbiAgUmVwbGljYXRpb25SdWxlLFxuICBSZXBsaWNhdGlvbkpvYkl0ZW1cbn0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0UXVlcnlQYXJhbXMgfSBmcm9tIFwiLi9SZXF1ZXN0UXVlcnlQYXJhbXNcIjtcblxuLyoqXG4gKiBEZWZpbmUgdGhlIHNlcnZpY2UgbWV0aG9kcyB0byBoYW5kbGUgdGhlIHJlcGxpY2F0aW9uIChydWxlIGFuZCBqb2IpIHJlbGF0ZWQgdGhpbmdzLlxuICpcbiAqKlxuICogQGFic3RyYWN0XG4gKiBjbGFzcyBSZXBsaWNhdGlvblNlcnZpY2VcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlcGxpY2F0aW9uU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIHJlcGxpY2F0aW9uIHJ1bGVzLlxuICAgKiBTZXQgdGhlIGFyZ3VtZW50ICdwcm9qZWN0SWQnIHRvIGxpbWl0IHRoZSBkYXRhIHNjb3BlIHRvIHRoZSBzcGVjaWZpZWQgcHJvamVjdDtcbiAgICogc2V0IHRoZSBhcmd1bWVudCAncnVsZU5hbWUnIHRvIHJldHVybiB0aGUgcnVsZSBvbmx5IG1hdGNoIHRoZSBuYW1lIHBhdHRlcm47XG4gICAqIGlmIHBhZ2luYXRpb24gbmVlZGVkLCB1c2UgdGhlIHF1ZXJ5UGFyYW1zIHRvIGFkZCBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICogICoqIGRlcHJlY2F0ZWQgcGFyYW0geyhudW1iZXIgfCBzdHJpbmcpfSBbcHJvamVjdElkXVxuICAgKiAgKiogZGVwcmVjYXRlZCBwYXJhbSB7c3RyaW5nfSBbcnVsZU5hbWVdXG4gICAqICAqKiBkZXByZWNhdGVkIHBhcmFtIHtSZXF1ZXN0UXVlcnlQYXJhbXN9IFtxdWVyeVBhcmFtc11cbiAgICogcmV0dXJucyB7KE9ic2VydmFibGU8UmVwbGljYXRpb25SdWxlW10+IHwgUHJvbWlzZTxSZXBsaWNhdGlvblJ1bGVbXT4gfCBSZXBsaWNhdGlvblJ1bGVbXSl9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBSZXBsaWNhdGlvblNlcnZpY2VcbiAgICovXG4gIGFic3RyYWN0IGdldFJlcGxpY2F0aW9uUnVsZXMoXG4gICAgcHJvamVjdElkPzogbnVtYmVyIHwgc3RyaW5nLFxuICAgIHJ1bGVOYW1lPzogc3RyaW5nLFxuICAgIHF1ZXJ5UGFyYW1zPzogUmVxdWVzdFF1ZXJ5UGFyYW1zXG4gICk6XG4gICAgfCBPYnNlcnZhYmxlPFJlcGxpY2F0aW9uUnVsZVtdPlxuICAgIHwgUHJvbWlzZTxSZXBsaWNhdGlvblJ1bGVbXT5cbiAgICB8IFJlcGxpY2F0aW9uUnVsZVtdO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNwZWNpZmllZCByZXBsaWNhdGlvbiBydWxlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICogICoqIGRlcHJlY2F0ZWQgcGFyYW0geyhudW1iZXIgfCBzdHJpbmcpfSBydWxlSWRcbiAgICogcmV0dXJucyB7KE9ic2VydmFibGU8UmVwbGljYXRpb25SdWxlPiB8IFByb21pc2U8UmVwbGljYXRpb25SdWxlPiB8IFJlcGxpY2F0aW9uUnVsZSl9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBSZXBsaWNhdGlvblNlcnZpY2VcbiAgICovXG4gIGFic3RyYWN0IGdldFJlcGxpY2F0aW9uUnVsZShcbiAgICBydWxlSWQ6IG51bWJlciB8IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPFJlcGxpY2F0aW9uUnVsZT4gfCBQcm9taXNlPFJlcGxpY2F0aW9uUnVsZT4gfCBSZXBsaWNhdGlvblJ1bGU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBuZXcgcmVwbGljYXRpb24gcnVsZS5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqICAqKiBkZXByZWNhdGVkIHBhcmFtIHtSZXBsaWNhdGlvblJ1bGV9IHJlcGxpY2F0aW9uUnVsZVxuICAgKiByZXR1cm5zIHsoT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55KX1cbiAgICpcbiAgICogQG1lbWJlck9mIFJlcGxpY2F0aW9uU2VydmljZVxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlUmVwbGljYXRpb25SdWxlKFxuICAgIHJlcGxpY2F0aW9uUnVsZTogUmVwbGljYXRpb25SdWxlXG4gICk6IE9ic2VydmFibGU8YW55PiB8IFByb21pc2U8YW55PiB8IGFueTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBzcGVjaWZpZWQgcmVwbGljYXRpb24gcnVsZS5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqICAqKiBkZXByZWNhdGVkIHBhcmFtIHtSZXBsaWNhdGlvblJ1bGV9IHJlcGxpY2F0aW9uUnVsZVxuICAgKiByZXR1cm5zIHsoT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55KX1cbiAgICpcbiAgICogQG1lbWJlck9mIFJlcGxpY2F0aW9uU2VydmljZVxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlUmVwbGljYXRpb25SdWxlKFxuICAgIGlkOiBudW1iZXIsXG4gICAgcmVwOiBSZXBsaWNhdGlvblJ1bGVcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55O1xuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIHNwZWNpZmllZCByZXBsaWNhdGlvbiBydWxlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICogICoqIGRlcHJlY2F0ZWQgcGFyYW0geyhudW1iZXIgfCBzdHJpbmcpfSBydWxlSWRcbiAgICogcmV0dXJucyB7KE9ic2VydmFibGU8YW55PiB8IFByb21pc2U8YW55PiB8IGFueSl9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBSZXBsaWNhdGlvblNlcnZpY2VcbiAgICovXG4gIGFic3RyYWN0IGRlbGV0ZVJlcGxpY2F0aW9uUnVsZShcbiAgICBydWxlSWQ6IG51bWJlciB8IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGFueT4gfCBQcm9taXNlPGFueT4gfCBhbnk7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0aGUgc3BlY2lmaWVkIHJlcGxpY2F0aW9uIHJ1bGUuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKiAgKiogZGVwcmVjYXRlZCBwYXJhbSB7KG51bWJlciB8IHN0cmluZyl9IHJ1bGVJZFxuICAgKiByZXR1cm5zIHsoT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55KX1cbiAgICpcbiAgICogQG1lbWJlck9mIFJlcGxpY2F0aW9uU2VydmljZVxuICAgKi9cbiAgYWJzdHJhY3QgZW5hYmxlUmVwbGljYXRpb25SdWxlKFxuICAgIHJ1bGVJZDogbnVtYmVyIHwgc3RyaW5nLFxuICAgIGVuYWJsZW1lbnQ6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPGFueT4gfCBQcm9taXNlPGFueT4gfCBhbnk7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIHNwZWNpZmllZCByZXBsaWNhdGlvbiBydWxlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICogICoqIGRlcHJlY2F0ZWQgcGFyYW0geyhudW1iZXIgfCBzdHJpbmcpfSBydWxlSWRcbiAgICogcmV0dXJucyB7KE9ic2VydmFibGU8YW55PiB8IFByb21pc2U8YW55PiB8IGFueSl9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBSZXBsaWNhdGlvblNlcnZpY2VcbiAgICovXG4gIGFic3RyYWN0IGRpc2FibGVSZXBsaWNhdGlvblJ1bGUoXG4gICAgcnVsZUlkOiBudW1iZXIgfCBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55O1xuXG4gIGFic3RyYWN0IHJlcGxpY2F0ZVJ1bGUoXG4gICAgcnVsZUlkOiBudW1iZXIgfCBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGpvYnMgZm9yIHRoZSBzcGVjaWZpZWQgcmVwbGljYXRpb24gcnVsZS5cbiAgICogU2V0IHF1ZXJ5IHBhcmFtZXRlcnMgdGhyb3VnaCAncXVlcnlQYXJhbXMnLCBzdXBwb3J0OlxuICAgKiAgIC0gc3RhdHVzXG4gICAqICAgLSByZXBvc2l0b3J5XG4gICAqICAgLSBzdGFydFRpbWUgYW5kIGVuZFRpbWVcbiAgICogICAtIHBhZ2VcbiAgICogICAtIHBhZ2VTaXplXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKiAgKiogZGVwcmVjYXRlZCBwYXJhbSB7KG51bWJlciB8IHN0cmluZyl9IHJ1bGVJZFxuICAgKiAgKiogZGVwcmVjYXRlZCBwYXJhbSB7UmVxdWVzdFF1ZXJ5UGFyYW1zfSBbcXVlcnlQYXJhbXNdXG4gICAqIHJldHVybnMgeyhPYnNlcnZhYmxlPFJlcGxpY2F0aW9uSm9iPiB8IFByb21pc2U8UmVwbGljYXRpb25Kb2I+IHwgUmVwbGljYXRpb25Kb2IpfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgUmVwbGljYXRpb25TZXJ2aWNlXG4gICAqL1xuICBhYnN0cmFjdCBnZXRKb2JzKFxuICAgIHJ1bGVJZDogbnVtYmVyIHwgc3RyaW5nLFxuICAgIHF1ZXJ5UGFyYW1zPzogUmVxdWVzdFF1ZXJ5UGFyYW1zXG4gICk6IE9ic2VydmFibGU8UmVwbGljYXRpb25Kb2I+IHwgUHJvbWlzZTxSZXBsaWNhdGlvbkpvYj4gfCBSZXBsaWNhdGlvbkpvYjtcblxuICAvKipcbiAgICogR2V0IHRoZSBsb2cgb2YgdGhlIHNwZWNpZmllZCBqb2IuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKiAgKiogZGVwcmVjYXRlZCBwYXJhbSB7KG51bWJlciB8IHN0cmluZyl9IGpvYklkXG4gICAqIHJldHVybnMgeyhPYnNlcnZhYmxlPHN0cmluZz4gfCBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmcpfVxuICAgKiBAbWVtYmVyb2YgUmVwbGljYXRpb25TZXJ2aWNlXG4gICAqL1xuICBhYnN0cmFjdCBnZXRKb2JMb2coXG4gICAgam9iSWQ6IG51bWJlciB8IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPHN0cmluZz4gfCBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmc7XG5cbiAgYWJzdHJhY3Qgc3RvcEpvYnMoXG4gICAgam9iSWQ6IG51bWJlciB8IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPHN0cmluZz4gfCBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmc7XG5cbiAgYWJzdHJhY3QgZ2V0Sm9iQmFzZVVybCgpOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW1wbGVtZW50IGRlZmF1bHQgc2VydmljZSBmb3IgcmVwbGljYXRpb24gcnVsZSBhbmQgam9iLlxuICpcbiAqKlxuICogY2xhc3MgUmVwbGljYXRpb25EZWZhdWx0U2VydmljZVxuICogZXh0ZW5kcyB7UmVwbGljYXRpb25TZXJ2aWNlfVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwbGljYXRpb25EZWZhdWx0U2VydmljZSBleHRlbmRzIFJlcGxpY2F0aW9uU2VydmljZSB7XG4gIF9ydWxlQmFzZVVybDogc3RyaW5nO1xuICBfam9iQmFzZVVybDogc3RyaW5nO1xuICBfcmVwbGljYXRlVXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwLFxuICAgIEBJbmplY3QoU0VSVklDRV9DT05GSUcpIGNvbmZpZzogSVNlcnZpY2VDb25maWdcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9ydWxlQmFzZVVybCA9IGNvbmZpZy5yZXBsaWNhdGlvblJ1bGVFbmRwb2ludFxuICAgICAgPyBjb25maWcucmVwbGljYXRpb25SdWxlRW5kcG9pbnRcbiAgICAgIDogXCIvYXBpL3BvbGljaWVzL3JlcGxpY2F0aW9uXCI7XG4gICAgdGhpcy5fam9iQmFzZVVybCA9IGNvbmZpZy5yZXBsaWNhdGlvbkpvYkVuZHBvaW50XG4gICAgICA/IGNvbmZpZy5yZXBsaWNhdGlvbkpvYkVuZHBvaW50XG4gICAgICA6IFwiL2FwaS9qb2JzL3JlcGxpY2F0aW9uXCI7XG4gICAgdGhpcy5fcmVwbGljYXRlVXJsID0gY29uZmlnLnJlcGxpY2F0aW9uQmFzZUVuZHBvaW50XG4gICAgICA/IGNvbmZpZy5yZXBsaWNhdGlvbkJhc2VFbmRwb2ludFxuICAgICAgOiBcIi9hcGkvcmVwbGljYXRpb25zXCI7XG4gIH1cblxuICAvLyBQcml2YXRlIG1ldGhvZHNcbiAgLy8gQ2hlY2sgaWYgdGhlIHJ1bGUgb2JqZWN0IGlzIHZhbGlkXG4gIF9pc1ZhbGlkUnVsZShydWxlOiBSZXBsaWNhdGlvblJ1bGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgcnVsZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBydWxlICE9IG51bGwgJiZcbiAgICAgIHJ1bGUubmFtZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBydWxlLm5hbWUudHJpbSgpICE9PSBcIlwiICYmXG4gICAgICBydWxlLnRhcmdldHMubGVuZ3RoICE9PSAwXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRKb2JCYXNlVXJsKCkge1xuICAgIHJldHVybiB0aGlzLl9qb2JCYXNlVXJsO1xuICB9XG5cbiAgcHVibGljIGdldFJlcGxpY2F0aW9uUnVsZXMoXG4gICAgcHJvamVjdElkPzogbnVtYmVyIHwgc3RyaW5nLFxuICAgIHJ1bGVOYW1lPzogc3RyaW5nLFxuICAgIHF1ZXJ5UGFyYW1zPzogUmVxdWVzdFF1ZXJ5UGFyYW1zXG4gICk6XG4gICAgfCBPYnNlcnZhYmxlPFJlcGxpY2F0aW9uUnVsZVtdPlxuICAgIHwgUHJvbWlzZTxSZXBsaWNhdGlvblJ1bGVbXT5cbiAgICB8IFJlcGxpY2F0aW9uUnVsZVtdIHtcbiAgICBpZiAoIXF1ZXJ5UGFyYW1zKSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IG5ldyBSZXF1ZXN0UXVlcnlQYXJhbXMoKTtcbiAgICB9XG5cbiAgICBpZiAocHJvamVjdElkKSB7XG4gICAgICBxdWVyeVBhcmFtcy5zZXQoXCJwcm9qZWN0X2lkXCIsIFwiXCIgKyBwcm9qZWN0SWQpO1xuICAgIH1cblxuICAgIGlmIChydWxlTmFtZSkge1xuICAgICAgcXVlcnlQYXJhbXMuc2V0KFwibmFtZVwiLCBydWxlTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldCh0aGlzLl9ydWxlQmFzZVVybCwgYnVpbGRIdHRwUmVxdWVzdE9wdGlvbnMocXVlcnlQYXJhbXMpKVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkgYXMgUmVwbGljYXRpb25SdWxlW10pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXBsaWNhdGlvblJ1bGUoXG4gICAgcnVsZUlkOiBudW1iZXIgfCBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxSZXBsaWNhdGlvblJ1bGU+IHwgUHJvbWlzZTxSZXBsaWNhdGlvblJ1bGU+IHwgUmVwbGljYXRpb25SdWxlIHtcbiAgICBpZiAoIXJ1bGVJZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiQmFkIGFyZ3VtZW50XCIpO1xuICAgIH1cblxuICAgIGxldCB1cmw6IHN0cmluZyA9IGAke3RoaXMuX3J1bGVCYXNlVXJsfS8ke3J1bGVJZH1gO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQodXJsLCBIVFRQX0dFVF9PUFRJT05TKVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkgYXMgUmVwbGljYXRpb25SdWxlKVxuICAgICAgLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlUmVwbGljYXRpb25SdWxlKFxuICAgIHJlcGxpY2F0aW9uUnVsZTogUmVwbGljYXRpb25SdWxlXG4gICk6IE9ic2VydmFibGU8YW55PiB8IFByb21pc2U8YW55PiB8IGFueSB7XG4gICAgaWYgKCF0aGlzLl9pc1ZhbGlkUnVsZShyZXBsaWNhdGlvblJ1bGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJCYWQgYXJndW1lbnRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoXG4gICAgICAgIHRoaXMuX3J1bGVCYXNlVXJsLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShyZXBsaWNhdGlvblJ1bGUpLFxuICAgICAgICBIVFRQX0pTT05fT1BUSU9OU1xuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlcGxpY2F0aW9uUnVsZShcbiAgICBpZDogbnVtYmVyLFxuICAgIHJlcDogUmVwbGljYXRpb25SdWxlXG4gICk6IE9ic2VydmFibGU8YW55PiB8IFByb21pc2U8YW55PiB8IGFueSB7XG4gICAgaWYgKCF0aGlzLl9pc1ZhbGlkUnVsZShyZXApKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJCYWQgYXJndW1lbnRcIik7XG4gICAgfVxuXG4gICAgbGV0IHVybCA9IGAke3RoaXMuX3J1bGVCYXNlVXJsfS8ke2lkfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnB1dCh1cmwsIEpTT04uc3RyaW5naWZ5KHJlcCksIEhUVFBfSlNPTl9PUFRJT05TKVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZVJlcGxpY2F0aW9uUnVsZShcbiAgICBydWxlSWQ6IG51bWJlciB8IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGFueT4gfCBQcm9taXNlPGFueT4gfCBhbnkge1xuICAgIGlmICghcnVsZUlkIHx8IHJ1bGVJZCA8PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJCYWQgYXJndW1lbnRcIik7XG4gICAgfVxuXG4gICAgbGV0IHVybDogc3RyaW5nID0gYCR7dGhpcy5fcnVsZUJhc2VVcmx9LyR7cnVsZUlkfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmRlbGV0ZSh1cmwsIEhUVFBfSlNPTl9PUFRJT05TKVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICB9XG5cbiAgcHVibGljIHJlcGxpY2F0ZVJ1bGUoXG4gICAgcnVsZUlkOiBudW1iZXIgfCBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHwgUHJvbWlzZTxhbnk+IHwgYW55IHtcbiAgICBpZiAoIXJ1bGVJZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiQmFkIGFyZ3VtZW50XCIpO1xuICAgIH1cblxuICAgIGxldCB1cmw6IHN0cmluZyA9IGAke3RoaXMuX3JlcGxpY2F0ZVVybH1gO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KHVybCwgeyBwb2xpY3lfaWQ6IHJ1bGVJZCB9LCBIVFRQX0pTT05fT1BUSU9OUylcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgfVxuXG4gIHB1YmxpYyBlbmFibGVSZXBsaWNhdGlvblJ1bGUoXG4gICAgcnVsZUlkOiBudW1iZXIgfCBzdHJpbmcsXG4gICAgZW5hYmxlbWVudDogbnVtYmVyXG4gICk6IE9ic2VydmFibGU8YW55PiB8IFByb21pc2U8YW55PiB8IGFueSB7XG4gICAgaWYgKCFydWxlSWQgfHwgcnVsZUlkIDw9IDApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkJhZCBhcmd1bWVudFwiKTtcbiAgICB9XG5cbiAgICBsZXQgdXJsOiBzdHJpbmcgPSBgJHt0aGlzLl9ydWxlQmFzZVVybH0vJHtydWxlSWR9L2VuYWJsZW1lbnRgO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wdXQodXJsLCB7IGVuYWJsZWQ6IGVuYWJsZW1lbnQgfSwgSFRUUF9KU09OX09QVElPTlMpXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlKVxuICAgICAgLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZVJlcGxpY2F0aW9uUnVsZShcbiAgICBydWxlSWQ6IG51bWJlciB8IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGFueT4gfCBQcm9taXNlPGFueT4gfCBhbnkge1xuICAgIGlmICghcnVsZUlkIHx8IHJ1bGVJZCA8PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJCYWQgYXJndW1lbnRcIik7XG4gICAgfVxuXG4gICAgbGV0IHVybDogc3RyaW5nID0gYCR7dGhpcy5fcnVsZUJhc2VVcmx9LyR7cnVsZUlkfS9lbmFibGVtZW50YDtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucHV0KHVybCwgeyBlbmFibGVkOiAwIH0sIEhUVFBfSlNPTl9PUFRJT05TKVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpO1xuICB9XG5cbiAgcHVibGljIGdldEpvYnMoXG4gICAgcnVsZUlkOiBudW1iZXIgfCBzdHJpbmcsXG4gICAgcXVlcnlQYXJhbXM/OiBSZXF1ZXN0UXVlcnlQYXJhbXNcbiAgKTogT2JzZXJ2YWJsZTxSZXBsaWNhdGlvbkpvYj4gfCBQcm9taXNlPFJlcGxpY2F0aW9uSm9iPiB8IFJlcGxpY2F0aW9uSm9iIHtcbiAgICBpZiAoIXJ1bGVJZCB8fCBydWxlSWQgPD0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiQmFkIGFyZ3VtZW50XCIpO1xuICAgIH1cblxuICAgIGlmICghcXVlcnlQYXJhbXMpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zID0gbmV3IFJlcXVlc3RRdWVyeVBhcmFtcygpO1xuICAgIH1cblxuICAgIHF1ZXJ5UGFyYW1zLnNldChcInBvbGljeV9pZFwiLCBcIlwiICsgcnVsZUlkKTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0KHRoaXMuX2pvYkJhc2VVcmwsIGJ1aWxkSHR0cFJlcXVlc3RPcHRpb25zKHF1ZXJ5UGFyYW1zKSlcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0OiBSZXBsaWNhdGlvbkpvYiA9IHtcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgeFRvdGFsQ291bnQ6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmhlYWRlcnMpIHtcbiAgICAgICAgICBsZXQgeEhlYWRlcjogc3RyaW5nID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJYLVRvdGFsLUNvdW50XCIpO1xuICAgICAgICAgIGlmICh4SGVhZGVyKSB7XG4gICAgICAgICAgICByZXN1bHQubWV0YWRhdGEueFRvdGFsQ291bnQgPSBwYXJzZUludCh4SGVhZGVyLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LmRhdGEgPSByZXNwb25zZS5qc29uKCkgYXMgUmVwbGljYXRpb25Kb2JJdGVtW107XG4gICAgICAgIGlmIChyZXN1bHQubWV0YWRhdGEueFRvdGFsQ291bnQgPT09IDApIHtcbiAgICAgICAgICBpZiAocmVzdWx0LmRhdGEgJiYgcmVzdWx0LmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLnhUb3RhbENvdW50ID0gcmVzdWx0LmRhdGEubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Sm9iTG9nKFxuICAgIGpvYklkOiBudW1iZXIgfCBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHwgUHJvbWlzZTxzdHJpbmc+IHwgc3RyaW5nIHtcbiAgICBpZiAoIWpvYklkIHx8IGpvYklkIDw9IDApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkJhZCBhcmd1bWVudFwiKTtcbiAgICB9XG5cbiAgICBsZXQgbG9nVXJsID0gYCR7dGhpcy5fam9iQmFzZVVybH0vJHtqb2JJZH0vbG9nYDtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0KGxvZ1VybCwgSFRUUF9HRVRfT1BUSU9OUylcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UudGV4dCgpKVxuICAgICAgLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSk7XG4gIH1cblxuICBwdWJsaWMgc3RvcEpvYnMoXG4gICAgam9iSWQ6IG51bWJlciB8IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGFueT4gfCBQcm9taXNlPGFueT4gfCBhbnkge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wdXQoXG4gICAgICAgIHRoaXMuX2pvYkJhc2VVcmwsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHsgcG9saWN5X2lkOiBqb2JJZCwgc3RhdHVzOiBcInN0b3BcIiB9KSxcbiAgICAgICAgSFRUUF9KU09OX09QVElPTlNcbiAgICAgIClcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcbiAgfVxufVxuIl19