@openziti/ziti-console-lib 0.3.0 → 0.3.1

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/README.md CHANGED
@@ -1,23 +1,80 @@
1
- # Ziti Admin Console
1
+ ![Ziggy using the ziti-console](https://raw.githubusercontent.com/openziti/ziti-console/main/projects/ziti-console-lib/src/lib/assets/banners/ZAC.jpg)
2
2
 
3
- This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.0.0.
3
+ <p align="center" width="100%">
4
+ OpenZiti is a free and open source project focused on bringing zero trust to any application.
5
+ <br>
6
+ The project provides all the pieces required to implement or integrate zero trust into your solutions.
7
+ <br/>
8
+ <br/>
9
+ <br>
10
+ </p>
4
11
 
5
- ## Code scaffolding
12
+ <p align="center" width="100%">
13
+ <a href="https://openziti.io"><img src="https://github.com/openziti/ziti-console/blob/main/projects/ziti-console-lib/src/lib/assets/icons/android-icon-192x192.png?raw=true" width="100"></a>
14
+ </p>
6
15
 
7
- Run `ng generate component component-name --project ziti-console-lib` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ziti-console-lib`.
8
- > Note: Don't forget to add `--project ziti-console-lib` or else it will be added to the default project in your `angular.json` file.
16
+ <p align="center">
17
+ <b>
18
+ <a>@openziti/ziti-console</a>
19
+ <br>
20
+ <br>
21
+ </b>
22
+ This repo hosts the Ziti Admin Console, and is designed to provide a user interface to help you administrate an <a href="https://openziti.io">OpenZiti Network</a> via the <a href="https://openziti.io/docs/reference/developer/api/">Ziti Edge API</a>
23
+ <br>
24
+ <br>
25
+ <b>Part of the <a href="https://openziti.io/about">OpenZiti</a> ecosystem</b>
26
+ </p>
27
+
28
+ <p align="center">
29
+ <br>
30
+ <b>Interested in knowing how to easily embed programmable, high performance, zero trust networking into your application without VPNs?</b>
31
+ <br>
32
+ Learn more about <a href="https://openziti.io/about">OpenZiti</a> project.</b>
33
+ <br>
34
+ Also, checkout core project on <a href="https://github.com/openziti">github</a>
35
+ <br/>
36
+ <br/>
37
+ Please star us!
38
+ <br/>
39
+ <a href="https://github.com/openziti/ziti/stargazers"><img src="https://img.shields.io/github/stars/openziti/ziti?style=flat" ></a>
40
+ </p>
41
+
42
+ ---
43
+ [![Issues](https://img.shields.io/github/issues-raw/openziti/ziti-console)]()
44
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
45
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=rounded)](CONTRIBUTING.md)
46
+ [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg)](CODE_OF_CONDUCT.md)
47
+
48
+ ---
49
+
50
+
51
+ # ziti-console-lib
52
+
53
+ ziti-console-lib is a shared Angular library that exports components used to administrate an <a href="https://openziti.io">OpenZiti Network</a>
9
54
 
10
- ## Build
55
+ This library is imported and extended via the <a href="https://github.com/openziti/ziti-console">Ziti Admin Console</a>, but can also be used in other 3rd party Angular applications.
11
56
 
12
- Run `ng build ziti-console-lib` to build the project. The build artifacts will be stored in the `dist/` directory.
13
57
 
14
- ## Publishing
58
+ ## How to install
15
59
 
16
- After building your library with `ng build ziti-console-lib`, go to the dist folder `cd dist/ziti-console-lib` and run `npm publish`.
60
+ To install this library in an angular application, run the following command from your project root:
17
61
 
18
- ## Running unit tests
62
+ ```
63
+ npm install @openziti/ziti-console-lib
64
+ ```
19
65
 
20
- Run `ng test ziti-console-lib` to execute the unit tests via [Karma](https://karma-runner.github.io).
66
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.0.0.
67
+
68
+ ## Building From Source
69
+ After checking out the main <a href="https://github.com/openziti/ziti-console">ziti-console</a> github project,
70
+
71
+ Run `ng build ziti-console-lib` from the project root to build the shared library. The build artifact will be stored in the `dist/` directory.
72
+
73
+
74
+ ## Code scaffolding
75
+
76
+ Run `ng generate component component-name --project ziti-console-lib` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ziti-console-lib`.
77
+ > Note: Don't forget to add `--project ziti-console-lib` or else it will be added to the default project in your `angular.json` file.
21
78
 
22
79
  ## Further help
23
80
 
Binary file
@@ -0,0 +1,131 @@
1
+ /*
2
+ Copyright NetFoundry Inc.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+ import { Component, Inject } from '@angular/core';
17
+ import { ListPageComponent } from "../../shared/list-page-component.class";
18
+ import { ZAC_WRAPPER_SERVICE } from "../../features/wrappers/zac-wrapper-service.class";
19
+ import * as i0 from "@angular/core";
20
+ import * as i1 from "./edge-router-policies-page.service";
21
+ import * as i2 from "../../features/data-table/data-table-filter.service";
22
+ import * as i3 from "@angular/material/dialog";
23
+ import * as i4 from "../../services/tab-name.service";
24
+ import * as i5 from "../../services/console-events.service";
25
+ import * as i6 from "@angular/common";
26
+ import * as i7 from "../../features/list-page-features/list-page-header/list-page-header.component";
27
+ import * as i8 from "../../features/data-table/data-table.component";
28
+ import * as i9 from "../../features/side-modal/side-modal.component";
29
+ import * as i10 from "../../features/projectable-forms/service-policy/service-policy-form.component";
30
+ import * as i11 from "../../features/wrappers/zac-wrapper-service.class";
31
+ class EdgeRouterPoliciesPageComponent extends ListPageComponent {
32
+ constructor(svc, filterService, dialogForm, tabNames, consoleEvents, zacWrapperService) {
33
+ super(filterService, svc, consoleEvents, dialogForm);
34
+ this.svc = svc;
35
+ this.tabNames = tabNames;
36
+ this.zacWrapperService = zacWrapperService;
37
+ this.routerRoleAttributes = [];
38
+ this.identityRoleAttributes = [];
39
+ this.formDataChanged = false;
40
+ this.title = 'Manage Edge Router Policies';
41
+ let userLang = navigator.language || 'en-us';
42
+ userLang = userLang.toLowerCase();
43
+ }
44
+ ngOnInit() {
45
+ super.ngOnInit();
46
+ this.getRoleAttributes();
47
+ this.tabs = this.tabNames.getTabs('policies');
48
+ }
49
+ headerActionClicked(action) {
50
+ switch (action) {
51
+ case 'add':
52
+ this.svc.serviceType = '';
53
+ this.svc.openUpdate();
54
+ break;
55
+ case 'edit':
56
+ this.svc.openUpdate();
57
+ break;
58
+ case 'delete':
59
+ const selectedItems = this.rowData.filter((row) => {
60
+ return row.selected;
61
+ });
62
+ const label = selectedItems.length > 1 ? 'services' : 'edge router';
63
+ this.openBulkDelete(selectedItems, label);
64
+ break;
65
+ default:
66
+ }
67
+ }
68
+ tableAction(event) {
69
+ switch (event?.action) {
70
+ case 'toggleAll':
71
+ case 'toggleItem':
72
+ this.itemToggled(event.item);
73
+ break;
74
+ case 'update':
75
+ this.svc.serviceType = 'advanced';
76
+ this.svc.openUpdate(event.item);
77
+ break;
78
+ case 'create':
79
+ this.svc.openUpdate();
80
+ break;
81
+ case 'delete':
82
+ this.deleteItem(event.item);
83
+ break;
84
+ case 'download-all':
85
+ this.svc.downloadAllItems();
86
+ break;
87
+ case 'download-selected':
88
+ this.svc.downloadItems(this.selectedItems);
89
+ break;
90
+ default:
91
+ break;
92
+ }
93
+ }
94
+ getRoleAttributes() {
95
+ this.svc.getEdgeRouterRoleAttributes().then((result) => {
96
+ this.routerRoleAttributes = result.data;
97
+ });
98
+ this.svc.getIdentityRoleAttributes().then((result) => {
99
+ this.identityRoleAttributes = result.data;
100
+ });
101
+ this.svc.getServiceNamedAttributes();
102
+ this.svc.getIdentityNamedAttributes();
103
+ this.svc.getPostureNamedAttributes();
104
+ }
105
+ deleteItem(item) {
106
+ this.openBulkDelete([item], 'edge-router-policies');
107
+ }
108
+ closeModal(event) {
109
+ this.svc.sideModalOpen = false;
110
+ if (event?.refresh) {
111
+ this.refreshData();
112
+ }
113
+ }
114
+ dataChanged(event) {
115
+ this.formDataChanged = event;
116
+ }
117
+ serviceTypeSelected(event) {
118
+ this.svc.serviceType = event;
119
+ }
120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EdgeRouterPoliciesPageComponent, deps: [{ token: i1.EdgeRouterPoliciesPageService }, { token: i2.DataTableFilterService }, { token: i3.MatDialog }, { token: i4.TabNameService }, { token: i5.ConsoleEventsService }, { token: ZAC_WRAPPER_SERVICE }], target: i0.ɵɵFactoryTarget.Component }); }
121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EdgeRouterPoliciesPageComponent, selector: "lib-edge-router-policies-page", usesInheritance: true, ngImport: i0, template: "<div class=\"ziti-page-container edge-router-policies-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [showAdd]=\"!itemsSelected\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'edge-router-policies'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No Edge Router Policies defined, Click the plus to add a Edge Router Policy.'\"\n [filterApplied]=\"filterApplied\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n\n <lib-side-modal [(open)]=\"svc.sideModalOpen\" [showClose]=\"false\">\n <lib-service-policy-form\n *ngIf=\"svc.sideModalOpen\"\n [formData]=\"svc.selectedServicePolicy\"\n [serviceRoleAttributes]=\"svc.routerRoleAttributes\"\n [serviceNamedAttributes]=\"svc.routerNamedAttributes\"\n [serviceNamedAttributesMap]=\"svc.routerNamedAttributesMap\"\n [identityRoleAttributes]=\"svc.identityRoleAttributes\"\n [identityNamedAttributes]=\"svc.identityNamedAttributes\"\n [identityNamedAttributesMap]=\"svc.identityNamedAttributesMap\"\n [postureRoleAttributes]=\"svc.postureRoleAttributes\"\n [postureNamedAttributes]=\"svc.postureNamedAttributes\"\n [postureNamedAttributesMap]=\"svc.postureNamedAttributesMap\"\n (close)=\"closeModal($event)\"\n (dataChange)=\"dataChanged($event)\">\n </lib-service-policy-form>\n </lib-side-modal>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.ListPageHeaderComponent, selector: "lib-list-page-header", inputs: ["title", "tabs", "showAdd", "hideAction"], outputs: ["actionClicked"] }, { kind: "component", type: i8.DataTableComponent, selector: "lib-data-table", inputs: ["rowData", "expandRowData", "collapseRowData", "rowValidation", "isTimeSearchAvailable", "isLoading", "tableId", "options", "validateService", "rowsToggled", "tableRefreshCount", "view", "serverSideDataSource", "allowDownload", "startCount", "endCount", "totalCount", "emptyMsg", "filterApplied", "menuItems", "headerActions", "noItemsClass", "entityTypeName", "showNoItemsAdd", "currentPage", "noItemsImage", "columnDefinitions", "refreshCount"], outputs: ["actionRequested", "gridReady", "dragStart", "dragLeave", "pageChanged"] }, { kind: "component", type: i9.SideModalComponent, selector: "lib-side-modal", inputs: ["showClose", "open"], outputs: ["openChange"] }, { kind: "component", type: i10.ServicePolicyFormComponent, selector: "lib-service-policy-form", inputs: ["formData", "serviceRoleAttributes", "serviceNamedAttributes", "serviceNamedAttributesMap", "identityRoleAttributes", "identityNamedAttributes", "identityNamedAttributesMap", "postureRoleAttributes", "postureNamedAttributes", "postureNamedAttributesMap"], outputs: ["close"] }] }); }
122
+ }
123
+ export { EdgeRouterPoliciesPageComponent };
124
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EdgeRouterPoliciesPageComponent, decorators: [{
125
+ type: Component,
126
+ args: [{ selector: 'lib-edge-router-policies-page', template: "<div class=\"ziti-page-container edge-router-policies-container\">\n <lib-list-page-header [title]=\"title\"\n [tabs]=\"tabs\"\n [showAdd]=\"!itemsSelected\"\n (actionClicked)=\"headerActionClicked($event)\"></lib-list-page-header>\n\n <lib-data-table [tableId]=\"'edge-router-policies'\"\n [rowData]=\"rowData\"\n [columnDefinitions]=\"columnDefs\"\n (actionRequested)=\"tableAction($event)\"\n [startCount]=\"startCount\"\n [endCount]=\"endCount\"\n [totalCount]=\"totalCount\"\n [emptyMsg]=\"'No Edge Router Policies defined, Click the plus to add a Edge Router Policy.'\"\n [filterApplied]=\"filterApplied\"\n [menuItems]=\"svc.menuItems\"\n (gridReady)=\"gridReady($event)\"\n >\n </lib-data-table>\n\n <lib-side-modal [(open)]=\"svc.sideModalOpen\" [showClose]=\"false\">\n <lib-service-policy-form\n *ngIf=\"svc.sideModalOpen\"\n [formData]=\"svc.selectedServicePolicy\"\n [serviceRoleAttributes]=\"svc.routerRoleAttributes\"\n [serviceNamedAttributes]=\"svc.routerNamedAttributes\"\n [serviceNamedAttributesMap]=\"svc.routerNamedAttributesMap\"\n [identityRoleAttributes]=\"svc.identityRoleAttributes\"\n [identityNamedAttributes]=\"svc.identityNamedAttributes\"\n [identityNamedAttributesMap]=\"svc.identityNamedAttributesMap\"\n [postureRoleAttributes]=\"svc.postureRoleAttributes\"\n [postureNamedAttributes]=\"svc.postureNamedAttributes\"\n [postureNamedAttributesMap]=\"svc.postureNamedAttributesMap\"\n (close)=\"closeModal($event)\"\n (dataChange)=\"dataChanged($event)\">\n </lib-service-policy-form>\n </lib-side-modal>\n</div>\n" }]
127
+ }], ctorParameters: function () { return [{ type: i1.EdgeRouterPoliciesPageService }, { type: i2.DataTableFilterService }, { type: i3.MatDialog }, { type: i4.TabNameService }, { type: i5.ConsoleEventsService }, { type: i11.ZacWrapperServiceClass, decorators: [{
128
+ type: Inject,
129
+ args: [ZAC_WRAPPER_SERVICE]
130
+ }] }]; } });
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1yb3V0ZXItcG9saWNpZXMtcGFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvcGFnZXMvZWRnZS1yb3V0ZXItcG9saWNpZXMvZWRnZS1yb3V0ZXItcG9saWNpZXMtcGFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvcGFnZXMvZWRnZS1yb3V0ZXItcG9saWNpZXMvZWRnZS1yb3V0ZXItcG9saWNpZXMtcGFnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7RUFjRTtBQUVGLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUt6RSxPQUFPLEVBQUMsbUJBQW1CLEVBQXlCLE1BQU0sbURBQW1ELENBQUM7Ozs7Ozs7Ozs7Ozs7QUFHOUcsTUFLYSwrQkFBZ0MsU0FBUSxpQkFBaUI7SUFTcEUsWUFDb0IsR0FBa0MsRUFDbEQsYUFBcUMsRUFDckMsVUFBcUIsRUFDYixRQUF3QixFQUNoQyxhQUFtQyxFQUNDLGlCQUF5QztRQUUvRSxLQUFLLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFQbkMsUUFBRyxHQUFILEdBQUcsQ0FBK0I7UUFHMUMsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFFSSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXdCO1FBYmpGLHlCQUFvQixHQUFVLEVBQUUsQ0FBQztRQUNqQywyQkFBc0IsR0FBVSxFQUFFLENBQUM7UUFDbkMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsVUFBSyxHQUFHLDZCQUE2QixDQUFDO1FBV3BD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QUM7UUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBUztRQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRTtZQUNqQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQUs7UUFDZixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBSztRQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQzsrR0F4R1UsK0JBQStCLGdNQWU5QixtQkFBbUI7bUdBZnBCLCtCQUErQiw0RkM5QjVDLHcvREFzQ0E7O1NEUmEsK0JBQStCOzRGQUEvQiwrQkFBK0I7a0JBTDNDLFNBQVM7K0JBQ0UsK0JBQStCOzswQkFtQnBDLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgICBDb3B5cmlnaHQgTmV0Rm91bmRyeSBJbmMuXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMaXN0UGFnZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9saXN0LXBhZ2UtY29tcG9uZW50LmNsYXNzXCI7XG5pbXBvcnQge0RhdGFUYWJsZUZpbHRlclNlcnZpY2V9IGZyb20gXCIuLi8uLi9mZWF0dXJlcy9kYXRhLXRhYmxlL2RhdGEtdGFibGUtZmlsdGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XG5pbXBvcnQge1RhYk5hbWVTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvdGFiLW5hbWUuc2VydmljZVwiO1xuaW1wb3J0IHtDb25zb2xlRXZlbnRzU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2NvbnNvbGUtZXZlbnRzLnNlcnZpY2VcIjtcbmltcG9ydCB7WkFDX1dSQVBQRVJfU0VSVklDRSwgWmFjV3JhcHBlclNlcnZpY2VDbGFzc30gZnJvbSBcIi4uLy4uL2ZlYXR1cmVzL3dyYXBwZXJzL3phYy13cmFwcGVyLXNlcnZpY2UuY2xhc3NcIjtcbmltcG9ydCB7RWRnZVJvdXRlclBvbGljaWVzUGFnZVNlcnZpY2V9IGZyb20gXCIuL2VkZ2Utcm91dGVyLXBvbGljaWVzLXBhZ2Uuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZWRnZS1yb3V0ZXItcG9saWNpZXMtcGFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGdlLXJvdXRlci1wb2xpY2llcy1wYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZWRnZS1yb3V0ZXItcG9saWNpZXMtcGFnZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEVkZ2VSb3V0ZXJQb2xpY2llc1BhZ2VDb21wb25lbnQgZXh0ZW5kcyBMaXN0UGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95ICB7XG5cbiAgcm91dGVyUm9sZUF0dHJpYnV0ZXM6IGFueVtdID0gW107XG4gIGlkZW50aXR5Um9sZUF0dHJpYnV0ZXM6IGFueVtdID0gW107XG4gIGZvcm1EYXRhQ2hhbmdlZCA9IGZhbHNlO1xuICBpc0xvYWRpbmc6IGJvb2xlYW47XG4gIHRhYnM6IHsgdXJsOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdO1xuICB0aXRsZSA9ICdNYW5hZ2UgRWRnZSBSb3V0ZXIgUG9saWNpZXMnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHVibGljIG92ZXJyaWRlIHN2YzogRWRnZVJvdXRlclBvbGljaWVzUGFnZVNlcnZpY2UsXG4gICAgICBmaWx0ZXJTZXJ2aWNlOiBEYXRhVGFibGVGaWx0ZXJTZXJ2aWNlLFxuICAgICAgZGlhbG9nRm9ybTogTWF0RGlhbG9nLFxuICAgICAgcHJpdmF0ZSB0YWJOYW1lczogVGFiTmFtZVNlcnZpY2UsXG4gICAgICBjb25zb2xlRXZlbnRzOiBDb25zb2xlRXZlbnRzU2VydmljZSxcbiAgICAgIEBJbmplY3QoWkFDX1dSQVBQRVJfU0VSVklDRSlwcml2YXRlIHphY1dyYXBwZXJTZXJ2aWNlOiBaYWNXcmFwcGVyU2VydmljZUNsYXNzLFxuICApIHtcbiAgICBzdXBlcihmaWx0ZXJTZXJ2aWNlLCBzdmMsIGNvbnNvbGVFdmVudHMsIGRpYWxvZ0Zvcm0pO1xuICAgIGxldCB1c2VyTGFuZyA9IG5hdmlnYXRvci5sYW5ndWFnZSB8fCAnZW4tdXMnO1xuICAgIHVzZXJMYW5nID0gdXNlckxhbmcudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5nZXRSb2xlQXR0cmlidXRlcygpO1xuICAgIHRoaXMudGFicyA9IHRoaXMudGFiTmFtZXMuZ2V0VGFicygncG9saWNpZXMnKTtcbiAgfVxuXG4gIGhlYWRlckFjdGlvbkNsaWNrZWQoYWN0aW9uOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2goYWN0aW9uKSB7XG4gICAgICBjYXNlICdhZGQnOlxuICAgICAgICB0aGlzLnN2Yy5zZXJ2aWNlVHlwZSA9ICcnO1xuICAgICAgICB0aGlzLnN2Yy5vcGVuVXBkYXRlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZWRpdCc6XG4gICAgICAgIHRoaXMuc3ZjLm9wZW5VcGRhdGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5yb3dEYXRhLmZpbHRlcigocm93KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJvdy5zZWxlY3RlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAxID8gJ3NlcnZpY2VzJyA6ICdlZGdlIHJvdXRlcic7XG4gICAgICAgIHRoaXMub3BlbkJ1bGtEZWxldGUoc2VsZWN0ZWRJdGVtcywgbGFiZWwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgdGFibGVBY3Rpb24oZXZlbnQ6IGFueSkge1xuICAgIHN3aXRjaChldmVudD8uYWN0aW9uKSB7XG4gICAgICBjYXNlICd0b2dnbGVBbGwnOlxuICAgICAgY2FzZSAndG9nZ2xlSXRlbSc6XG4gICAgICAgIHRoaXMuaXRlbVRvZ2dsZWQoZXZlbnQuaXRlbSlcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1cGRhdGUnOlxuICAgICAgICB0aGlzLnN2Yy5zZXJ2aWNlVHlwZSA9ICdhZHZhbmNlZCc7XG4gICAgICAgIHRoaXMuc3ZjLm9wZW5VcGRhdGUoZXZlbnQuaXRlbSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3JlYXRlJzpcbiAgICAgICAgdGhpcy5zdmMub3BlblVwZGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHRoaXMuZGVsZXRlSXRlbShldmVudC5pdGVtKVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rvd25sb2FkLWFsbCc6XG4gICAgICAgIHRoaXMuc3ZjLmRvd25sb2FkQWxsSXRlbXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkb3dubG9hZC1zZWxlY3RlZCc6XG4gICAgICAgIHRoaXMuc3ZjLmRvd25sb2FkSXRlbXModGhpcy5zZWxlY3RlZEl0ZW1zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBnZXRSb2xlQXR0cmlidXRlcygpIHtcbiAgICB0aGlzLnN2Yy5nZXRFZGdlUm91dGVyUm9sZUF0dHJpYnV0ZXMoKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yb3V0ZXJSb2xlQXR0cmlidXRlcyA9IHJlc3VsdC5kYXRhO1xuICAgIH0pO1xuICAgIHRoaXMuc3ZjLmdldElkZW50aXR5Um9sZUF0dHJpYnV0ZXMoKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5pZGVudGl0eVJvbGVBdHRyaWJ1dGVzID0gcmVzdWx0LmRhdGE7XG4gICAgfSk7XG4gICAgdGhpcy5zdmMuZ2V0U2VydmljZU5hbWVkQXR0cmlidXRlcygpO1xuICAgIHRoaXMuc3ZjLmdldElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzKCk7XG4gICAgdGhpcy5zdmMuZ2V0UG9zdHVyZU5hbWVkQXR0cmlidXRlcygpO1xuICB9XG5cbiAgZGVsZXRlSXRlbShpdGVtOiBhbnkpIHtcbiAgICB0aGlzLm9wZW5CdWxrRGVsZXRlKFtpdGVtXSwgJ2VkZ2Utcm91dGVyLXBvbGljaWVzJyk7XG4gIH1cblxuICBjbG9zZU1vZGFsKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnN2Yy5zaWRlTW9kYWxPcGVuID0gZmFsc2U7XG4gICAgaWYoZXZlbnQ/LnJlZnJlc2gpIHtcbiAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBkYXRhQ2hhbmdlZChldmVudCkge1xuICAgIHRoaXMuZm9ybURhdGFDaGFuZ2VkID0gZXZlbnQ7XG4gIH1cblxuICBzZXJ2aWNlVHlwZVNlbGVjdGVkKGV2ZW50KSB7XG4gICAgdGhpcy5zdmMuc2VydmljZVR5cGUgPSBldmVudDtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwieml0aS1wYWdlLWNvbnRhaW5lciBlZGdlLXJvdXRlci1wb2xpY2llcy1jb250YWluZXJcIj5cbiAgICA8bGliLWxpc3QtcGFnZS1oZWFkZXIgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RhYnNdPVwidGFic1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QWRkXT1cIiFpdGVtc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbkNsaWNrZWQpPVwiaGVhZGVyQWN0aW9uQ2xpY2tlZCgkZXZlbnQpXCI+PC9saWItbGlzdC1wYWdlLWhlYWRlcj5cblxuICAgIDxsaWItZGF0YS10YWJsZSBbdGFibGVJZF09XCInZWRnZS1yb3V0ZXItcG9saWNpZXMnXCJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd0RhdGFdPVwicm93RGF0YVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5EZWZpbml0aW9uc109XCJjb2x1bW5EZWZzXCJcbiAgICAgICAgICAgICAgICAgICAgKGFjdGlvblJlcXVlc3RlZCk9XCJ0YWJsZUFjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0YXJ0Q291bnRdPVwic3RhcnRDb3VudFwiXG4gICAgICAgICAgICAgICAgICAgIFtlbmRDb3VudF09XCJlbmRDb3VudFwiXG4gICAgICAgICAgICAgICAgICAgIFt0b3RhbENvdW50XT1cInRvdGFsQ291bnRcIlxuICAgICAgICAgICAgICAgICAgICBbZW1wdHlNc2ddPVwiJ05vIEVkZ2UgUm91dGVyIFBvbGljaWVzIGRlZmluZWQsIENsaWNrIHRoZSBwbHVzIHRvIGFkZCBhIEVkZ2UgUm91dGVyIFBvbGljeS4nXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZpbHRlckFwcGxpZWRdPVwiZmlsdGVyQXBwbGllZFwiXG4gICAgICAgICAgICAgICAgICAgIFttZW51SXRlbXNdPVwic3ZjLm1lbnVJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgIChncmlkUmVhZHkpPVwiZ3JpZFJlYWR5KCRldmVudClcIlxuICAgID5cbiAgICA8L2xpYi1kYXRhLXRhYmxlPlxuXG4gICAgPGxpYi1zaWRlLW1vZGFsIFsob3BlbildPVwic3ZjLnNpZGVNb2RhbE9wZW5cIiBbc2hvd0Nsb3NlXT1cImZhbHNlXCI+XG4gICAgICAgIDxsaWItc2VydmljZS1wb2xpY3ktZm9ybVxuICAgICAgICAgICAgICAgICpuZ0lmPVwic3ZjLnNpZGVNb2RhbE9wZW5cIlxuICAgICAgICAgICAgICAgIFtmb3JtRGF0YV09XCJzdmMuc2VsZWN0ZWRTZXJ2aWNlUG9saWN5XCJcbiAgICAgICAgICAgICAgICBbc2VydmljZVJvbGVBdHRyaWJ1dGVzXT1cInN2Yy5yb3V0ZXJSb2xlQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgW3NlcnZpY2VOYW1lZEF0dHJpYnV0ZXNdPVwic3ZjLnJvdXRlck5hbWVkQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgW3NlcnZpY2VOYW1lZEF0dHJpYnV0ZXNNYXBdPVwic3ZjLnJvdXRlck5hbWVkQXR0cmlidXRlc01hcFwiXG4gICAgICAgICAgICAgICAgW2lkZW50aXR5Um9sZUF0dHJpYnV0ZXNdPVwic3ZjLmlkZW50aXR5Um9sZUF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgIFtpZGVudGl0eU5hbWVkQXR0cmlidXRlc109XCJzdmMuaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgIFtpZGVudGl0eU5hbWVkQXR0cmlidXRlc01hcF09XCJzdmMuaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXNNYXBcIlxuICAgICAgICAgICAgICAgIFtwb3N0dXJlUm9sZUF0dHJpYnV0ZXNdPVwic3ZjLnBvc3R1cmVSb2xlQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgW3Bvc3R1cmVOYW1lZEF0dHJpYnV0ZXNdPVwic3ZjLnBvc3R1cmVOYW1lZEF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgIFtwb3N0dXJlTmFtZWRBdHRyaWJ1dGVzTWFwXT1cInN2Yy5wb3N0dXJlTmFtZWRBdHRyaWJ1dGVzTWFwXCJcbiAgICAgICAgICAgICAgICAoY2xvc2UpPVwiY2xvc2VNb2RhbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZGF0YUNoYW5nZSk9XCJkYXRhQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgIDwvbGliLXNlcnZpY2UtcG9saWN5LWZvcm0+XG4gICAgPC9saWItc2lkZS1tb2RhbD5cbjwvZGl2PlxuIl19