@harbor/ui
Version:
Harbor shared UI components based on Clarity and Angular6
436 lines (435 loc) • 38 kB
JavaScript
/**
* @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