@lowcodeunit/applications-flow-common 0.0.2 → 0.0.4
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.
- package/esm2020/lcu.api.mjs +80 -0
- package/esm2020/lib/applications-flow.module.mjs +352 -0
- package/esm2020/lib/controls/build-pipeline-form/build-pipeline-form.component.mjs +251 -0
- package/esm2020/lib/controls/devops-source-control-form/devops-source-control-form.component.mjs +432 -0
- package/esm2020/lib/controls/edit-application-form/edit-application-form.component.mjs +110 -0
- package/esm2020/lib/controls/processor-details-form/processor-details-form.component.mjs +432 -0
- package/esm2020/lib/controls/security-toggle/security-toggle.component.mjs +61 -0
- package/esm2020/lib/controls/source-control-form/source-control-form.component.mjs +69 -0
- package/esm2020/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.mjs +32 -0
- package/esm2020/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.mjs +35 -0
- package/esm2020/lib/dialogs/edit-application-dialog/edit-application-dialog.component.mjs +33 -0
- package/esm2020/lib/dialogs/new-application-dialog/new-application-dialog.component.mjs +170 -0
- package/esm2020/lib/dialogs/processor-details-dialog/processor-details-dialog.component.mjs +53 -0
- package/esm2020/lib/dialogs/source-control-dialog/source-control-dialog.component.mjs +29 -0
- package/esm2020/lib/dialogs/upgrade-dialog/upgrade-dialog.component.mjs +23 -0
- package/esm2020/lib/elements/analytics-card/analytics-card.component.mjs +28 -0
- package/esm2020/lib/elements/base-form/base-form.component.mjs +57 -0
- package/esm2020/lib/elements/breadcrumb/breadcrumb.component.mjs +124 -0
- package/esm2020/lib/elements/card-carousel/card-carousel.component.mjs +70 -0
- package/esm2020/lib/elements/dynamic-tabs/dynamic-tabs.component.mjs +75 -0
- package/esm2020/lib/elements/feed-card-sm/feed-card-sm.component.mjs +42 -0
- package/esm2020/lib/elements/flow-tool/flow-tool.component.mjs +75 -0
- package/esm2020/lib/elements/form-card/form-card.component.mjs +33 -0
- package/esm2020/lib/elements/gh-control/gh-control.component.mjs +78 -0
- package/esm2020/lib/elements/main-feed-card/main-feed-card.component.mjs +128 -0
- package/esm2020/lib/elements/project-info-card/project-info-card.component.mjs +76 -0
- package/esm2020/lib/elements/projects/controls/builds/builds.component.mjs +32 -0
- package/esm2020/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.mjs +145 -0
- package/esm2020/lib/elements/projects/controls/forms/source-control/source-control.component.mjs +285 -0
- package/esm2020/lib/elements/projects/controls/git-auth/git-auth.component.mjs +26 -0
- package/esm2020/lib/elements/projects/controls/header/header.component.mjs +83 -0
- package/esm2020/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.mjs +118 -0
- package/esm2020/lib/elements/projects/controls/project-items/project-items.component.mjs +54 -0
- package/esm2020/lib/elements/projects/controls/project-tabs/project-tabs.component.mjs +103 -0
- package/esm2020/lib/elements/projects/controls/recent-activities/recent-activities.component.mjs +14 -0
- package/esm2020/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.mjs +561 -0
- package/esm2020/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.mjs +72 -0
- package/esm2020/lib/elements/projects/controls/tabs/devops/devops.component.mjs +242 -0
- package/esm2020/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.mjs +179 -0
- package/esm2020/lib/elements/projects/controls/tabs/domains/domains.component.mjs +140 -0
- package/esm2020/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.mjs +90 -0
- package/esm2020/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.mjs +142 -0
- package/esm2020/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.mjs +124 -0
- package/esm2020/lib/elements/projects/controls/tabs/general/general.component.mjs +40 -0
- package/esm2020/lib/elements/projects/projects.component.mjs +91 -0
- package/esm2020/lib/elements/skeleton-feed-card/skeleton-feed-card.component.mjs +20 -0
- package/esm2020/lib/elements/slotted-card/slotted-card.component.mjs +60 -0
- package/esm2020/lib/elements/three-column/three-column.component.mjs +30 -0
- package/esm2020/lib/elements/two-column-header/two-column-header.component.mjs +15 -0
- package/esm2020/lib/models/actions.model.mjs +3 -0
- package/esm2020/lib/models/base-form-config.model.mjs +6 -0
- package/esm2020/lib/models/card-form-config.model.mjs +6 -0
- package/esm2020/lib/models/dev-settings-preset.model.mjs +3 -0
- package/esm2020/lib/models/domain.model.mjs +3 -0
- package/esm2020/lib/models/dynamic-tabs.model.mjs +6 -0
- package/esm2020/lib/models/form-actions.model.mjs +3 -0
- package/esm2020/lib/models/form.model.mjs +6 -0
- package/esm2020/lib/models/form.values.model.mjs +11 -0
- package/esm2020/lib/models/project-actions.model.mjs +6 -0
- package/esm2020/lib/models/user-feed.model.mjs +12 -0
- package/esm2020/lib/services/applications-flow.service.mjs +142 -0
- package/esm2020/lib/services/eac.service.mjs +183 -0
- package/esm2020/lib/services/forms.service.mjs +132 -0
- package/esm2020/lib/services/npm.service.mjs +77 -0
- package/esm2020/lib/services/project.service.mjs +326 -0
- package/esm2020/lib/state/applications-flow-state.context.mjs +36 -0
- package/esm2020/lib/state/applications-flow.state.mjs +72 -0
- package/esm2020/lowcodeunit-applications-flow-common.mjs +5 -0
- package/fesm2015/lowcodeunit-applications-flow-common.mjs +6156 -0
- package/fesm2015/lowcodeunit-applications-flow-common.mjs.map +1 -0
- package/fesm2020/lowcodeunit-applications-flow-common.mjs +6009 -0
- package/fesm2020/lowcodeunit-applications-flow-common.mjs.map +1 -0
- package/lcu.api.d.ts +58 -4
- package/lib/applications-flow.module.d.ts +58 -1
- package/lib/controls/build-pipeline-form/build-pipeline-form.component.d.ts +47 -0
- package/lib/controls/devops-source-control-form/devops-source-control-form.component.d.ts +86 -0
- package/lib/controls/edit-application-form/edit-application-form.component.d.ts +27 -0
- package/lib/controls/processor-details-form/processor-details-form.component.d.ts +80 -0
- package/lib/controls/security-toggle/security-toggle.component.d.ts +25 -0
- package/lib/controls/source-control-form/source-control-form.component.d.ts +27 -0
- package/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.d.ts +19 -0
- package/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.d.ts +22 -0
- package/lib/dialogs/edit-application-dialog/edit-application-dialog.component.d.ts +17 -0
- package/lib/dialogs/new-application-dialog/new-application-dialog.component.d.ts +35 -0
- package/lib/dialogs/processor-details-dialog/processor-details-dialog.component.d.ts +31 -0
- package/lib/dialogs/source-control-dialog/source-control-dialog.component.d.ts +18 -0
- package/lib/dialogs/upgrade-dialog/upgrade-dialog.component.d.ts +11 -0
- package/lib/elements/analytics-card/analytics-card.component.d.ts +11 -0
- package/lib/elements/base-form/base-form.component.d.ts +6 -4
- package/lib/elements/breadcrumb/breadcrumb.component.d.ts +38 -0
- package/lib/elements/card-carousel/card-carousel.component.d.ts +16 -0
- package/lib/elements/dynamic-tabs/dynamic-tabs.component.d.ts +7 -5
- package/lib/elements/feed-card-sm/feed-card-sm.component.d.ts +14 -0
- package/lib/elements/flow-tool/flow-tool.component.d.ts +28 -0
- package/lib/elements/form-card/form-card.component.d.ts +3 -1
- package/lib/elements/gh-control/gh-control.component.d.ts +19 -0
- package/lib/elements/main-feed-card/main-feed-card.component.d.ts +26 -0
- package/lib/elements/project-info-card/project-info-card.component.d.ts +26 -0
- package/lib/elements/projects/controls/builds/builds.component.d.ts +9 -13
- package/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.d.ts +15 -14
- package/lib/elements/projects/controls/forms/source-control/source-control.component.d.ts +63 -0
- package/lib/elements/projects/controls/git-auth/git-auth.component.d.ts +4 -1
- package/lib/elements/projects/controls/header/header.component.d.ts +22 -4
- package/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.d.ts +22 -4
- package/lib/elements/projects/controls/project-items/project-items.component.d.ts +29 -0
- package/lib/elements/projects/controls/project-tabs/project-tabs.component.d.ts +19 -4
- package/lib/elements/projects/controls/recent-activities/recent-activities.component.d.ts +3 -1
- package/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.d.ts +113 -0
- package/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.d.ts +23 -0
- package/lib/elements/projects/controls/tabs/devops/devops.component.d.ts +53 -0
- package/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.d.ts +51 -0
- package/lib/elements/projects/controls/tabs/domains/domains.component.d.ts +18 -8
- package/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.d.ts +6 -4
- package/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.d.ts +9 -6
- package/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.d.ts +9 -6
- package/lib/elements/projects/controls/tabs/general/general.component.d.ts +8 -4
- package/lib/elements/projects/projects.component.d.ts +18 -22
- package/lib/elements/skeleton-feed-card/skeleton-feed-card.component.d.ts +9 -0
- package/lib/elements/slotted-card/slotted-card.component.d.ts +23 -0
- package/lib/elements/three-column/three-column.component.d.ts +11 -0
- package/lib/elements/two-column-header/two-column-header.component.d.ts +8 -0
- package/lib/models/actions.model.d.ts +0 -1
- package/lib/models/base-form-config.model.d.ts +0 -1
- package/lib/models/card-form-config.model.d.ts +0 -1
- package/lib/models/dev-settings-preset.model.d.ts +0 -1
- package/lib/models/domain.model.d.ts +0 -1
- package/lib/models/dynamic-tabs.model.d.ts +0 -1
- package/lib/models/form-actions.model.d.ts +0 -1
- package/lib/models/form.model.d.ts +0 -1
- package/lib/models/form.values.model.d.ts +0 -1
- package/lib/models/project-actions.model.d.ts +0 -1
- package/lib/models/user-feed.model.d.ts +42 -0
- package/lib/services/applications-flow.service.d.ts +20 -8
- package/lib/services/eac.service.d.ts +63 -0
- package/lib/services/forms.service.d.ts +3 -1
- package/lib/services/npm.service.d.ts +13 -0
- package/lib/services/project.service.d.ts +23 -7
- package/lib/state/applications-flow-state.context.d.ts +3 -1
- package/lib/state/applications-flow.state.d.ts +29 -38
- package/lowcodeunit-applications-flow-common.d.ts +1 -13
- package/package.json +20 -12
- package/bundles/lowcodeunit-applications-flow-common.umd.js +0 -2571
- package/bundles/lowcodeunit-applications-flow-common.umd.js.map +0 -1
- package/bundles/lowcodeunit-applications-flow-common.umd.min.js +0 -16
- package/bundles/lowcodeunit-applications-flow-common.umd.min.js.map +0 -1
- package/esm2015/lcu.api.js +0 -25
- package/esm2015/lib/applications-flow.module.js +0 -116
- package/esm2015/lib/elements/base-form/base-form.component.js +0 -61
- package/esm2015/lib/elements/dynamic-tabs/dynamic-tabs.component.js +0 -69
- package/esm2015/lib/elements/form-card/form-card.component.js +0 -22
- package/esm2015/lib/elements/projects/controls/builds/builds.component.js +0 -37
- package/esm2015/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.js +0 -207
- package/esm2015/lib/elements/projects/controls/git-auth/git-auth.component.js +0 -26
- package/esm2015/lib/elements/projects/controls/header/header.component.js +0 -19
- package/esm2015/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.js +0 -55
- package/esm2015/lib/elements/projects/controls/project-item/project-item.component.js +0 -39
- package/esm2015/lib/elements/projects/controls/project-settings/project-settings.component.js +0 -44
- package/esm2015/lib/elements/projects/controls/project-tabs/project-tabs.component.js +0 -39
- package/esm2015/lib/elements/projects/controls/recent-activities/recent-activities.component.js +0 -15
- package/esm2015/lib/elements/projects/controls/tabs/domains/domains.component.js +0 -108
- package/esm2015/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.js +0 -86
- package/esm2015/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.js +0 -122
- package/esm2015/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.js +0 -109
- package/esm2015/lib/elements/projects/controls/tabs/general/forms/settings/settings.component.js +0 -238
- package/esm2015/lib/elements/projects/controls/tabs/general/general.component.js +0 -44
- package/esm2015/lib/elements/projects/projects.component.js +0 -145
- package/esm2015/lib/models/actions.model.js +0 -3
- package/esm2015/lib/models/base-form-config.model.js +0 -6
- package/esm2015/lib/models/card-form-config.model.js +0 -6
- package/esm2015/lib/models/dev-settings-preset.model.js +0 -3
- package/esm2015/lib/models/domain.model.js +0 -3
- package/esm2015/lib/models/dynamic-tabs.model.js +0 -6
- package/esm2015/lib/models/form-actions.model.js +0 -3
- package/esm2015/lib/models/form.model.js +0 -6
- package/esm2015/lib/models/form.values.model.js +0 -11
- package/esm2015/lib/models/project-actions.model.js +0 -6
- package/esm2015/lib/services/applications-flow-events.service.js +0 -28
- package/esm2015/lib/services/applications-flow.service.js +0 -96
- package/esm2015/lib/services/forms.service.js +0 -131
- package/esm2015/lib/services/project.service.js +0 -85
- package/esm2015/lib/state/applications-flow-state.context.js +0 -37
- package/esm2015/lib/state/applications-flow.state.js +0 -31
- package/esm2015/lowcodeunit-applications-flow-common.js +0 -17
- package/fesm2015/lowcodeunit-applications-flow-common.js +0 -1966
- package/fesm2015/lowcodeunit-applications-flow-common.js.map +0 -1
- package/lcu.api.d.ts.map +0 -1
- package/lib/applications-flow.module.d.ts.map +0 -1
- package/lib/elements/base-form/base-form.component.d.ts.map +0 -1
- package/lib/elements/dynamic-tabs/dynamic-tabs.component.d.ts.map +0 -1
- package/lib/elements/form-card/form-card.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/builds/builds.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/git-auth/git-auth.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/header/header.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/project-item/project-item.component.d.ts +0 -23
- package/lib/elements/projects/controls/project-item/project-item.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/project-settings/project-settings.component.d.ts +0 -16
- package/lib/elements/projects/controls/project-settings/project-settings.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/project-tabs/project-tabs.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/recent-activities/recent-activities.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/tabs/domains/domains.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/tabs/general/forms/settings/settings.component.d.ts +0 -116
- package/lib/elements/projects/controls/tabs/general/forms/settings/settings.component.d.ts.map +0 -1
- package/lib/elements/projects/controls/tabs/general/general.component.d.ts.map +0 -1
- package/lib/elements/projects/projects.component.d.ts.map +0 -1
- package/lib/models/actions.model.d.ts.map +0 -1
- package/lib/models/base-form-config.model.d.ts.map +0 -1
- package/lib/models/card-form-config.model.d.ts.map +0 -1
- package/lib/models/dev-settings-preset.model.d.ts.map +0 -1
- package/lib/models/domain.model.d.ts.map +0 -1
- package/lib/models/dynamic-tabs.model.d.ts.map +0 -1
- package/lib/models/form-actions.model.d.ts.map +0 -1
- package/lib/models/form.model.d.ts.map +0 -1
- package/lib/models/form.values.model.d.ts.map +0 -1
- package/lib/models/project-actions.model.d.ts.map +0 -1
- package/lib/services/applications-flow-events.service.d.ts +0 -13
- package/lib/services/applications-flow-events.service.d.ts.map +0 -1
- package/lib/services/applications-flow.service.d.ts.map +0 -1
- package/lib/services/forms.service.d.ts.map +0 -1
- package/lib/services/project.service.d.ts.map +0 -1
- package/lib/state/applications-flow-state.context.d.ts.map +0 -1
- package/lib/state/applications-flow.state.d.ts.map +0 -1
- package/lowcodeunit-applications-flow-common.d.ts.map +0 -1
- package/lowcodeunit-applications-flow-common.metadata.json +0 -1
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
|
+
import { Validators, } from '@angular/forms';
|
|
3
|
+
import { Guid } from '@lcu/common';
|
|
4
|
+
import { EaCApplicationAsCode } from '@semanticjs/common';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../services/applications-flow.service";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
|
+
import * as i3 from "../../services/eac.service";
|
|
9
|
+
import * as i4 from "@angular/material/card";
|
|
10
|
+
import * as i5 from "@lowcodeunit/app-host-common";
|
|
11
|
+
import * as i6 from "@angular/material/form-field";
|
|
12
|
+
import * as i7 from "@angular/material/select";
|
|
13
|
+
import * as i8 from "@angular/material/core";
|
|
14
|
+
import * as i9 from "../../elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component";
|
|
15
|
+
import * as i10 from "@angular/material/slide-toggle";
|
|
16
|
+
import * as i11 from "@angular/material/icon";
|
|
17
|
+
import * as i12 from "@angular/material/button";
|
|
18
|
+
import * as i13 from "@angular/common";
|
|
19
|
+
import * as i14 from "@angular/material/input";
|
|
20
|
+
import * as i15 from "@angular/material/tooltip";
|
|
21
|
+
import * as i16 from "@angular/flex-layout/flex";
|
|
22
|
+
export class ProcessorDetailsFormComponent {
|
|
23
|
+
constructor(appsFlowSvc, formBldr, eacSvc) {
|
|
24
|
+
this.appsFlowSvc = appsFlowSvc;
|
|
25
|
+
this.formBldr = formBldr;
|
|
26
|
+
this.eacSvc = eacSvc;
|
|
27
|
+
this.redirectTooltip = '';
|
|
28
|
+
this.HasSaveButton = true;
|
|
29
|
+
this.SaveFormEvent = new EventEmitter();
|
|
30
|
+
}
|
|
31
|
+
get APIRootFormControl() {
|
|
32
|
+
return this.ProcessorDetailsFormGroup?.controls.apiRoot;
|
|
33
|
+
}
|
|
34
|
+
get Environment() {
|
|
35
|
+
return this.State?.EaC?.Environments[this.State?.EaC?.Enterprise?.PrimaryEnvironment];
|
|
36
|
+
}
|
|
37
|
+
get BuildFormControl() {
|
|
38
|
+
return this.ProcessorDetailsFormGroup?.controls.build;
|
|
39
|
+
}
|
|
40
|
+
get BuildPathFormControl() {
|
|
41
|
+
return this.ProcessorDetailsFormGroup?.controls.buildPath;
|
|
42
|
+
}
|
|
43
|
+
get ClientIDFormControl() {
|
|
44
|
+
return this.ProcessorDetailsFormGroup?.controls.clientId;
|
|
45
|
+
}
|
|
46
|
+
get ClientSecretFormControl() {
|
|
47
|
+
return this.ProcessorDetailsFormGroup?.controls.clientSecret;
|
|
48
|
+
}
|
|
49
|
+
get DefaultFileFormControl() {
|
|
50
|
+
return this.ProcessorDetailsFormGroup?.controls.defaultFile;
|
|
51
|
+
}
|
|
52
|
+
get DefaultSourceControl() {
|
|
53
|
+
return {
|
|
54
|
+
Organization: this.EditingApplication?.LowCodeUnit?.Organization,
|
|
55
|
+
Repository: this.EditingApplication?.LowCodeUnit?.Repository,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
get InboundPathFormControl() {
|
|
59
|
+
return this.ProcessorDetailsFormGroup?.controls.inboundPath;
|
|
60
|
+
}
|
|
61
|
+
get IncludeRequestFormControl() {
|
|
62
|
+
return this.ProcessorDetailsFormGroup?.controls.includeRequest;
|
|
63
|
+
}
|
|
64
|
+
get MethodsFormControl() {
|
|
65
|
+
return this.ProcessorDetailsFormGroup?.controls.methods;
|
|
66
|
+
}
|
|
67
|
+
get PackageFormControl() {
|
|
68
|
+
return this.ProcessorDetailsFormGroup?.controls.package;
|
|
69
|
+
}
|
|
70
|
+
get PermanentFormControl() {
|
|
71
|
+
return this.ProcessorDetailsFormGroup?.controls.permanent;
|
|
72
|
+
}
|
|
73
|
+
get PreserveMethodFormControl() {
|
|
74
|
+
return this.ProcessorDetailsFormGroup?.controls.preserveMethod;
|
|
75
|
+
}
|
|
76
|
+
get RedirectFormControl() {
|
|
77
|
+
return this.ProcessorDetailsFormGroup?.controls.redirect;
|
|
78
|
+
}
|
|
79
|
+
get ScopesFormControl() {
|
|
80
|
+
return this.ProcessorDetailsFormGroup?.controls.scopes;
|
|
81
|
+
}
|
|
82
|
+
get SecurityFormControl() {
|
|
83
|
+
return this.ProcessorDetailsFormGroup?.controls.security;
|
|
84
|
+
}
|
|
85
|
+
get State() {
|
|
86
|
+
return this.eacSvc.State;
|
|
87
|
+
}
|
|
88
|
+
get SourceControls() {
|
|
89
|
+
return this.Environment?.Sources || {};
|
|
90
|
+
}
|
|
91
|
+
get SourceControlFormControl() {
|
|
92
|
+
return this.ProcessorDetailsFormGroup?.controls.sourceControl;
|
|
93
|
+
}
|
|
94
|
+
get SPARootFormControl() {
|
|
95
|
+
return this.ProcessorDetailsFormGroup?.controls.spaRoot;
|
|
96
|
+
}
|
|
97
|
+
get TokenLookupFormControl() {
|
|
98
|
+
return this.ProcessorDetailsFormGroup?.controls.tokenLookup;
|
|
99
|
+
}
|
|
100
|
+
get VersionFormControl() {
|
|
101
|
+
return this.ProcessorDetailsFormGroup?.controls.version;
|
|
102
|
+
}
|
|
103
|
+
get ZipFileFormControl() {
|
|
104
|
+
return this.ProcessorDetailsFormGroup?.controls.zipFile;
|
|
105
|
+
}
|
|
106
|
+
ngOnInit() {
|
|
107
|
+
if (!this.EditingApplication) {
|
|
108
|
+
this.CreateNewApplication();
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.setupProcessorDetailsForm();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
CreateNewApplication() {
|
|
115
|
+
this.SetEditingApplication(Guid.CreateRaw());
|
|
116
|
+
}
|
|
117
|
+
DetermineTooltipText() {
|
|
118
|
+
let permanentValue = this.PermanentFormControl.value;
|
|
119
|
+
let preserveValue = this.PreserveMethodFormControl.value;
|
|
120
|
+
if (permanentValue === true && preserveValue === false) {
|
|
121
|
+
this.redirectTooltip = '301 – Permanent and Not Preserve';
|
|
122
|
+
}
|
|
123
|
+
else if (permanentValue === false && preserveValue === false) {
|
|
124
|
+
this.redirectTooltip = '302 – Not Permanent and Not Preserve';
|
|
125
|
+
}
|
|
126
|
+
else if (permanentValue === false && preserveValue === true) {
|
|
127
|
+
this.redirectTooltip = '307 – Not Permanent and Preserve';
|
|
128
|
+
}
|
|
129
|
+
else if (permanentValue === true && preserveValue === true) {
|
|
130
|
+
this.redirectTooltip = '308 – Permanent and Preserve';
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
SaveProcessorDetails() {
|
|
134
|
+
const app = this.EditingApplication;
|
|
135
|
+
app.LookupConfig.AllowedMethods =
|
|
136
|
+
this.MethodsFormControl?.value
|
|
137
|
+
?.split(' ')
|
|
138
|
+
.filter((v) => !!v);
|
|
139
|
+
app.Processor.Type = this.ProcessorType;
|
|
140
|
+
switch (app.Processor.Type) {
|
|
141
|
+
case 'DFS':
|
|
142
|
+
app.Processor.DefaultFile =
|
|
143
|
+
this.DefaultFileFormControl.value ||
|
|
144
|
+
'index.html';
|
|
145
|
+
app.LowCodeUnit = {
|
|
146
|
+
Type: this.LCUType,
|
|
147
|
+
};
|
|
148
|
+
switch (app.LowCodeUnit.Type) {
|
|
149
|
+
case 'GitHub':
|
|
150
|
+
app.LowCodeUnit.Organization =
|
|
151
|
+
this.SourceControls[this.SourceControlFormControl.value].Organization;
|
|
152
|
+
app.LowCodeUnit.Repository =
|
|
153
|
+
this.SourceControls[this.SourceControlFormControl.value].Repository;
|
|
154
|
+
app.LowCodeUnit.Build =
|
|
155
|
+
this.BuildFormControl.value;
|
|
156
|
+
app.LowCodeUnit.Path =
|
|
157
|
+
this.BuildPathFormControl.value;
|
|
158
|
+
app.LowCodeUnit.SourceControlLookup =
|
|
159
|
+
this.SourceControlFormControl.value;
|
|
160
|
+
break;
|
|
161
|
+
case 'NPM':
|
|
162
|
+
app.LowCodeUnit.Package =
|
|
163
|
+
this.PackageFormControl.value;
|
|
164
|
+
app.LowCodeUnit.Version =
|
|
165
|
+
this.VersionFormControl.value;
|
|
166
|
+
break;
|
|
167
|
+
case 'WordPress':
|
|
168
|
+
app.LowCodeUnit.APIRoot =
|
|
169
|
+
this.APIRootFormControl.value;
|
|
170
|
+
break;
|
|
171
|
+
case 'Zip':
|
|
172
|
+
app.LowCodeUnit.ZipFile =
|
|
173
|
+
this.ZipFileFormControl.value;
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
case 'OAuth':
|
|
178
|
+
app.Processor.Scopes =
|
|
179
|
+
this.ScopesFormControl.value.split(' ');
|
|
180
|
+
app.Processor.TokenLookup =
|
|
181
|
+
this.TokenLookupFormControl.value;
|
|
182
|
+
app.LowCodeUnit = {
|
|
183
|
+
Type: this.LCUType,
|
|
184
|
+
};
|
|
185
|
+
switch (app.LowCodeUnit.Type) {
|
|
186
|
+
case 'GitHubOAuth':
|
|
187
|
+
app.LowCodeUnit.ClientID =
|
|
188
|
+
this.ClientIDFormControl.value;
|
|
189
|
+
app.LowCodeUnit.ClientSecret =
|
|
190
|
+
this.ClientSecretFormControl.value;
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
break;
|
|
194
|
+
case 'Proxy':
|
|
195
|
+
app.Processor.InboundPath =
|
|
196
|
+
this.InboundPathFormControl.value;
|
|
197
|
+
app.LowCodeUnit = {
|
|
198
|
+
Type: this.LCUType,
|
|
199
|
+
};
|
|
200
|
+
switch (app.LowCodeUnit.Type) {
|
|
201
|
+
case 'API':
|
|
202
|
+
app.LowCodeUnit.APIRoot =
|
|
203
|
+
this.APIRootFormControl.value;
|
|
204
|
+
app.LowCodeUnit.Security =
|
|
205
|
+
this.SecurityFormControl.value;
|
|
206
|
+
break;
|
|
207
|
+
case 'SPA':
|
|
208
|
+
app.LowCodeUnit.SPARoot =
|
|
209
|
+
this.SPARootFormControl.value;
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
break;
|
|
213
|
+
case 'Redirect':
|
|
214
|
+
app.Processor.IncludeRequest =
|
|
215
|
+
!!this.IncludeRequestFormControl.value;
|
|
216
|
+
app.Processor.Permanent =
|
|
217
|
+
!!this.PermanentFormControl.value;
|
|
218
|
+
app.Processor.PreserveMethod =
|
|
219
|
+
!!this.PreserveMethodFormControl.value;
|
|
220
|
+
app.Processor.Redirect =
|
|
221
|
+
this.RedirectFormControl.value;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
if (!app.LookupConfig.PathRegex.startsWith('/')) {
|
|
225
|
+
app.LookupConfig.PathRegex = `/${app.LookupConfig.PathRegex}`;
|
|
226
|
+
}
|
|
227
|
+
const saveAppReq = {
|
|
228
|
+
ProjectLookup: this.ProjectLookup,
|
|
229
|
+
Application: app,
|
|
230
|
+
ApplicationLookup: this.EditingApplicationLookup || Guid.CreateRaw(),
|
|
231
|
+
};
|
|
232
|
+
this.eacSvc.SaveApplicationAsCode(saveAppReq).then(res => {
|
|
233
|
+
this.SaveFormEvent.emit(res);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
SetEditingApplication(appLookup) {
|
|
237
|
+
this.EditingApplication = new EaCApplicationAsCode;
|
|
238
|
+
this.EditingApplicationLookup = appLookup;
|
|
239
|
+
this.setupProcessorDetailsForm();
|
|
240
|
+
}
|
|
241
|
+
SourceControlChanged(event) {
|
|
242
|
+
this.listBuildPaths();
|
|
243
|
+
}
|
|
244
|
+
ProcessorTypeChanged(event) {
|
|
245
|
+
this.ProcessorType = event.value;
|
|
246
|
+
this.setupProcessorTypeSubForm();
|
|
247
|
+
}
|
|
248
|
+
LCUTypeChanged(event) {
|
|
249
|
+
this.LCUType = event.value;
|
|
250
|
+
this.setupLcuTypeSubForm();
|
|
251
|
+
}
|
|
252
|
+
//HELPERS
|
|
253
|
+
cleanupLcuTypeSubForm() {
|
|
254
|
+
this.ProcessorDetailsFormGroup.removeControl('methods');
|
|
255
|
+
this.ProcessorDetailsFormGroup.removeControl('apiRoot');
|
|
256
|
+
this.ProcessorDetailsFormGroup.removeControl('security');
|
|
257
|
+
this.ProcessorDetailsFormGroup.removeControl('spaRoot');
|
|
258
|
+
this.ProcessorDetailsFormGroup.removeControl('applicationId');
|
|
259
|
+
this.ProcessorDetailsFormGroup.removeControl('sourceControl');
|
|
260
|
+
this.ProcessorDetailsFormGroup.removeControl('build');
|
|
261
|
+
this.ProcessorDetailsFormGroup.removeControl('clientId');
|
|
262
|
+
this.ProcessorDetailsFormGroup.removeControl('clientSecret');
|
|
263
|
+
this.ProcessorDetailsFormGroup.removeControl('zipFile');
|
|
264
|
+
}
|
|
265
|
+
cleanupProcessorTypeSubForm() {
|
|
266
|
+
this.ProcessorDetailsFormGroup.removeControl('defaultFile');
|
|
267
|
+
// this.ApplicationFormGroup.removeControl('dfsLcuType');
|
|
268
|
+
// this.ApplicationFormGroup.removeControl('oauthLcuType');
|
|
269
|
+
this.ProcessorDetailsFormGroup.removeControl('scopes');
|
|
270
|
+
this.ProcessorDetailsFormGroup.removeControl('tokenLookup');
|
|
271
|
+
this.ProcessorDetailsFormGroup.removeControl('inboundPath');
|
|
272
|
+
this.ProcessorDetailsFormGroup.removeControl('proxyLcuType');
|
|
273
|
+
this.ProcessorDetailsFormGroup.removeControl('includeRequest');
|
|
274
|
+
this.ProcessorDetailsFormGroup.removeControl('redirect');
|
|
275
|
+
this.ProcessorDetailsFormGroup.removeControl('permanent');
|
|
276
|
+
this.ProcessorDetailsFormGroup.removeControl('preserveMethod');
|
|
277
|
+
this.cleanupLcuTypeSubForm();
|
|
278
|
+
}
|
|
279
|
+
listBuildPaths() {
|
|
280
|
+
this.State.Loading = true;
|
|
281
|
+
this.appsFlowSvc
|
|
282
|
+
.ListBuildPaths(this.SourceControls[this.SourceControlFormControl.value].Organization, this.SourceControls[this.SourceControlFormControl.value].Repository)
|
|
283
|
+
.subscribe((response) => {
|
|
284
|
+
this.BuildPathOptions = response.Model;
|
|
285
|
+
this.State.Loading = false;
|
|
286
|
+
if (this.BuildPathOptions?.length === 1) {
|
|
287
|
+
this.BuildPathFormControl.setValue(this.BuildPathOptions[0]);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
setupLcuTypeSubForm() {
|
|
292
|
+
this.cleanupLcuTypeSubForm();
|
|
293
|
+
// this.ApplicationFormGroup.removeControl('package');
|
|
294
|
+
// this.ApplicationFormGroup.removeControl('version');
|
|
295
|
+
if (this.LCUType) {
|
|
296
|
+
switch (this.LCUType) {
|
|
297
|
+
case 'API':
|
|
298
|
+
this.setupLCUAPIForm();
|
|
299
|
+
break;
|
|
300
|
+
case 'ApplicationPointer':
|
|
301
|
+
this.setupLCUApplicationPointerForm();
|
|
302
|
+
break;
|
|
303
|
+
case 'GitHub':
|
|
304
|
+
this.setupLCUGitHubForm();
|
|
305
|
+
break;
|
|
306
|
+
case 'GitHubOAuth':
|
|
307
|
+
this.setupLCUGitHubOAuthForm();
|
|
308
|
+
break;
|
|
309
|
+
case 'WordPress':
|
|
310
|
+
this.setupLCUWordPressForm();
|
|
311
|
+
break;
|
|
312
|
+
// case 'NPM':
|
|
313
|
+
// this.setupLCUNPMForm();
|
|
314
|
+
// break;
|
|
315
|
+
case 'SPA':
|
|
316
|
+
this.setupLCUSPAForm();
|
|
317
|
+
break;
|
|
318
|
+
case 'Zip':
|
|
319
|
+
this.setupLCUZipForm();
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
setupProcessorDetailsForm() {
|
|
325
|
+
this.ProcessorType = this.EditingApplication?.Processor?.Type || '';
|
|
326
|
+
// console.log('EDITING APP = ', this.EditingApplication);
|
|
327
|
+
if (this.EditingApplication != null) {
|
|
328
|
+
this.ProcessorDetailsFormGroup = this.formBldr.group({
|
|
329
|
+
procType: [this.ProcessorType, [Validators.required]],
|
|
330
|
+
});
|
|
331
|
+
this.setupDfsForm();
|
|
332
|
+
this.setupLcuTypeSubForm();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
setupLCUGitHubForm() {
|
|
336
|
+
console.log("EditingApplication: ", this.EditingApplication);
|
|
337
|
+
this.ProcessorDetailsFormGroup.addControl('sourceControl', this.formBldr.control(this.EditingApplication.LowCodeUnit?.SourceControlLookup || '', [Validators.required]));
|
|
338
|
+
this.ProcessorDetailsFormGroup.addControl('buildPath', this.formBldr.control(this.EditingApplication.LowCodeUnit?.Path || '', [Validators.required]));
|
|
339
|
+
this.ProcessorDetailsFormGroup.addControl('build', this.formBldr.control(this.EditingApplication.LowCodeUnit?.Build || 'latest', [Validators.required]));
|
|
340
|
+
}
|
|
341
|
+
setupLCUApplicationPointerForm() {
|
|
342
|
+
this.ProcessorDetailsFormGroup.addControl('applicationId', this.formBldr.control(this.EditingApplication.LowCodeUnit?.ApplicationID || '', [Validators.required]));
|
|
343
|
+
}
|
|
344
|
+
setupLCUSPAForm() {
|
|
345
|
+
this.ProcessorDetailsFormGroup.addControl('spaRoot', this.formBldr.control(this.EditingApplication.LowCodeUnit?.SPARoot || '', [Validators.required]));
|
|
346
|
+
}
|
|
347
|
+
setupLCUAPIForm() {
|
|
348
|
+
this.ProcessorDetailsFormGroup.addControl('methods', this.formBldr.control(this.EditingApplication.LookupConfig?.AllowedMethods?.join(' ') || '', []));
|
|
349
|
+
this.ProcessorDetailsFormGroup.addControl('apiRoot', this.formBldr.control(this.EditingApplication.LowCodeUnit?.APIRoot || '', [Validators.required]));
|
|
350
|
+
this.ProcessorDetailsFormGroup.addControl('security', this.formBldr.control(this.EditingApplication.LowCodeUnit?.Security || '', [Validators.required]));
|
|
351
|
+
}
|
|
352
|
+
setupLCUGitHubOAuthForm() {
|
|
353
|
+
this.ProcessorDetailsFormGroup.addControl('clientId', this.formBldr.control(this.EditingApplication.LowCodeUnit?.ClientID || '', [Validators.required]));
|
|
354
|
+
this.ProcessorDetailsFormGroup.addControl('clientSecret', this.formBldr.control(this.EditingApplication.LowCodeUnit?.ClientSecret || '', [Validators.required]));
|
|
355
|
+
}
|
|
356
|
+
setupLCUWordPressForm() {
|
|
357
|
+
this.ProcessorDetailsFormGroup.addControl('apiRoot', this.formBldr.control(this.EditingApplication.LowCodeUnit?.APIRoot || '', [Validators.required]));
|
|
358
|
+
}
|
|
359
|
+
setupProxyForm() {
|
|
360
|
+
this.LCUType = this.EditingApplication.LowCodeUnit?.Type || '';
|
|
361
|
+
this.ProcessorDetailsFormGroup.addControl('inboundPath', this.formBldr.control(this.EditingApplication.Processor?.InboundPath || '', [Validators.required]));
|
|
362
|
+
this.ProcessorDetailsFormGroup.addControl('lcuType', this.formBldr.control(this.LCUType, [Validators.required]));
|
|
363
|
+
}
|
|
364
|
+
setupRedirectForm() {
|
|
365
|
+
this.ProcessorDetailsFormGroup.addControl('redirect', this.formBldr.control(this.EditingApplication.Processor?.Redirect || '', [
|
|
366
|
+
Validators.required,
|
|
367
|
+
]));
|
|
368
|
+
this.ProcessorDetailsFormGroup.addControl('permanent', this.formBldr.control(this.EditingApplication.Processor?.Permanent || false, []));
|
|
369
|
+
this.ProcessorDetailsFormGroup.addControl('preserveMethod', this.formBldr.control(this.EditingApplication.Processor?.PreserveMethod || false, []));
|
|
370
|
+
this.ProcessorDetailsFormGroup.addControl('includeRequest', this.formBldr.control(this.EditingApplication.Processor?.IncludeRequest || false, []));
|
|
371
|
+
this.DetermineTooltipText();
|
|
372
|
+
}
|
|
373
|
+
setupOAuthForm() {
|
|
374
|
+
this.LCUType = this.EditingApplication.LowCodeUnit?.Type || '';
|
|
375
|
+
this.ProcessorDetailsFormGroup.addControl('scopes', this.formBldr.control(this.EditingApplication.Processor?.Scopes?.Join(' ') || '', [Validators.required]));
|
|
376
|
+
this.ProcessorDetailsFormGroup.addControl('tokenLookup', this.formBldr.control(this.EditingApplication.Processor?.TokenLookup || '', [Validators.required]));
|
|
377
|
+
this.ProcessorDetailsFormGroup.addControl('lcuType', this.formBldr.control(this.LCUType, [Validators.required]));
|
|
378
|
+
}
|
|
379
|
+
setupLCUZipForm() {
|
|
380
|
+
this.ProcessorDetailsFormGroup.addControl('zipFile', this.formBldr.control(this.EditingApplication.LowCodeUnit?.ZipFile || '', [Validators.required]));
|
|
381
|
+
}
|
|
382
|
+
setupDfsForm() {
|
|
383
|
+
this.LCUType = this.EditingApplication.LowCodeUnit?.Type || '';
|
|
384
|
+
this.ProcessorDetailsFormGroup.addControl('defaultFile', this.formBldr.control(this.EditingApplication.Processor?.DefaultFile || 'index.html', [Validators.required]));
|
|
385
|
+
this.ProcessorDetailsFormGroup.addControl('lcuType', this.formBldr.control(this.LCUType, [Validators.required]));
|
|
386
|
+
}
|
|
387
|
+
setupProcessorTypeSubForm() {
|
|
388
|
+
this.cleanupProcessorTypeSubForm();
|
|
389
|
+
if (this.ProcessorType) {
|
|
390
|
+
switch (this.ProcessorType) {
|
|
391
|
+
case 'DFS':
|
|
392
|
+
this.setupDfsForm();
|
|
393
|
+
break;
|
|
394
|
+
case 'OAuth':
|
|
395
|
+
this.setupOAuthForm();
|
|
396
|
+
break;
|
|
397
|
+
case 'Proxy':
|
|
398
|
+
this.setupProxyForm();
|
|
399
|
+
break;
|
|
400
|
+
case 'Redirect':
|
|
401
|
+
this.setupRedirectForm();
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
this.setupLcuTypeSubForm();
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
ProcessorDetailsFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ProcessorDetailsFormComponent, deps: [{ token: i1.ApplicationsFlowService }, { token: i2.FormBuilder }, { token: i3.EaCService }], target: i0.ɵɵFactoryTarget.Component });
|
|
409
|
+
ProcessorDetailsFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: ProcessorDetailsFormComponent, selector: "lcu-processor-details-form", inputs: { EditingApplication: ["editing-application", "EditingApplication"], EditingApplicationLookup: ["editing-application-lookup", "EditingApplicationLookup"], HasSaveButton: ["has-save-button", "HasSaveButton"], SourceControlLookups: ["source-control-lookups", "SourceControlLookups"], ProjectLookup: ["project-lookup", "ProjectLookup"] }, outputs: { SaveFormEvent: "save-form-event" }, ngImport: i0, template: "<form class=\"processor-details-form\" [formGroup]=\"ProcessorDetailsFormGroup\" (ngSubmit)=\"SaveProcessorDetails()\">\n<mat-card class=\"spread flow-card\">\n <mat-card-header>\n <mat-card-title> Processor Details </mat-card-title>\n </mat-card-header>\n\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n\n <ng-container *ngIf=\"!State?.Loading\">\n\n <mat-card-content>\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"procType\"\n (selectionChange)=\"ProcessorTypeChanged($event)\"\n required\n >\n <mat-option value=\"DFS\">View Package</mat-option>\n\n <mat-option value=\"Redirect\">Redirect</mat-option>\n\n <mat-option value=\"Proxy\">Proxy</mat-option>\n\n <mat-option value=\"OAuth\">OAuth</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"ProcessorType\">\n <div *ngSwitchCase=\"'DFS'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Default File\"\n formControlName=\"defaultFile\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"NPM\">NPM</mat-option>\n\n <mat-option value=\"GitHub\">GitHub</mat-option>\n\n <mat-option value=\"WordPress\">WordPress</mat-option>\n\n <!-- <mat-option value=\"Zip\">Zip</mat-option> -->\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'GitHub'\">\n <!-- <lcu-source-control-form-controls\n [build-path]=\"EditingApplication?.LowCodeUnit?.Path\"\n [form-group]=\"ProcessorDetailsFormGroup\"\n [source-control]=\"DefaultSourceControl\"\n [use-branches]=\"false\"\n [use-build-path]=\"true\"\n ></lcu-source-control-form-controls> -->\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Source Control\"\n formControlName=\"sourceControl\"\n (selectionChange)=\"SourceControlChanged($event)\"\n required\n >\n <mat-option \n *ngFor=\"let scLookup of SourceControlLookups\" \n [value]=\"scLookup\">\n {{scLookup}}\n </mat-option>\n \n \n <!-- <mat-option value=\"Zip\">Zip</mat-option> -->\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\"\n *ngIf=\"\n SourceControlFormControl?.valid\n \"\n > \n <mat-select\n formControlName=\"buildPath\"\n placeholder=\"Build Path\"\n required\n >\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\n <mat-form-field\n class=\"mat-full-width\"\n *ngIf=\"\n SourceControlFormControl?.valid\n \"\n >\n <input\n matInput\n placeholder=\"Build\"\n formControlName=\"build\"\n required\n />\n\n <mat-hint>\n Current Build:\n {{ EditingApplication?.LowCodeUnit?.CurrentBuild }}\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"'NPM'\">\n <lcu-npm-package-select\n [npm-package]=\"EditingApplication?.LowCodeUnit?.Package\"\n [npm-package-version]=\"\n EditingApplication?.LowCodeUnit?.Version\n \"\n [form-group]=\"ProcessorDetailsFormGroup\"\n ></lcu-npm-package-select>\n\n <mat-hint>\n Current Version:\n {{ EditingApplication?.LowCodeUnit?.CurrentVersion }}\n </mat-hint>\n </div>\n\n <div *ngSwitchCase=\"'WordPress'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"API Root\"\n formControlName=\"apiRoot\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'OAuth'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Scopes (space separated)\"\n formControlName=\"scopes\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Token Lookup\"\n formControlName=\"tokenLookup\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"GitHubOAuth\">GitHub</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'GitHubOAuth'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Client ID\"\n formControlName=\"clientId\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Client Secret\"\n formControlName=\"clientSecret\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Proxy'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Inbound Path\"\n formControlName=\"inboundPath\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"API\">API</mat-option>\n\n <mat-option value=\"SPA\">Single Page Application</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'API'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"API Root\"\n formControlName=\"apiRoot\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Allowed Methods (separate with spaces)\"\n formControlName=\"methods\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Security ({header}~{value})\"\n formControlName=\"security\"\n required\n />\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"'SPA'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"SPA Root\"\n formControlName=\"spaRoot\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Redirect'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Redirect URL\"\n formControlName=\"redirect\"\n required\n />\n </mat-form-field>\n\n <div>\n <mat-slide-toggle \n class=\"spread\" \n formControlName=\"permanent\">\n Is Permanent?\n </mat-slide-toggle>\n\n <mat-slide-toggle\n class=\"spread\"\n formControlName=\"preserveMethod\"\n >\n Preserve Method?\n </mat-slide-toggle>\n\n <mat-icon\n class=\"spread\"\n matSuffix\n (mouseenter)=\"DetermineTooltipText()\"\n matTooltip={{redirectTooltip}}\n >\n info_outline\n </mat-icon>\n\n \n </div>\n \n <div>\n <mat-slide-toggle \n class=\"spread\" \n formControlName=\"includeRequest\">\n Include Path and Query?\n </mat-slide-toggle>\n\n <mat-icon\n class=\"spread\"\n matSuffix\n matTooltip=\"Should the redirect include the path and query?\"\n >\n info_outline\n </mat-icon>\n </div>\n </div>\n </div>\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n *ngIf=\"HasSaveButton && !State?.Loading\"\n mat-raised-button \n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!ProcessorDetailsFormGroup.valid || !ProcessorDetailsFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Processor Details\n </button>\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n\n </mat-card-actions>\n\n </ng-container>\n \n</mat-card>\n</form>\n \n", styles: [""], components: [{ type: i4.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i4.MatCardHeader, selector: "mat-card-header" }, { type: i5.LoaderComponent, selector: "lcu-loader", inputs: ["diameter", "hide-inner", "loading"] }, { 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.NpmPackageSelectComponent, selector: "lcu-npm-package-select", inputs: ["npm-package", "npm-package-version", "form-group"] }, { type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i12.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"] }], directives: [{ type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i13.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i13.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i14.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: i2.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: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i6.MatSuffix, selector: "[matSuffix]" }, { type: i15.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { type: i16.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"] }, { type: i16.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"] }] });
|
|
410
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ProcessorDetailsFormComponent, decorators: [{
|
|
411
|
+
type: Component,
|
|
412
|
+
args: [{ selector: 'lcu-processor-details-form', template: "<form class=\"processor-details-form\" [formGroup]=\"ProcessorDetailsFormGroup\" (ngSubmit)=\"SaveProcessorDetails()\">\n<mat-card class=\"spread flow-card\">\n <mat-card-header>\n <mat-card-title> Processor Details </mat-card-title>\n </mat-card-header>\n\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n\n <ng-container *ngIf=\"!State?.Loading\">\n\n <mat-card-content>\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"procType\"\n (selectionChange)=\"ProcessorTypeChanged($event)\"\n required\n >\n <mat-option value=\"DFS\">View Package</mat-option>\n\n <mat-option value=\"Redirect\">Redirect</mat-option>\n\n <mat-option value=\"Proxy\">Proxy</mat-option>\n\n <mat-option value=\"OAuth\">OAuth</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"ProcessorType\">\n <div *ngSwitchCase=\"'DFS'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Default File\"\n formControlName=\"defaultFile\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"NPM\">NPM</mat-option>\n\n <mat-option value=\"GitHub\">GitHub</mat-option>\n\n <mat-option value=\"WordPress\">WordPress</mat-option>\n\n <!-- <mat-option value=\"Zip\">Zip</mat-option> -->\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'GitHub'\">\n <!-- <lcu-source-control-form-controls\n [build-path]=\"EditingApplication?.LowCodeUnit?.Path\"\n [form-group]=\"ProcessorDetailsFormGroup\"\n [source-control]=\"DefaultSourceControl\"\n [use-branches]=\"false\"\n [use-build-path]=\"true\"\n ></lcu-source-control-form-controls> -->\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Source Control\"\n formControlName=\"sourceControl\"\n (selectionChange)=\"SourceControlChanged($event)\"\n required\n >\n <mat-option \n *ngFor=\"let scLookup of SourceControlLookups\" \n [value]=\"scLookup\">\n {{scLookup}}\n </mat-option>\n \n \n <!-- <mat-option value=\"Zip\">Zip</mat-option> -->\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\"\n *ngIf=\"\n SourceControlFormControl?.valid\n \"\n > \n <mat-select\n formControlName=\"buildPath\"\n placeholder=\"Build Path\"\n required\n >\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\n <mat-form-field\n class=\"mat-full-width\"\n *ngIf=\"\n SourceControlFormControl?.valid\n \"\n >\n <input\n matInput\n placeholder=\"Build\"\n formControlName=\"build\"\n required\n />\n\n <mat-hint>\n Current Build:\n {{ EditingApplication?.LowCodeUnit?.CurrentBuild }}\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"'NPM'\">\n <lcu-npm-package-select\n [npm-package]=\"EditingApplication?.LowCodeUnit?.Package\"\n [npm-package-version]=\"\n EditingApplication?.LowCodeUnit?.Version\n \"\n [form-group]=\"ProcessorDetailsFormGroup\"\n ></lcu-npm-package-select>\n\n <mat-hint>\n Current Version:\n {{ EditingApplication?.LowCodeUnit?.CurrentVersion }}\n </mat-hint>\n </div>\n\n <div *ngSwitchCase=\"'WordPress'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"API Root\"\n formControlName=\"apiRoot\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'OAuth'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Scopes (space separated)\"\n formControlName=\"scopes\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Token Lookup\"\n formControlName=\"tokenLookup\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"GitHubOAuth\">GitHub</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'GitHubOAuth'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Client ID\"\n formControlName=\"clientId\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Client Secret\"\n formControlName=\"clientSecret\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Proxy'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Inbound Path\"\n formControlName=\"inboundPath\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"API\">API</mat-option>\n\n <mat-option value=\"SPA\">Single Page Application</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'API'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"API Root\"\n formControlName=\"apiRoot\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Allowed Methods (separate with spaces)\"\n formControlName=\"methods\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Security ({header}~{value})\"\n formControlName=\"security\"\n required\n />\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"'SPA'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"SPA Root\"\n formControlName=\"spaRoot\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Redirect'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Redirect URL\"\n formControlName=\"redirect\"\n required\n />\n </mat-form-field>\n\n <div>\n <mat-slide-toggle \n class=\"spread\" \n formControlName=\"permanent\">\n Is Permanent?\n </mat-slide-toggle>\n\n <mat-slide-toggle\n class=\"spread\"\n formControlName=\"preserveMethod\"\n >\n Preserve Method?\n </mat-slide-toggle>\n\n <mat-icon\n class=\"spread\"\n matSuffix\n (mouseenter)=\"DetermineTooltipText()\"\n matTooltip={{redirectTooltip}}\n >\n info_outline\n </mat-icon>\n\n \n </div>\n \n <div>\n <mat-slide-toggle \n class=\"spread\" \n formControlName=\"includeRequest\">\n Include Path and Query?\n </mat-slide-toggle>\n\n <mat-icon\n class=\"spread\"\n matSuffix\n matTooltip=\"Should the redirect include the path and query?\"\n >\n info_outline\n </mat-icon>\n </div>\n </div>\n </div>\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n *ngIf=\"HasSaveButton && !State?.Loading\"\n mat-raised-button \n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!ProcessorDetailsFormGroup.valid || !ProcessorDetailsFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Processor Details\n </button>\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n\n </mat-card-actions>\n\n </ng-container>\n \n</mat-card>\n</form>\n \n", styles: [""] }]
|
|
413
|
+
}], ctorParameters: function () { return [{ type: i1.ApplicationsFlowService }, { type: i2.FormBuilder }, { type: i3.EaCService }]; }, propDecorators: { EditingApplication: [{
|
|
414
|
+
type: Input,
|
|
415
|
+
args: ['editing-application']
|
|
416
|
+
}], EditingApplicationLookup: [{
|
|
417
|
+
type: Input,
|
|
418
|
+
args: ['editing-application-lookup']
|
|
419
|
+
}], HasSaveButton: [{
|
|
420
|
+
type: Input,
|
|
421
|
+
args: ['has-save-button']
|
|
422
|
+
}], SourceControlLookups: [{
|
|
423
|
+
type: Input,
|
|
424
|
+
args: ['source-control-lookups']
|
|
425
|
+
}], ProjectLookup: [{
|
|
426
|
+
type: Input,
|
|
427
|
+
args: ['project-lookup']
|
|
428
|
+
}], SaveFormEvent: [{
|
|
429
|
+
type: Output,
|
|
430
|
+
args: ['save-form-event']
|
|
431
|
+
}] } });
|
|
432
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc29yLWRldGFpbHMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24vc3JjL2xpYi9jb250cm9scy9wcm9jZXNzb3ItZGV0YWlscy1mb3JtL3Byb2Nlc3Nvci1kZXRhaWxzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvY29udHJvbHMvcHJvY2Vzc29yLWRldGFpbHMtZm9ybS9wcm9jZXNzb3ItZGV0YWlscy1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBdUIsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxvQkFBb0IsRUFBMEMsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVWxHLE1BQU0sT0FBTyw2QkFBNkI7SUF3SXhDLFlBQ1ksV0FBb0MsRUFDcEMsUUFBcUIsRUFDckIsTUFBa0I7UUFGbEIsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQWE7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUUxQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQTVIRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDO0lB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QU07Z0JBRVIsS0FBSyxPQUFPO29CQUNWLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEIsTUFBTTtnQkFFUixLQUFLLE9BQU87b0JBQ1YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN0QixNQUFNO2dCQUVSLEtBQUssVUFBVTtvQkFDYixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDekIsTUFBTTthQUNUO1NBQ0Y7UUFFRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDOzswSEFuckJVLDZCQUE2Qjs4R0FBN0IsNkJBQTZCLHljQ3pCMUMsZy9WQTRWQTsyRkRuVWEsNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDRCQUE0QjtpS0FPL0Isa0JBQWtCO3NCQUR4QixLQUFLO3VCQUFDLHFCQUFxQjtnQkFJckIsd0JBQXdCO3NCQUQ5QixLQUFLO3VCQUFDLDRCQUE0QjtnQkFJNUIsYUFBYTtzQkFEbkIsS0FBSzt1QkFBQyxpQkFBaUI7Z0JBSWpCLG9CQUFvQjtzQkFEMUIsS0FBSzt1QkFBQyx3QkFBd0I7Z0JBSXhCLGFBQWE7c0JBRG5CLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUloQixhQUFhO3NCQURuQixNQUFNO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQnVpbGRlcixcbiAgRm9ybUdyb3VwLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTZWxlY3RDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgQmFzZU1vZGVsZWRSZXNwb25zZSwgR3VpZCB9IGZyb20gJ0BsY3UvY29tbW9uJztcbmltcG9ydCB7IEVhQ0FwcGxpY2F0aW9uQXNDb2RlLCBFYUNFbnZpcm9ubWVudEFzQ29kZSwgRWFDU291cmNlQ29udHJvbCB9IGZyb20gJ0BzZW1hbnRpY2pzL2NvbW1vbic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbnNGbG93U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcGxpY2F0aW9ucy1mbG93LnNlcnZpY2UnO1xuaW1wb3J0IHsgRWFDU2VydmljZSwgU2F2ZUFwcGxpY2F0aW9uQXNDb2RlRXZlbnRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWFjLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25zRmxvd1N0YXRlIH0gZnJvbSAnLi4vLi4vc3RhdGUvYXBwbGljYXRpb25zLWZsb3cuc3RhdGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsY3UtcHJvY2Vzc29yLWRldGFpbHMtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9jZXNzb3ItZGV0YWlscy1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvY2Vzc29yLWRldGFpbHMtZm9ybS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9jZXNzb3JEZXRhaWxzRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCdlZGl0aW5nLWFwcGxpY2F0aW9uJylcbiAgcHVibGljIEVkaXRpbmdBcHBsaWNhdGlvbjogRWFDQXBwbGljYXRpb25Bc0NvZGU7XG5cbiAgQElucHV0KCdlZGl0aW5nLWFwcGxpY2F0aW9uLWxvb2t1cCcpXG4gIHB1YmxpYyBFZGl0aW5nQXBwbGljYXRpb25Mb29rdXA6IHN0cmluZztcblxuICBASW5wdXQoJ2hhcy1zYXZlLWJ1dHRvbicpXG4gIHB1YmxpYyBIYXNTYXZlQnV0dG9uOiBib29sZWFuO1xuXG4gIEBJbnB1dCgnc291cmNlLWNvbnRyb2wtbG9va3VwcycpXG4gIHB1YmxpYyBTb3VyY2VDb250cm9sTG9va3VwczogQXJyYXk8c3RyaW5nPjtcblxuICBASW5wdXQoJ3Byb2plY3QtbG9va3VwJylcbiAgcHVibGljIFByb2plY3RMb29rdXA6IHN0cmluZztcblxuICBAT3V0cHV0KCdzYXZlLWZvcm0tZXZlbnQnKVxuICBwdWJsaWMgU2F2ZUZvcm1FdmVudDogRXZlbnRFbWl0dGVyPHt9PjtcbiAgXG5cbiAgcHVibGljIGdldCBBUElSb290Rm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy5hcGlSb290O1xuICB9XG5cbiAgcHVibGljIGdldCBFbnZpcm9ubWVudCgpOiBFYUNFbnZpcm9ubWVudEFzQ29kZSB7XG4gICAgcmV0dXJuIHRoaXMuU3RhdGU/LkVhQz8uRW52aXJvbm1lbnRzW1xuICAgICAgdGhpcy5TdGF0ZT8uRWFDPy5FbnRlcnByaXNlPy5QcmltYXJ5RW52aXJvbm1lbnRcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIGdldCBCdWlsZEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuYnVpbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEJ1aWxkUGF0aEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuYnVpbGRQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBDbGllbnRJREZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuY2xpZW50SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IENsaWVudFNlY3JldEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuY2xpZW50U2VjcmV0O1xuICB9XG5cbiAgcHVibGljIGdldCBEZWZhdWx0RmlsZUZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuZGVmYXVsdEZpbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IERlZmF1bHRTb3VyY2VDb250cm9sKCk6IEVhQ1NvdXJjZUNvbnRyb2wge1xuICAgIHJldHVybiB7XG4gICAgICBPcmdhbml6YXRpb246IHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uPy5Mb3dDb2RlVW5pdD8uT3JnYW5pemF0aW9uLFxuICAgICAgUmVwb3NpdG9yeTogdGhpcy5FZGl0aW5nQXBwbGljYXRpb24/Lkxvd0NvZGVVbml0Py5SZXBvc2l0b3J5LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0IEluYm91bmRQYXRoRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy5pbmJvdW5kUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgSW5jbHVkZVJlcXVlc3RGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXA/LmNvbnRyb2xzLmluY2x1ZGVSZXF1ZXN0O1xuICB9XG5cbiAgcHVibGljIGdldCBNZXRob2RzRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy5tZXRob2RzO1xuICB9XG5cbiAgcHVibGljIGdldCBQYWNrYWdlRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy5wYWNrYWdlO1xuICB9XG5cbiAgcHVibGljIGdldCBQZXJtYW5lbnRGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXA/LmNvbnRyb2xzLnBlcm1hbmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgUHJlc2VydmVNZXRob2RGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXA/LmNvbnRyb2xzLnByZXNlcnZlTWV0aG9kO1xuICB9XG5cbiAgcHVibGljIGdldCBSZWRpcmVjdEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMucmVkaXJlY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IFNjb3Blc0Zvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuc2NvcGVzO1xuICB9XG5cbiAgcHVibGljIGdldCBTZWN1cml0eUZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuc2VjdXJpdHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IFN0YXRlKCk6IEFwcGxpY2F0aW9uc0Zsb3dTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjU3ZjLlN0YXRlXG4gIH1cblxuICBwdWJsaWMgZ2V0IFNvdXJjZUNvbnRyb2xzKCk6IHsgW2xvb2t1cDogc3RyaW5nXTogRWFDU291cmNlQ29udHJvbCB9IHtcbiAgICByZXR1cm4gdGhpcy5FbnZpcm9ubWVudD8uU291cmNlcyB8fCB7fTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgU291cmNlQ29udHJvbEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuc291cmNlQ29udHJvbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgU1BBUm9vdEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuc3BhUm9vdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgVG9rZW5Mb29rdXBGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXA/LmNvbnRyb2xzLnRva2VuTG9va3VwO1xuICB9XG5cbiAgcHVibGljIGdldCBWZXJzaW9uRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy52ZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBaaXBGaWxlRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy56aXBGaWxlO1xuICB9XG5cbiAgcHVibGljIEJ1aWxkUGF0aE9wdGlvbnM6IHN0cmluZ1tdO1xuXG4gIHB1YmxpYyBJc1Blcm1hbmVudDogYm9vbGVhbjtcblxuICBwdWJsaWMgSXNQcmVzZXJ2ZTogYm9vbGVhbjtcblxuICBwdWJsaWMgTENVVHlwZTogc3RyaW5nO1xuXG4gIHB1YmxpYyByZWRpcmVjdFRvb2x0aXA6IHN0cmluZztcblxuICBwdWJsaWMgUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cDogRm9ybUdyb3VwO1xuXG4gIHB1YmxpYyBQcm9jZXNzb3JUeXBlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGFwcHNGbG93U3ZjOiBBcHBsaWNhdGlvbnNGbG93U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZm9ybUJsZHI6IEZvcm1CdWlsZGVyLCBcbiAgICBwcm90ZWN0ZWQgZWFjU3ZjOiBFYUNTZXJ2aWNlLCkge1xuICAgIHRoaXMucmVkaXJlY3RUb29sdGlwID0gJyc7XG5cbiAgICB0aGlzLkhhc1NhdmVCdXR0b24gPSB0cnVlO1xuXG4gICAgdGhpcy5TYXZlRm9ybUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5FZGl0aW5nQXBwbGljYXRpb24pIHtcbiAgICAgIHRoaXMuQ3JlYXRlTmV3QXBwbGljYXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXR1cFByb2Nlc3NvckRldGFpbHNGb3JtKCk7XG4gICAgfVxuICAgIFxuICB9XG5cbiAgcHVibGljIENyZWF0ZU5ld0FwcGxpY2F0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuU2V0RWRpdGluZ0FwcGxpY2F0aW9uKEd1aWQuQ3JlYXRlUmF3KCkpO1xuICB9XG5cbiAgcHVibGljIERldGVybWluZVRvb2x0aXBUZXh0KCkge1xuICAgIGxldCBwZXJtYW5lbnRWYWx1ZSA9IHRoaXMuUGVybWFuZW50Rm9ybUNvbnRyb2wudmFsdWU7XG4gICAgbGV0IHByZXNlcnZlVmFsdWUgPSB0aGlzLlByZXNlcnZlTWV0aG9kRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAocGVybWFuZW50VmFsdWUgPT09IHRydWUgJiYgcHJlc2VydmVWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMucmVkaXJlY3RUb29sdGlwID0gJzMwMSDigJMgUGVybWFuZW50IGFuZCBOb3QgUHJlc2VydmUnO1xuICAgIH0gZWxzZSBpZiAocGVybWFuZW50VmFsdWUgPT09IGZhbHNlICYmIHByZXNlcnZlVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnJlZGlyZWN0VG9vbHRpcCA9ICczMDIg4oCTIE5vdCBQZXJtYW5lbnQgYW5kIE5vdCBQcmVzZXJ2ZSc7XG4gICAgfSBlbHNlIGlmIChwZXJtYW5lbnRWYWx1ZSA9PT0gZmFsc2UgJiYgcHJlc2VydmVWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5yZWRpcmVjdFRvb2x0aXAgPSAnMzA3IOKAkyBOb3QgUGVybWFuZW50IGFuZCBQcmVzZXJ2ZSc7XG4gICAgfSBlbHNlIGlmIChwZXJtYW5lbnRWYWx1ZSA9PT0gdHJ1ZSAmJiBwcmVzZXJ2ZVZhbHVlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnJlZGlyZWN0VG9vbHRpcCA9ICczMDgg4oCTIFBlcm1hbmVudCBhbmQgUHJlc2VydmUnO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBTYXZlUHJvY2Vzc29yRGV0YWlscygpOiB2b2lkIHtcblxuICAgIGNvbnN0IGFwcDogRWFDQXBwbGljYXRpb25Bc0NvZGUgPSB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbjtcbiAgICBhcHAuTG9va3VwQ29uZmlnLkFsbG93ZWRNZXRob2RzID1cbiAgICAgIHRoaXMuTWV0aG9kc0Zvcm1Db250cm9sPy52YWx1ZVxuICAgICAgICA/LnNwbGl0KCcgJylcbiAgICAgICAgLmZpbHRlcigodjogc3RyaW5nKSA9PiAhIXYpO1xuICAgIGFwcC5Qcm9jZXNzb3IuVHlwZSA9IHRoaXMuUHJvY2Vzc29yVHlwZTtcblxuICAgIHN3aXRjaCAoYXBwLlByb2Nlc3Nvci5UeXBlKSB7XG4gICAgICBjYXNlICdERlMnOlxuICAgICAgICBhcHAuUHJvY2Vzc29yLkRlZmF1bHRGaWxlID1cbiAgICAgICAgICB0aGlzLkRlZmF1bHRGaWxlRm9ybUNvbnRyb2wudmFsdWUgfHxcbiAgICAgICAgICAnaW5kZXguaHRtbCc7XG5cbiAgICAgICAgYXBwLkxvd0NvZGVVbml0ID0ge1xuICAgICAgICAgIFR5cGU6IHRoaXMuTENVVHlwZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGFwcC5Mb3dDb2RlVW5pdC5UeXBlKSB7XG4gICAgICAgICAgY2FzZSAnR2l0SHViJzpcbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5Pcmdhbml6YXRpb24gPVxuICAgICAgICAgICAgICB0aGlzLlNvdXJjZUNvbnRyb2xzW1xuICAgICAgICAgICAgICAgIHRoaXMuU291cmNlQ29udHJvbEZvcm1Db250cm9sLnZhbHVlXG4gICAgICAgICAgICAgIF0uT3JnYW5pemF0aW9uO1xuXG4gICAgICAgICAgICBhcHAuTG93Q29kZVVuaXQuUmVwb3NpdG9yeSA9XG4gICAgICAgICAgICAgIHRoaXMuU291cmNlQ29udHJvbHNbXG4gICAgICAgICAgICAgICAgdGhpcy5Tb3VyY2VDb250cm9sRm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgICAgICAgXS5SZXBvc2l0b3J5O1xuXG4gICAgICAgICAgICBhcHAuTG93Q29kZVVuaXQuQnVpbGQgPVxuICAgICAgICAgICAgICB0aGlzLkJ1aWxkRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5QYXRoID1cbiAgICAgICAgICAgICAgdGhpcy5CdWlsZFBhdGhGb3JtQ29udHJvbC52YWx1ZTtcblxuICAgICAgICAgICAgYXBwLkxvd0NvZGVVbml0LlNvdXJjZUNvbnRyb2xMb29rdXAgPVxuICAgICAgICAgICAgICB0aGlzLlNvdXJjZUNvbnRyb2xGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnTlBNJzpcbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5QYWNrYWdlID1cbiAgICAgICAgICAgICAgdGhpcy5QYWNrYWdlRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5WZXJzaW9uID1cbiAgICAgICAgICAgICAgdGhpcy5WZXJzaW9uRm9ybUNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ1dvcmRQcmVzcyc6XG4gICAgICAgICAgICBhcHAuTG93Q29kZVVuaXQuQVBJUm9vdCA9XG4gICAgICAgICAgICAgIHRoaXMuQVBJUm9vdEZvcm1Db250cm9sLnZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdaaXAnOlxuICAgICAgICAgICAgYXBwLkxvd0NvZGVVbml0LlppcEZpbGUgPVxuICAgICAgICAgICAgICB0aGlzLlppcEZpbGVGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdPQXV0aCc6XG4gICAgICAgIGFwcC5Qcm9jZXNzb3IuU2NvcGVzID1cbiAgICAgICAgICB0aGlzLlNjb3Blc0Zvcm1Db250cm9sLnZhbHVlLnNwbGl0KCcgJyk7XG5cbiAgICAgICAgYXBwLlByb2Nlc3Nvci5Ub2tlbkxvb2t1cCA9XG4gICAgICAgICAgdGhpcy5Ub2tlbkxvb2t1cEZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgICAgIGFwcC5Mb3dDb2RlVW5pdCA9IHtcbiAgICAgICAgICBUeXBlOiB0aGlzLkxDVVR5cGUsXG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChhcHAuTG93Q29kZVVuaXQuVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0dpdEh1Yk9BdXRoJzpcbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5DbGllbnRJRCA9XG4gICAgICAgICAgICAgIHRoaXMuQ2xpZW50SURGb3JtQ29udHJvbC52YWx1ZTtcblxuICAgICAgICAgICAgYXBwLkxvd0NvZGVVbml0LkNsaWVudFNlY3JldCA9XG4gICAgICAgICAgICAgIHRoaXMuQ2xpZW50U2VjcmV0Rm9ybUNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnUHJveHknOlxuICAgICAgICBhcHAuUHJvY2Vzc29yLkluYm91bmRQYXRoID1cbiAgICAgICAgICB0aGlzLkluYm91bmRQYXRoRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgYXBwLkxvd0NvZGVVbml0ID0ge1xuICAgICAgICAgIFR5cGU6IHRoaXMuTENVVHlwZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGFwcC5Mb3dDb2RlVW5pdC5UeXBlKSB7XG4gICAgICAgICAgY2FzZSAnQVBJJzpcbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5BUElSb290ID1cbiAgICAgICAgICAgICAgdGhpcy5BUElSb290Rm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5TZWN1cml0eSA9XG4gICAgICAgICAgICAgIHRoaXMuU2VjdXJpdHlGb3JtQ29udHJvbC52YWx1ZTtcblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdTUEEnOlxuICAgICAgICAgICAgYXBwLkxvd0NvZGVVbml0LlNQQVJvb3QgPVxuICAgICAgICAgICAgICB0aGlzLlNQQVJvb3RGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdSZWRpcmVjdCc6XG4gICAgICAgIGFwcC5Qcm9jZXNzb3IuSW5jbHVkZVJlcXVlc3QgPVxuICAgICAgICAgICEhdGhpcy5JbmNsdWRlUmVxdWVzdEZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgICAgIGFwcC5Qcm9jZXNzb3IuUGVybWFuZW50ID1cbiAgICAgICAgICAhIXRoaXMuUGVybWFuZW50Rm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgYXBwLlByb2Nlc3Nvci5QcmVzZXJ2ZU1ldGhvZCA9XG4gICAgICAgICAgISF0aGlzLlByZXNlcnZlTWV0aG9kRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgYXBwLlByb2Nlc3Nvci5SZWRpcmVjdCA9XG4gICAgICAgICAgdGhpcy5SZWRpcmVjdEZvcm1Db250cm9sLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoIWFwcC5Mb29rdXBDb25maWcuUGF0aFJlZ2V4LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgYXBwLkxvb2t1cENvbmZpZy5QYXRoUmVnZXggPSBgLyR7YXBwLkxvb2t1cENvbmZpZy5QYXRoUmVnZXh9YDtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlQXBwUmVxOiBTYXZlQXBwbGljYXRpb25Bc0NvZGVFdmVudFJlcXVlc3QgPSB7XG4gICAgICBQcm9qZWN0TG9va3VwOiB0aGlzLlByb2plY3RMb29rdXAsXG4gICAgICBBcHBsaWNhdGlvbjogYXBwLFxuICAgICAgQXBwbGljYXRpb25Mb29rdXA6IHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uTG9va3VwIHx8IEd1aWQuQ3JlYXRlUmF3KCksXG4gICAgfTtcblxuICAgIHRoaXMuZWFjU3ZjLlNhdmVBcHBsaWNhdGlvbkFzQ29kZShzYXZlQXBwUmVxKS50aGVuKHJlcyA9PntcbiAgICAgIHRoaXMuU2F2ZUZvcm1FdmVudC5lbWl0KHJlcyk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgU2V0RWRpdGluZ0FwcGxpY2F0aW9uKGFwcExvb2t1cDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24gPSBuZXcgRWFDQXBwbGljYXRpb25Bc0NvZGU7XG4gICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb25Mb29rdXAgPSBhcHBMb29rdXA7XG5cbiAgICB0aGlzLnNldHVwUHJvY2Vzc29yRGV0YWlsc0Zvcm0oKTtcbiAgfVxuXG4gIHB1YmxpYyBTb3VyY2VDb250cm9sQ2hhbmdlZChldmVudDogYW55KXtcbiAgICB0aGlzLmxpc3RCdWlsZFBhdGhzKCk7XG4gIH1cblxuICBwdWJsaWMgUHJvY2Vzc29yVHlwZUNoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yVHlwZSA9IGV2ZW50LnZhbHVlO1xuXG4gICAgdGhpcy5zZXR1cFByb2Nlc3NvclR5cGVTdWJGb3JtKCk7XG4gIH1cblxuICBwdWJsaWMgTENVVHlwZUNoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIHRoaXMuTENVVHlwZSA9IGV2ZW50LnZhbHVlO1xuXG4gICAgdGhpcy5zZXR1cExjdVR5cGVTdWJGb3JtKCk7XG4gIH1cblxuICAvL0hFTFBFUlNcblxuICBwcm90ZWN0ZWQgY2xlYW51cExjdVR5cGVTdWJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdtZXRob2RzJyk7XG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ2FwaVJvb3QnKTtcbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnc2VjdXJpdHknKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdzcGFSb290Jyk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnYXBwbGljYXRpb25JZCcpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdzb3VyY2VDb250cm9sJyk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnYnVpbGQnKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdjbGllbnRJZCcpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdjbGllbnRTZWNyZXQnKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCd6aXBGaWxlJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYW51cFByb2Nlc3NvclR5cGVTdWJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdkZWZhdWx0RmlsZScpO1xuXG4gICAgLy8gdGhpcy5BcHBsaWNhdGlvbkZvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdkZnNMY3VUeXBlJyk7XG5cbiAgICAvLyB0aGlzLkFwcGxpY2F0aW9uRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ29hdXRoTGN1VHlwZScpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdzY29wZXMnKTtcbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgndG9rZW5Mb29rdXAnKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdpbmJvdW5kUGF0aCcpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdwcm94eUxjdVR5cGUnKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdpbmNsdWRlUmVxdWVzdCcpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdyZWRpcmVjdCcpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdwZXJtYW5lbnQnKTtcbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgncHJlc2VydmVNZXRob2QnKTtcblxuICAgIHRoaXMuY2xlYW51cExjdVR5cGVTdWJGb3JtKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbGlzdEJ1aWxkUGF0aHMoKTogdm9pZCB7XG4gICAgICB0aGlzLlN0YXRlLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICB0aGlzLmFwcHNGbG93U3ZjXG4gICAgICAgIC5MaXN0QnVpbGRQYXRocyhcbiAgICAgICAgICB0aGlzLlNvdXJjZUNvbnRyb2xzW1xuICAgICAgICAgICAgdGhpcy5Tb3VyY2VDb250cm9sRm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgICBdLk9yZ2FuaXphdGlvbixcbiAgICAgICAgICB0aGlzLlNvdXJjZUNvbnRyb2xzW1xuICAgICAgICAgICAgdGhpcy5Tb3VyY2VDb250cm9sRm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgICBdLlJlcG9zaXRvcnlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxzdHJpbmdbXT4pID0+IHtcbiAgICAgICAgICB0aGlzLkJ1aWxkUGF0aE9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICAgIHRoaXMuU3RhdGUuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuQnVpbGRQYXRoT3B0aW9ucz8ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLkJ1aWxkUGF0aEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuQnVpbGRQYXRoT3B0aW9uc1swXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICBcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cExjdVR5cGVTdWJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cExjdVR5cGVTdWJGb3JtKCk7XG5cbiAgICAvLyB0aGlzLkFwcGxpY2F0aW9uRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ3BhY2thZ2UnKTtcbiAgICAvLyB0aGlzLkFwcGxpY2F0aW9uRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ3ZlcnNpb24nKTtcblxuICAgIGlmICh0aGlzLkxDVVR5cGUpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5MQ1VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ0FQSSc6XG4gICAgICAgICAgdGhpcy5zZXR1cExDVUFQSUZvcm0oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdBcHBsaWNhdGlvblBvaW50ZXInOlxuICAgICAgICAgIHRoaXMuc2V0dXBMQ1VBcHBsaWNhdGlvblBvaW50ZXJGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnR2l0SHViJzpcbiAgICAgICAgICB0aGlzLnNldHVwTENVR2l0SHViRm9ybSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0dpdEh1Yk9BdXRoJzpcbiAgICAgICAgICB0aGlzLnNldHVwTENVR2l0SHViT0F1dGhGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnV29yZFByZXNzJzpcbiAgICAgICAgICB0aGlzLnNldHVwTENVV29yZFByZXNzRm9ybSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIGNhc2UgJ05QTSc6XG4gICAgICAgIC8vICAgdGhpcy5zZXR1cExDVU5QTUZvcm0oKTtcbiAgICAgICAgLy8gICBicmVhaztcblxuICAgICAgICBjYXNlICdTUEEnOlxuICAgICAgICAgIHRoaXMuc2V0dXBMQ1VTUEFGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnWmlwJzpcbiAgICAgICAgICB0aGlzLnNldHVwTENVWmlwRm9ybSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cFByb2Nlc3NvckRldGFpbHNGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yVHlwZSA9IHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uPy5Qcm9jZXNzb3I/LlR5cGUgfHwgJyc7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnRURJVElORyBBUFAgPSAnLCB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbik7XG5cbiAgICBpZiAodGhpcy5FZGl0aW5nQXBwbGljYXRpb24gIT0gbnVsbCkge1xuICAgICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwID0gdGhpcy5mb3JtQmxkci5ncm91cCh7XG4gICAgICAgIHByb2NUeXBlOiBbdGhpcy5Qcm9jZXNzb3JUeXBlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldHVwRGZzRm9ybSgpO1xuXG4gICAgICB0aGlzLnNldHVwTGN1VHlwZVN1YkZvcm0oKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBMQ1VHaXRIdWJGb3JtKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwiRWRpdGluZ0FwcGxpY2F0aW9uOiBcIix0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbiApXG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdzb3VyY2VDb250cm9sJyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uTG93Q29kZVVuaXQ/LlNvdXJjZUNvbnRyb2xMb29rdXAgfHwgJycsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdidWlsZFBhdGgnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uUGF0aCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuXG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAnYnVpbGQnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uQnVpbGQgfHwgJ2xhdGVzdCcsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBMQ1VBcHBsaWNhdGlvblBvaW50ZXJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2FwcGxpY2F0aW9uSWQnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uQXBwbGljYXRpb25JRCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIFxuXG4gIHByb3RlY3RlZCBzZXR1cExDVVNQQUZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAnc3BhUm9vdCcsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLkxvd0NvZGVVbml0Py5TUEFSb290IHx8ICcnLFxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldHVwTENVQVBJRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdtZXRob2RzJyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uTG9va3VwQ29uZmlnPy5BbGxvd2VkTWV0aG9kcz8uam9pbignICcpIHx8ICcnLFxuICAgICAgICBbXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdhcGlSb290JyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uTG93Q29kZVVuaXQ/LkFQSVJvb3QgfHwgJycsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdzZWN1cml0eScsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLkxvd0NvZGVVbml0Py5TZWN1cml0eSB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cExDVUdpdEh1Yk9BdXRoRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdjbGllbnRJZCcsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLkxvd0NvZGVVbml0Py5DbGllbnRJRCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2NsaWVudFNlY3JldCcsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLkxvd0NvZGVVbml0Py5DbGllbnRTZWNyZXQgfHwgJycsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBMQ1VXb3JkUHJlc3NGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2FwaVJvb3QnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uQVBJUm9vdCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cFByb3h5Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLkxDVVR5cGUgPSB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uVHlwZSB8fCAnJztcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2luYm91bmRQYXRoJyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uUHJvY2Vzc29yPy5JbmJvdW5kUGF0aCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2xjdVR5cGUnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKHRoaXMuTENVVHlwZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBSZWRpcmVjdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAncmVkaXJlY3QnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLlByb2Nlc3Nvcj8uUmVkaXJlY3QgfHwgJycsIFtcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgIF0pXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ3Blcm1hbmVudCcsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLlByb2Nlc3Nvcj8uUGVybWFuZW50IHx8IGZhbHNlLFxuICAgICAgICBbXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdwcmVzZXJ2ZU1ldGhvZCcsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLlByb2Nlc3Nvcj8uUHJlc2VydmVNZXRob2QgfHwgZmFsc2UsXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2luY2x1ZGVSZXF1ZXN0JyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uUHJvY2Vzc29yPy5JbmNsdWRlUmVxdWVzdCB8fCBmYWxzZSxcbiAgICAgICAgW11cbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5EZXRlcm1pbmVUb29sdGlwVGV4dCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldHVwT0F1dGhGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuTENVVHlwZSA9IHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLkxvd0NvZGVVbml0Py5UeXBlIHx8ICcnO1xuXG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAnc2NvcGVzJyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uUHJvY2Vzc29yPy5TY29wZXM/LkpvaW4oJyAnKSB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ3Rva2VuTG9va3VwJyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uUHJvY2Vzc29yPy5Ub2tlbkxvb2t1cCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2xjdVR5cGUnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKHRoaXMuTENVVHlwZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBMQ1VaaXBGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ3ppcEZpbGUnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uWmlwRmlsZSB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cERmc0Zvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5MQ1VUeXBlID0gdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uTG93Q29kZVVuaXQ/LlR5cGUgfHwgJyc7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdkZWZhdWx0RmlsZScsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLlByb2Nlc3Nvcj8uRGVmYXVsdEZpbGUgfHwgJ2luZGV4Lmh0bWwnLFxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAnbGN1VHlwZScsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2wodGhpcy5MQ1VUeXBlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cFByb2Nlc3NvclR5cGVTdWJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cFByb2Nlc3NvclR5cGVTdWJGb3JtKCk7XG5cbiAgICBpZiAodGhpcy5Qcm9jZXNzb3JUeXBlKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuUHJvY2Vzc29yVHlwZSkge1xuICAgICAgICBjYXNlICdERlMnOlxuICAgICAgICAgIHRoaXMuc2V0dXBEZnNGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnT0F1dGgnOlxuICAgICAgICAgIHRoaXMuc2V0dXBPQXV0aEZvcm0oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdQcm94eSc6XG4gICAgICAgICAgdGhpcy5zZXR1cFByb3h5Rm9ybSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ1JlZGlyZWN0JzpcbiAgICAgICAgICB0aGlzLnNldHVwUmVkaXJlY3RGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXR1cExjdVR5cGVTdWJGb3JtKCk7XG4gIH1cbn1cbiIsIjxmb3JtIGNsYXNzPVwicHJvY2Vzc29yLWRldGFpbHMtZm9ybVwiIFtmb3JtR3JvdXBdPVwiUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJTYXZlUHJvY2Vzc29yRGV0YWlscygpXCI+XG48bWF0LWNhcmQgY2xhc3M9XCJzcHJlYWQgZmxvdy1jYXJkXCI+XG4gICAgPG1hdC1jYXJkLWhlYWRlcj5cbiAgICAgIDxtYXQtY2FyZC10aXRsZT4gUHJvY2Vzc29yIERldGFpbHMgPC9tYXQtY2FyZC10aXRsZT5cbiAgICA8L21hdC1jYXJkLWhlYWRlcj5cblxuICAgIDxsY3UtbG9hZGVyIFtsb2FkaW5nXT1cIlN0YXRlPy5Mb2FkaW5nXCI+PC9sY3UtbG9hZGVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFTdGF0ZT8uTG9hZGluZ1wiPlxuXG4gICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZVwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvY1R5cGVcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiUHJvY2Vzc29yVHlwZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiREZTXCI+VmlldyBQYWNrYWdlPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJSZWRpcmVjdFwiPlJlZGlyZWN0PC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJQcm94eVwiPlByb3h5PC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJPQXV0aFwiPk9BdXRoPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJQcm9jZXNzb3JUeXBlXCI+XG4gICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidERlMnXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkRlZmF1bHQgRmlsZVwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlZmF1bHRGaWxlXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGVcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsY3VUeXBlXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJMQ1VUeXBlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJOUE1cIj5OUE08L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJHaXRIdWJcIj5HaXRIdWI8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJXb3JkUHJlc3NcIj5Xb3JkUHJlc3M8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgPCEtLSA8bWF0LW9wdGlvbiB2YWx1ZT1cIlppcFwiPlppcDwvbWF0LW9wdGlvbj4gLS0+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDxkaXYgW25nU3dpdGNoXT1cIkxDVVR5cGVcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidHaXRIdWInXCI+XG4gICAgICAgICAgICAgIDwhLS0gPGxjdS1zb3VyY2UtY29udHJvbC1mb3JtLWNvbnRyb2xzXG4gICAgICAgICAgICAgICAgW2J1aWxkLXBhdGhdPVwiRWRpdGluZ0FwcGxpY2F0aW9uPy5Mb3dDb2RlVW5pdD8uUGF0aFwiXG4gICAgICAgICAgICAgICAgW2Zvcm0tZ3JvdXBdPVwiUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cFwiXG4gICAgICAgICAgICAgICAgW3NvdXJjZS1jb250cm9sXT1cIkRlZmF1bHRTb3VyY2VDb250cm9sXCJcbiAgICAgICAgICAgICAgICBbdXNlLWJyYW5jaGVzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbdXNlLWJ1aWxkLXBhdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID48L2xjdS1zb3VyY2UtY29udHJvbC1mb3JtLWNvbnRyb2xzPiAtLT5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNvdXJjZSBDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNvdXJjZUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJTb3VyY2VDb250cm9sQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzY0xvb2t1cCBvZiBTb3VyY2VDb250cm9sTG9va3Vwc1wiIFxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2NMb29rdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgIHt7c2NMb29rdXB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgXG4gICAgXG4gICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtb3B0aW9uIHZhbHVlPVwiWmlwXCI+WmlwPC9tYXQtb3B0aW9uPiAtLT5cbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGggd2l0aC1oaW50XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRyb2xGb3JtQ29udHJvbD8udmFsaWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+ICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJidWlsZFBhdGhcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCdWlsZCBQYXRoXCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnVpbGRQYXRoIG9mIEJ1aWxkUGF0aE9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImJ1aWxkUGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGJ1aWxkUGF0aCB9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgXG4gICAgICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgVGhlIGJ1aWxkIHBhdGggaWRlbnRpZmllcyB3aGljaCBidWlsZCBhY3Rpb24gdG8gdXNlIGZvciB5b3VyXG4gICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLlxuICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRyb2xGb3JtQ29udHJvbD8udmFsaWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCdWlsZFwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJidWlsZFwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICBDdXJyZW50IEJ1aWxkOlxuICAgICAgICAgICAgICAgICAge3sgRWRpdGluZ0FwcGxpY2F0aW9uPy5Mb3dDb2RlVW5pdD8uQ3VycmVudEJ1aWxkIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInTlBNJ1wiPlxuICAgICAgICAgICAgICA8bGN1LW5wbS1wYWNrYWdlLXNlbGVjdFxuICAgICAgICAgICAgICAgIFtucG0tcGFja2FnZV09XCJFZGl0aW5nQXBwbGljYXRpb24/Lkxvd0NvZGVVbml0Py5QYWNrYWdlXCJcbiAgICAgICAgICAgICAgICBbbnBtLXBhY2thZ2UtdmVyc2lvbl09XCJcbiAgICAgICAgICAgICAgICAgIEVkaXRpbmdBcHBsaWNhdGlvbj8uTG93Q29kZVVuaXQ/LlZlcnNpb25cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtmb3JtLWdyb3VwXT1cIlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXBcIlxuICAgICAgICAgICAgICA+PC9sY3UtbnBtLXBhY2thZ2Utc2VsZWN0PlxuXG4gICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICBDdXJyZW50IFZlcnNpb246XG4gICAgICAgICAgICAgICAge3sgRWRpdGluZ0FwcGxpY2F0aW9uPy5Mb3dDb2RlVW5pdD8uQ3VycmVudFZlcnNpb24gfX1cbiAgICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInV29yZFByZXNzJ1wiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQVBJIFJvb3RcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYXBpUm9vdFwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ09BdXRoJ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTY29wZXMgKHNwYWNlIHNlcGFyYXRlZClcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzY29wZXNcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRva2VuIExvb2t1cFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRva2VuTG9va3VwXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGVcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsY3VUeXBlXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJMQ1VUeXBlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJHaXRIdWJPQXV0aFwiPkdpdEh1YjwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiTENVVHlwZVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0dpdEh1Yk9BdXRoJ1wiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2xpZW50IElEXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNsaWVudElkXCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2xpZW50IFNlY3JldFwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjbGllbnRTZWNyZXRcIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidQcm94eSdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSW5ib3VuZCBQYXRoXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW5ib3VuZFBhdGhcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZVwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImxjdVR5cGVcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIkxDVVR5cGVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkFQSVwiPkFQSTwvbWF0LW9wdGlvbj5cblxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNQQVwiPlNpbmdsZSBQYWdlIEFwcGxpY2F0aW9uPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJMQ1VUeXBlXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInQVBJJ1wiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQVBJIFJvb3RcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYXBpUm9vdFwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFsbG93ZWQgTWV0aG9kcyAoc2VwYXJhdGUgd2l0aCBzcGFjZXMpXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1ldGhvZHNcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlY3VyaXR5ICh7aGVhZGVyfX57dmFsdWV9KVwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWN1cml0eVwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ1NQQSdcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNQQSBSb290XCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNwYVJvb3RcIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidSZWRpcmVjdCdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmVkaXJlY3QgVVJMXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVkaXJlY3RcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFxuICAgICAgICAgICAgICBjbGFzcz1cInNwcmVhZFwiIFxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwZXJtYW5lbnRcIj5cbiAgICAgICAgICAgICAgSXMgUGVybWFuZW50P1xuICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuXG4gICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICBjbGFzcz1cInNwcmVhZFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByZXNlcnZlTWV0aG9kXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUHJlc2VydmUgTWV0aG9kP1xuICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuXG4gICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgY2xhc3M9XCJzcHJlYWRcIlxuICAgICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiRGV0ZXJtaW5lVG9vbHRpcFRleHQoKVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9e3tyZWRpcmVjdFRvb2x0aXB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBpbmZvX291dGxpbmVcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgICAgICAgIFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBcbiAgICAgICAgICAgICAgY2xhc3M9XCJzcHJlYWRcIiBcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW5jbHVkZVJlcXVlc3RcIj5cbiAgICAgICAgICAgICAgSW5jbHVkZSBQYXRoIGFuZCBRdWVyeT9cbiAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cblxuICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgIGNsYXNzPVwic3ByZWFkXCJcbiAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTaG91bGQgdGhlIHJlZGlyZWN0IGluY2x1ZGUgdGhlIHBhdGggYW5kIHF1ZXJ5P1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIGluZm9fb3V0bGluZVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPG1hdC1jYXJkLWFjdGlvbnMgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIj5cblxuICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICpuZ0lmPVwiSGFzU2F2ZUJ1dHRvbiAmJiAhU3RhdGU/LkxvYWRpbmdcIlxuICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uIFxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIiBcbiAgICAgICAgICBmeEZsZXg9XCIxMDAlXCIgXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFQcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLnZhbGlkIHx8ICFQcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmRpcnR5XCI+XG4gICAgICAgICAgPG1hdC1pY29uPnNhdmU8L21hdC1pY29uPlxuICAgICAgICAgIFNhdmUgUHJvY2Vzc29yIERldGFpbHNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxsY3UtbG9hZGVyIFtsb2FkaW5nXT1cIlN0YXRlPy5Mb2FkaW5nXCI+PC9sY3UtbG9hZGVyPlxuXG4gICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxuXG4gIDwvbmctY29udGFpbmVyPlxuICBcbjwvbWF0LWNhcmQ+XG48L2Zvcm0+XG4gIFxuIl19
|