@lowcodeunit/applications-flow-common 1.33.264-lets-get-social-ish → 1.33.267-lets-get-social-ish

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  import { COMMA, ENTER } from '@angular/cdk/keycodes';
2
- import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
- import { FormControl, Validators } from '@angular/forms';
2
+ import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
3
+ import { FormControl, Validators, } from '@angular/forms';
4
4
  import { Guid } from '@lcu/common';
5
- import { ProjectHostingDetails } from '../../state/applications-flow.state';
5
+ import { ProjectHostingDetails, } from '../../state/applications-flow.state';
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "../../services/applications-flow.service";
8
8
  import * as i2 from "../../services/eac.service";
@@ -28,7 +28,7 @@ export class DevopsSourceControlFormComponent {
28
28
  this.eacSvc = eacSvc;
29
29
  this.formBuilder = formBuilder;
30
30
  this.SeparatorKeysCodes = [ENTER, COMMA];
31
- this.SaveStatusEvent = new EventEmitter;
31
+ this.SaveStatusEvent = new EventEmitter();
32
32
  this.BuildPath = null;
33
33
  this.HostingDetails = new ProjectHostingDetails();
34
34
  this.SelectedBranches = [];
@@ -110,9 +110,11 @@ export class DevopsSourceControlFormComponent {
110
110
  this.destroyFormControls();
111
111
  }
112
112
  ngOnInit() {
113
+ console.log("source control lookup", this.EditingSourceControlLookup);
113
114
  if (this.EditingSourceControlLookup === null) {
114
115
  this.CreateNewSourceControl();
115
116
  }
117
+ console.log("source control", this.EditingSourceControl);
116
118
  if (this.EditingSourceControl != null) {
117
119
  this.DevOpsSourceControlFormGroup = this.formBuilder.group({});
118
120
  this.setupFormControls();
@@ -206,55 +208,18 @@ export class DevopsSourceControlFormComponent {
206
208
  this.EditingSourceControlLookup = scLookup;
207
209
  }
208
210
  SubmitSourceControl() {
209
- console.log("source control submitted: ", this.DevOpsSourceControlFormGroup.value);
211
+ console.log('source control submitted: ', this.DevOpsSourceControlFormGroup.value);
210
212
  this.SaveSourceControl();
211
213
  }
212
214
  SaveSourceControl() {
213
215
  const saveEnvReq = {
214
216
  Environment: {
215
217
  ...this.Environment,
216
- Artifacts: this.Environment.Artifacts || {},
217
- DevOpsActions: this.Environment.DevOpsActions || {},
218
- Secrets: this.Environment.Secrets || {},
219
218
  Sources: this.Environment.Sources || {},
220
219
  },
221
220
  EnvironmentLookup: this.EnvironmentLookup,
222
221
  EnterpriseDataTokens: {},
223
222
  };
224
- let artifactLookup;
225
- let artifact = this.Artifact;
226
- if (!this.ArtifactLookup) {
227
- artifactLookup = Guid.CreateRaw();
228
- artifact = {
229
- ...artifact,
230
- // Type: this.HostingDetailsFormControls.SelectedHostingOption
231
- // .ArtifactType,
232
- // Name: this.HostingDetailsFormControls.SelectedHostingOption.Name,
233
- NPMRegistry: 'https://registry.npmjs.org/',
234
- };
235
- }
236
- else {
237
- artifactLookup = this.ArtifactLookup;
238
- }
239
- saveEnvReq.Environment.Artifacts[artifactLookup] = artifact;
240
- let devOpsActionLookup;
241
- if (!this.DevOpsActionLookup) {
242
- devOpsActionLookup = Guid.CreateRaw();
243
- const doa = {
244
- ...this.DevOpsAction,
245
- ArtifactLookups: [artifactLookup],
246
- };
247
- saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = this.DevOpsAction;
248
- }
249
- else {
250
- devOpsActionLookup = this.DevOpsActionLookupFormControl.value;
251
- const doa = {
252
- ...this.DevOpsAction,
253
- // Name: this.HostingDetailsFormControls.DevOpsActionNameFormControl.value,
254
- };
255
- // saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = doa;
256
- saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = this.DevOpsAction;
257
- }
258
223
  let source = {
259
224
  ...this.EditingSourceControl,
260
225
  Branches: this.SelectedBranches,
@@ -264,14 +229,14 @@ export class DevopsSourceControlFormComponent {
264
229
  ...source,
265
230
  Type: 'GitHub',
266
231
  Name: this.EditingSourceControlLookup,
267
- DevOpsActionTriggerLookups: [devOpsActionLookup],
232
+ DevOpsActionTriggerLookups: [this.DevOpsActionLookup],
268
233
  Organization: this.OrganizationFormControl.value,
269
234
  Repository: this.RepositoryFormControl.value,
270
235
  };
271
236
  const scLookup = `github://${source.Organization}/${source.Repository}`;
272
237
  saveEnvReq.Environment.Sources[scLookup] = source;
273
238
  let resp = this.eacSvc.SaveEnvironmentAsCode(saveEnvReq);
274
- resp.then(res => {
239
+ resp.then((res) => {
275
240
  this.SaveStatusEvent.emit(res);
276
241
  });
277
242
  }
@@ -349,6 +314,7 @@ export class DevopsSourceControlFormComponent {
349
314
  .ListOrganizations()
350
315
  .subscribe((response) => {
351
316
  this.OrganizationOptions = response.Model;
317
+ console.log("Organization Options: ", this.OrganizationOptions);
352
318
  this.Loading = false;
353
319
  if (this.EditingSourceControl?.Organization) {
354
320
  setTimeout(() => {
@@ -409,10 +375,10 @@ export class DevopsSourceControlFormComponent {
409
375
  }
410
376
  }
411
377
  DevopsSourceControlFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: DevopsSourceControlFormComponent, deps: [{ token: i1.ApplicationsFlowService }, { token: i2.EaCService }, { token: i3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
412
- DevopsSourceControlFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: DevopsSourceControlFormComponent, selector: "lcu-devops-source-control-form", inputs: { EditingSourceControlLookup: ["editing-source-control-lookup", "EditingSourceControlLookup"], Environment: ["environment", "Environment"], EnvironmentLookup: ["environment-lookup", "EnvironmentLookup"] }, outputs: { SaveStatusEvent: "save-status-event" }, viewQueries: [{ propertyName: "BranchesInput", first: true, predicate: ["branches"], descendants: true }], ngImport: i0, template: "<form class=\"form-card\" [formGroup]=\"DevOpsSourceControlFormGroup\" (ngSubmit)=\"SubmitSourceControl()\">\n\n <mat-card class=\"spread\" class=\"sc-card\">\n <mat-card-header>\n <mat-card-title> Source Control </mat-card-title>\n\n <div fxFlex></div>\n\n <mat-icon matSuffix matTooltip=\"Configure source control, DevOps CI/CD, and artifacts.\">\n info_outline\n </mat-icon>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"card\">\n <mat-form-field class=\"mat-full-width\">\n <mat-select formControlName=\"devOpsActionLookup\" placeholder=\"DevOps Action\"\n [disabled]=\"HostingDetails?.Loading\" (selectionChange)=\"DevOpsActionLookupChanged($event)\">\n <ng-container *ngFor=\"let devOpsActionLookup of DevOpsActionLookups\">\n <mat-option [value]=\"devOpsActionLookup\" *ngIf=\"DevOpsActions[devOpsActionLookup]; let devOpsAction\">\n {{ devOpsAction.Name }}\n </mat-option>\n </ng-container>\n\n <mat-option value=\"\">-- Create New --</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"card\" *ngIf=\"OrganizationFormControl?.valid || !Loading\">\n <mat-form-field class=\"mat-full-width with-hint margin-bottom\" *ngIf=\"OrganizationOptions?.length > 0\">\n <mat-icon class=\"org-icon\" matPrefix>corporate_fare</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'organization'\" placeholder=\"Organization\"\n (selectionChange)=\"OrganizationChanged($event)\" [disabled]=\"Loading || HostingDetails?.Loading\" required>\n <ng-container *ngFor=\"let orgOpt of OrganizationOptions\">\n <mat-option [value]=\"orgOpt.Name\">\n {{ orgOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\" matTooltip=\"Refresh Organization\"> refresh </mat-icon>\n\n <a matSuffix href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon color=\"accent\" matTooltip=\"Re-authorize Organizations\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n RepositoryFormControl?.valid ||\n (OrganizationFormControl?.valid && !Loading)\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>description</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'repository'\" [placeholder]=\"\n OrganizationFormControl?.valid\n ? 'Repository'\n : 'Repository (select organization first)'\n \" [disabled]=\"\n !OrganizationFormControl?.valid || Loading || HostingDetails?.Loading\n \" (selectionChange)=\"RepositoryChanged($event)\" *ngIf=\"!CreatingRepository\" required>\n <ng-container *ngFor=\"let repoOpt of RepositoryOptions\">\n <mat-option [value]=\"repoOpt.Name\">\n {{ repoOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <input matInput placeholder=\"Repository (creates new if does not exist)\"\n [formControlName]=\"SourceControlRoot + 'repository'\" *ngIf=\"CreatingRepository\"\n [fxHide]=\"Loading || HostingDetails?.Loading\" required />\n\n <mat-icon matSuffix (click)=\"CreateRepository()\" [fxHide]=\"Loading || HostingDetails?.Loading\"\n *ngIf=\"!CreatingRepository && OrganizationFormControl?.valid\">\n add_circle\n </mat-icon>\n\n <button mat-button type=\"button\" (click)=\"SaveRepository()\"\n *ngIf=\"CreatingRepository && RepositoryFormControl?.valid\">\n\n <mat-icon matSuffix color=\"primary\">\n save\n </mat-icon>\n </button>\n\n <button mat-button type=\"button\" (click)=\"CancelCreateRepository()\" *ngIf=\"CreatingRepository\">\n\n <mat-icon matSuffix>\n cancel\n </mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BranchesFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBranches\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-label>Selected Branches</mat-label>\n\n <mat-autocomplete (optionSelected)=\"BranchOptionSelected($event)\" #branchOptions=\"matAutocomplete\">\n <ng-container *ngFor=\"let branchOpt of BranchOptions\">\n <mat-option [value]=\"branchOpt.Name\">\n {{ branchOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n\n <mat-chip-list #selectedBranches>\n <mat-chip [removable]=\"true\" (removed)=\"RemoveBranchOption(selBranch)\"\n *ngFor=\"let selBranch of SelectedBranches\">\n {{ selBranch }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n\n <input matInput placeholder=\"New Branch...\" [formControlName]=\"SourceControlRoot + 'branches'\" #branches\n [matAutocomplete]=\"branchOptions\" [matChipInputFor]=\"selectedBranches\"\n [matChipInputSeparatorKeyCodes]=\"SeparatorKeysCodes\" [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"AddBranchOption($event)\" [disabled]=\"Loading || HostingDetails?.Loading\"\n required />\n </mat-chip-list>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\" [fxShow]=\"SelectedBranches?.length > 1\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'mainBranch'\" placeholder=\"Main Branch\"\n [disabled]=\"Loading || HostingDetails?.Loading\" (selectionChange)=\"MainBranchChanged($event)\" required>\n <ng-container *ngFor=\"let branch of SelectedBranches\">\n <mat-option [value]=\"branch\">\n {{ branch }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\"> refresh </mat-icon>\n\n <a matSuffix mat-icon-button href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon matTooltip=\"Re-authorize Organizations\" color=\"accent\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BuildPathFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBuildPath\n \">\n <mat-form-field class=\"mat-full-width with-hint\">\n <mat-icon class=\"org-icon\" matPrefix>build</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'buildPath'\" placeholder=\"Build Path\"\n [disabled]=\"Loading || BuildPathDisabled\" (selectionChange)=\"BuildPathChanged($event)\" required>\n <ng-container *ngFor=\"let buildPath of BuildPathOptions\">\n <mat-option [value]=\"buildPath\">\n {{ buildPath }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-hint>\n The build path identifies which build action to use for your\n configuration.\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"Loading\">\n <div class=\"spread\">\n <lcu-loader style=\"margin: auto\" [loading]=\"true\"></lcu-loader>\n\n <div class=\"margin-3\">\n <h4 class=\"mat-title\" *ngIf=\"!OrganizationFormControl?.valid\">\n Loading organizations\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n OrganizationFormControl?.valid && !RepositoryFormControl?.valid\n \">\n Loading repositories\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"RepositoryFormControl?.valid && !BranchesFormControl?.valid\">\n Loading branches\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n (RepositoryFormControl?.valid || BranchesFormControl?.valid) &&\n !BuildPathFormControl?.valid\n \">\n Loading build paths\n </h4>\n </div>\n </div>\n </div>\n <!-- </div> -->\n\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n mat-raised-button \n *ngIf=\"!State?.Loading\"\n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!DevOpsSourceControlFormGroup.valid || !DevOpsSourceControlFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Source Control\n </button>\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n \n </mat-card-actions>\n </mat-card>\n</form>", styles: [".form-card,.sc-card{width:100%}.margin-bottom{margin-bottom:15px}\n"], components: [{ type: i4.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i4.MatCardHeader, selector: "mat-card-header" }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i11.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i9.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { type: i12.LoaderComponent, selector: "lcu-loader", inputs: ["diameter", "hide-inner", "loading"] }], directives: [{ type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i13.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i6.MatSuffix, selector: "[matSuffix]" }, { type: i14.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i15.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatPrefix, selector: "[matPrefix]" }, { type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i16.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i17.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { type: i6.MatLabel, selector: "mat-label" }, { type: i11.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i11.MatChipRemove, selector: "[matChipRemove]" }, { type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i4.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { type: i13.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }] });
378
+ DevopsSourceControlFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: DevopsSourceControlFormComponent, selector: "lcu-devops-source-control-form", inputs: { EditingSourceControlLookup: ["editing-source-control-lookup", "EditingSourceControlLookup"], Environment: ["environment", "Environment"], EnvironmentLookup: ["environment-lookup", "EnvironmentLookup"] }, outputs: { SaveStatusEvent: "save-status-event" }, viewQueries: [{ propertyName: "BranchesInput", first: true, predicate: ["branches"], descendants: true }], ngImport: i0, template: "<form class=\"form-card\" [formGroup]=\"DevOpsSourceControlFormGroup\" (ngSubmit)=\"SubmitSourceControl()\">\n\n <mat-card class=\"spread\" class=\"sc-card\">\n <mat-card-header>\n <mat-card-title> Source Control </mat-card-title>\n\n <div fxFlex></div>\n\n <mat-icon matSuffix matTooltip=\"Configure source control, DevOps CI/CD, and artifacts.\">\n info_outline\n </mat-icon>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"card\">\n <mat-form-field class=\"mat-full-width\">\n <mat-select \n formControlName=\"devOpsActionLookup\" \n placeholder=\"DevOps Action\"\n [disabled]=\"HostingDetails?.Loading\" \n (selectionChange)=\"DevOpsActionLookupChanged($event)\"\n >\n <ng-container *ngFor=\"let devOpsActionLookup of DevOpsActionLookups\">\n <mat-option \n [value]=\"devOpsActionLookup\" \n *ngIf=\"DevOpsActions[devOpsActionLookup]; let devOpsAction\">\n {{ devOpsAction.Name }}\n </mat-option>\n </ng-container>\n\n <mat-option value=\"\">-- Create New --</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"card\" *ngIf=\"OrganizationFormControl?.valid || !Loading\">\n <mat-form-field \n class=\"mat-full-width with-hint margin-bottom\" \n *ngIf=\"OrganizationOptions?.length > 0\"\n >\n <mat-icon class=\"org-icon\" matPrefix>corporate_fare</mat-icon>\n\n <mat-select \n [formControlName]=\"SourceControlRoot + 'organization'\" \n placeholder=\"Organization\"\n (selectionChange)=\"OrganizationChanged($event)\" \n [disabled]=\"Loading || HostingDetails?.Loading\" \n required\n >\n <ng-container *ngFor=\"let orgOpt of OrganizationOptions\">\n <mat-option [value]=\"orgOpt.Name\">\n {{ orgOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\" matTooltip=\"Refresh Organization\" color=\"accent\"> refresh </mat-icon>\n\n <a matSuffix href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon color=\"accent\" matTooltip=\"Re-authorize Organizations\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" class=\"primary-link\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n RepositoryFormControl?.valid ||\n (OrganizationFormControl?.valid && !Loading)\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>description</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'repository'\" [placeholder]=\"\n OrganizationFormControl?.valid\n ? 'Repository'\n : 'Repository (select organization first)'\n \" [disabled]=\"\n !OrganizationFormControl?.valid || Loading || HostingDetails?.Loading\n \" (selectionChange)=\"RepositoryChanged($event)\" *ngIf=\"!CreatingRepository\" required>\n <ng-container *ngFor=\"let repoOpt of RepositoryOptions\">\n <mat-option [value]=\"repoOpt.Name\">\n {{ repoOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <input matInput placeholder=\"Repository (creates new if does not exist)\"\n [formControlName]=\"SourceControlRoot + 'repository'\" *ngIf=\"CreatingRepository\"\n [fxHide]=\"Loading || HostingDetails?.Loading\" required />\n\n <mat-icon matSuffix (click)=\"CreateRepository()\" [fxHide]=\"Loading || HostingDetails?.Loading\"\n *ngIf=\"!CreatingRepository && OrganizationFormControl?.valid\">\n add_circle\n </mat-icon>\n\n <button mat-button type=\"button\" (click)=\"SaveRepository()\"\n *ngIf=\"CreatingRepository && RepositoryFormControl?.valid\">\n\n <mat-icon matSuffix color=\"primary\">\n save\n </mat-icon>\n </button>\n\n <button mat-button type=\"button\" (click)=\"CancelCreateRepository()\" *ngIf=\"CreatingRepository\">\n\n <mat-icon matSuffix>\n cancel\n </mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BranchesFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBranches\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-label>Selected Branches</mat-label>\n\n <mat-autocomplete (optionSelected)=\"BranchOptionSelected($event)\" #branchOptions=\"matAutocomplete\">\n <ng-container *ngFor=\"let branchOpt of BranchOptions\">\n <mat-option [value]=\"branchOpt.Name\">\n {{ branchOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n\n <mat-chip-list #selectedBranches>\n <mat-chip [removable]=\"true\" (removed)=\"RemoveBranchOption(selBranch)\"\n *ngFor=\"let selBranch of SelectedBranches\">\n {{ selBranch }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n\n <input matInput placeholder=\"New Branch...\" [formControlName]=\"SourceControlRoot + 'branches'\" #branches\n [matAutocomplete]=\"branchOptions\" [matChipInputFor]=\"selectedBranches\"\n [matChipInputSeparatorKeyCodes]=\"SeparatorKeysCodes\" [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"AddBranchOption($event)\" [disabled]=\"Loading || HostingDetails?.Loading\"\n required />\n </mat-chip-list>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\" [fxShow]=\"SelectedBranches?.length > 1\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'mainBranch'\" placeholder=\"Main Branch\"\n [disabled]=\"Loading || HostingDetails?.Loading\" (selectionChange)=\"MainBranchChanged($event)\" required>\n <ng-container *ngFor=\"let branch of SelectedBranches\">\n <mat-option [value]=\"branch\">\n {{ branch }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\" color=\"accent\"> refresh </mat-icon>\n\n <a matSuffix mat-icon-button href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon matTooltip=\"Re-authorize Organizations\" color=\"accent\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\"class=\"primary-link\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BuildPathFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBuildPath\n \">\n <mat-form-field class=\"mat-full-width with-hint\">\n <mat-icon class=\"org-icon\" matPrefix>build</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'buildPath'\" placeholder=\"Build Path\"\n [disabled]=\"Loading || BuildPathDisabled\" (selectionChange)=\"BuildPathChanged($event)\" required>\n <ng-container *ngFor=\"let buildPath of BuildPathOptions\">\n <mat-option [value]=\"buildPath\">\n {{ buildPath }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-hint>\n The build path identifies which build action to use for your\n configuration.\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"Loading\">\n <div class=\"spread\">\n <lcu-loader style=\"margin: auto\" [loading]=\"true\"></lcu-loader>\n\n <div class=\"margin-3\">\n <h4 class=\"mat-title\" *ngIf=\"!OrganizationFormControl?.valid\">\n Loading organizations\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n OrganizationFormControl?.valid && !RepositoryFormControl?.valid\n \">\n Loading repositories\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"RepositoryFormControl?.valid && !BranchesFormControl?.valid\">\n Loading branches\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n (RepositoryFormControl?.valid || BranchesFormControl?.valid) &&\n !BuildPathFormControl?.valid\n \">\n Loading build paths\n </h4>\n </div>\n </div>\n </div>\n <!-- </div> -->\n\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n mat-raised-button \n *ngIf=\"!State?.Loading\"\n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!DevOpsSourceControlFormGroup.valid || !DevOpsSourceControlFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Source Control\n </button>\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n \n </mat-card-actions>\n </mat-card>\n</form>", styles: [".form-card,.sc-card{width:100%}.margin-bottom{margin-bottom:15px}.primary-link{color:#4a918e}\n"], components: [{ type: i4.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i4.MatCardHeader, selector: "mat-card-header" }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i11.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i9.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { type: i12.LoaderComponent, selector: "lcu-loader", inputs: ["diameter", "hide-inner", "loading"] }], directives: [{ type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i13.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i6.MatSuffix, selector: "[matSuffix]" }, { type: i14.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i15.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatPrefix, selector: "[matPrefix]" }, { type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i16.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i17.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { type: i6.MatLabel, selector: "mat-label" }, { type: i11.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i11.MatChipRemove, selector: "[matChipRemove]" }, { type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i4.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { type: i13.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }] });
413
379
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: DevopsSourceControlFormComponent, decorators: [{
414
380
  type: Component,
415
- args: [{ selector: 'lcu-devops-source-control-form', template: "<form class=\"form-card\" [formGroup]=\"DevOpsSourceControlFormGroup\" (ngSubmit)=\"SubmitSourceControl()\">\n\n <mat-card class=\"spread\" class=\"sc-card\">\n <mat-card-header>\n <mat-card-title> Source Control </mat-card-title>\n\n <div fxFlex></div>\n\n <mat-icon matSuffix matTooltip=\"Configure source control, DevOps CI/CD, and artifacts.\">\n info_outline\n </mat-icon>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"card\">\n <mat-form-field class=\"mat-full-width\">\n <mat-select formControlName=\"devOpsActionLookup\" placeholder=\"DevOps Action\"\n [disabled]=\"HostingDetails?.Loading\" (selectionChange)=\"DevOpsActionLookupChanged($event)\">\n <ng-container *ngFor=\"let devOpsActionLookup of DevOpsActionLookups\">\n <mat-option [value]=\"devOpsActionLookup\" *ngIf=\"DevOpsActions[devOpsActionLookup]; let devOpsAction\">\n {{ devOpsAction.Name }}\n </mat-option>\n </ng-container>\n\n <mat-option value=\"\">-- Create New --</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"card\" *ngIf=\"OrganizationFormControl?.valid || !Loading\">\n <mat-form-field class=\"mat-full-width with-hint margin-bottom\" *ngIf=\"OrganizationOptions?.length > 0\">\n <mat-icon class=\"org-icon\" matPrefix>corporate_fare</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'organization'\" placeholder=\"Organization\"\n (selectionChange)=\"OrganizationChanged($event)\" [disabled]=\"Loading || HostingDetails?.Loading\" required>\n <ng-container *ngFor=\"let orgOpt of OrganizationOptions\">\n <mat-option [value]=\"orgOpt.Name\">\n {{ orgOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\" matTooltip=\"Refresh Organization\"> refresh </mat-icon>\n\n <a matSuffix href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon color=\"accent\" matTooltip=\"Re-authorize Organizations\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n RepositoryFormControl?.valid ||\n (OrganizationFormControl?.valid && !Loading)\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>description</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'repository'\" [placeholder]=\"\n OrganizationFormControl?.valid\n ? 'Repository'\n : 'Repository (select organization first)'\n \" [disabled]=\"\n !OrganizationFormControl?.valid || Loading || HostingDetails?.Loading\n \" (selectionChange)=\"RepositoryChanged($event)\" *ngIf=\"!CreatingRepository\" required>\n <ng-container *ngFor=\"let repoOpt of RepositoryOptions\">\n <mat-option [value]=\"repoOpt.Name\">\n {{ repoOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <input matInput placeholder=\"Repository (creates new if does not exist)\"\n [formControlName]=\"SourceControlRoot + 'repository'\" *ngIf=\"CreatingRepository\"\n [fxHide]=\"Loading || HostingDetails?.Loading\" required />\n\n <mat-icon matSuffix (click)=\"CreateRepository()\" [fxHide]=\"Loading || HostingDetails?.Loading\"\n *ngIf=\"!CreatingRepository && OrganizationFormControl?.valid\">\n add_circle\n </mat-icon>\n\n <button mat-button type=\"button\" (click)=\"SaveRepository()\"\n *ngIf=\"CreatingRepository && RepositoryFormControl?.valid\">\n\n <mat-icon matSuffix color=\"primary\">\n save\n </mat-icon>\n </button>\n\n <button mat-button type=\"button\" (click)=\"CancelCreateRepository()\" *ngIf=\"CreatingRepository\">\n\n <mat-icon matSuffix>\n cancel\n </mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BranchesFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBranches\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-label>Selected Branches</mat-label>\n\n <mat-autocomplete (optionSelected)=\"BranchOptionSelected($event)\" #branchOptions=\"matAutocomplete\">\n <ng-container *ngFor=\"let branchOpt of BranchOptions\">\n <mat-option [value]=\"branchOpt.Name\">\n {{ branchOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n\n <mat-chip-list #selectedBranches>\n <mat-chip [removable]=\"true\" (removed)=\"RemoveBranchOption(selBranch)\"\n *ngFor=\"let selBranch of SelectedBranches\">\n {{ selBranch }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n\n <input matInput placeholder=\"New Branch...\" [formControlName]=\"SourceControlRoot + 'branches'\" #branches\n [matAutocomplete]=\"branchOptions\" [matChipInputFor]=\"selectedBranches\"\n [matChipInputSeparatorKeyCodes]=\"SeparatorKeysCodes\" [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"AddBranchOption($event)\" [disabled]=\"Loading || HostingDetails?.Loading\"\n required />\n </mat-chip-list>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\" [fxShow]=\"SelectedBranches?.length > 1\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'mainBranch'\" placeholder=\"Main Branch\"\n [disabled]=\"Loading || HostingDetails?.Loading\" (selectionChange)=\"MainBranchChanged($event)\" required>\n <ng-container *ngFor=\"let branch of SelectedBranches\">\n <mat-option [value]=\"branch\">\n {{ branch }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\"> refresh </mat-icon>\n\n <a matSuffix mat-icon-button href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon matTooltip=\"Re-authorize Organizations\" color=\"accent\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BuildPathFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBuildPath\n \">\n <mat-form-field class=\"mat-full-width with-hint\">\n <mat-icon class=\"org-icon\" matPrefix>build</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'buildPath'\" placeholder=\"Build Path\"\n [disabled]=\"Loading || BuildPathDisabled\" (selectionChange)=\"BuildPathChanged($event)\" required>\n <ng-container *ngFor=\"let buildPath of BuildPathOptions\">\n <mat-option [value]=\"buildPath\">\n {{ buildPath }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-hint>\n The build path identifies which build action to use for your\n configuration.\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"Loading\">\n <div class=\"spread\">\n <lcu-loader style=\"margin: auto\" [loading]=\"true\"></lcu-loader>\n\n <div class=\"margin-3\">\n <h4 class=\"mat-title\" *ngIf=\"!OrganizationFormControl?.valid\">\n Loading organizations\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n OrganizationFormControl?.valid && !RepositoryFormControl?.valid\n \">\n Loading repositories\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"RepositoryFormControl?.valid && !BranchesFormControl?.valid\">\n Loading branches\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n (RepositoryFormControl?.valid || BranchesFormControl?.valid) &&\n !BuildPathFormControl?.valid\n \">\n Loading build paths\n </h4>\n </div>\n </div>\n </div>\n <!-- </div> -->\n\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n mat-raised-button \n *ngIf=\"!State?.Loading\"\n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!DevOpsSourceControlFormGroup.valid || !DevOpsSourceControlFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Source Control\n </button>\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n \n </mat-card-actions>\n </mat-card>\n</form>", styles: [".form-card,.sc-card{width:100%}.margin-bottom{margin-bottom:15px}\n"] }]
381
+ args: [{ selector: 'lcu-devops-source-control-form', template: "<form class=\"form-card\" [formGroup]=\"DevOpsSourceControlFormGroup\" (ngSubmit)=\"SubmitSourceControl()\">\n\n <mat-card class=\"spread\" class=\"sc-card\">\n <mat-card-header>\n <mat-card-title> Source Control </mat-card-title>\n\n <div fxFlex></div>\n\n <mat-icon matSuffix matTooltip=\"Configure source control, DevOps CI/CD, and artifacts.\">\n info_outline\n </mat-icon>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"card\">\n <mat-form-field class=\"mat-full-width\">\n <mat-select \n formControlName=\"devOpsActionLookup\" \n placeholder=\"DevOps Action\"\n [disabled]=\"HostingDetails?.Loading\" \n (selectionChange)=\"DevOpsActionLookupChanged($event)\"\n >\n <ng-container *ngFor=\"let devOpsActionLookup of DevOpsActionLookups\">\n <mat-option \n [value]=\"devOpsActionLookup\" \n *ngIf=\"DevOpsActions[devOpsActionLookup]; let devOpsAction\">\n {{ devOpsAction.Name }}\n </mat-option>\n </ng-container>\n\n <mat-option value=\"\">-- Create New --</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"card\" *ngIf=\"OrganizationFormControl?.valid || !Loading\">\n <mat-form-field \n class=\"mat-full-width with-hint margin-bottom\" \n *ngIf=\"OrganizationOptions?.length > 0\"\n >\n <mat-icon class=\"org-icon\" matPrefix>corporate_fare</mat-icon>\n\n <mat-select \n [formControlName]=\"SourceControlRoot + 'organization'\" \n placeholder=\"Organization\"\n (selectionChange)=\"OrganizationChanged($event)\" \n [disabled]=\"Loading || HostingDetails?.Loading\" \n required\n >\n <ng-container *ngFor=\"let orgOpt of OrganizationOptions\">\n <mat-option [value]=\"orgOpt.Name\">\n {{ orgOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\" matTooltip=\"Refresh Organization\" color=\"accent\"> refresh </mat-icon>\n\n <a matSuffix href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon color=\"accent\" matTooltip=\"Re-authorize Organizations\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" class=\"primary-link\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n RepositoryFormControl?.valid ||\n (OrganizationFormControl?.valid && !Loading)\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>description</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'repository'\" [placeholder]=\"\n OrganizationFormControl?.valid\n ? 'Repository'\n : 'Repository (select organization first)'\n \" [disabled]=\"\n !OrganizationFormControl?.valid || Loading || HostingDetails?.Loading\n \" (selectionChange)=\"RepositoryChanged($event)\" *ngIf=\"!CreatingRepository\" required>\n <ng-container *ngFor=\"let repoOpt of RepositoryOptions\">\n <mat-option [value]=\"repoOpt.Name\">\n {{ repoOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <input matInput placeholder=\"Repository (creates new if does not exist)\"\n [formControlName]=\"SourceControlRoot + 'repository'\" *ngIf=\"CreatingRepository\"\n [fxHide]=\"Loading || HostingDetails?.Loading\" required />\n\n <mat-icon matSuffix (click)=\"CreateRepository()\" [fxHide]=\"Loading || HostingDetails?.Loading\"\n *ngIf=\"!CreatingRepository && OrganizationFormControl?.valid\">\n add_circle\n </mat-icon>\n\n <button mat-button type=\"button\" (click)=\"SaveRepository()\"\n *ngIf=\"CreatingRepository && RepositoryFormControl?.valid\">\n\n <mat-icon matSuffix color=\"primary\">\n save\n </mat-icon>\n </button>\n\n <button mat-button type=\"button\" (click)=\"CancelCreateRepository()\" *ngIf=\"CreatingRepository\">\n\n <mat-icon matSuffix>\n cancel\n </mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BranchesFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBranches\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-label>Selected Branches</mat-label>\n\n <mat-autocomplete (optionSelected)=\"BranchOptionSelected($event)\" #branchOptions=\"matAutocomplete\">\n <ng-container *ngFor=\"let branchOpt of BranchOptions\">\n <mat-option [value]=\"branchOpt.Name\">\n {{ branchOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n\n <mat-chip-list #selectedBranches>\n <mat-chip [removable]=\"true\" (removed)=\"RemoveBranchOption(selBranch)\"\n *ngFor=\"let selBranch of SelectedBranches\">\n {{ selBranch }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n\n <input matInput placeholder=\"New Branch...\" [formControlName]=\"SourceControlRoot + 'branches'\" #branches\n [matAutocomplete]=\"branchOptions\" [matChipInputFor]=\"selectedBranches\"\n [matChipInputSeparatorKeyCodes]=\"SeparatorKeysCodes\" [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"AddBranchOption($event)\" [disabled]=\"Loading || HostingDetails?.Loading\"\n required />\n </mat-chip-list>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\" [fxShow]=\"SelectedBranches?.length > 1\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'mainBranch'\" placeholder=\"Main Branch\"\n [disabled]=\"Loading || HostingDetails?.Loading\" (selectionChange)=\"MainBranchChanged($event)\" required>\n <ng-container *ngFor=\"let branch of SelectedBranches\">\n <mat-option [value]=\"branch\">\n {{ branch }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\" color=\"accent\"> refresh </mat-icon>\n\n <a matSuffix mat-icon-button href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon matTooltip=\"Re-authorize Organizations\" color=\"accent\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\"class=\"primary-link\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BuildPathFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBuildPath\n \">\n <mat-form-field class=\"mat-full-width with-hint\">\n <mat-icon class=\"org-icon\" matPrefix>build</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'buildPath'\" placeholder=\"Build Path\"\n [disabled]=\"Loading || BuildPathDisabled\" (selectionChange)=\"BuildPathChanged($event)\" required>\n <ng-container *ngFor=\"let buildPath of BuildPathOptions\">\n <mat-option [value]=\"buildPath\">\n {{ buildPath }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-hint>\n The build path identifies which build action to use for your\n configuration.\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"Loading\">\n <div class=\"spread\">\n <lcu-loader style=\"margin: auto\" [loading]=\"true\"></lcu-loader>\n\n <div class=\"margin-3\">\n <h4 class=\"mat-title\" *ngIf=\"!OrganizationFormControl?.valid\">\n Loading organizations\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n OrganizationFormControl?.valid && !RepositoryFormControl?.valid\n \">\n Loading repositories\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"RepositoryFormControl?.valid && !BranchesFormControl?.valid\">\n Loading branches\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n (RepositoryFormControl?.valid || BranchesFormControl?.valid) &&\n !BuildPathFormControl?.valid\n \">\n Loading build paths\n </h4>\n </div>\n </div>\n </div>\n <!-- </div> -->\n\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n mat-raised-button \n *ngIf=\"!State?.Loading\"\n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!DevOpsSourceControlFormGroup.valid || !DevOpsSourceControlFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Source Control\n </button>\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n \n </mat-card-actions>\n </mat-card>\n</form>", styles: [".form-card,.sc-card{width:100%}.margin-bottom{margin-bottom:15px}.primary-link{color:#4a918e}\n"] }]
416
382
  }], ctorParameters: function () { return [{ type: i1.ApplicationsFlowService }, { type: i2.EaCService }, { type: i3.FormBuilder }]; }, propDecorators: { EditingSourceControlLookup: [{
417
383
  type: Input,
418
384
  args: ['editing-source-control-lookup']
@@ -429,4 +395,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImpor
429
395
  type: ViewChild,
430
396
  args: ['branches']
431
397
  }] } });
432
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvY29udHJvbHMvZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0vZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvY29udHJvbHMvZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0vZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hJLE9BQU8sRUFBZ0MsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSWxHLE9BQU8sRUFBcUMsSUFBSSxFQUFVLE1BQU0sYUFBYSxDQUFDO0FBSTlFLE9BQU8sRUFBNkUscUJBQXFCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU92SixNQUFNLE9BQU8sZ0NBQWdDO0lBd0ozQyxnQkFBZ0I7SUFDaEIsWUFDWSxXQUFvQyxFQUNwQyxNQUFrQixFQUNsQixXQUF3QjtRQUZ4QixnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFDcEMsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQU5wQix1QkFBa0IsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQVUsQ0FBQztRQVMzRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxDQUFDO1FB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LENBQ3BCLENBQ0YsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQzFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFDOUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUMzRCxDQUFDO1NBQ0g7SUFDSCxDQUFDOzs2SEFyb0JVLGdDQUFnQztpSEFBaEMsZ0NBQWdDLDBiQ2pCN0MseWhVQWdQTzsyRkQvTk0sZ0NBQWdDO2tCQUw1QyxTQUFTOytCQUNFLGdDQUFnQztpS0FTbkMsMEJBQTBCO3NCQURoQyxLQUFLO3VCQUFDLCtCQUErQjtnQkFJL0IsV0FBVztzQkFEakIsS0FBSzt1QkFBQyxhQUFhO2dCQUliLGlCQUFpQjtzQkFEdkIsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBSXBCLGVBQWU7c0JBRHJCLE1BQU07dUJBQUMsbUJBQW1CO2dCQUlwQixhQUFhO3NCQURuQixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT01NQSwgRU5URVIgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdENoaXBJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuaW1wb3J0IHsgTWF0U2VsZWN0Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IEJhc2VNb2RlbGVkUmVzcG9uc2UsIEJhc2VSZXNwb25zZSwgR3VpZCwgU3RhdHVzIH0gZnJvbSAnQGxjdS9jb21tb24nO1xuaW1wb3J0IHsgRWFDQXJ0aWZhY3QsIEVhQ0Rldk9wc0FjdGlvbiwgRWFDRW52aXJvbm1lbnRBc0NvZGUsIEVhQ1NvdXJjZUNvbnRyb2wgfSBmcm9tICdAc2VtYW50aWNqcy9jb21tb24nO1xuaW1wb3J0IHsgQXBwbGljYXRpb25zRmxvd1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHBsaWNhdGlvbnMtZmxvdy5zZXJ2aWNlJztcbmltcG9ydCB7IEVhQ1NlcnZpY2UsIFNhdmVFbnZpcm9ubWVudEFzQ29kZUV2ZW50UmVxdWVzdCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VhYy5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uc0Zsb3dTdGF0ZSwgR2l0SHViQnJhbmNoLCBHaXRIdWJPcmdhbml6YXRpb24sIEdpdEh1YlJlcG9zaXRvcnksIFByb2plY3RIb3N0aW5nRGV0YWlscyB9IGZyb20gJy4uLy4uL3N0YXRlL2FwcGxpY2F0aW9ucy1mbG93LnN0YXRlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGN1LWRldm9wcy1zb3VyY2UtY29udHJvbC1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rldm9wcy1zb3VyY2UtY29udHJvbC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZXZvcHNTb3VyY2VDb250cm9sRm9ybUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgLy8gIEZpZWxkc1xuXG4gIEBJbnB1dCgnZWRpdGluZy1zb3VyY2UtY29udHJvbC1sb29rdXAnKVxuICBwdWJsaWMgRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXA6IHN0cmluZztcblxuICBASW5wdXQoJ2Vudmlyb25tZW50JylcbiAgcHVibGljIEVudmlyb25tZW50OiBFYUNFbnZpcm9ubWVudEFzQ29kZTtcblxuICBASW5wdXQoJ2Vudmlyb25tZW50LWxvb2t1cCcpXG4gIHB1YmxpYyBFbnZpcm9ubWVudExvb2t1cDogc3RyaW5nO1xuXG4gIEBPdXRwdXQoJ3NhdmUtc3RhdHVzLWV2ZW50JylcbiAgcHVibGljIFNhdmVTdGF0dXNFdmVudDogRXZlbnRFbWl0dGVyPFN0YXR1cz47XG5cbiAgQFZpZXdDaGlsZCgnYnJhbmNoZXMnKVxuICBwdWJsaWMgQnJhbmNoZXNJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICAvL09wdGlvbmFsIGlucHV0IG5vdCBiZWluZyB1c2VkIHNldHRpbmcgdG8gXG4gIC8vIEBJbnB1dCgnYnVpbGQtcGF0aCcpXG4gIHB1YmxpYyBCdWlsZFBhdGg6IHN0cmluZztcblxuICAvL09wdGlvbmFsIG5vdCBiZWluZyB1c2VkXG4gIC8vIEBJbnB1dCgnYnVpbGQtcGF0aC1kaXNhYmxlZCcpXG4gIHB1YmxpYyBCdWlsZFBhdGhEaXNhYmxlZDogYm9vbGVhbjtcblxuICAvLyB0aGlzIGlucHV0IGlzIG5vdCBiZWluZyB1c2VkIGFueXdoZXJlXG4gIC8vIEBJbnB1dCgnc291cmNlLWNvbnRyb2wtcm9vdCcpXG4gIHB1YmxpYyBTb3VyY2VDb250cm9sUm9vdDogc3RyaW5nO1xuXG4gIC8vbm90IGJlaW5nIHVzZWQgc2V0IHRvIHRydWUgYnkgZGVmYXVsdFxuICAvLyBASW5wdXQoJ3VzZS1icmFuY2hlcycpXG4gIHB1YmxpYyBVc2VCcmFuY2hlczogYm9vbGVhbjtcblxuICAvL25vdCBiZWluZyB1c2VkIHNldCB0byBmYWxzZSBieSBkZWZhdWx0XG4gIC8vIEBJbnB1dCgndXNlLWJ1aWxkLXBhdGgnKVxuICBwdWJsaWMgVXNlQnVpbGRQYXRoOiBib29sZWFuO1xuXG5cblxuXG4gIC8vICBQcm9wZXJ0aWVzXG5cbiAgcHVibGljIGdldCBBcnRpZmFjdExvb2t1cHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuRGV2T3BzQWN0aW9uPy5BcnRpZmFjdExvb2t1cHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEFydGlmYWN0TG9va3VwKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYXJ0TG9va3VwID0gdGhpcy5EZXZPcHNBY3Rpb24/LkFydGlmYWN0TG9va3Vwc1xuICAgICAgPyB0aGlzLkRldk9wc0FjdGlvbj8uQXJ0aWZhY3RMb29rdXBzWzBdXG4gICAgICA6IG51bGw7XG4gICAgICByZXR1cm4gYXJ0TG9va3VwO1xuICB9XG5cbiAgcHVibGljIGdldCBBcnRpZmFjdCgpXG4gIDogRWFDQXJ0aWZhY3R7XG4gICAgcmV0dXJuIHRoaXMuRW52aXJvbm1lbnQ/LkFydGlmYWN0cyAmJiB0aGlzLkFydGlmYWN0TG9va3VwXG4gICAgPyB0aGlzLkVudmlyb25tZW50Py5BcnRpZmFjdHNbdGhpcy5BcnRpZmFjdExvb2t1cF0gfHwge31cbiAgICA6IHt9O1xuICB9IFxuICBwdWJsaWMgZ2V0IEJyYW5jaGVzRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldCh0aGlzLlNvdXJjZUNvbnRyb2xSb290ICsgJ2JyYW5jaGVzJyk7XG4gIH1cblxuXG4gIHB1YmxpYyBnZXQgQnVpbGRQYXRoRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldCh0aGlzLlNvdXJjZUNvbnRyb2xSb290ICsgJ2J1aWxkUGF0aCcpO1xuICB9XG5cblxuICBwdWJsaWMgZ2V0IERldk9wc0FjdGlvbkxvb2t1cHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5EZXZPcHNBY3Rpb25zKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5EZXZPcHNBY3Rpb25zIHx8IHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRGV2T3BzQWN0aW9uKCk6IGFueXtcbiAgICByZXR1cm4gdGhpcy5FbnZpcm9ubWVudC5EZXZPcHNBY3Rpb25zICYmIHRoaXMuRGV2T3BzQWN0aW9uTG9va3VwXG4gICAgICA/IHRoaXMuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9uc1t0aGlzLkRldk9wc0FjdGlvbkxvb2t1cF0gfHwge31cbiAgICAgIDoge307XG4gIH1cblxuICBcblxuICBwdWJsaWMgZ2V0IERldk9wc0FjdGlvbkxvb2t1cCgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMuRGV2T3BzQWN0aW9uTG9va3VwRm9ybUNvbnRyb2w/LnZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXBGb3JtQ29udHJvbC52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoISF0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sPy5EZXZPcHNBY3Rpb25UcmlnZ2VyTG9va3Vwcykge1xuICAgICAgcmV0dXJuIHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2w/LkRldk9wc0FjdGlvblRyaWdnZXJMb29rdXBzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IERldk9wc0FjdGlvbkxvb2t1cEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5nZXQoJ2Rldk9wc0FjdGlvbkxvb2t1cCcpO1xuICB9XG5cbiAgcHVibGljIGdldCBEZXZPcHNBY3Rpb25zKCk6IHsgW2xvb2t1cDogc3RyaW5nXTogRWFDRGV2T3BzQWN0aW9uIH0ge1xuICAgIHJldHVybiB0aGlzLkVudmlyb25tZW50LkRldk9wc0FjdGlvbnMgfHwge307XG4gIH1cblxuICBwdWJsaWMgZ2V0IEVkaXRpbmdTb3VyY2VDb250cm9sKCk6IEVhQ1NvdXJjZUNvbnRyb2wge1xuICAgIGxldCBzYyA9IHRoaXMuRW52aXJvbm1lbnQ/LlNvdXJjZXNcbiAgICAgID8gdGhpcy5FbnZpcm9ubWVudD8uU291cmNlc1t0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sTG9va3VwXVxuICAgICAgOiBudWxsO1xuXG4gICAgaWYgKHNjID09IG51bGwgJiYgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbExvb2t1cCkge1xuICAgICAgc2MgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IE1haW5CcmFuY2hGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuZ2V0KHRoaXMuU291cmNlQ29udHJvbFJvb3QgKyAnbWFpbkJyYW5jaCcpO1xuICB9XG5cbiAgcHVibGljIGdldCBPcmdhbml6YXRpb25Gb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuZ2V0KHRoaXMuU291cmNlQ29udHJvbFJvb3QgKyAnb3JnYW5pemF0aW9uJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IFJlcG9zaXRvcnlGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuZ2V0KHRoaXMuU291cmNlQ29udHJvbFJvb3QgKyAncmVwb3NpdG9yeScpO1xuICB9XG5cbiAgcHVibGljIGdldCBTdGF0ZSgpOiBBcHBsaWNhdGlvbnNGbG93U3RhdGUge1xuICAgIHJldHVybiB0aGlzLmVhY1N2Yy5TdGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBCcmFuY2hPcHRpb25zOiBHaXRIdWJCcmFuY2hbXTtcblxuICBwdWJsaWMgQnVpbGRQYXRoT3B0aW9uczogc3RyaW5nW107XG5cbiAgcHVibGljIENyZWF0aW5nUmVwb3NpdG9yeTogYm9vbGVhbjtcblxuICBwdWJsaWMgRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cDogRm9ybUdyb3VwO1xuXG4gIHB1YmxpYyBIb3N0aW5nRGV0YWlsczogUHJvamVjdEhvc3RpbmdEZXRhaWxzO1xuXG4gIHB1YmxpYyBMb2FkaW5nOiBib29sZWFuO1xuXG4gIHB1YmxpYyBPcmdhbml6YXRpb25PcHRpb25zOiBHaXRIdWJPcmdhbml6YXRpb25bXTtcblxuICBwdWJsaWMgUmVwb3NpdG9yeU9wdGlvbnM6IEdpdEh1YlJlcG9zaXRvcnlbXTtcblxuICBwdWJsaWMgU2VsZWN0ZWRCcmFuY2hlczogc3RyaW5nW107XG5cbiAgcHVibGljIHJlYWRvbmx5IFNlcGFyYXRvcktleXNDb2RlcyA9IFtFTlRFUiwgQ09NTUFdIGFzIGNvbnN0O1xuXG4gIC8vICBDb25zdHJ1Y3RvcnNcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGFwcHNGbG93U3ZjOiBBcHBsaWNhdGlvbnNGbG93U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZWFjU3ZjOiBFYUNTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICkge1xuXG4gICAgdGhpcy5TYXZlU3RhdHVzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyO1xuXG4gICAgdGhpcy5CdWlsZFBhdGggPSBudWxsO1xuXG4gICAgdGhpcy5Ib3N0aW5nRGV0YWlscyA9IG5ldyBQcm9qZWN0SG9zdGluZ0RldGFpbHMoKTtcblxuICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IFtdO1xuXG4gICAgdGhpcy5Tb3VyY2VDb250cm9sUm9vdCA9ICcnO1xuXG4gICAgdGhpcy5Vc2VCcmFuY2hlcyA9IHRydWU7XG5cbiAgICB0aGlzLlVzZUJ1aWxkUGF0aCA9IGZhbHNlO1xuXG4gIH1cblxuICAvLyAgTGlmZSBDeWNsZVxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQgeyB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveUZvcm1Db250cm9scygpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXAgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuQ3JlYXRlTmV3U291cmNlQ29udHJvbCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sICE9IG51bGwpIHtcbiAgICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe30pO1xuXG4gICAgICB0aGlzLnNldHVwRm9ybUNvbnRyb2xzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5SZWZyZXNoT3JnYW5pemF0aW9ucygpO1xuICB9XG5cbiAgLy8gIEFQSSBNZXRob2RzXG4gIHB1YmxpYyBBZGRCcmFuY2hPcHRpb24oZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XG5cbiAgICB0aGlzLmFkZEJyYW5jaE9wdGlvbihldmVudC52YWx1ZSk7XG5cbiAgICBldmVudC5pbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgcHVibGljIEJyYW5jaE9wdGlvblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5hZGRCcmFuY2hPcHRpb24oZXZlbnQub3B0aW9uLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBCcmFuY2hlc0NoYW5nZWQoYnJhbmNoZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkUHJvamVjdEhvc3RpbmdEZXRhaWxzKCk7XG4gIH1cblxuICBwdWJsaWMgQnVpbGRQYXRoQ2hhbmdlZChldmVudDogTWF0U2VsZWN0Q2hhbmdlKTogdm9pZCB7XG4gICAgLy9kbyBzb21ldGhpbmc/P1xuICB9XG5cbiAgcHVibGljIENyZWF0ZU5ld1NvdXJjZUNvbnRyb2woKTogdm9pZCB7XG4gICAgdGhpcy5TZXRFZGl0aW5nU291cmNlQ29udHJvbChHdWlkLkNyZWF0ZVJhdygpKTtcbiAgfVxuXG4gIHB1YmxpYyBDcmVhdGVSZXBvc2l0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMuQ3JlYXRpbmdSZXBvc2l0b3J5ID0gdHJ1ZTtcblxuICAgIHRoaXMuUmVwb3NpdG9yeUZvcm1Db250cm9sLnJlc2V0KCk7XG4gIH1cblxuICBwdWJsaWMgQ2FuY2VsQ3JlYXRlUmVwb3NpdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLkNyZWF0aW5nUmVwb3NpdG9yeSA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIERldk9wc0FjdGlvbkxvb2t1cENoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlndXJlRGV2T3BzQWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgTWFpbkJyYW5jaENoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIHRoaXMuZW1pdEJyYW5jaGVzQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHVibGljIE9yZ2FuaXphdGlvbkNoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIGNvbnN0IG9yZyA9IHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w7XG5cbiAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC5yZXNldCgpO1xuXG4gICAgaWYgKHRoaXMuVXNlQnJhbmNoZXMpIHtcbiAgICAgIHRoaXMuQnJhbmNoZXNGb3JtQ29udHJvbC5yZXNldCgpO1xuXG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RSZXBvc2l0b3JpZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBSZWZyZXNoT3JnYW5pemF0aW9ucygpOiB2b2lkIHtcbiAgICAvLyB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMubGlzdE9yZ2FuaXphdGlvbnMoKTtcblxuICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnJlc2V0KCk7XG5cbiAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbD8ucmVzZXQoKTtcblxuICAgIGlmICh0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLkJyYW5jaGVzRm9ybUNvbnRyb2w/LnJlc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIFJlbW92ZUJyYW5jaE9wdGlvbihvcHRpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5TZWxlY3RlZEJyYW5jaGVzLmluZGV4T2Yob3B0aW9uKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXRCcmFuY2hlc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBSZXBvc2l0b3J5Q2hhbmdlZChldmVudDogTWF0U2VsZWN0Q2hhbmdlKTogdm9pZCB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMuUmVwb3NpdG9yeUZvcm1Db250cm9sO1xuXG4gICAgaWYgKHRoaXMuVXNlQnJhbmNoZXMpIHtcbiAgICAgIHRoaXMuQnJhbmNoZXNGb3JtQ29udHJvbC5yZXNldCgpO1xuXG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMgPSBbXTtcblxuICAgICAgdGhpcy5saXN0QnJhbmNoZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuVXNlQnJhbmNoZXMpIHtcbiAgICAgIHRoaXMubGlzdEJ1aWxkUGF0aHMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgU2F2ZVJlcG9zaXRvcnkoKTogdm9pZCB7XG4gICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IG9yZyA9IHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICBjb25zdCByZXBvTmFtZSA9IHRoaXMuUmVwb3NpdG9yeUZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgdGhpcy5hcHBzRmxvd1N2Y1xuICAgICAgLkNyZWF0ZVJlcG9zaXRvcnkob3JnLCByZXBvTmFtZSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBCYXNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLlN0YXR1cy5Db2RlID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5saXN0UmVwb3NpdG9yaWVzKHJlcG9OYW1lKTtcblxuICAgICAgICAgIHRoaXMuQ3JlYXRpbmdSZXBvc2l0b3J5ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gIFRPRE86ICBOZWVkIHRvIHN1cmZhY2UgYW4gZXJyb3IgdG8gdGhlIHVzZXIuLi5cblxuICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBTZXRFZGl0aW5nU291cmNlQ29udHJvbChzY0xvb2t1cDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbExvb2t1cCA9IHNjTG9va3VwO1xuICB9XG5cbiAgcHVibGljIFN1Ym1pdFNvdXJjZUNvbnRyb2woKSB7XG4gICAgY29uc29sZS5sb2coXCJzb3VyY2UgY29udHJvbCBzdWJtaXR0ZWQ6IFwiLCB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAudmFsdWUpO1xuICAgIHRoaXMuU2F2ZVNvdXJjZUNvbnRyb2woKTtcblxuICB9XG5cbiAgcHVibGljIFNhdmVTb3VyY2VDb250cm9sKCk6IHZvaWQge1xuICAgIGNvbnN0IHNhdmVFbnZSZXE6IFNhdmVFbnZpcm9ubWVudEFzQ29kZUV2ZW50UmVxdWVzdCA9ICBcblxuICAgIHtcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIC4uLnRoaXMuRW52aXJvbm1lbnQsXG4gICAgICAgIEFydGlmYWN0czogdGhpcy5FbnZpcm9ubWVudC5BcnRpZmFjdHMgfHwge30sXG4gICAgICAgIERldk9wc0FjdGlvbnM6IHRoaXMuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9ucyB8fCB7fSxcbiAgICAgICAgU2VjcmV0czogdGhpcy5FbnZpcm9ubWVudC5TZWNyZXRzIHx8IHt9LFxuICAgICAgICBTb3VyY2VzOiB0aGlzLkVudmlyb25tZW50LlNvdXJjZXMgfHwge30sXG4gICAgICB9LFxuICAgICAgRW52aXJvbm1lbnRMb29rdXA6IHRoaXMuRW52aXJvbm1lbnRMb29rdXAsXG4gICAgICBFbnRlcnByaXNlRGF0YVRva2Vuczoge30sXG4gICAgfTtcblxuICAgIGxldCBhcnRpZmFjdExvb2t1cDogc3RyaW5nO1xuXG4gICAgbGV0IGFydGlmYWN0ID0gdGhpcy5BcnRpZmFjdFxuXG4gICAgaWYgKCF0aGlzLkFydGlmYWN0TG9va3VwKSB7XG4gICAgICBhcnRpZmFjdExvb2t1cCA9IEd1aWQuQ3JlYXRlUmF3KCk7XG5cbiAgICAgIGFydGlmYWN0ID0ge1xuICAgICAgICAuLi5hcnRpZmFjdCxcbiAgICAgICAgLy8gVHlwZTogdGhpcy5Ib3N0aW5nRGV0YWlsc0Zvcm1Db250cm9scy5TZWxlY3RlZEhvc3RpbmdPcHRpb25cbiAgICAgICAgLy8gICAuQXJ0aWZhY3RUeXBlLFxuICAgICAgICAvLyBOYW1lOiB0aGlzLkhvc3RpbmdEZXRhaWxzRm9ybUNvbnRyb2xzLlNlbGVjdGVkSG9zdGluZ09wdGlvbi5OYW1lLFxuICAgICAgICBOUE1SZWdpc3RyeTogJ2h0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLycsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBhcnRpZmFjdExvb2t1cCA9IHRoaXMuQXJ0aWZhY3RMb29rdXA7XG4gICAgfVxuXG4gICAgc2F2ZUVudlJlcS5FbnZpcm9ubWVudC5BcnRpZmFjdHNbYXJ0aWZhY3RMb29rdXBdID0gYXJ0aWZhY3Q7XG5cbiAgICBsZXQgZGV2T3BzQWN0aW9uTG9va3VwOiBzdHJpbmc7XG5cbiAgICBpZiAoIXRoaXMuRGV2T3BzQWN0aW9uTG9va3VwKSB7XG4gICAgICBkZXZPcHNBY3Rpb25Mb29rdXAgPSBHdWlkLkNyZWF0ZVJhdygpO1xuXG4gICAgICBjb25zdCBkb2E6IEVhQ0Rldk9wc0FjdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5EZXZPcHNBY3Rpb24sXG4gICAgICAgIEFydGlmYWN0TG9va3VwczogW2FydGlmYWN0TG9va3VwXSxcbiAgICAgICAgXG4gICAgICB9O1xuXG4gICAgICBcbiAgICAgIHNhdmVFbnZSZXEuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9uc1tkZXZPcHNBY3Rpb25Mb29rdXBdID0gdGhpcy5EZXZPcHNBY3Rpb247XG5cbiAgICB9IGVsc2Uge1xuICAgICAgZGV2T3BzQWN0aW9uTG9va3VwID0gdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXBGb3JtQ29udHJvbC52YWx1ZTtcblxuICAgICAgY29uc3QgZG9hOiBFYUNEZXZPcHNBY3Rpb24gPSB7XG4gICAgICAgIC4uLnRoaXMuRGV2T3BzQWN0aW9uLFxuICAgICAgICAvLyBOYW1lOiB0aGlzLkhvc3RpbmdEZXRhaWxzRm9ybUNvbnRyb2xzLkRldk9wc0FjdGlvbk5hbWVGb3JtQ29udHJvbC52YWx1ZSxcbiAgICAgIH07XG5cbiAgICAgIC8vIHNhdmVFbnZSZXEuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9uc1tkZXZPcHNBY3Rpb25Mb29rdXBdID0gZG9hO1xuICAgICAgc2F2ZUVudlJlcS5FbnZpcm9ubWVudC5EZXZPcHNBY3Rpb25zW2Rldk9wc0FjdGlvbkxvb2t1cF0gPSB0aGlzLkRldk9wc0FjdGlvbjtcblxuICAgIH1cblxuICAgIGxldCBzb3VyY2U6IEVhQ1NvdXJjZUNvbnRyb2wgPSB7XG4gICAgICAuLi50aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sLFxuICAgICAgQnJhbmNoZXM6IHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyxcbiAgICAgIE1haW5CcmFuY2g6IHRoaXMuTWFpbkJyYW5jaEZvcm1Db250cm9sLnZhbHVlLFxuICAgIH07XG5cbiAgICBzb3VyY2UgPSB7XG4gICAgICAuLi5zb3VyY2UsXG4gICAgICBUeXBlOiAnR2l0SHViJyxcbiAgICAgIE5hbWU6IHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXAsXG4gICAgICBEZXZPcHNBY3Rpb25UcmlnZ2VyTG9va3VwczogW2Rldk9wc0FjdGlvbkxvb2t1cF0sXG4gICAgICBPcmdhbml6YXRpb246XG4gICAgICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgICBSZXBvc2l0b3J5OiB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC52YWx1ZSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2NMb29rdXAgPSBgZ2l0aHViOi8vJHtzb3VyY2UuT3JnYW5pemF0aW9ufS8ke3NvdXJjZS5SZXBvc2l0b3J5fWA7XG5cbiAgICBzYXZlRW52UmVxLkVudmlyb25tZW50LlNvdXJjZXNbc2NMb29rdXBdID0gc291cmNlO1xuXG4gICAgbGV0IHJlc3AgPSB0aGlzLmVhY1N2Yy5TYXZlRW52aXJvbm1lbnRBc0NvZGUoc2F2ZUVudlJlcSk7XG5cbiAgICByZXNwLnRoZW4ocmVzID0+e1xuICAgICAgdGhpcy5TYXZlU3RhdHVzRXZlbnQuZW1pdChyZXMpO1xuICAgIH0pXG5cbiAgICBcbiAgfVxuXG4gIC8vICBIZWxwZXJzXG5cbiAgcHJvdGVjdGVkIGFkZEJyYW5jaE9wdGlvbih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdmFsdWUgPSAodmFsdWUgfHwgJycpLnRyaW0oKTtcblxuICAgIGlmICh2YWx1ZSAmJiB0aGlzLlNlbGVjdGVkQnJhbmNoZXMuaW5kZXhPZih2YWx1ZSkgPCAwKSB7XG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5CcmFuY2hlc0lucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuXG4gICAgdGhpcy5lbWl0QnJhbmNoZXNDaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlRGV2T3BzQWN0aW9uKCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXBGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLkRldk9wc0FjdGlvbkxvb2t1cCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUZvcm1Db250cm9scygpOiB2b2lkIHtcbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAucmVtb3ZlQ29udHJvbChcbiAgICAgIFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAnbWFpbkJyYW5jaCddLmpvaW4oJycpXG4gICAgKTtcblxuICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cD8ucmVtb3ZlQ29udHJvbChbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ2JyYW5jaGVzJ10uam9pbignJykpO1xuXG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwPy5yZW1vdmVDb250cm9sKFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAnYnVpbGRQYXRoJ10uam9pbignJykpO1xuXG4gICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzID0gW107XG5cbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXA/LnJlbW92ZUNvbnRyb2woXG4gICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ29yZ2FuaXphdGlvbiddLmpvaW4oJycpXG4gICAgKTtcblxuICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cD8ucmVtb3ZlQ29udHJvbChcbiAgICAgIFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAncmVwb3NpdG9yeSddLmpvaW4oJycpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0QnJhbmNoZXNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcz8ubGVuZ3RoID4gMCAmJlxuICAgICAgKCF0aGlzLk1haW5CcmFuY2hGb3JtQ29udHJvbC52YWx1ZSB8fFxuICAgICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMuaW5kZXhPZih0aGlzLk1haW5CcmFuY2hGb3JtQ29udHJvbC52YWx1ZSkgPCAwKVxuICAgICkge1xuICAgICAgdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wuc2V0VmFsdWUoXG4gICAgICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcy5maW5kKFxuICAgICAgICAgIChicmFuY2gpID0+IGJyYW5jaCA9PT0gJ21haW4nIHx8IGJyYW5jaCA9PT0gJ21hc3RlcidcbiAgICAgICAgKSB8fCB0aGlzLlNlbGVjdGVkQnJhbmNoZXNbMF1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLlNlbGVjdGVkQnJhbmNoZXM/Lmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aGlzLk1haW5CcmFuY2hGb3JtQ29udHJvbC5yZXNldCgpO1xuICAgIH1cblxuICAgIHRoaXMuQnJhbmNoZXNGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLlNlbGVjdGVkQnJhbmNoZXMuam9pbignLCcpKTtcblxuICAgIHRoaXMuQnJhbmNoZXNDaGFuZ2VkKHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyB8fCBbXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbGlzdEJyYW5jaGVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICB0aGlzLmFwcHNGbG93U3ZjXG4gICAgICAgIC5MaXN0QnJhbmNoZXMoXG4gICAgICAgICAgdGhpcy5Pcmdhbml6YXRpb25Gb3JtQ29udHJvbC52YWx1ZSxcbiAgICAgICAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC52YWx1ZVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBCYXNlTW9kZWxlZFJlc3BvbnNlPEdpdEh1YkJyYW5jaFtdPikgPT4ge1xuICAgICAgICAgIHRoaXMuQnJhbmNoT3B0aW9ucyA9IHJlc3BvbnNlLk1vZGVsO1xuXG4gICAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAodGhpcy5FZGl0aW5nU291cmNlQ29udHJvbD8uQnJhbmNoZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2wuQnJhbmNoZXM7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLkJyYW5jaE9wdGlvbnM/Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5CcmFuY2hlc0Zvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuQnJhbmNoT3B0aW9uc1swXS5OYW1lKTtcblxuICAgICAgICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzID0gW3RoaXMuQnJhbmNoT3B0aW9uc1swXS5OYW1lXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmVtaXRCcmFuY2hlc0NoYW5nZWQoKTtcblxuICAgICAgICAgIHRoaXMubGlzdEJ1aWxkUGF0aHMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGxpc3RCdWlsZFBhdGhzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLlVzZUJ1aWxkUGF0aCkge1xuICAgICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgdGhpcy5hcHBzRmxvd1N2Y1xuICAgICAgICAuTGlzdEJ1aWxkUGF0aHMoXG4gICAgICAgICAgdGhpcy5Pcmdhbml6YXRpb25Gb3JtQ29udHJvbC52YWx1ZSxcbiAgICAgICAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC52YWx1ZVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBCYXNlTW9kZWxlZFJlc3BvbnNlPHN0cmluZ1tdPikgPT4ge1xuICAgICAgICAgIHRoaXMuQnVpbGRQYXRoT3B0aW9ucyA9IHJlc3BvbnNlLk1vZGVsO1xuXG4gICAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAodGhpcy5CdWlsZFBhdGhPcHRpb25zPy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuQnVpbGRQYXRoRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5CdWlsZFBhdGhPcHRpb25zWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBsaXN0T3JnYW5pemF0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5hcHBzRmxvd1N2Y1xuICAgICAgLkxpc3RPcmdhbml6YXRpb25zKClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBCYXNlTW9kZWxlZFJlc3BvbnNlPEdpdEh1Yk9yZ2FuaXphdGlvbltdPikgPT4ge1xuICAgICAgICB0aGlzLk9yZ2FuaXphdGlvbk9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5FZGl0aW5nU291cmNlQ29udHJvbD8uT3JnYW5pemF0aW9uKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sLnNldFZhbHVlKFxuICAgICAgICAgICAgICB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sLk9yZ2FuaXphdGlvblxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5saXN0UmVwb3NpdG9yaWVzKHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2w/LlJlcG9zaXRvcnkpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBsaXN0UmVwb3NpdG9yaWVzKGFjdGl2ZVJlcG86IHN0cmluZyA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5hcHBzRmxvd1N2Y1xuICAgICAgLkxpc3RSZXBvc2l0b3JpZXModGhpcy5Pcmdhbml6YXRpb25Gb3JtQ29udHJvbC52YWx1ZSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBCYXNlTW9kZWxlZFJlc3BvbnNlPEdpdEh1YlJlcG9zaXRvcnlbXT4pID0+IHtcbiAgICAgICAgdGhpcy5SZXBvc2l0b3J5T3B0aW9ucyA9IHJlc3BvbnNlLk1vZGVsO1xuXG4gICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChhY3RpdmVSZXBvKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC5zZXRWYWx1ZShhY3RpdmVSZXBvKTtcblxuICAgICAgICAgICAgdGhpcy5saXN0QnJhbmNoZXMoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICAgICAgICAgIHRoaXMubGlzdEJ1aWxkUGF0aHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLlJlcG9zaXRvcnlPcHRpb25zPy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgIHRoaXMuQ3JlYXRpbmdSZXBvc2l0b3J5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbG9hZFByb2plY3RIb3N0aW5nRGV0YWlscygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5TZWxlY3RlZEJyYW5jaGVzPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLkhvc3RpbmdEZXRhaWxzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICB0aGlzLmFwcHNGbG93U3ZjXG4gICAgICAgIC5Mb2FkUHJvamVjdEhvc3RpbmdEZXRhaWxzKFxuICAgICAgICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnZhbHVlLFxuICAgICAgICAgIHRoaXMuUmVwb3NpdG9yeUZvcm1Db250cm9sPy52YWx1ZSxcbiAgICAgICAgICB0aGlzLk1haW5CcmFuY2hGb3JtQ29udHJvbD8udmFsdWVcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxQcm9qZWN0SG9zdGluZ0RldGFpbHM+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLkhvc3RpbmdEZXRhaWxzID0gcmVzcG9uc2UuTW9kZWw7XG5cbiAgICAgICAgICAgIHRoaXMuSG9zdGluZ0RldGFpbHMuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZURldk9wc0FjdGlvbigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5Ib3N0aW5nRGV0YWlscy5Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cEZvcm1Db250cm9scygpOiB2b2lkIHtcblxuICAgIC8vIHRoaXMuZGVzdHJveUZvcm1Db250cm9scygpO1xuXG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAnZGV2T3BzQWN0aW9uTG9va3VwJyxcbiAgICAgIG5ldyBGb3JtQ29udHJvbCh0aGlzLkRldk9wc0FjdGlvbkxvb2t1cCB8fCAnJywgW10pXG4gICAgKTtcblxuXG5cbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgIFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAnb3JnYW5pemF0aW9uJ10uam9pbignJyksXG4gICAgICBuZXcgRm9ybUNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2wuT3JnYW5pemF0aW9uID8/ICcnLFxuICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdyZXBvc2l0b3J5J10uam9pbignJyksXG4gICAgICBuZXcgRm9ybUNvbnRyb2wodGhpcy5FZGl0aW5nU291cmNlQ29udHJvbC5SZXBvc2l0b3J5ID8/ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5Vc2VCcmFuY2hlcykge1xuICAgICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAgIFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAnYnJhbmNoZXMnXS5qb2luKCcnKSxcbiAgICAgICAgbmV3IEZvcm1Db250cm9sKHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2w/LkJyYW5jaGVzID8/ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgKTtcblxuICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzID0gdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbD8uQnJhbmNoZXM7XG5cbiAgICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ21haW5CcmFuY2gnXS5qb2luKCcnKSxcbiAgICAgICAgbmV3IEZvcm1Db250cm9sKFxuICAgICAgICAgIHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2wuTWFpbkJyYW5jaCA/PyAnJyxcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuVXNlQnVpbGRQYXRoKSB7XG4gICAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICAgW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdidWlsZFBhdGgnXS5qb2luKCcnKSxcbiAgICAgICAgbmV3IEZvcm1Db250cm9sKHRoaXMuQnVpbGRQYXRoID8/ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn0iLCI8Zm9ybSBjbGFzcz1cImZvcm0tY2FyZFwiIFtmb3JtR3JvdXBdPVwiRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJTdWJtaXRTb3VyY2VDb250cm9sKClcIj5cblxuICA8bWF0LWNhcmQgY2xhc3M9XCJzcHJlYWRcIiBjbGFzcz1cInNjLWNhcmRcIj5cbiAgICA8bWF0LWNhcmQtaGVhZGVyPlxuICAgICAgPG1hdC1jYXJkLXRpdGxlPiBTb3VyY2UgQ29udHJvbCA8L21hdC1jYXJkLXRpdGxlPlxuXG4gICAgICA8ZGl2IGZ4RmxleD48L2Rpdj5cblxuICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeCBtYXRUb29sdGlwPVwiQ29uZmlndXJlIHNvdXJjZSBjb250cm9sLCBEZXZPcHMgQ0kvQ0QsIGFuZCBhcnRpZmFjdHMuXCI+XG4gICAgICAgIGluZm9fb3V0bGluZVxuICAgICAgPC9tYXQtaWNvbj5cbiAgICA8L21hdC1jYXJkLWhlYWRlcj5cblxuICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkZXZPcHNBY3Rpb25Mb29rdXBcIiBwbGFjZWhvbGRlcj1cIkRldk9wcyBBY3Rpb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIkhvc3RpbmdEZXRhaWxzPy5Mb2FkaW5nXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJEZXZPcHNBY3Rpb25Mb29rdXBDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRldk9wc0FjdGlvbkxvb2t1cCBvZiBEZXZPcHNBY3Rpb25Mb29rdXBzXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJkZXZPcHNBY3Rpb25Mb29rdXBcIiAqbmdJZj1cIkRldk9wc0FjdGlvbnNbZGV2T3BzQWN0aW9uTG9va3VwXTsgbGV0IGRldk9wc0FjdGlvblwiPlxuICAgICAgICAgICAgICAgIHt7IGRldk9wc0FjdGlvbi5OYW1lIH19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiPi0tIENyZWF0ZSBOZXcgLS08L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiICpuZ0lmPVwiT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnZhbGlkIHx8ICFMb2FkaW5nXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoIHdpdGgtaGludCBtYXJnaW4tYm90dG9tXCIgKm5nSWY9XCJPcmdhbml6YXRpb25PcHRpb25zPy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwib3JnLWljb25cIiBtYXRQcmVmaXg+Y29ycG9yYXRlX2ZhcmU8L21hdC1pY29uPlxuXG4gICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJTb3VyY2VDb250cm9sUm9vdCArICdvcmdhbml6YXRpb24nXCIgcGxhY2Vob2xkZXI9XCJPcmdhbml6YXRpb25cIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJPcmdhbml6YXRpb25DaGFuZ2VkKCRldmVudClcIiBbZGlzYWJsZWRdPVwiTG9hZGluZyB8fCBIb3N0aW5nRGV0YWlscz8uTG9hZGluZ1wiIHJlcXVpcmVkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3JnT3B0IG9mIE9yZ2FuaXphdGlvbk9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIm9yZ09wdC5OYW1lXCI+XG4gICAgICAgICAgICAgICAge3sgb3JnT3B0Lk5hbWUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuXG4gICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeCAoY2xpY2spPVwiUmVmcmVzaE9yZ2FuaXphdGlvbnMoKVwiIG1hdFRvb2x0aXA9XCJSZWZyZXNoIE9yZ2FuaXphdGlvblwiPiByZWZyZXNoIDwvbWF0LWljb24+XG5cbiAgICAgICAgICA8YSBtYXRTdWZmaXggaHJlZj1cIi8ub2F1dGgvZ2l0aHViP29hdXRoLWZvcmNlLWVkaXQ9dHJ1ZVwiIHRhcmdldD1cIl9ibGFua1wiIGNvbG9yPVwiYWNjZW50XCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJhY2NlbnRcIiBtYXRUb29sdGlwPVwiUmUtYXV0aG9yaXplIE9yZ2FuaXphdGlvbnNcIj4gbGF1bmNoIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgSWYgeW91IGRvbid0IGhhdmUgYW4gb3JnYW5pemF0aW9uIG9yIHdvdWxkIGxpa2UgdG8gY3JlYXRlIGEgbmV3IG9uZSxcbiAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vYWNjb3VudC9vcmdhbml6YXRpb25zL25ld1wiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAgICBzdGFydCBoZXJlXG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgUmVwb3NpdG9yeUZvcm1Db250cm9sPy52YWxpZCB8fFxuICAgICAgICAgICAgICAgIChPcmdhbml6YXRpb25Gb3JtQ29udHJvbD8udmFsaWQgJiYgIUxvYWRpbmcpXG4gICAgICAgICAgICAgIFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZy1pY29uXCIgbWF0UHJlZml4PmRlc2NyaXB0aW9uPC9tYXQtaWNvbj5cblxuICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiU291cmNlQ29udHJvbFJvb3QgKyAncmVwb3NpdG9yeSdcIiBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIE9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgID8gJ1JlcG9zaXRvcnknXG4gICAgICAgICAgICAgICAgICAgICAgOiAnUmVwb3NpdG9yeSAoc2VsZWN0IG9yZ2FuaXphdGlvbiBmaXJzdCknXG4gICAgICAgICAgICAgICAgICBcIiBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICFPcmdhbml6YXRpb25Gb3JtQ29udHJvbD8udmFsaWQgfHwgTG9hZGluZyB8fCBIb3N0aW5nRGV0YWlscz8uTG9hZGluZ1xuICAgICAgICAgICAgICAgICAgXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJSZXBvc2l0b3J5Q2hhbmdlZCgkZXZlbnQpXCIgKm5nSWY9XCIhQ3JlYXRpbmdSZXBvc2l0b3J5XCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByZXBvT3B0IG9mIFJlcG9zaXRvcnlPcHRpb25zXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJyZXBvT3B0Lk5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyByZXBvT3B0Lk5hbWUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiUmVwb3NpdG9yeSAoY3JlYXRlcyBuZXcgaWYgZG9lcyBub3QgZXhpc3QpXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiU291cmNlQ29udHJvbFJvb3QgKyAncmVwb3NpdG9yeSdcIiAqbmdJZj1cIkNyZWF0aW5nUmVwb3NpdG9yeVwiXG4gICAgICAgICAgICBbZnhIaWRlXT1cIkxvYWRpbmcgfHwgSG9zdGluZ0RldGFpbHM/LkxvYWRpbmdcIiByZXF1aXJlZCAvPlxuXG4gICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeCAoY2xpY2spPVwiQ3JlYXRlUmVwb3NpdG9yeSgpXCIgW2Z4SGlkZV09XCJMb2FkaW5nIHx8IEhvc3RpbmdEZXRhaWxzPy5Mb2FkaW5nXCJcbiAgICAgICAgICAgICpuZ0lmPVwiIUNyZWF0aW5nUmVwb3NpdG9yeSAmJiBPcmdhbml6YXRpb25Gb3JtQ29udHJvbD8udmFsaWRcIj5cbiAgICAgICAgICAgIGFkZF9jaXJjbGVcbiAgICAgICAgICA8L21hdC1pY29uPlxuXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiU2F2ZVJlcG9zaXRvcnkoKVwiXG4gICAgICAgICAgICAqbmdJZj1cIkNyZWF0aW5nUmVwb3NpdG9yeSAmJiBSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkXCI+XG5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgIHNhdmVcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJDYW5jZWxDcmVhdGVSZXBvc2l0b3J5KClcIiAqbmdJZj1cIkNyZWF0aW5nUmVwb3NpdG9yeVwiPlxuXG4gICAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4PlxuICAgICAgICAgICAgICBjYW5jZWxcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIChCcmFuY2hlc0Zvcm1Db250cm9sPy52YWxpZCB8fFxuICAgICAgICAgICAgICAgICAgKE9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgICFMb2FkaW5nKSkgJiZcbiAgICAgICAgICAgICAgICAhQ3JlYXRpbmdSZXBvc2l0b3J5ICYmXG4gICAgICAgICAgICAgICAgVXNlQnJhbmNoZXNcbiAgICAgICAgICAgICAgXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwib3JnLWljb25cIiBtYXRQcmVmaXg+YWNjb3VudF90cmVlPC9tYXQtaWNvbj5cblxuICAgICAgICAgIDxtYXQtbGFiZWw+U2VsZWN0ZWQgQnJhbmNoZXM8L21hdC1sYWJlbD5cblxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlIChvcHRpb25TZWxlY3RlZCk9XCJCcmFuY2hPcHRpb25TZWxlY3RlZCgkZXZlbnQpXCIgI2JyYW5jaE9wdGlvbnM9XCJtYXRBdXRvY29tcGxldGVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJyYW5jaE9wdCBvZiBCcmFuY2hPcHRpb25zXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJicmFuY2hPcHQuTmFtZVwiPlxuICAgICAgICAgICAgICAgIHt7IGJyYW5jaE9wdC5OYW1lIH19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cblxuICAgICAgICAgIDxtYXQtY2hpcC1saXN0ICNzZWxlY3RlZEJyYW5jaGVzPlxuICAgICAgICAgICAgPG1hdC1jaGlwIFtyZW1vdmFibGVdPVwidHJ1ZVwiIChyZW1vdmVkKT1cIlJlbW92ZUJyYW5jaE9wdGlvbihzZWxCcmFuY2gpXCJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNlbEJyYW5jaCBvZiBTZWxlY3RlZEJyYW5jaGVzXCI+XG4gICAgICAgICAgICAgIHt7IHNlbEJyYW5jaCB9fVxuICAgICAgICAgICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZT5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9tYXQtY2hpcD5cblxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiTmV3IEJyYW5jaC4uLlwiIFtmb3JtQ29udHJvbE5hbWVdPVwiU291cmNlQ29udHJvbFJvb3QgKyAnYnJhbmNoZXMnXCIgI2JyYW5jaGVzXG4gICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYnJhbmNoT3B0aW9uc1wiIFttYXRDaGlwSW5wdXRGb3JdPVwic2VsZWN0ZWRCcmFuY2hlc1wiXG4gICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJTZXBhcmF0b3JLZXlzQ29kZXNcIiBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAobWF0Q2hpcElucHV0VG9rZW5FbmQpPVwiQWRkQnJhbmNoT3B0aW9uKCRldmVudClcIiBbZGlzYWJsZWRdPVwiTG9hZGluZyB8fCBIb3N0aW5nRGV0YWlscz8uTG9hZGluZ1wiXG4gICAgICAgICAgICAgIHJlcXVpcmVkIC8+XG4gICAgICAgICAgPC9tYXQtY2hpcC1saXN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoIHdpdGgtaGludFwiIFtmeFNob3ddPVwiU2VsZWN0ZWRCcmFuY2hlcz8ubGVuZ3RoID4gMVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZy1pY29uXCIgbWF0UHJlZml4PmFjY291bnRfdHJlZTwvbWF0LWljb24+XG5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cIlNvdXJjZUNvbnRyb2xSb290ICsgJ21haW5CcmFuY2gnXCIgcGxhY2Vob2xkZXI9XCJNYWluIEJyYW5jaFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiTG9hZGluZyB8fCBIb3N0aW5nRGV0YWlscz8uTG9hZGluZ1wiIChzZWxlY3Rpb25DaGFuZ2UpPVwiTWFpbkJyYW5jaENoYW5nZWQoJGV2ZW50KVwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnJhbmNoIG9mIFNlbGVjdGVkQnJhbmNoZXNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImJyYW5jaFwiPlxuICAgICAgICAgICAgICAgIHt7IGJyYW5jaCB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4IChjbGljayk9XCJSZWZyZXNoT3JnYW5pemF0aW9ucygpXCI+IHJlZnJlc2ggPC9tYXQtaWNvbj5cblxuICAgICAgICAgIDxhIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gaHJlZj1cIi8ub2F1dGgvZ2l0aHViP29hdXRoLWZvcmNlLWVkaXQ9dHJ1ZVwiIHRhcmdldD1cIl9ibGFua1wiIGNvbG9yPVwiYWNjZW50XCI+XG4gICAgICAgICAgICA8bWF0LWljb24gbWF0VG9vbHRpcD1cIlJlLWF1dGhvcml6ZSBPcmdhbml6YXRpb25zXCIgY29sb3I9XCJhY2NlbnRcIj4gbGF1bmNoIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgSWYgeW91IGRvbid0IGhhdmUgYW4gb3JnYW5pemF0aW9uIG9yIHdvdWxkIGxpa2UgdG8gY3JlYXRlIGEgbmV3IG9uZSxcbiAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vYWNjb3VudC9vcmdhbml6YXRpb25zL25ld1wiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAgICBzdGFydCBoZXJlXG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgKEJ1aWxkUGF0aEZvcm1Db250cm9sPy52YWxpZCB8fFxuICAgICAgICAgICAgICAgICAgKE9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgICFMb2FkaW5nKSkgJiZcbiAgICAgICAgICAgICAgICAhQ3JlYXRpbmdSZXBvc2l0b3J5ICYmXG4gICAgICAgICAgICAgICAgVXNlQnVpbGRQYXRoXG4gICAgICAgICAgICAgIFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aCB3aXRoLWhpbnRcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmctaWNvblwiIG1hdFByZWZpeD5idWlsZDwvbWF0LWljb24+XG5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cIlNvdXJjZUNvbnRyb2xSb290ICsgJ2J1aWxkUGF0aCdcIiBwbGFjZWhvbGRlcj1cIkJ1aWxkIFBhdGhcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIkxvYWRpbmcgfHwgQnVpbGRQYXRoRGlzYWJsZWRcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIkJ1aWxkUGF0aENoYW5nZWQoJGV2ZW50KVwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnVpbGRQYXRoIG9mIEJ1aWxkUGF0aE9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImJ1aWxkUGF0aFwiPlxuICAgICAgICAgICAgICAgIHt7IGJ1aWxkUGF0aCB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICBUaGUgYnVpbGQgcGF0aCBpZGVudGlmaWVzIHdoaWNoIGJ1aWxkIGFjdGlvbiB0byB1c2UgZm9yIHlvdXJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiTG9hZGluZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ByZWFkXCI+XG4gICAgICAgICAgPGxjdS1sb2FkZXIgc3R5bGU9XCJtYXJnaW46IGF1dG9cIiBbbG9hZGluZ109XCJ0cnVlXCI+PC9sY3UtbG9hZGVyPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcmdpbi0zXCI+XG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtYXQtdGl0bGVcIiAqbmdJZj1cIiFPcmdhbml6YXRpb25Gb3JtQ29udHJvbD8udmFsaWRcIj5cbiAgICAgICAgICAgICAgTG9hZGluZyBvcmdhbml6YXRpb25zXG4gICAgICAgICAgICA8L2g0PlxuXG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtYXQtdGl0bGVcIiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIE9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZCAmJiAhUmVwb3NpdG9yeUZvcm1Db250cm9sPy52YWxpZFxuICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgTG9hZGluZyByZXBvc2l0b3JpZXNcbiAgICAgICAgICAgIDwvaDQ+XG5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1hdC10aXRsZVwiICpuZ0lmPVwiUmVwb3NpdG9yeUZvcm1Db250cm9sPy52YWxpZCAmJiAhQnJhbmNoZXNGb3JtQ29udHJvbD8udmFsaWRcIj5cbiAgICAgICAgICAgICAgTG9hZGluZyBicmFuY2hlc1xuICAgICAgICAgICAgPC9oND5cblxuICAgICAgICAgICAgPGg0IGNsYXNzPVwibWF0LXRpdGxlXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAoUmVwb3NpdG9yeUZvcm1Db250cm9sPy52YWxpZCB8fCBCcmFuY2hlc0Zvcm1Db250cm9sPy52YWxpZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhQnVpbGRQYXRoRm9ybUNvbnRyb2w/LnZhbGlkXG4gICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIGJ1aWxkIHBhdGhzXG4gICAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSA8L2Rpdj4gLS0+XG5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPG1hdC1jYXJkLWFjdGlvbnMgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIj5cblxuICAgICAgPGJ1dHRvbiBcbiAgICAgICAgbWF0LXJhaXNlZC1idXR0b24gXG4gICAgICAgICpuZ0lmPVwiIVN0YXRlPy5Mb2FkaW5nXCJcbiAgICAgICAgdHlwZT1cInN1Ym1pdFwiIFxuICAgICAgICBmeEZsZXg9XCIxMDAlXCIgXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiIFxuICAgICAgICBbZGlzYWJsZWRdPVwiIURldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAudmFsaWQgfHwgIURldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuZGlydHlcIj5cbiAgICAgICAgPG1hdC1pY29uPnNhdmU8L21hdC1pY29uPlxuICAgICAgICBTYXZlIFNvdXJjZSBDb250cm9sXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxsY3UtbG9hZGVyIFtsb2FkaW5nXT1cIlN0YXRlPy5Mb2FkaW5nXCI+PC9sY3UtbG9hZGVyPlxuICAgICAgXG4gIDwvbWF0LWNhcmQtYWN0aW9ucz5cbiAgPC9tYXQtY2FyZD5cbjwvZm9ybT4iXX0=
398
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvY29udHJvbHMvZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0vZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvY29udHJvbHMvZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0vZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0wsV0FBVyxFQUVYLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBSXhCLE9BQU8sRUFBcUMsSUFBSSxFQUFVLE1BQU0sYUFBYSxDQUFDO0FBWTlFLE9BQU8sRUFLTCxxQkFBcUIsR0FDdEIsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU83QyxNQUFNLE9BQU8sZ0NBQWdDO0lBMkozQyxnQkFBZ0I7SUFDaEIsWUFDWSxXQUFvQyxFQUNwQyxNQUFrQixFQUNsQixXQUF3QjtRQUZ4QixnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFDcEMsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQU5wQix1QkFBa0IsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQVUsQ0FBQztRQVEzRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7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QUFFLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFDL0MsSUFBSSxXQUFXLENBQ2IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQzFDLFVBQVUsQ0FBQyxRQUFRLENBQ3BCLENBQ0YsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQzFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFDOUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUMzRCxDQUFDO1NBQ0g7SUFDSCxDQUFDOzs2SEEzbEJVLGdDQUFnQztpSEFBaEMsZ0NBQWdDLDBiQy9DN0Msd3lVQThQTzsyRkQvTU0sZ0NBQWdDO2tCQUw1QyxTQUFTOytCQUNFLGdDQUFnQztpS0FVbkMsMEJBQTBCO3NCQURoQyxLQUFLO3VCQUFDLCtCQUErQjtnQkFJL0IsV0FBVztzQkFEakIsS0FBSzt1QkFBQyxhQUFhO2dCQUliLGlCQUFpQjtzQkFEdkIsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBSXBCLGVBQWU7c0JBRHJCLE1BQU07dUJBQUMsbUJBQW1CO2dCQUlwQixhQUFhO3NCQURuQixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT01NQSwgRU5URVIgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQnVpbGRlcixcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBNYXRDaGlwSW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcbmltcG9ydCB7IE1hdFNlbGVjdENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBCYXNlTW9kZWxlZFJlc3BvbnNlLCBCYXNlUmVzcG9uc2UsIEd1aWQsIFN0YXR1cyB9IGZyb20gJ0BsY3UvY29tbW9uJztcbmltcG9ydCB7XG4gIEVhQ0FydGlmYWN0LFxuICBFYUNEZXZPcHNBY3Rpb24sXG4gIEVhQ0Vudmlyb25tZW50QXNDb2RlLFxuICBFYUNTb3VyY2VDb250cm9sLFxufSBmcm9tICdAc2VtYW50aWNqcy9jb21tb24nO1xuaW1wb3J0IHsgQXBwbGljYXRpb25zRmxvd1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHBsaWNhdGlvbnMtZmxvdy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEVhQ1NlcnZpY2UsXG4gIFNhdmVFbnZpcm9ubWVudEFzQ29kZUV2ZW50UmVxdWVzdCxcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWFjLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25zRmxvd1N0YXRlLFxuICBHaXRIdWJCcmFuY2gsXG4gIEdpdEh1Yk9yZ2FuaXphdGlvbixcbiAgR2l0SHViUmVwb3NpdG9yeSxcbiAgUHJvamVjdEhvc3RpbmdEZXRhaWxzLFxufSBmcm9tICcuLi8uLi9zdGF0ZS9hcHBsaWNhdGlvbnMtZmxvdy5zdGF0ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xjdS1kZXZvcHMtc291cmNlLWNvbnRyb2wtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXZvcHMtc291cmNlLWNvbnRyb2wtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rldm9wcy1zb3VyY2UtY29udHJvbC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERldm9wc1NvdXJjZUNvbnRyb2xGb3JtQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkluaXRcbntcbiAgLy8gIEZpZWxkc1xuXG4gIEBJbnB1dCgnZWRpdGluZy1zb3VyY2UtY29udHJvbC1sb29rdXAnKVxuICBwdWJsaWMgRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXA6IHN0cmluZztcblxuICBASW5wdXQoJ2Vudmlyb25tZW50JylcbiAgcHVibGljIEVudmlyb25tZW50OiBFYUNFbnZpcm9ubWVudEFzQ29kZTtcblxuICBASW5wdXQoJ2Vudmlyb25tZW50LWxvb2t1cCcpXG4gIHB1YmxpYyBFbnZpcm9ubWVudExvb2t1cDogc3RyaW5nO1xuXG4gIEBPdXRwdXQoJ3NhdmUtc3RhdHVzLWV2ZW50JylcbiAgcHVibGljIFNhdmVTdGF0dXNFdmVudDogRXZlbnRFbWl0dGVyPFN0YXR1cz47XG5cbiAgQFZpZXdDaGlsZCgnYnJhbmNoZXMnKVxuICBwdWJsaWMgQnJhbmNoZXNJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICAvL09wdGlvbmFsIGlucHV0IG5vdCBiZWluZyB1c2VkIHNldHRpbmcgdG9cbiAgLy8gQElucHV0KCdidWlsZC1wYXRoJylcbiAgcHVibGljIEJ1aWxkUGF0aDogc3RyaW5nO1xuXG4gIC8vT3B0aW9uYWwgbm90IGJlaW5nIHVzZWRcbiAgLy8gQElucHV0KCdidWlsZC1wYXRoLWRpc2FibGVkJylcbiAgcHVibGljIEJ1aWxkUGF0aERpc2FibGVkOiBib29sZWFuO1xuXG4gIC8vIHRoaXMgaW5wdXQgaXMgbm90IGJlaW5nIHVzZWQgYW55d2hlcmVcbiAgLy8gQElucHV0KCdzb3VyY2UtY29udHJvbC1yb290JylcbiAgcHVibGljIFNvdXJjZUNvbnRyb2xSb290OiBzdHJpbmc7XG5cbiAgLy9ub3QgYmVpbmcgdXNlZCBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0XG4gIC8vIEBJbnB1dCgndXNlLWJyYW5jaGVzJylcbiAgcHVibGljIFVzZUJyYW5jaGVzOiBib29sZWFuO1xuXG4gIC8vbm90IGJlaW5nIHVzZWQgc2V0IHRvIGZhbHNlIGJ5IGRlZmF1bHRcbiAgLy8gQElucHV0KCd1c2UtYnVpbGQtcGF0aCcpXG4gIHB1YmxpYyBVc2VCdWlsZFBhdGg6IGJvb2xlYW47XG5cbiAgLy8gIFByb3BlcnRpZXNcblxuICBwdWJsaWMgZ2V0IEFydGlmYWN0TG9va3VwcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNBY3Rpb24/LkFydGlmYWN0TG9va3VwcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgQXJ0aWZhY3RMb29rdXAoKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcnRMb29rdXAgPSB0aGlzLkRldk9wc0FjdGlvbj8uQXJ0aWZhY3RMb29rdXBzXG4gICAgICA/IHRoaXMuRGV2T3BzQWN0aW9uPy5BcnRpZmFjdExvb2t1cHNbMF1cbiAgICAgIDogbnVsbDtcbiAgICByZXR1cm4gYXJ0TG9va3VwO1xuICB9XG5cbiAgcHVibGljIGdldCBBcnRpZmFjdCgpOiBFYUNBcnRpZmFjdCB7XG4gICAgcmV0dXJuIHRoaXMuRW52aXJvbm1lbnQ/LkFydGlmYWN0cyAmJiB0aGlzLkFydGlmYWN0TG9va3VwXG4gICAgICA/IHRoaXMuRW52aXJvbm1lbnQ/LkFydGlmYWN0c1t0aGlzLkFydGlmYWN0TG9va3VwXSB8fCB7fVxuICAgICAgOiB7fTtcbiAgfVxuICBwdWJsaWMgZ2V0IEJyYW5jaGVzRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldChcbiAgICAgIHRoaXMuU291cmNlQ29udHJvbFJvb3QgKyAnYnJhbmNoZXMnXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgQnVpbGRQYXRoRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldChcbiAgICAgIHRoaXMuU291cmNlQ29udHJvbFJvb3QgKyAnYnVpbGRQYXRoJ1xuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IERldk9wc0FjdGlvbkxvb2t1cHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5EZXZPcHNBY3Rpb25zKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5EZXZPcHNBY3Rpb25zIHx8IHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRGV2T3BzQWN0aW9uKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9ucyAmJiB0aGlzLkRldk9wc0FjdGlvbkxvb2t1cFxuICAgICAgPyB0aGlzLkVudmlyb25tZW50LkRldk9wc0FjdGlvbnNbdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXBdIHx8IHt9XG4gICAgICA6IHt9O1xuICB9XG5cbiAgcHVibGljIGdldCBEZXZPcHNBY3Rpb25Mb29rdXAoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLkRldk9wc0FjdGlvbkxvb2t1cEZvcm1Db250cm9sPy52YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuRGV2T3BzQWN0aW9uTG9va3VwRm9ybUNvbnRyb2wudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKCEhdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbD8uRGV2T3BzQWN0aW9uVHJpZ2dlckxvb2t1cHMpIHtcbiAgICAgIHJldHVybiB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sPy5EZXZPcHNBY3Rpb25UcmlnZ2VyTG9va3Vwc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBEZXZPcHNBY3Rpb25Mb29rdXBGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuZ2V0KCdkZXZPcHNBY3Rpb25Mb29rdXAnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRGV2T3BzQWN0aW9ucygpOiB7IFtsb29rdXA6IHN0cmluZ106IEVhQ0Rldk9wc0FjdGlvbiB9IHtcbiAgICByZXR1cm4gdGhpcy5FbnZpcm9ubWVudC5EZXZPcHNBY3Rpb25zIHx8IHt9O1xuICB9XG5cbiAgcHVibGljIGdldCBFZGl0aW5nU291cmNlQ29udHJvbCgpOiBFYUNTb3VyY2VDb250cm9sIHtcbiAgICBsZXQgc2MgPSB0aGlzLkVudmlyb25tZW50Py5Tb3VyY2VzXG4gICAgICA/IHRoaXMuRW52aXJvbm1lbnQ/LlNvdXJjZXNbdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbExvb2t1cF1cbiAgICAgIDogbnVsbDtcblxuICAgIGlmIChzYyA9PSBudWxsICYmIHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXApIHtcbiAgICAgIHNjID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjO1xuICB9XG5cbiAgcHVibGljIGdldCBNYWluQnJhbmNoRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldChcbiAgICAgIHRoaXMuU291cmNlQ29udHJvbFJvb3QgKyAnbWFpbkJyYW5jaCdcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBPcmdhbml6YXRpb25Gb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuZ2V0KFxuICAgICAgdGhpcy5Tb3VyY2VDb250cm9sUm9vdCArICdvcmdhbml6YXRpb24nXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgUmVwb3NpdG9yeUZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5nZXQoXG4gICAgICB0aGlzLlNvdXJjZUNvbnRyb2xSb290ICsgJ3JlcG9zaXRvcnknXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgU3RhdGUoKTogQXBwbGljYXRpb25zRmxvd1N0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5lYWNTdmMuU3RhdGU7XG4gIH1cblxuICBwdWJsaWMgQnJhbmNoT3B0aW9uczogR2l0SHViQnJhbmNoW107XG5cbiAgcHVibGljIEJ1aWxkUGF0aE9wdGlvbnM6IHN0cmluZ1tdO1xuXG4gIHB1YmxpYyBDcmVhdGluZ1JlcG9zaXRvcnk6IGJvb2xlYW47XG5cbiAgcHVibGljIERldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXA6IEZvcm1Hcm91cDtcblxuICBwdWJsaWMgSG9zdGluZ0RldGFpbHM6IFByb2plY3RIb3N0aW5nRGV0YWlscztcblxuICBwdWJsaWMgTG9hZGluZzogYm9vbGVhbjtcblxuICBwdWJsaWMgT3JnYW5pemF0aW9uT3B0aW9uczogR2l0SHViT3JnYW5pemF0aW9uW107XG5cbiAgcHVibGljIFJlcG9zaXRvcnlPcHRpb25zOiBHaXRIdWJSZXBvc2l0b3J5W107XG5cbiAgcHVibGljIFNlbGVjdGVkQnJhbmNoZXM6IHN0cmluZ1tdO1xuXG4gIHB1YmxpYyByZWFkb25seSBTZXBhcmF0b3JLZXlzQ29kZXMgPSBbRU5URVIsIENPTU1BXSBhcyBjb25zdDtcblxuICAvLyAgQ29uc3RydWN0b3JzXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBhcHBzRmxvd1N2YzogQXBwbGljYXRpb25zRmxvd1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGVhY1N2YzogRWFDU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyXG4gICkge1xuICAgIHRoaXMuU2F2ZVN0YXR1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgdGhpcy5CdWlsZFBhdGggPSBudWxsO1xuXG4gICAgdGhpcy5Ib3N0aW5nRGV0YWlscyA9IG5ldyBQcm9qZWN0SG9zdGluZ0RldGFpbHMoKTtcblxuICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IFtdO1xuXG4gICAgdGhpcy5Tb3VyY2VDb250cm9sUm9vdCA9ICcnO1xuXG4gICAgdGhpcy5Vc2VCcmFuY2hlcyA9IHRydWU7XG5cbiAgICB0aGlzLlVzZUJ1aWxkUGF0aCA9IGZhbHNlO1xuICB9XG5cbiAgLy8gIExpZmUgQ3ljbGVcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHt9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveUZvcm1Db250cm9scygpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgY29uc29sZS5sb2coXCJzb3VyY2UgY29udHJvbCBsb29rdXBcIiwgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbExvb2t1cClcblxuICAgIGlmICh0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sTG9va3VwID09PSBudWxsKSB7XG4gICAgICB0aGlzLkNyZWF0ZU5ld1NvdXJjZUNvbnRyb2woKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCJzb3VyY2UgY29udHJvbFwiLCB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sKTtcblxuICAgIGlmICh0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sICE9IG51bGwpIHtcbiAgICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe30pO1xuXG4gICAgICB0aGlzLnNldHVwRm9ybUNvbnRyb2xzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5SZWZyZXNoT3JnYW5pemF0aW9ucygpO1xuICB9XG5cbiAgLy8gIEFQSSBNZXRob2RzXG4gIHB1YmxpYyBBZGRCcmFuY2hPcHRpb24oZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5hZGRCcmFuY2hPcHRpb24oZXZlbnQudmFsdWUpO1xuXG4gICAgZXZlbnQuaW5wdXQudmFsdWUgPSAnJztcbiAgfVxuXG4gIHB1YmxpYyBCcmFuY2hPcHRpb25TZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQnJhbmNoT3B0aW9uKGV2ZW50Lm9wdGlvbi52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgQnJhbmNoZXNDaGFuZ2VkKGJyYW5jaGVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMubG9hZFByb2plY3RIb3N0aW5nRGV0YWlscygpO1xuICB9XG5cbiAgcHVibGljIEJ1aWxkUGF0aENoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIC8vZG8gc29tZXRoaW5nPz9cbiAgfVxuXG4gIHB1YmxpYyBDcmVhdGVOZXdTb3VyY2VDb250cm9sKCk6IHZvaWQge1xuICAgIHRoaXMuU2V0RWRpdGluZ1NvdXJjZUNvbnRyb2woR3VpZC5DcmVhdGVSYXcoKSk7XG4gIH1cblxuICBwdWJsaWMgQ3JlYXRlUmVwb3NpdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLkNyZWF0aW5nUmVwb3NpdG9yeSA9IHRydWU7XG5cbiAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC5yZXNldCgpO1xuICB9XG5cbiAgcHVibGljIENhbmNlbENyZWF0ZVJlcG9zaXRvcnkoKTogdm9pZCB7XG4gICAgdGhpcy5DcmVhdGluZ1JlcG9zaXRvcnkgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBEZXZPcHNBY3Rpb25Mb29rdXBDaGFuZ2VkKGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ3VyZURldk9wc0FjdGlvbigpO1xuICB9XG5cbiAgcHVibGljIE1haW5CcmFuY2hDaGFuZ2VkKGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRCcmFuY2hlc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBPcmdhbml6YXRpb25DaGFuZ2VkKGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBvcmcgPSB0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sO1xuXG4gICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wucmVzZXQoKTtcblxuICAgIGlmICh0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLkJyYW5jaGVzRm9ybUNvbnRyb2wucmVzZXQoKTtcblxuICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5saXN0UmVwb3NpdG9yaWVzKCk7XG4gIH1cblxuICBwdWJsaWMgUmVmcmVzaE9yZ2FuaXphdGlvbnMoKTogdm9pZCB7XG4gICAgLy8gdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmxpc3RPcmdhbml6YXRpb25zKCk7XG5cbiAgICB0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy5yZXNldCgpO1xuXG4gICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnJlc2V0KCk7XG5cbiAgICBpZiAodGhpcy5Vc2VCcmFuY2hlcykge1xuICAgICAgdGhpcy5CcmFuY2hlc0Zvcm1Db250cm9sPy5yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBSZW1vdmVCcmFuY2hPcHRpb24ob3B0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuU2VsZWN0ZWRCcmFuY2hlcy5pbmRleE9mKG9wdGlvbik7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0QnJhbmNoZXNDaGFuZ2VkKCk7XG4gIH1cblxuICBwdWJsaWMgUmVwb3NpdG9yeUNoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbDtcblxuICAgIGlmICh0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLkJyYW5jaGVzRm9ybUNvbnRyb2wucmVzZXQoKTtcblxuICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzID0gW107XG5cbiAgICAgIHRoaXMubGlzdEJyYW5jaGVzKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmxpc3RCdWlsZFBhdGhzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIFNhdmVSZXBvc2l0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMuTG9hZGluZyA9IHRydWU7XG5cbiAgICBjb25zdCBvcmcgPSB0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC52YWx1ZTtcblxuICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgIC5DcmVhdGVSZXBvc2l0b3J5KG9yZywgcmVwb05hbWUpXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5TdGF0dXMuQ29kZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubGlzdFJlcG9zaXRvcmllcyhyZXBvTmFtZSk7XG5cbiAgICAgICAgICB0aGlzLkNyZWF0aW5nUmVwb3NpdG9yeSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vICBUT0RPOiAgTmVlZCB0byBzdXJmYWNlIGFuIGVycm9yIHRvIHRoZSB1c2VyLi4uXG5cbiAgICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgU2V0RWRpdGluZ1NvdXJjZUNvbnRyb2woc2NMb29rdXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXAgPSBzY0xvb2t1cDtcbiAgfVxuXG4gIHB1YmxpYyBTdWJtaXRTb3VyY2VDb250cm9sKCkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ3NvdXJjZSBjb250cm9sIHN1Ym1pdHRlZDogJyxcbiAgICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC52YWx1ZVxuICAgICk7XG4gICAgdGhpcy5TYXZlU291cmNlQ29udHJvbCgpO1xuICB9XG5cbiAgcHVibGljIFNhdmVTb3VyY2VDb250cm9sKCk6IHZvaWQge1xuICAgIGNvbnN0IHNhdmVFbnZSZXE6IFNhdmVFbnZpcm9ubWVudEFzQ29kZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIC4uLnRoaXMuRW52aXJvbm1lbnQsXG4gICAgICAgIFNvdXJjZXM6IHRoaXMuRW52aXJvbm1lbnQuU291cmNlcyB8fCB7fSxcbiAgICAgIH0sXG4gICAgICBFbnZpcm9ubWVudExvb2t1cDogdGhpcy5FbnZpcm9ubWVudExvb2t1cCxcbiAgICAgIEVudGVycHJpc2VEYXRhVG9rZW5zOiB7fSxcbiAgICB9O1xuXG4gICAgbGV0IHNvdXJjZTogRWFDU291cmNlQ29udHJvbCA9IHtcbiAgICAgIC4uLnRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2wsXG4gICAgICBCcmFuY2hlczogdGhpcy5TZWxlY3RlZEJyYW5jaGVzLFxuICAgICAgTWFpbkJyYW5jaDogdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgfTtcblxuICAgIHNvdXJjZSA9IHtcbiAgICAgIC4uLnNvdXJjZSxcbiAgICAgIFR5cGU6ICdHaXRIdWInLFxuICAgICAgTmFtZTogdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbExvb2t1cCxcbiAgICAgIERldk9wc0FjdGlvblRyaWdnZXJMb29rdXBzOiBbdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXBdLFxuICAgICAgT3JnYW5pemF0aW9uOiB0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sLnZhbHVlLFxuICAgICAgUmVwb3NpdG9yeTogdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wudmFsdWUsXG4gICAgfTtcblxuICAgIGNvbnN0IHNjTG9va3VwID0gYGdpdGh1YjovLyR7c291cmNlLk9yZ2FuaXphdGlvbn0vJHtzb3VyY2UuUmVwb3NpdG9yeX1gO1xuXG4gICAgc2F2ZUVudlJlcS5FbnZpcm9ubWVudC5Tb3VyY2VzW3NjTG9va3VwXSA9IHNvdXJjZTtcblxuICAgIGxldCByZXNwID0gdGhpcy5lYWNTdmMuU2F2ZUVudmlyb25tZW50QXNDb2RlKHNhdmVFbnZSZXEpO1xuXG4gICAgcmVzcC50aGVuKChyZXMpID0+IHtcbiAgICAgIHRoaXMuU2F2ZVN0YXR1c0V2ZW50LmVtaXQocmVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vICBIZWxwZXJzXG5cbiAgcHJvdGVjdGVkIGFkZEJyYW5jaE9wdGlvbih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdmFsdWUgPSAodmFsdWUgfHwgJycpLnRyaW0oKTtcblxuICAgIGlmICh2YWx1ZSAmJiB0aGlzLlNlbGVjdGVkQnJhbmNoZXMuaW5kZXhPZih2YWx1ZSkgPCAwKSB7XG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5CcmFuY2hlc0lucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuXG4gICAgdGhpcy5lbWl0QnJhbmNoZXNDaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlRGV2T3BzQWN0aW9uKCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXBGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLkRldk9wc0FjdGlvbkxvb2t1cCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzdHJveUZvcm1Db250cm9scygpOiB2b2lkIHtcbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAucmVtb3ZlQ29udHJvbChcbiAgICAgIFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAnbWFpbkJyYW5jaCddLmpvaW4oJycpXG4gICAgKTtcblxuICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cD8ucmVtb3ZlQ29udHJvbChcbiAgICAgIFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAnYnJhbmNoZXMnXS5qb2luKCcnKVxuICAgICk7XG5cbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXA/LnJlbW92ZUNvbnRyb2woXG4gICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ2J1aWxkUGF0aCddLmpvaW4oJycpXG4gICAgKTtcblxuICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IFtdO1xuXG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwPy5yZW1vdmVDb250cm9sKFxuICAgICAgW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdvcmdhbml6YXRpb24nXS5qb2luKCcnKVxuICAgICk7XG5cbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXA/LnJlbW92ZUNvbnRyb2woXG4gICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ3JlcG9zaXRvcnknXS5qb2luKCcnKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJyYW5jaGVzQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICghdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wudmFsdWUgfHxcbiAgICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzLmluZGV4T2YodGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wudmFsdWUpIDwgMClcbiAgICApIHtcbiAgICAgIHRoaXMuTWFpbkJyYW5jaEZvcm1Db250cm9sLnNldFZhbHVlKFxuICAgICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMuZmluZChcbiAgICAgICAgICAoYnJhbmNoKSA9PiBicmFuY2ggPT09ICdtYWluJyB8fCBicmFuY2ggPT09ICdtYXN0ZXInXG4gICAgICAgICkgfHwgdGhpcy5TZWxlY3RlZEJyYW5jaGVzWzBdXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5TZWxlY3RlZEJyYW5jaGVzPy5sZW5ndGggPD0gMCkge1xuICAgICAgdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wucmVzZXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLkJyYW5jaGVzRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5TZWxlY3RlZEJyYW5jaGVzLmpvaW4oJywnKSk7XG5cbiAgICB0aGlzLkJyYW5jaGVzQ2hhbmdlZCh0aGlzLlNlbGVjdGVkQnJhbmNoZXMgfHwgW10pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxpc3RCcmFuY2hlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5Vc2VCcmFuY2hlcykge1xuICAgICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgdGhpcy5hcHBzRmxvd1N2Y1xuICAgICAgICAuTGlzdEJyYW5jaGVzKFxuICAgICAgICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgICAgICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxHaXRIdWJCcmFuY2hbXT4pID0+IHtcbiAgICAgICAgICB0aGlzLkJyYW5jaE9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2w/LkJyYW5jaGVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMgPSB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sLkJyYW5jaGVzO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5CcmFuY2hPcHRpb25zPy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuQnJhbmNoZXNGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLkJyYW5jaE9wdGlvbnNbMF0uTmFtZSk7XG5cbiAgICAgICAgICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IFt0aGlzLkJyYW5jaE9wdGlvbnNbMF0uTmFtZV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5lbWl0QnJhbmNoZXNDaGFuZ2VkKCk7XG5cbiAgICAgICAgICB0aGlzLmxpc3RCdWlsZFBhdGhzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBsaXN0QnVpbGRQYXRocygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5Vc2VCdWlsZFBhdGgpIHtcbiAgICAgIHRoaXMuTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgICAgLkxpc3RCdWlsZFBhdGhzKFxuICAgICAgICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgICAgICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxzdHJpbmdbXT4pID0+IHtcbiAgICAgICAgICB0aGlzLkJ1aWxkUGF0aE9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuQnVpbGRQYXRoT3B0aW9ucz8ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLkJ1aWxkUGF0aEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuQnVpbGRQYXRoT3B0aW9uc1swXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbGlzdE9yZ2FuaXphdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgIC5MaXN0T3JnYW5pemF0aW9ucygpXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxHaXRIdWJPcmdhbml6YXRpb25bXT4pID0+IHtcbiAgICAgICAgdGhpcy5Pcmdhbml6YXRpb25PcHRpb25zID0gcmVzcG9uc2UuTW9kZWw7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiT3JnYW5pemF0aW9uIE9wdGlvbnM6IFwiLCB0aGlzLk9yZ2FuaXphdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sPy5Pcmdhbml6YXRpb24pIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wuc2V0VmFsdWUoXG4gICAgICAgICAgICAgIHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2wuT3JnYW5pemF0aW9uXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLmxpc3RSZXBvc2l0b3JpZXModGhpcy5FZGl0aW5nU291cmNlQ29udHJvbD8uUmVwb3NpdG9yeSk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxpc3RSZXBvc2l0b3JpZXMoYWN0aXZlUmVwbzogc3RyaW5nID0gbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuTG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLmFwcHNGbG93U3ZjXG4gICAgICAuTGlzdFJlcG9zaXRvcmllcyh0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sLnZhbHVlKVxuICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IEJhc2VNb2RlbGVkUmVzcG9uc2U8R2l0SHViUmVwb3NpdG9yeVtdPikgPT4ge1xuICAgICAgICB0aGlzLlJlcG9zaXRvcnlPcHRpb25zID0gcmVzcG9uc2UuTW9kZWw7XG5cbiAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGFjdGl2ZVJlcG8pIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuUmVwb3NpdG9yeUZvcm1Db250cm9sLnNldFZhbHVlKGFjdGl2ZVJlcG8pO1xuXG4gICAgICAgICAgICB0aGlzLmxpc3RCcmFuY2hlcygpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuVXNlQnJhbmNoZXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5saXN0QnVpbGRQYXRocygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuUmVwb3NpdG9yeU9wdGlvbnM/Lmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5DcmVhdGluZ1JlcG9zaXRvcnkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBsb2FkUHJvamVjdEhvc3RpbmdEZXRhaWxzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLlNlbGVjdGVkQnJhbmNoZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuSG9zdGluZ0RldGFpbHMuTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgICAgLkxvYWRQcm9qZWN0SG9zdGluZ0RldGFpbHMoXG4gICAgICAgICAgdGhpcy5Pcmdhbml6YXRpb25Gb3JtQ29udHJvbD8udmFsdWUsXG4gICAgICAgICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbHVlLFxuICAgICAgICAgIHRoaXMuTWFpbkJyYW5jaEZvcm1Db250cm9sPy52YWx1ZVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlc3BvbnNlOiBCYXNlTW9kZWxlZFJlc3BvbnNlPFByb2plY3RIb3N0aW5nRGV0YWlscz4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuSG9zdGluZ0RldGFpbHMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICAgICAgdGhpcy5Ib3N0aW5nRGV0YWlscy5Mb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJlRGV2T3BzQWN0aW9uKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLkhvc3RpbmdEZXRhaWxzLkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldHVwRm9ybUNvbnRyb2xzKCk6IHZvaWQge1xuICAgIC8vIHRoaXMuZGVzdHJveUZvcm1Db250cm9scygpO1xuXG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAnZGV2T3BzQWN0aW9uTG9va3VwJyxcbiAgICAgIG5ldyBGb3JtQ29udHJvbCh0aGlzLkRldk9wc0FjdGlvbkxvb2t1cCB8fCAnJywgW10pXG4gICAgKTtcblxuICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdvcmdhbml6YXRpb24nXS5qb2luKCcnKSxcbiAgICAgIG5ldyBGb3JtQ29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbC5Pcmdhbml6YXRpb24gPz8gJycsXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWRcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ3JlcG9zaXRvcnknXS5qb2luKCcnKSxcbiAgICAgIG5ldyBGb3JtQ29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbC5SZXBvc2l0b3J5ID8/ICcnLFxuICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkXG4gICAgICApXG4gICAgKTtcblxuICAgIGlmICh0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICAgW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdicmFuY2hlcyddLmpvaW4oJycpLFxuICAgICAgICBuZXcgRm9ybUNvbnRyb2woXG4gICAgICAgICAgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbD8uQnJhbmNoZXMgPz8gJycsXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZFxuICAgICAgICApXG4gICAgICApO1xuXG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMgPSB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sPy5CcmFuY2hlcztcblxuICAgICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAgIFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAnbWFpbkJyYW5jaCddLmpvaW4oJycpLFxuICAgICAgICBuZXcgRm9ybUNvbnRyb2woXG4gICAgICAgICAgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbC5NYWluQnJhbmNoID8/ICcnLFxuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWRcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5Vc2VCdWlsZFBhdGgpIHtcbiAgICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ2J1aWxkUGF0aCddLmpvaW4oJycpLFxuICAgICAgICBuZXcgRm9ybUNvbnRyb2wodGhpcy5CdWlsZFBhdGggPz8gJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiPGZvcm0gY2xhc3M9XCJmb3JtLWNhcmRcIiBbZm9ybUdyb3VwXT1cIkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXBcIiAobmdTdWJtaXQpPVwiU3VibWl0U291cmNlQ29udHJvbCgpXCI+XG5cbiAgPG1hdC1jYXJkIGNsYXNzPVwic3ByZWFkXCIgY2xhc3M9XCJzYy1jYXJkXCI+XG4gICAgPG1hdC1jYXJkLWhlYWRlcj5cbiAgICAgIDxtYXQtY2FyZC10aXRsZT4gU291cmNlIENvbnRyb2wgPC9tYXQtY2FyZC10aXRsZT5cblxuICAgICAgPGRpdiBmeEZsZXg+PC9kaXY+XG5cbiAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggbWF0VG9vbHRpcD1cIkNvbmZpZ3VyZSBzb3VyY2UgY29udHJvbCwgRGV2T3BzIENJL0NELCBhbmQgYXJ0aWZhY3RzLlwiPlxuICAgICAgICBpbmZvX291dGxpbmVcbiAgICAgIDwvbWF0LWljb24+XG4gICAgPC9tYXQtY2FyZC1oZWFkZXI+XG5cbiAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1zZWxlY3QgXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZXZPcHNBY3Rpb25Mb29rdXBcIiBcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGV2T3BzIEFjdGlvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiSG9zdGluZ0RldGFpbHM/LkxvYWRpbmdcIiBcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiRGV2T3BzQWN0aW9uTG9va3VwQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkZXZPcHNBY3Rpb25Mb29rdXAgb2YgRGV2T3BzQWN0aW9uTG9va3Vwc1wiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZGV2T3BzQWN0aW9uTG9va3VwXCIgXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJEZXZPcHNBY3Rpb25zW2Rldk9wc0FjdGlvbkxvb2t1cF07IGxldCBkZXZPcHNBY3Rpb25cIj5cbiAgICAgICAgICAgICAgICB7eyBkZXZPcHNBY3Rpb24uTmFtZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJcIj4tLSBDcmVhdGUgTmV3IC0tPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIiAqbmdJZj1cIk9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZCB8fCAhTG9hZGluZ1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgXG4gICAgICAgICAgY2xhc3M9XCJtYXQtZnVsbC13aWR0aCB3aXRoLWhpbnQgbWFyZ2luLWJvdHRvbVwiIFxuICAgICAgICAgICpuZ0lmPVwiT3JnYW5pemF0aW9uT3B0aW9ucz8ubGVuZ3RoID4gMFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmctaWNvblwiIG1hdFByZWZpeD5jb3Jwb3JhdGVfZmFyZTwvbWF0LWljb24+XG5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiU291cmNlQ29udHJvbFJvb3QgKyAnb3JnYW5pemF0aW9uJ1wiIFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJPcmdhbml6YXRpb25cIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJPcmdhbml6YXRpb25DaGFuZ2VkKCRldmVudClcIiBcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJMb2FkaW5nIHx8IEhvc3RpbmdEZXRhaWxzPy5Mb2FkaW5nXCIgXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9yZ09wdCBvZiBPcmdhbml6YXRpb25PcHRpb25zXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJvcmdPcHQuTmFtZVwiPlxuICAgICAgICAgICAgICAgIHt7IG9yZ09wdC5OYW1lIH19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggKGNsaWNrKT1cIlJlZnJlc2hPcmdhbml6YXRpb25zKClcIiBtYXRUb29sdGlwPVwiUmVmcmVzaCBPcmdhbml6YXRpb25cIiBjb2xvcj1cImFjY2VudFwiPiByZWZyZXNoIDwvbWF0LWljb24+XG5cbiAgICAgICAgICA8YSBtYXRTdWZmaXggaHJlZj1cIi8ub2F1dGgvZ2l0aHViP29hdXRoLWZvcmNlLWVkaXQ9dHJ1ZVwiIHRhcmdldD1cIl9ibGFua1wiIGNvbG9yPVwiYWNjZW50XCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJhY2NlbnRcIiBtYXRUb29sdGlwPVwiUmUtYXV0aG9yaXplIE9yZ2FuaXphdGlvbnNcIj4gbGF1bmNoIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgSWYgeW91IGRvbid0IGhhdmUgYW4gb3JnYW5pemF0aW9uIG9yIHdvdWxkIGxpa2UgdG8gY3JlYXRlIGEgbmV3IG9uZSxcbiAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vYWNjb3VudC9vcmdhbml6YXRpb25zL25ld1wiIGNsYXNzPVwicHJpbWFyeS1saW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgICAgICAgIHN0YXJ0IGhlcmVcbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkIHx8XG4gICAgICAgICAgICAgICAgKE9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZCAmJiAhTG9hZGluZylcbiAgICAgICAgICAgICAgXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwib3JnLWljb25cIiBtYXRQcmVmaXg+ZGVzY3JpcHRpb248L21hdC1pY29uPlxuXG4gICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJTb3VyY2VDb250cm9sUm9vdCArICdyZXBvc2l0b3J5J1wiIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnZhbGlkXG4gICAgICAgICAgICAgICAgICAgICAgPyAnUmVwb3NpdG9yeSdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdSZXBvc2l0b3J5IChzZWxlY3Qgb3JnYW5pemF0aW9uIGZpcnN0KSdcbiAgICAgICAgICAgICAgICAgIFwiIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgIU9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZCB8fCBMb2FkaW5nIHx8IEhvc3RpbmdEZXRhaWxzPy5Mb2FkaW5nXG4gICAgICAgICAgICAgICAgICBcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIlJlcG9zaXRvcnlDaGFuZ2VkKCRldmVudClcIiAqbmdJZj1cIiFDcmVhdGluZ1JlcG9zaXRvcnlcIiByZXF1aXJlZD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlcG9PcHQgb2YgUmVwb3NpdG9yeU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInJlcG9PcHQuTmFtZVwiPlxuICAgICAgICAgICAgICAgIHt7IHJlcG9PcHQuTmFtZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJSZXBvc2l0b3J5IChjcmVhdGVzIG5ldyBpZiBkb2VzIG5vdCBleGlzdClcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJTb3VyY2VDb250cm9sUm9vdCArICdyZXBvc2l0b3J5J1wiICpuZ0lmPVwiQ3JlYXRpbmdSZXBvc2l0b3J5XCJcbiAgICAgICAgICAgIFtmeEhpZGVdPVwiTG9hZGluZyB8fCBIb3N0aW5nRGV0YWlscz8uTG9hZGluZ1wiIHJlcXVpcmVkIC8+XG5cbiAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4IChjbGljayk9XCJDcmVhdGVSZXBvc2l0b3J5KClcIiBbZnhIaWRlXT1cIkxvYWRpbmcgfHwgSG9zdGluZ0RldGFpbHM/LkxvYWRpbmdcIlxuICAgICAgICAgICAgKm5nSWY9XCIhQ3JlYXRpbmdSZXBvc2l0b3J5ICYmIE9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZFwiPlxuICAgICAgICAgICAgYWRkX2NpcmNsZVxuICAgICAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJTYXZlUmVwb3NpdG9yeSgpXCJcbiAgICAgICAgICAgICpuZ0lmPVwiQ3JlYXRpbmdSZXBvc2l0b3J5ICYmIFJlcG9zaXRvcnlGb3JtQ29udHJvbD8udmFsaWRcIj5cblxuICAgICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeCBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgc2F2ZVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIkNhbmNlbENyZWF0ZVJlcG9zaXRvcnkoKVwiICpuZ0lmPVwiQ3JlYXRpbmdSZXBvc2l0b3J5XCI+XG5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXg+XG4gICAgICAgICAgICAgIGNhbmNlbFxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgKEJyYW5jaGVzRm9ybUNvbnRyb2w/LnZhbGlkIHx8XG4gICAgICAgICAgICAgICAgICAoT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlGb3JtQ29udHJvbD8udmFsaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIUxvYWRpbmcpKSAmJlxuICAgICAgICAgICAgICAgICFDcmVhdGluZ1JlcG9zaXRvcnkgJiZcbiAgICAgICAgICAgICAgICBVc2VCcmFuY2hlc1xuICAgICAgICAgICAgICBcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmctaWNvblwiIG1hdFByZWZpeD5hY2NvdW50X3RyZWU8L21hdC1pY29uPlxuXG4gICAgICAgICAgPG1hdC1sYWJlbD5TZWxlY3RlZCBCcmFuY2hlczwvbWF0LWxhYmVsPlxuXG4gICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgKG9wdGlvblNlbGVjdGVkKT1cIkJyYW5jaE9wdGlvblNlbGVjdGVkKCRldmVudClcIiAjYnJhbmNoT3B0aW9ucz1cIm1hdEF1dG9jb21wbGV0ZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnJhbmNoT3B0IG9mIEJyYW5jaE9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImJyYW5jaE9wdC5OYW1lXCI+XG4gICAgICAgICAgICAgICAge3sgYnJhbmNoT3B0Lk5hbWUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgICAgPG1hdC1jaGlwLWxpc3QgI3NlbGVjdGVkQnJhbmNoZXM+XG4gICAgICAgICAgICA8bWF0LWNoaXAgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZWQpPVwiUmVtb3ZlQnJhbmNoT3B0aW9uKHNlbEJyYW5jaClcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VsQnJhbmNoIG9mIFNlbGVjdGVkQnJhbmNoZXNcIj5cbiAgICAgICAgICAgICAge3sgc2VsQnJhbmNoIH19XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L21hdC1jaGlwPlxuXG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJOZXcgQnJhbmNoLi4uXCIgW2Zvcm1Db250cm9sTmFtZV09XCJTb3VyY2VDb250cm9sUm9vdCArICdicmFuY2hlcydcIiAjYnJhbmNoZXNcbiAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJicmFuY2hPcHRpb25zXCIgW21hdENoaXBJbnB1dEZvcl09XCJzZWxlY3RlZEJyYW5jaGVzXCJcbiAgICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cIlNlcGFyYXRvcktleXNDb2Rlc1wiIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJBZGRCcmFuY2hPcHRpb24oJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJMb2FkaW5nIHx8IEhvc3RpbmdEZXRhaWxzPy5Mb2FkaW5nXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWQgLz5cbiAgICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGggd2l0aC1oaW50XCIgW2Z4U2hvd109XCJTZWxlY3RlZEJyYW5jaGVzPy5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwib3JnLWljb25cIiBtYXRQcmVmaXg+YWNjb3VudF90cmVlPC9tYXQtaWNvbj5cblxuICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiU291cmNlQ29udHJvbFJvb3QgKyAnbWFpbkJyYW5jaCdcIiBwbGFjZWhvbGRlcj1cIk1haW4gQnJhbmNoXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJMb2FkaW5nIHx8IEhvc3RpbmdEZXRhaWxzPy5Mb2FkaW5nXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJNYWluQnJhbmNoQ2hhbmdlZCgkZXZlbnQpXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBicmFuY2ggb2YgU2VsZWN0ZWRCcmFuY2hlc1wiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiYnJhbmNoXCI+XG4gICAgICAgICAgICAgICAge3sgYnJhbmNoIH19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggKGNsaWNrKT1cIlJlZnJlc2hPcmdhbml6YXRpb25zKClcIiBjb2xvcj1cImFjY2VudFwiPiByZWZyZXNoIDwvbWF0LWljb24+XG5cbiAgICAgICAgICA8YSBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGhyZWY9XCIvLm9hdXRoL2dpdGh1Yj9vYXV0aC1mb3JjZS1lZGl0PXRydWVcIiB0YXJnZXQ9XCJfYmxhbmtcIiBjb2xvcj1cImFjY2VudFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIG1hdFRvb2x0aXA9XCJSZS1hdXRob3JpemUgT3JnYW5pemF0aW9uc1wiIGNvbG9yPVwiYWNjZW50XCI+IGxhdW5jaCA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYT5cblxuICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgIElmIHlvdSBkb24ndCBoYXZlIGFuIG9yZ2FuaXphdGlvbiBvciB3b3VsZCBsaWtlIHRvIGNyZWF0ZSBhIG5ldyBvbmUsXG4gICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2FjY291bnQvb3JnYW5pemF0aW9ucy9uZXdcIiB0YXJnZXQ9XCJfYmxhbmtcImNsYXNzPVwicHJpbWFyeS1saW5rXCI+XG4gICAgICAgICAgICAgIHN0YXJ0IGhlcmVcbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAoQnVpbGRQYXRoRm9ybUNvbnRyb2w/LnZhbGlkIHx8XG4gICAgICAgICAgICAgICAgICAoT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlGb3JtQ29udHJvbD8udmFsaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIUxvYWRpbmcpKSAmJlxuICAgICAgICAgICAgICAgICFDcmVhdGluZ1JlcG9zaXRvcnkgJiZcbiAgICAgICAgICAgICAgICBVc2VCdWlsZFBhdGhcbiAgICAgICAgICAgICAgXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoIHdpdGgtaGludFwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZy1pY29uXCIgbWF0UHJlZml4PmJ1aWxkPC9tYXQtaWNvbj5cblxuICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiU291cmNlQ29udHJvbFJvb3QgKyAnYnVpbGRQYXRoJ1wiIHBsYWNlaG9sZGVyPVwiQnVpbGQgUGF0aFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiTG9hZGluZyB8fCBCdWlsZFBhdGhEaXNhYmxlZFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiQnVpbGRQYXRoQ2hhbmdlZCgkZXZlbnQpXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidWlsZFBhdGggb2YgQnVpbGRQYXRoT3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiYnVpbGRQYXRoXCI+XG4gICAgICAgICAgICAgICAge3sgYnVpbGRQYXRoIH19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgIFRoZSBidWlsZCBwYXRoIGlkZW50aWZpZXMgd2hpY2ggYnVpbGQgYWN0aW9uIHRvIHVzZSBmb3IgeW91clxuICAgICAgICAgICAgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJMb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcHJlYWRcIj5cbiAgICAgICAgICA8bGN1LWxvYWRlciBzdHlsZT1cIm1hcmdpbjogYXV0b1wiIFtsb2FkaW5nXT1cInRydWVcIj48L2xjdS1sb2FkZXI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFyZ2luLTNcIj5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1hdC10aXRsZVwiICpuZ0lmPVwiIU9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIG9yZ2FuaXphdGlvbnNcbiAgICAgICAgICAgIDwvaDQ+XG5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1hdC10aXRsZVwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnZhbGlkICYmICFSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkXG4gICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHJlcG9zaXRvcmllc1xuICAgICAgICAgICAgPC9oND5cblxuICAgICAgICAgICAgPGg0IGNsYXNzPVwibWF0LXRpdGxlXCIgKm5nSWY9XCJSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkICYmICFCcmFuY2hlc0Zvcm1Db250cm9sPy52YWxpZFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIGJyYW5jaGVzXG4gICAgICAgICAgICA8L2g0PlxuXG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtYXQtdGl0bGVcIiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIChSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkIHx8IEJyYW5jaGVzRm9ybUNvbnRyb2w/LnZhbGlkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICFCdWlsZFBhdGhGb3JtQ29udHJvbD8udmFsaWRcbiAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgIExvYWRpbmcgYnVpbGQgcGF0aHNcbiAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIDwvZGl2PiAtLT5cblxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICA8bWF0LWNhcmQtYWN0aW9ucyBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiPlxuXG4gICAgICA8YnV0dG9uIFxuICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvbiBcbiAgICAgICAgKm5nSWY9XCIhU3RhdGU/LkxvYWRpbmdcIlxuICAgICAgICB0eXBlPVwic3VibWl0XCIgXG4gICAgICAgIGZ4RmxleD1cIjEwMCVcIiBcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgXG4gICAgICAgIFtkaXNhYmxlZF09XCIhRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC52YWxpZCB8fCAhRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5kaXJ0eVwiPlxuICAgICAgICA8bWF0LWljb24+c2F2ZTwvbWF0LWljb24+XG4gICAgICAgIFNhdmUgU291cmNlIENvbnRyb2xcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGxjdS1sb2FkZXIgW2xvYWRpbmddPVwiU3RhdGU/LkxvYWRpbmdcIj48L2xjdS1sb2FkZXI+XG4gICAgICBcbiAgPC9tYXQtY2FyZC1hY3Rpb25zPlxuICA8L21hdC1jYXJkPlxuPC9mb3JtPiJdfQ==