@wertzui/ngx-restworld-client 2.0.0 → 3.1.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/{esm2015/lib/constants/link-names.js → esm2020/lib/constants/link-names.mjs} +0 -0
- package/{esm2015/lib/models/api-url.js → esm2020/lib/models/api-url.mjs} +0 -0
- package/{esm2015/lib/models/client-settings.js → esm2020/lib/models/client-settings.mjs} +1 -1
- package/{esm2015/lib/models/problem-details.js → esm2020/lib/models/problem-details.mjs} +0 -0
- package/{esm2015/lib/models/restworld-options.js → esm2020/lib/models/restworld-options.mjs} +0 -0
- package/{esm2015/lib/pipes/as.pipe.js → esm2020/lib/pipes/as.pipe.mjs} +4 -4
- package/{esm2015/lib/pipes/safe-url.pipe.js → esm2020/lib/pipes/safe-url.pipe.mjs} +4 -4
- package/esm2020/lib/restworld-client.module.mjs +200 -0
- package/{esm2015/lib/services/avatar-generator.js → esm2020/lib/services/avatar-generator.mjs} +4 -4
- package/{esm2015/lib/services/form.service.js → esm2020/lib/services/form.service.mjs} +4 -4
- package/esm2020/lib/services/restworld-client-collection.mjs +39 -0
- package/esm2020/lib/services/restworld-client.mjs +165 -0
- package/esm2020/lib/services/settings.service.mjs +39 -0
- package/esm2020/lib/views/restworld-edit-form/restworld-edit-form.component.mjs +230 -0
- package/esm2020/lib/views/restworld-edit-view/restworld-edit-view.component.mjs +313 -0
- package/esm2020/lib/views/restworld-file-view/restworld-file-view.component.mjs +57 -0
- package/esm2020/lib/views/restworld-image-view/restworld-image-view.component.mjs +100 -0
- package/esm2020/lib/views/restworld-list-view/restworld-list-view.component.mjs +341 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/{esm2015/wertzui-ngx-restworld-client.js → esm2020/wertzui-ngx-restworld-client.mjs} +0 -0
- package/fesm2015/wertzui-ngx-restworld-client.mjs +1709 -0
- package/fesm2015/wertzui-ngx-restworld-client.mjs.map +1 -0
- package/fesm2020/wertzui-ngx-restworld-client.mjs +1649 -0
- package/fesm2020/wertzui-ngx-restworld-client.mjs.map +1 -0
- package/lib/models/client-settings.d.ts +4 -1
- package/package.json +42 -31
- package/bundles/wertzui-ngx-restworld-client.umd.js +0 -2477
- package/bundles/wertzui-ngx-restworld-client.umd.js.map +0 -1
- package/esm2015/lib/restworld-client.module.js +0 -201
- package/esm2015/lib/services/restworld-client-collection.js +0 -42
- package/esm2015/lib/services/restworld-client.js +0 -183
- package/esm2015/lib/services/settings.service.js +0 -47
- package/esm2015/lib/views/restworld-edit-form/restworld-edit-form.component.js +0 -238
- package/esm2015/lib/views/restworld-edit-view/restworld-edit-view.component.js +0 -335
- package/esm2015/lib/views/restworld-file-view/restworld-file-view.component.js +0 -63
- package/esm2015/lib/views/restworld-image-view/restworld-image-view.component.js +0 -107
- package/esm2015/lib/views/restworld-list-view/restworld-list-view.component.js +0 -353
- package/fesm2015/wertzui-ngx-restworld-client.js +0 -1728
- package/fesm2015/wertzui-ngx-restworld-client.js.map +0 -1
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { Component, forwardRef, Input, ViewChildren } from '@angular/core';
|
|
2
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
-
import { FileUpload } from 'primeng/fileupload';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "primeng/button";
|
|
6
|
-
import * as i2 from "primeng/fileupload";
|
|
7
|
-
import * as i3 from "primeng/dialog";
|
|
8
|
-
import * as i4 from "ngx-image-cropper";
|
|
9
|
-
import * as i5 from "primeng/colorpicker";
|
|
10
|
-
import * as i6 from "@angular/common";
|
|
11
|
-
import * as i7 from "primeng/tooltip";
|
|
12
|
-
import * as i8 from "@angular/forms";
|
|
13
|
-
import * as i9 from "primeng/inputtext";
|
|
14
|
-
import * as i10 from "primeng/ripple";
|
|
15
|
-
import * as i11 from "../../pipes/safe-url.pipe";
|
|
16
|
-
export class RESTWorldImageViewComponent {
|
|
17
|
-
constructor() {
|
|
18
|
-
this.maintainAspectRatio = true;
|
|
19
|
-
this.aspectRatio = 1;
|
|
20
|
-
this.resizeToWidth = 0;
|
|
21
|
-
this.resizeToHeight = 0;
|
|
22
|
-
this.onlyScaleDown = false;
|
|
23
|
-
this.containWithinAspectRatio = false;
|
|
24
|
-
this.backgroundColor = "#ffffff";
|
|
25
|
-
this.format = 'png';
|
|
26
|
-
this.disabled = false;
|
|
27
|
-
this.displayCropDialog = false;
|
|
28
|
-
}
|
|
29
|
-
writeValue(obj) {
|
|
30
|
-
this.uri = obj;
|
|
31
|
-
}
|
|
32
|
-
registerOnChange(fn) {
|
|
33
|
-
this.onChange = fn;
|
|
34
|
-
}
|
|
35
|
-
registerOnTouched() {
|
|
36
|
-
// not needed for this component, but needed to implement the interface
|
|
37
|
-
}
|
|
38
|
-
setDisabledState(isDisabled) {
|
|
39
|
-
this.disabled = isDisabled;
|
|
40
|
-
}
|
|
41
|
-
showCropDialog() {
|
|
42
|
-
this.displayCropDialog = true;
|
|
43
|
-
}
|
|
44
|
-
imageChanged(event) {
|
|
45
|
-
this.tempImageFile = event.files[0];
|
|
46
|
-
this.showCropDialog();
|
|
47
|
-
}
|
|
48
|
-
croppedImageChanged(event) {
|
|
49
|
-
this.tempCroppedUri = event.base64;
|
|
50
|
-
}
|
|
51
|
-
acceptCroppedImage() {
|
|
52
|
-
var _a;
|
|
53
|
-
this.uri = this.tempCroppedUri;
|
|
54
|
-
(_a = this.onChange) === null || _a === void 0 ? void 0 : _a.call(this, this.uri);
|
|
55
|
-
this.closeCropDialog();
|
|
56
|
-
}
|
|
57
|
-
closeCropDialog() {
|
|
58
|
-
var _a;
|
|
59
|
-
(_a = this.fileUploads) === null || _a === void 0 ? void 0 : _a.forEach(f => f.clear());
|
|
60
|
-
this.displayCropDialog = false;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
RESTWorldImageViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: RESTWorldImageViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
64
|
-
RESTWorldImageViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.11", type: RESTWorldImageViewComponent, selector: "rw-image", inputs: { alt: "alt", accept: "accept", fileName: "fileName", maintainAspectRatio: "maintainAspectRatio", aspectRatio: "aspectRatio", resizeToWidth: "resizeToWidth", resizeToHeight: "resizeToHeight", onlyScaleDown: "onlyScaleDown", containWithinAspectRatio: "containWithinAspectRatio", backgroundColor: "backgroundColor", format: "format" }, providers: [{
|
|
65
|
-
provide: NG_VALUE_ACCESSOR,
|
|
66
|
-
useExisting: forwardRef(() => RESTWorldImageViewComponent),
|
|
67
|
-
multi: true
|
|
68
|
-
}], viewQueries: [{ propertyName: "fileUploads", predicate: FileUpload, descendants: true }], ngImport: i0, template: "<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No image present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download image\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload class=\"mr-1\" chooseIcon=\"pi-upload fas fa-upload\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || 'false'\" [customUpload]=\"true\" (uploadHandler)=\"imageChanged($event)\" pTooltip=\"Upload new image\"></p-fileUpload>\r\n <img *ngIf=\"uri\" [src]=\"uri\" [alt]=\"alt\" (click)=\"showCropDialog()\" pTooltip=\"Zoom and crop\" />\r\n</div>\r\n\r\n<p-dialog header=\"alt\" [(visible)]=\"displayCropDialog\">\r\n <image-cropper #cropper\r\n [imageFile]=\"tempImageFile!\"\r\n [imageURL]=\"uri!\"\r\n [maintainAspectRatio]=\"maintainAspectRatio\"\r\n [aspectRatio]=\"aspectRatio\"\r\n [resizeToWidth]=\"resizeToWidth\"\r\n [resizeToHeight]=\"resizeToHeight\"\r\n [onlyScaleDown]=\"onlyScaleDown\"\r\n [autoCrop]=\"true\"\r\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\r\n [backgroundColor]=\"backgroundColor\"\r\n [format]=\"format\"\r\n (imageCropped)=\"croppedImageChanged($event)\"></image-cropper>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"flex-auto align-items-center\">\r\n <span>Background color: </span>\r\n <p-colorPicker [(ngModel)]=\"cropper.backgroundColor\" appendTo=\"body\" class=\"ml-1 mr-1\"></p-colorPicker>\r\n <input pInputText [(ngModel)]=\"cropper.backgroundColor\" />\r\n </div>\r\n <button type=\"button\" pButton pRipple (click)=\"acceptCroppedImage()\" class=\"mr-2\">Ok</button>\r\n <button type=\"button\" pButton pRipple (click)=\"closeCropDialog()\">Cancel</button>\r\n </div>\r\n</p-dialog>\r\n", styles: ["img{height:calc(1rem + 2*8px + 2*1px);cursor:zoom-in;border-radius:3px}a{text-decoration:none;height:calc(1rem + 2*8px + 2px)}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"], components: [{ type: i1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass"], outputs: ["onClick", "onFocus", "onBlur"] }, { type: i2.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler"] }, { type: i3.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { type: i4.ImageCropperComponent, selector: "image-cropper", inputs: ["format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "cropper", "alignImage", "disabled", "imageChangedEvent", "imageURL", "imageBase64", "imageFile"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed"] }, { type: i5.ColorPicker, selector: "p-colorPicker", inputs: ["style", "styleClass", "inline", "format", "appendTo", "disabled", "tabindex", "inputId", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onChange", "onShow", "onHide"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.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: i9.InputText, selector: "[pInputText]" }, { type: i10.Ripple, selector: "[pRipple]" }], pipes: { "safeUrl": i11.SafeUrlPipe } });
|
|
69
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: RESTWorldImageViewComponent, decorators: [{
|
|
70
|
-
type: Component,
|
|
71
|
-
args: [{
|
|
72
|
-
selector: 'rw-image',
|
|
73
|
-
templateUrl: './restworld-image-view.component.html',
|
|
74
|
-
styleUrls: ['./restworld-image-view.component.css'],
|
|
75
|
-
providers: [{
|
|
76
|
-
provide: NG_VALUE_ACCESSOR,
|
|
77
|
-
useExisting: forwardRef(() => RESTWorldImageViewComponent),
|
|
78
|
-
multi: true
|
|
79
|
-
}]
|
|
80
|
-
}]
|
|
81
|
-
}], propDecorators: { alt: [{
|
|
82
|
-
type: Input
|
|
83
|
-
}], accept: [{
|
|
84
|
-
type: Input
|
|
85
|
-
}], fileName: [{
|
|
86
|
-
type: Input
|
|
87
|
-
}], maintainAspectRatio: [{
|
|
88
|
-
type: Input
|
|
89
|
-
}], aspectRatio: [{
|
|
90
|
-
type: Input
|
|
91
|
-
}], resizeToWidth: [{
|
|
92
|
-
type: Input
|
|
93
|
-
}], resizeToHeight: [{
|
|
94
|
-
type: Input
|
|
95
|
-
}], onlyScaleDown: [{
|
|
96
|
-
type: Input
|
|
97
|
-
}], containWithinAspectRatio: [{
|
|
98
|
-
type: Input
|
|
99
|
-
}], backgroundColor: [{
|
|
100
|
-
type: Input
|
|
101
|
-
}], format: [{
|
|
102
|
-
type: Input
|
|
103
|
-
}], fileUploads: [{
|
|
104
|
-
type: ViewChildren,
|
|
105
|
-
args: [FileUpload]
|
|
106
|
-
}] } });
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWltYWdlLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlc3R3b3JsZC1jbGllbnQvc3JjL2xpYi92aWV3cy9yZXN0d29ybGQtaW1hZ2Utdmlldy9yZXN0d29ybGQtaW1hZ2Utdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1pbWFnZS12aWV3L3Jlc3R3b3JsZC1pbWFnZS12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBYSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVloRCxNQUFNLE9BQU8sMkJBQTJCO0lBVnhDO1FBcUJFLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUUzQixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUVoQixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUVsQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUVuQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUV0Qiw2QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFFakMsb0JBQWUsR0FBRyxTQUFTLENBQUM7UUFFckIsV0FBTSxHQUFpQixLQUFLLENBQUM7UUFPN0IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUdqQixzQkFBaUIsR0FBRyxLQUFLLENBQUM7S0F3Q2xDO0lBckNDLFVBQVUsQ0FBQyxHQUFtQjtRQUM1QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsRUFBYTtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsdUVBQXVFO0lBQ3pFLENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxZQUFZLENBQUMsS0FBd0I7UUFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU0sbUJBQW1CLENBQUMsS0FBd0I7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxrQkFBa0I7O1FBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMvQixNQUFBLElBQUksQ0FBQyxRQUFRLCtDQUFiLElBQUksRUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxlQUFlOztRQUNwQixNQUFBLElBQUksQ0FBQyxXQUFXLDBDQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQzs7eUhBMUVVLDJCQUEyQjs2R0FBM0IsMkJBQTJCLHlYQU4zQixDQUFDO1lBQ1YsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO1lBQzFELEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQywwREE4QlksVUFBVSxnREMzQzFCLCsvREErQkE7NEZEaEJhLDJCQUEyQjtrQkFWdkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsV0FBVyxFQUFFLHVDQUF1QztvQkFDcEQsU0FBUyxFQUFFLENBQUMsc0NBQXNDLENBQUM7b0JBQ25ELFNBQVMsRUFBRSxDQUFDOzRCQUNWLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDRCQUE0QixDQUFDOzRCQUMxRCxLQUFLLEVBQUUsSUFBSTt5QkFDWixDQUFDO2lCQUNIOzhCQU1RLEdBQUc7c0JBRFQsS0FBSztnQkFHQyxNQUFNO3NCQURaLEtBQUs7Z0JBR0MsUUFBUTtzQkFEZCxLQUFLO2dCQUdOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFHTixXQUFXO3NCQURWLEtBQUs7Z0JBR04sYUFBYTtzQkFEWixLQUFLO2dCQUdOLGNBQWM7c0JBRGIsS0FBSztnQkFHTixhQUFhO3NCQURaLEtBQUs7Z0JBR04sd0JBQXdCO3NCQUR2QixLQUFLO2dCQUdOLGVBQWU7c0JBRGQsS0FBSztnQkFHQyxNQUFNO3NCQURaLEtBQUs7Z0JBS04sV0FBVztzQkFEVixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBJbWFnZUNyb3BwZWRFdmVudCwgT3V0cHV0Rm9ybWF0IH0gZnJvbSAnbmd4LWltYWdlLWNyb3BwZXInO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAncHJpbWVuZy9maWxldXBsb2FkJztcclxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdydy1pbWFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXN0d29ybGQtaW1hZ2Utdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1pbWFnZS12aWV3LmNvbXBvbmVudC5jc3MnXSxcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSRVNUV29ybGRJbWFnZVZpZXdDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWVcclxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBSRVNUV29ybGRJbWFnZVZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cclxuICBwcml2YXRlIG9uQ2hhbmdlPzogRnVuY3Rpb247XG5cbiAgQElucHV0KClcbiAgcHVibGljIGFsdD86IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIGFjY2VwdD86IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIGZpbGVOYW1lPzogc3RyaW5nO1xuICBASW5wdXQoKVxuICBtYWludGFpbkFzcGVjdFJhdGlvID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgYXNwZWN0UmF0aW8gPSAxO1xuICBASW5wdXQoKVxuICByZXNpemVUb1dpZHRoID0gMDtcbiAgQElucHV0KClcbiAgcmVzaXplVG9IZWlnaHQgPSAwO1xuICBASW5wdXQoKVxuICBvbmx5U2NhbGVEb3duID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbyA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBiYWNrZ3JvdW5kQ29sb3IgPSBcIiNmZmZmZmZcIjtcbiAgQElucHV0KClcbiAgcHVibGljIGZvcm1hdDogT3V0cHV0Rm9ybWF0ID0gJ3BuZyc7XG5cblxyXG4gIEBWaWV3Q2hpbGRyZW4oRmlsZVVwbG9hZClcclxuICBmaWxlVXBsb2Fkcz86IFF1ZXJ5TGlzdDxGaWxlVXBsb2FkPjtcblxuXG4gIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuICBwdWJsaWMgdXJpPzogc3RyaW5nIHwgbnVsbDtcclxuICBwdWJsaWMgdGVtcEltYWdlRmlsZT86IEZpbGU7XHJcbiAgcHVibGljIGRpc3BsYXlDcm9wRGlhbG9nID0gZmFsc2U7XG4gIHB1YmxpYyB0ZW1wQ3JvcHBlZFVyaT86IHN0cmluZyB8IG51bGw7XG5cbiAgd3JpdGVWYWx1ZShvYmo/OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLnVyaSA9IG9iajtcclxuICB9XHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbj86IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKCk6IHZvaWQge1xyXG4gICAgLy8gbm90IG5lZWRlZCBmb3IgdGhpcyBjb21wb25lbnQsIGJ1dCBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBpbnRlcmZhY2VcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dDcm9wRGlhbG9nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNwbGF5Q3JvcERpYWxvZyA9IHRydWU7XHJcbiAgfVxyXG5cbiAgcHVibGljIGltYWdlQ2hhbmdlZChldmVudDogeyBmaWxlczogRmlsZVtdIH0pOiB2b2lkIHtcclxuICAgIHRoaXMudGVtcEltYWdlRmlsZSA9IGV2ZW50LmZpbGVzWzBdO1xyXG4gICAgdGhpcy5zaG93Q3JvcERpYWxvZygpO1xyXG4gIH1cblxuICBwdWJsaWMgY3JvcHBlZEltYWdlQ2hhbmdlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMudGVtcENyb3BwZWRVcmkgPSBldmVudC5iYXNlNjQ7XHJcbiAgfVxuXHJcbiAgcHVibGljIGFjY2VwdENyb3BwZWRJbWFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudXJpID0gdGhpcy50ZW1wQ3JvcHBlZFVyaTtcclxuICAgIHRoaXMub25DaGFuZ2U/Lih0aGlzLnVyaSk7XHJcbiAgICB0aGlzLmNsb3NlQ3JvcERpYWxvZygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlQ3JvcERpYWxvZygpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsZVVwbG9hZHM/LmZvckVhY2goZiA9PiBmLmNsZWFyKCkpO1xyXG4gICAgdGhpcy5kaXNwbGF5Q3JvcERpYWxvZyA9IGZhbHNlO1xyXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gIDxwLWJ1dHRvbiAqbmdJZj1cIiF1cmlcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiIGNsYXNzPVwibXItMVwiIHBUb29sdGlwPVwiTm8gaW1hZ2UgcHJlc2VudFwiPjwvcC1idXR0b24+XHJcbiAgPGEgKm5nSWY9XCJ1cmlcIiBbaHJlZl09XCJ1cmkgfCBzYWZlVXJsXCIgW2Rvd25sb2FkXT1cImZpbGVOYW1lIHx8ICdkb3dubG9hZCdcIiBjbGFzcz1cIm1yLTFcIiBwQnV0dG9uIHBUb29sdGlwPVwiRG93bmxvYWQgaW1hZ2VcIiBpY29uPVwicGkgcGktZG93bmxvYWRcIj48L2E+XHJcbiAgPHAtZmlsZVVwbG9hZCBjbGFzcz1cIm1yLTFcIiBjaG9vc2VJY29uPVwicGktdXBsb2FkIGZhcyBmYS11cGxvYWRcIiBtb2RlPVwiYmFzaWNcIiBbYXV0b109XCJ0cnVlXCIgW2FjY2VwdF09XCJhY2NlcHQgfHwgJ2ZhbHNlJ1wiIFtjdXN0b21VcGxvYWRdPVwidHJ1ZVwiICh1cGxvYWRIYW5kbGVyKT1cImltYWdlQ2hhbmdlZCgkZXZlbnQpXCIgcFRvb2x0aXA9XCJVcGxvYWQgbmV3IGltYWdlXCI+PC9wLWZpbGVVcGxvYWQ+XHJcbiAgPGltZyAqbmdJZj1cInVyaVwiIFtzcmNdPVwidXJpXCIgW2FsdF09XCJhbHRcIiAoY2xpY2spPVwic2hvd0Nyb3BEaWFsb2coKVwiIHBUb29sdGlwPVwiWm9vbSBhbmQgY3JvcFwiIC8+XHJcbjwvZGl2PlxyXG5cclxuPHAtZGlhbG9nIGhlYWRlcj1cImFsdFwiIFsodmlzaWJsZSldPVwiZGlzcGxheUNyb3BEaWFsb2dcIj5cclxuICA8aW1hZ2UtY3JvcHBlciAjY3JvcHBlclxyXG4gICAgICAgICAgICAgICAgIFtpbWFnZUZpbGVdPVwidGVtcEltYWdlRmlsZSFcIlxyXG4gICAgICAgICAgICAgICAgIFtpbWFnZVVSTF09XCJ1cmkhXCJcclxuICAgICAgICAgICAgICAgICBbbWFpbnRhaW5Bc3BlY3RSYXRpb109XCJtYWludGFpbkFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICBbYXNwZWN0UmF0aW9dPVwiYXNwZWN0UmF0aW9cIlxyXG4gICAgICAgICAgICAgICAgIFtyZXNpemVUb1dpZHRoXT1cInJlc2l6ZVRvV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgIFtyZXNpemVUb0hlaWdodF09XCJyZXNpemVUb0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgW29ubHlTY2FsZURvd25dPVwib25seVNjYWxlRG93blwiXHJcbiAgICAgICAgICAgICAgICAgW2F1dG9Dcm9wXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgIFtjb250YWluV2l0aGluQXNwZWN0UmF0aW9dPVwiY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cImJhY2tncm91bmRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgW2Zvcm1hdF09XCJmb3JtYXRcIlxyXG4gICAgICAgICAgICAgICAgIChpbWFnZUNyb3BwZWQpPVwiY3JvcHBlZEltYWdlQ2hhbmdlZCgkZXZlbnQpXCI+PC9pbWFnZS1jcm9wcGVyPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWF1dG8gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgIDxzcGFuPkJhY2tncm91bmQgY29sb3I6Jm5ic3A7PC9zcGFuPlxyXG4gICAgICA8cC1jb2xvclBpY2tlciBbKG5nTW9kZWwpXT1cImNyb3BwZXIuYmFja2dyb3VuZENvbG9yXCIgYXBwZW5kVG89XCJib2R5XCIgY2xhc3M9XCJtbC0xIG1yLTFcIj48L3AtY29sb3JQaWNrZXI+XHJcbiAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwiY3JvcHBlci5iYWNrZ3JvdW5kQ29sb3JcIiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cImFjY2VwdENyb3BwZWRJbWFnZSgpXCIgY2xhc3M9XCJtci0yXCI+T2s8L2J1dHRvbj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwiY2xvc2VDcm9wRGlhbG9nKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9wLWRpYWxvZz5cclxuIl19
|
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Component, Input } from '@angular/core';
|
|
3
|
-
import * as _ from 'lodash';
|
|
4
|
-
import { FilterMatchMode } from 'primeng/api';
|
|
5
|
-
import { ProblemDetails } from '../../models/problem-details';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "../../services/restworld-client-collection";
|
|
8
|
-
import * as i2 from "primeng/api";
|
|
9
|
-
import * as i3 from "../../services/avatar-generator";
|
|
10
|
-
import * as i4 from "primeng/table";
|
|
11
|
-
import * as i5 from "primeng/avatar";
|
|
12
|
-
import * as i6 from "primeng/tristatecheckbox";
|
|
13
|
-
import * as i7 from "primeng/toast";
|
|
14
|
-
import * as i8 from "primeng/confirmdialog";
|
|
15
|
-
import * as i9 from "@angular/common";
|
|
16
|
-
import * as i10 from "primeng/tooltip";
|
|
17
|
-
import * as i11 from "@angular/router";
|
|
18
|
-
import * as i12 from "primeng/button";
|
|
19
|
-
import * as i13 from "@angular/forms";
|
|
20
|
-
export var ColumnType;
|
|
21
|
-
(function (ColumnType) {
|
|
22
|
-
ColumnType["text"] = "text";
|
|
23
|
-
ColumnType["numeric"] = "numeric";
|
|
24
|
-
ColumnType["boolean"] = "boolean";
|
|
25
|
-
ColumnType["date"] = "date";
|
|
26
|
-
})(ColumnType || (ColumnType = {}));
|
|
27
|
-
export class RESTworldListViewComponent {
|
|
28
|
-
constructor(_clients, _confirmationService, _messageService, avatarGenerator) {
|
|
29
|
-
this._clients = _clients;
|
|
30
|
-
this._confirmationService = _confirmationService;
|
|
31
|
-
this._messageService = _messageService;
|
|
32
|
-
this.avatarGenerator = avatarGenerator;
|
|
33
|
-
this._columns = [];
|
|
34
|
-
this._editLink = '/edit';
|
|
35
|
-
this.isLoading = false;
|
|
36
|
-
this._totalRecords = 0;
|
|
37
|
-
this.rowsPerPage = [10, 25, 50];
|
|
38
|
-
this._lastEvent = {
|
|
39
|
-
rows: this.rowsPerPage[0]
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
get columns() {
|
|
43
|
-
return this._columns;
|
|
44
|
-
}
|
|
45
|
-
set editLink(value) {
|
|
46
|
-
if (value)
|
|
47
|
-
this._editLink = value;
|
|
48
|
-
}
|
|
49
|
-
get editLink() {
|
|
50
|
-
return this._editLink;
|
|
51
|
-
}
|
|
52
|
-
set apiName(value) {
|
|
53
|
-
this._apiName = value;
|
|
54
|
-
if (this.apiName && this.rel && this._lastEvent)
|
|
55
|
-
this.load(this._lastEvent);
|
|
56
|
-
}
|
|
57
|
-
get apiName() {
|
|
58
|
-
return this._apiName;
|
|
59
|
-
}
|
|
60
|
-
set rel(value) {
|
|
61
|
-
this._rel = value;
|
|
62
|
-
if (this.apiName && this.rel && this._lastEvent)
|
|
63
|
-
this.load(this._lastEvent);
|
|
64
|
-
}
|
|
65
|
-
get rel() {
|
|
66
|
-
return this._rel;
|
|
67
|
-
}
|
|
68
|
-
get value() {
|
|
69
|
-
var _a, _b;
|
|
70
|
-
return ((_b = (_a = this.resource) === null || _a === void 0 ? void 0 : _a._embedded) === null || _b === void 0 ? void 0 : _b.items) || [];
|
|
71
|
-
}
|
|
72
|
-
get rows() {
|
|
73
|
-
var _a;
|
|
74
|
-
return ((_a = this._lastEvent) === null || _a === void 0 ? void 0 : _a.rows) || 0;
|
|
75
|
-
}
|
|
76
|
-
get totalRecords() {
|
|
77
|
-
return this._totalRecords;
|
|
78
|
-
}
|
|
79
|
-
set totalRecords(value) {
|
|
80
|
-
this._totalRecords = value || 0;
|
|
81
|
-
}
|
|
82
|
-
get sortOrder() {
|
|
83
|
-
return this._lastEvent.sortOrder || 0;
|
|
84
|
-
}
|
|
85
|
-
get newHref() {
|
|
86
|
-
var _a, _b;
|
|
87
|
-
return (_b = (_a = this.resource) === null || _a === void 0 ? void 0 : _a.findLink('new')) === null || _b === void 0 ? void 0 : _b.href;
|
|
88
|
-
}
|
|
89
|
-
get dateFormat() {
|
|
90
|
-
return RESTworldListViewComponent._dateFormat;
|
|
91
|
-
}
|
|
92
|
-
getClient() {
|
|
93
|
-
if (!this.apiName)
|
|
94
|
-
throw new Error('Cannot get a client, because the apiName is not set.');
|
|
95
|
-
return this._clients.getClient(this.apiName);
|
|
96
|
-
}
|
|
97
|
-
load(event) {
|
|
98
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
-
if (!this.apiName || !this.rel)
|
|
100
|
-
return;
|
|
101
|
-
this.isLoading = true;
|
|
102
|
-
this._lastEvent = event;
|
|
103
|
-
const parameters = this.createParametersFromEvent(event);
|
|
104
|
-
const response = yield this.getClient().getList(this.rel, parameters);
|
|
105
|
-
if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {
|
|
106
|
-
this._messageService.add({ severity: 'error', summary: 'Error', detail: 'Error while loading the resources from the API.', data: response });
|
|
107
|
-
}
|
|
108
|
-
else if (response.body) {
|
|
109
|
-
this.resource = response.body;
|
|
110
|
-
this.totalRecords = this.resource.totalPages && parameters.$top ? this.resource.totalPages * parameters.$top : undefined;
|
|
111
|
-
this._columns = this.createColumns();
|
|
112
|
-
}
|
|
113
|
-
this.isLoading = false;
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
showDeleteConfirmatioModal(resource) {
|
|
117
|
-
this._confirmationService.confirm({
|
|
118
|
-
message: 'Do you really want to delete this resource?',
|
|
119
|
-
header: 'Confirm delete',
|
|
120
|
-
icon: 'far fa-trash-alt',
|
|
121
|
-
accept: () => this.delete(resource)
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
delete(resource) {
|
|
125
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
-
if (!this.apiName || !this.rel)
|
|
127
|
-
return;
|
|
128
|
-
yield this.getClient().delete(resource);
|
|
129
|
-
this._messageService.add({ severity: 'success', summary: 'Deleted', detail: 'The resource has been deleted.' });
|
|
130
|
-
this.load(this._lastEvent);
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
createColumns() {
|
|
134
|
-
if (this.value.length === 0)
|
|
135
|
-
return this.columns;
|
|
136
|
-
// Get all distinct properties from all rows
|
|
137
|
-
// We look at all rows to eliminate possible undefined values
|
|
138
|
-
const rowsWithProperties = this.value
|
|
139
|
-
.map(resource => Object.entries(resource)
|
|
140
|
-
.filter(p => p[0] !== '_links' &&
|
|
141
|
-
p[0] !== '_embedded' &&
|
|
142
|
-
p[0] !== 'id' &&
|
|
143
|
-
p[0] !== 'timestamp'));
|
|
144
|
-
const distinctProperties = rowsWithProperties[0];
|
|
145
|
-
for (const propertiesOfRow of rowsWithProperties) {
|
|
146
|
-
for (const property of propertiesOfRow) {
|
|
147
|
-
const propertyName = property[0];
|
|
148
|
-
const propertyValue = property[1];
|
|
149
|
-
const alreadyFoundPropertyWithSameName = distinctProperties.find(p => p[0] === propertyName);
|
|
150
|
-
if (!alreadyFoundPropertyWithSameName) // Add new property
|
|
151
|
-
distinctProperties.push(property);
|
|
152
|
-
else if (!alreadyFoundPropertyWithSameName[1] && propertyValue) // Use defined value instead of existing undefined value
|
|
153
|
-
alreadyFoundPropertyWithSameName[1] = propertyValue;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// Check if the rows are entities with change tracking
|
|
157
|
-
const withoutChangeTrackingProperties = distinctProperties.filter(p => p[0] !== 'createdAt' &&
|
|
158
|
-
p[0] !== 'createdBy' &&
|
|
159
|
-
p[0] !== 'lastChangedAt' &&
|
|
160
|
-
p[0] !== 'lastChangedBy');
|
|
161
|
-
const hasChangeTrackingProperties = withoutChangeTrackingProperties.length < distinctProperties.length;
|
|
162
|
-
// First the id, then all other properties
|
|
163
|
-
const sortedProperties = [
|
|
164
|
-
['id', 0],
|
|
165
|
-
...withoutChangeTrackingProperties
|
|
166
|
-
];
|
|
167
|
-
// And change tracking properties at the end
|
|
168
|
-
if (hasChangeTrackingProperties) {
|
|
169
|
-
sortedProperties.push(['createdAt', new Date()]);
|
|
170
|
-
sortedProperties.push(['createdBy', '']);
|
|
171
|
-
sortedProperties.push(['lastChangedAt', new Date()]);
|
|
172
|
-
sortedProperties.push(['lastChangedBy', '']);
|
|
173
|
-
}
|
|
174
|
-
const columns = sortedProperties
|
|
175
|
-
.map(p => ({
|
|
176
|
-
header: RESTworldListViewComponent.toTitleCase(p[0]),
|
|
177
|
-
field: p[0],
|
|
178
|
-
type: RESTworldListViewComponent.getColumnType(p[1]),
|
|
179
|
-
}));
|
|
180
|
-
return columns;
|
|
181
|
-
}
|
|
182
|
-
static getColumnType(value) {
|
|
183
|
-
if (value === null || value === undefined)
|
|
184
|
-
return ColumnType.text;
|
|
185
|
-
if (_.isNumber(value))
|
|
186
|
-
return ColumnType.numeric;
|
|
187
|
-
if (_.isDate(value))
|
|
188
|
-
return ColumnType.date;
|
|
189
|
-
if (_.isString(value))
|
|
190
|
-
return ColumnType.text;
|
|
191
|
-
if (_.isBoolean(value))
|
|
192
|
-
return ColumnType.boolean;
|
|
193
|
-
return ColumnType.text;
|
|
194
|
-
}
|
|
195
|
-
static toTitleCase(anyCase) {
|
|
196
|
-
return anyCase
|
|
197
|
-
.replace(/(_)+/g, ' ') // underscore to whitespace
|
|
198
|
-
.replace(/([a-z])([A-Z][a-z])/g, "$1 $2") // insert space before each new word if there is none
|
|
199
|
-
.replace(/([A-Z][a-z])([A-Z])/g, "$1 $2") // insert space after each word if there is none
|
|
200
|
-
.replace(/([a-z])([A-Z]+[a-z])/g, "$1 $2") // insert space after single letter word if there is none
|
|
201
|
-
.replace(/([A-Z]+)([A-Z][a-z][a-z])/g, "$1 $2") // insert space before single letter word if there is none
|
|
202
|
-
.replace(/([a-z]+)([A-Z0-9]+)/g, "$1 $2") // insert space after numbers
|
|
203
|
-
.replace(/^./, (match) => match.toUpperCase()); // change first letter to be upper case
|
|
204
|
-
}
|
|
205
|
-
createParametersFromEvent(event) {
|
|
206
|
-
const oDataParameters = {
|
|
207
|
-
$filter: this.createFilterFromEvent(event),
|
|
208
|
-
$orderby: RESTworldListViewComponent.createOrderByFromEvent(event),
|
|
209
|
-
$top: RESTworldListViewComponent.createTopFromEvent(event),
|
|
210
|
-
$skip: RESTworldListViewComponent.createSkipFromEvent(event)
|
|
211
|
-
};
|
|
212
|
-
return oDataParameters;
|
|
213
|
-
}
|
|
214
|
-
static createSkipFromEvent(event) {
|
|
215
|
-
return event.first;
|
|
216
|
-
}
|
|
217
|
-
static createTopFromEvent(event) {
|
|
218
|
-
return event.rows;
|
|
219
|
-
}
|
|
220
|
-
static createOrderByFromEvent(event) {
|
|
221
|
-
if (event.sortField) {
|
|
222
|
-
const order = !event.sortOrder || event.sortOrder > 0 ? 'asc' : 'desc';
|
|
223
|
-
return `${event.sortField} ${order}`;
|
|
224
|
-
}
|
|
225
|
-
return undefined;
|
|
226
|
-
}
|
|
227
|
-
createFilterFromEvent(event) {
|
|
228
|
-
if (!event.filters)
|
|
229
|
-
return undefined;
|
|
230
|
-
const filter = Object.entries(event.filters)
|
|
231
|
-
// The type definition is wrong, event.filters has values of type FilterMetadata[] and not FilterMetadata.
|
|
232
|
-
.map(([property, filter]) => ({ property: property, filters: filter }))
|
|
233
|
-
.map(f => this.createFilterForPropertyArray(f.property, f.filters))
|
|
234
|
-
.filter(f => !!f)
|
|
235
|
-
.join(' and ');
|
|
236
|
-
if (filter === '')
|
|
237
|
-
return undefined;
|
|
238
|
-
return `(${filter})`;
|
|
239
|
-
}
|
|
240
|
-
createFilterForPropertyArray(property, filters) {
|
|
241
|
-
const filter = filters
|
|
242
|
-
.map(f => this.createFilterForProperty(property, f))
|
|
243
|
-
.filter(f => !!f)
|
|
244
|
-
.join(` ${filters[0].operator} `);
|
|
245
|
-
if (filter === '')
|
|
246
|
-
return undefined;
|
|
247
|
-
return `(${filter})`;
|
|
248
|
-
}
|
|
249
|
-
createFilterForProperty(property, filter) {
|
|
250
|
-
if (!filter.value)
|
|
251
|
-
return undefined;
|
|
252
|
-
const oDataOperator = RESTworldListViewComponent.createODataOperator(filter.matchMode);
|
|
253
|
-
const comparisonValue = this.createComparisonValue(property, filter.value);
|
|
254
|
-
switch (oDataOperator) {
|
|
255
|
-
case 'contains':
|
|
256
|
-
case 'not contains':
|
|
257
|
-
case 'startswith':
|
|
258
|
-
case 'endswith':
|
|
259
|
-
return `${oDataOperator}(${property}, ${comparisonValue})`;
|
|
260
|
-
default:
|
|
261
|
-
return `${property} ${oDataOperator} ${comparisonValue}`;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
static createODataOperator(matchMode) {
|
|
265
|
-
switch (matchMode) {
|
|
266
|
-
case FilterMatchMode.STARTS_WITH:
|
|
267
|
-
return 'startswith';
|
|
268
|
-
case FilterMatchMode.CONTAINS:
|
|
269
|
-
return 'contains';
|
|
270
|
-
case FilterMatchMode.NOT_CONTAINS:
|
|
271
|
-
return 'not contains';
|
|
272
|
-
case FilterMatchMode.ENDS_WITH:
|
|
273
|
-
return 'endswith';
|
|
274
|
-
case FilterMatchMode.EQUALS:
|
|
275
|
-
return 'eq';
|
|
276
|
-
case FilterMatchMode.NOT_EQUALS:
|
|
277
|
-
return 'ne';
|
|
278
|
-
case FilterMatchMode.IN:
|
|
279
|
-
return 'in';
|
|
280
|
-
case FilterMatchMode.LESS_THAN:
|
|
281
|
-
return 'lt';
|
|
282
|
-
case FilterMatchMode.LESS_THAN_OR_EQUAL_TO:
|
|
283
|
-
return 'le';
|
|
284
|
-
case FilterMatchMode.GREATER_THAN:
|
|
285
|
-
return 'gt';
|
|
286
|
-
case FilterMatchMode.GREATER_THAN_OR_EQUAL_TO:
|
|
287
|
-
return 'ge';
|
|
288
|
-
case FilterMatchMode.IS:
|
|
289
|
-
return 'eq';
|
|
290
|
-
case FilterMatchMode.IS_NOT:
|
|
291
|
-
return 'ne';
|
|
292
|
-
case FilterMatchMode.BEFORE:
|
|
293
|
-
return 'lt';
|
|
294
|
-
case FilterMatchMode.AFTER:
|
|
295
|
-
return 'gt';
|
|
296
|
-
case FilterMatchMode.DATE_AFTER:
|
|
297
|
-
return 'ge';
|
|
298
|
-
case FilterMatchMode.DATE_BEFORE:
|
|
299
|
-
return 'lt';
|
|
300
|
-
case FilterMatchMode.DATE_IS:
|
|
301
|
-
return 'eq';
|
|
302
|
-
case FilterMatchMode.DATE_IS_NOT:
|
|
303
|
-
return 'ne';
|
|
304
|
-
default:
|
|
305
|
-
throw Error(`Unknown matchMode ${matchMode}`);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
createComparisonValue(property, value) {
|
|
309
|
-
if (value === null || value === undefined)
|
|
310
|
-
return 'null';
|
|
311
|
-
const columns = this.columns.filter(c => c.field === property);
|
|
312
|
-
if (columns.length !== 1)
|
|
313
|
-
throw new Error(`Cannot find the column for the property ${property} which is specified in the filter.`);
|
|
314
|
-
const type = columns[0].type;
|
|
315
|
-
switch (type) {
|
|
316
|
-
case ColumnType.boolean:
|
|
317
|
-
return `${value}`;
|
|
318
|
-
case ColumnType.date:
|
|
319
|
-
return `cast(${value.toISOString()}, Edm.DateTimeOffset)`;
|
|
320
|
-
case ColumnType.numeric:
|
|
321
|
-
return `${value}`;
|
|
322
|
-
case ColumnType.text:
|
|
323
|
-
return `'${value}'`;
|
|
324
|
-
default:
|
|
325
|
-
throw new Error(`Unknown column type '${type}'`);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
RESTworldListViewComponent._dateFormat = new Date(3333, 10, 22)
|
|
330
|
-
.toLocaleDateString()
|
|
331
|
-
.replace("22", "dd")
|
|
332
|
-
.replace("11", "MM")
|
|
333
|
-
.replace("3333", "y")
|
|
334
|
-
.replace("33", "yy");
|
|
335
|
-
RESTworldListViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: RESTworldListViewComponent, deps: [{ token: i1.RESTworldClientCollection }, { token: i2.ConfirmationService }, { token: i2.MessageService }, { token: i3.AvatarGenerator }], target: i0.ɵɵFactoryTarget.Component });
|
|
336
|
-
RESTworldListViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.11", type: RESTworldListViewComponent, selector: "rw-list", inputs: { editLink: "editLink", apiName: "apiName", rel: "rel", rowsPerPage: "rowsPerPage" }, ngImport: i0, template: "<p-table [value]=\"value\"\r\n [lazy]=\"true\"\r\n [lazyLoadOnInit]=\"false\"\r\n (onLazyLoad)=\"load($event)\"\r\n responsiveLayout=\"scroll\"\r\n [paginator]=\"true\"\r\n [rows]=\"rows\"\r\n [rowsPerPageOptions]=\"rowsPerPage\"\r\n [totalRecords]=\"totalRecords\"\r\n [loading]=\"isLoading\"\r\n [showInitialSortBadge]=\"true\"\r\n [columns]=\"columns\">\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.field\">\r\n <div class=\"p-d-flex p-jc-between p-ai-center\">\r\n {{col.header}}\r\n <p-sortIcon [field]=\"col.field\"></p-sortIcon>\r\n <p-columnFilter [type]=\"col.type\" [field]=\"col.field\" display=\"menu\"></p-columnFilter>\r\n </div>\r\n </th>\r\n <th>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"mx-2\" pTooltip=\"Create new\" tooltipPosition=\"left\">\r\n <a class=\"p-button-success\" icon=\"fas fa-plus\" pButton [routerLink]=\"['/edit', apiName, newHref]\"></a>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-entity let-columns=\"columns\">\r\n <tr>\r\n <td [ngSwitch]=\"col.type\" *ngFor=\"let col of columns\">\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <p-avatar *ngIf=\"col.field === 'createdBy' || col.field === 'lastChangedBy'\" [pTooltip]=\"entity[col.field]\" tooltipPosition=\"top\" [image]=\"avatarGenerator.getImage(entity[col.field])\" [label]=\"avatarGenerator.getLabel(entity[col.field])\" [style]=\"avatarGenerator.getStyle(entity[col.field])\" shape=\"circle\"></p-avatar>\r\n <span *ngIf=\"col.field !== 'createdBy' && col.field !== 'lastChangedBy'\">{{entity[col.field]}}</span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'numeric'\" class=\"flex justify-content-end\">{{entity[col.field]}}</span>\r\n <span *ngSwitchCase=\"'boolean'\" class=\"flex justify-content-center\"><p-triStateCheckbox [(ngModel)]=\"entity[col.field]\" [readonly]=\"true\"></p-triStateCheckbox></span>\r\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"entity[col.field]\">{{entity[col.field] | date:dateFormat}}</span>\r\n </td>\r\n <td>\r\n <div class=\"flex justify-content-end\">\r\n <a pButton pTooltip=\"View/Edit\" tooltipPosition=\"left\" [routerLink]=\"[editLink, apiName, entity._links?.self[0].href]\" icon=\"fas fa-edit\"></a>\r\n <button pTooltip=\"Delete\" tooltipPosition=\"left\" pButton *ngIf=\"entity._links.delete\" (click)=\"showDeleteConfirmatioModal(entity)\" icon=\"fas fa-trash-alt\" type=\"button\" class=\"mx-2 p-button-danger\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"8\">No entries found.</td>\r\n </tr>\r\n </ng-template>\r\n\r\n</p-table>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n", styles: [".p-tooltip{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}a.p-button{text-decoration:none}\n"], components: [{ type: i4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection"], outputs: ["selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { type: i4.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping"] }, { type: i5.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "style", "styleClass"] }, { type: i6.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { type: i7.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { type: i8.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }], directives: [{ type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { type: i10.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i11.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i12.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i9.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i9.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i13.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "date": i9.DatePipe } });
|
|
337
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: RESTworldListViewComponent, decorators: [{
|
|
338
|
-
type: Component,
|
|
339
|
-
args: [{
|
|
340
|
-
selector: 'rw-list',
|
|
341
|
-
templateUrl: './restworld-list-view.component.html',
|
|
342
|
-
styleUrls: ['./restworld-list-view.component.css']
|
|
343
|
-
}]
|
|
344
|
-
}], ctorParameters: function () { return [{ type: i1.RESTworldClientCollection }, { type: i2.ConfirmationService }, { type: i2.MessageService }, { type: i3.AvatarGenerator }]; }, propDecorators: { editLink: [{
|
|
345
|
-
type: Input
|
|
346
|
-
}], apiName: [{
|
|
347
|
-
type: Input
|
|
348
|
-
}], rel: [{
|
|
349
|
-
type: Input
|
|
350
|
-
}], rowsPerPage: [{
|
|
351
|
-
type: Input
|
|
352
|
-
}] } });
|
|
353
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWxpc3Qtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1saXN0LXZpZXcvcmVzdHdvcmxkLWxpc3Qtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1saXN0LXZpZXcvcmVzdHdvcmxkLWxpc3Qtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUF1QixlQUFlLEVBQWlELE1BQU0sYUFBYSxDQUFDO0FBR2xILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBRzlELE1BQU0sQ0FBTixJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDcEIsMkJBQWEsQ0FBQTtJQUNiLGlDQUFtQixDQUFBO0lBQ25CLGlDQUFtQixDQUFBO0lBQ25CLDJCQUFhLENBQUE7QUFDZixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFhRCxNQUFNLE9BQU8sMEJBQTBCO0lBd0VyQyxZQUNVLFFBQW1DLEVBQ25DLG9CQUF5QyxFQUN6QyxlQUErQixFQUNoQyxlQUFnQztRQUgvQixhQUFRLEdBQVIsUUFBUSxDQUEyQjtRQUNuQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUNoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUF2RWpDLGFBQVEsR0FBYSxFQUFFLENBQUM7UUFTeEIs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LEVBQUUsSUFBSSxDQUFDLENBQUM7d0hBbEVaLDBCQUEwQjs0R0FBMUIsMEJBQTBCLDZJQzNCdkMsNGpHQThEQTs0RkRuQ2EsMEJBQTBCO2tCQUx0QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxTQUFTO29CQUNuQixXQUFXLEVBQUUsc0NBQXNDO29CQUNuRCxTQUFTLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQztpQkFDbkQ7Nk1BUVksUUFBUTtzQkFEbEIsS0FBSztnQkFVSyxPQUFPO3NCQURqQixLQUFLO2dCQVdLLEdBQUc7c0JBRGIsS0FBSztnQkFXQyxXQUFXO3NCQURqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYWdlZExpc3RSZXNvdXJjZSwgUmVzb3VyY2UgfSBmcm9tICdAd2VydHp1aS9uZ3gtaGFsLWNsaWVudCc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgRmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJNZXRhZGF0YSwgTGF6eUxvYWRFdmVudCwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFJFU1R3b3JsZENsaWVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3R3b3JsZC1jbGllbnQnO1xyXG5pbXBvcnQgeyBSRVNUd29ybGRDbGllbnRDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdHdvcmxkLWNsaWVudC1jb2xsZWN0aW9uJztcclxuaW1wb3J0IHsgUHJvYmxlbURldGFpbHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvYmxlbS1kZXRhaWxzJztcclxuaW1wb3J0IHsgQXZhdGFyR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXZhdGFyLWdlbmVyYXRvcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2x1bW5UeXBlIHtcclxuICB0ZXh0ID0gJ3RleHQnLFxyXG4gIG51bWVyaWMgPSAnbnVtZXJpYycsXHJcbiAgYm9vbGVhbiA9ICdib29sZWFuJyxcclxuICBkYXRlID0gJ2RhdGUnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uIHtcclxuICBoZWFkZXI6IHN0cmluZztcclxuICBmaWVsZDogc3RyaW5nO1xyXG4gIHR5cGU6IENvbHVtblR5cGU7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncnctbGlzdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc3R3b3JsZC1saXN0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1saXN0LXZpZXcuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSRVNUd29ybGRMaXN0Vmlld0NvbXBvbmVudCB7XHJcblxyXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcclxuICB9XHJcbiAgcHJpdmF0ZSBfY29sdW1uczogQ29sdW1uW10gPSBbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgZWRpdExpbmsodmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKHZhbHVlKVxyXG4gICAgICB0aGlzLl9lZGl0TGluayA9IHZhbHVlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGVkaXRMaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VkaXRMaW5rO1xyXG4gIH1cclxuICBwcml2YXRlIF9lZGl0TGluayA9ICcvZWRpdCc7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGFwaU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fYXBpTmFtZSA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuYXBpTmFtZSAmJiB0aGlzLnJlbCAmJiB0aGlzLl9sYXN0RXZlbnQpXHJcbiAgICAgIHRoaXMubG9hZCh0aGlzLl9sYXN0RXZlbnQpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGFwaU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9hcGlOYW1lO1xyXG4gIH1cclxuICBwcml2YXRlIF9hcGlOYW1lPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCByZWwodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fcmVsID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5hcGlOYW1lICYmIHRoaXMucmVsICYmIHRoaXMuX2xhc3RFdmVudClcclxuICAgICAgdGhpcy5sb2FkKHRoaXMuX2xhc3RFdmVudCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgcmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVsO1xyXG4gIH1cclxuICBwcml2YXRlIF9yZWw/OiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcm93c1BlclBhZ2U6IG51bWJlcltdO1xyXG4gIHB1YmxpYyByZXNvdXJjZT86IFBhZ2VkTGlzdFJlc291cmNlO1xyXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIF90b3RhbFJlY29yZHMgPSAwO1xyXG4gIHByaXZhdGUgX2xhc3RFdmVudDogTGF6eUxvYWRFdmVudDtcclxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFJlc291cmNlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2U/Ll9lbWJlZGRlZD8uaXRlbXMgfHwgW107XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgcm93cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xhc3RFdmVudD8ucm93cyB8fCAwO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHRvdGFsUmVjb3JkcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUmVjb3JkcztcclxuICB9XHJcbiAgcHJpdmF0ZSBzZXQgdG90YWxSZWNvcmRzKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX3RvdGFsUmVjb3JkcyA9IHZhbHVlIHx8IDA7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgc29ydE9yZGVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xhc3RFdmVudC5zb3J0T3JkZXIgfHwgMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbmV3SHJlZigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2U/LmZpbmRMaW5rKCduZXcnKT8uaHJlZjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF9kYXRlRm9ybWF0ID0gbmV3IERhdGUoMzMzMywgMTAsIDIyKVxyXG4gICAgLnRvTG9jYWxlRGF0ZVN0cmluZygpXHJcbiAgICAucmVwbGFjZShcIjIyXCIsIFwiZGRcIilcclxuICAgIC5yZXBsYWNlKFwiMTFcIiwgXCJNTVwiKVxyXG4gICAgLnJlcGxhY2UoXCIzMzMzXCIsIFwieVwiKVxyXG4gICAgLnJlcGxhY2UoXCIzM1wiLCBcInl5XCIpO1xyXG5cclxuICBwdWJsaWMgZ2V0IGRhdGVGb3JtYXQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBSRVNUd29ybGRMaXN0Vmlld0NvbXBvbmVudC5fZGF0ZUZvcm1hdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfY2xpZW50czogUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvbixcclxuICAgIHByaXZhdGUgX2NvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgYXZhdGFyR2VuZXJhdG9yOiBBdmF0YXJHZW5lcmF0b3IpIHtcclxuICAgIHRoaXMucm93c1BlclBhZ2UgPSBbMTAsIDI1LCA1MF07XHJcblxyXG4gICAgdGhpcy5fbGFzdEV2ZW50ID0ge1xyXG4gICAgICByb3dzOiB0aGlzLnJvd3NQZXJQYWdlWzBdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDbGllbnQoKTogUkVTVHdvcmxkQ2xpZW50IHtcclxuICAgIGlmICghdGhpcy5hcGlOYW1lKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgYSBjbGllbnQsIGJlY2F1c2UgdGhlIGFwaU5hbWUgaXMgbm90IHNldC4nKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50cy5nZXRDbGllbnQodGhpcy5hcGlOYW1lKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkKGV2ZW50OiBMYXp5TG9hZEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSB8fCAhdGhpcy5yZWwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLl9sYXN0RXZlbnQgPSBldmVudDtcclxuXHJcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5jcmVhdGVQYXJhbWV0ZXJzRnJvbUV2ZW50KGV2ZW50KTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKS5nZXRMaXN0KHRoaXMucmVsLCBwYXJhbWV0ZXJzKTtcclxuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSB8fCAhcmVzcG9uc2UuYm9keSkge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiAnRXJyb3Igd2hpbGUgbG9hZGluZyB0aGUgcmVzb3VyY2VzIGZyb20gdGhlIEFQSS4nLCBkYXRhOiByZXNwb25zZSB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHJlc3BvbnNlLmJvZHkpIHtcclxuICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc3BvbnNlLmJvZHk7XHJcbiAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gdGhpcy5yZXNvdXJjZS50b3RhbFBhZ2VzICYmIHBhcmFtZXRlcnMuJHRvcCA/IHRoaXMucmVzb3VyY2UudG90YWxQYWdlcyAqIHBhcmFtZXRlcnMuJHRvcCA6IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5fY29sdW1ucyA9IHRoaXMuY3JlYXRlQ29sdW1ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIHNob3dEZWxldGVDb25maXJtYXRpb01vZGFsKHJlc291cmNlOiBSZXNvdXJjZSkge1xyXG4gICAgdGhpcy5fY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgbWVzc2FnZTogJ0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyByZXNvdXJjZT8nLFxyXG4gICAgICBoZWFkZXI6ICdDb25maXJtIGRlbGV0ZScsXHJcbiAgICAgIGljb246ICdmYXIgZmEtdHJhc2gtYWx0JyxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB0aGlzLmRlbGV0ZShyZXNvdXJjZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZShyZXNvdXJjZTogUmVzb3VyY2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5hcGlOYW1lIHx8ICF0aGlzLnJlbClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuZGVsZXRlKHJlc291cmNlKTtcclxuXHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnRGVsZXRlZCcsIGRldGFpbDogJ1RoZSByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkLicgfSk7XHJcblxyXG4gICAgdGhpcy5sb2FkKHRoaXMuX2xhc3RFdmVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNvbHVtbnMoKTogQ29sdW1uW10ge1xyXG4gICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoID09PSAwKVxyXG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5zO1xyXG5cclxuICAgIC8vIEdldCBhbGwgZGlzdGluY3QgcHJvcGVydGllcyBmcm9tIGFsbCByb3dzXHJcbiAgICAvLyBXZSBsb29rIGF0IGFsbCByb3dzIHRvIGVsaW1pbmF0ZSBwb3NzaWJsZSB1bmRlZmluZWQgdmFsdWVzXHJcbiAgICBjb25zdCByb3dzV2l0aFByb3BlcnRpZXMgPSB0aGlzLnZhbHVlXHJcbiAgICAgIC5tYXAocmVzb3VyY2UgPT5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvdXJjZSlcclxuICAgICAgICAgIC5maWx0ZXIocCA9PlxyXG4gICAgICAgICAgICBwWzBdICE9PSAnX2xpbmtzJyAmJlxyXG4gICAgICAgICAgICBwWzBdICE9PSAnX2VtYmVkZGVkJyAmJlxyXG4gICAgICAgICAgICBwWzBdICE9PSAnaWQnICYmXHJcbiAgICAgICAgICAgIHBbMF0gIT09ICd0aW1lc3RhbXAnKSk7XHJcblxyXG4gICAgY29uc3QgZGlzdGluY3RQcm9wZXJ0aWVzID0gcm93c1dpdGhQcm9wZXJ0aWVzWzBdO1xyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0aWVzT2ZSb3cgb2Ygcm93c1dpdGhQcm9wZXJ0aWVzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllc09mUm93KSB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHlbMF07XHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5WzFdO1xyXG4gICAgICAgIGNvbnN0IGFscmVhZHlGb3VuZFByb3BlcnR5V2l0aFNhbWVOYW1lID0gZGlzdGluY3RQcm9wZXJ0aWVzLmZpbmQocCA9PiBwWzBdID09PSBwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIGlmICghYWxyZWFkeUZvdW5kUHJvcGVydHlXaXRoU2FtZU5hbWUpIC8vIEFkZCBuZXcgcHJvcGVydHlcclxuICAgICAgICAgIGRpc3RpbmN0UHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcclxuICAgICAgICBlbHNlIGlmICghYWxyZWFkeUZvdW5kUHJvcGVydHlXaXRoU2FtZU5hbWVbMV0gJiYgcHJvcGVydHlWYWx1ZSkgLy8gVXNlIGRlZmluZWQgdmFsdWUgaW5zdGVhZCBvZiBleGlzdGluZyB1bmRlZmluZWQgdmFsdWVcclxuICAgICAgICAgIGFscmVhZHlGb3VuZFByb3BlcnR5V2l0aFNhbWVOYW1lWzFdID0gcHJvcGVydHlWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZSByb3dzIGFyZSBlbnRpdGllcyB3aXRoIGNoYW5nZSB0cmFja2luZ1xyXG4gICAgY29uc3Qgd2l0aG91dENoYW5nZVRyYWNraW5nUHJvcGVydGllcyA9IGRpc3RpbmN0UHJvcGVydGllcy5maWx0ZXIocCA9PlxyXG4gICAgICBwWzBdICE9PSAnY3JlYXRlZEF0JyAmJlxyXG4gICAgICBwWzBdICE9PSAnY3JlYXRlZEJ5JyAmJlxyXG4gICAgICBwWzBdICE9PSAnbGFzdENoYW5nZWRBdCcgJiZcclxuICAgICAgcFswXSAhPT0gJ2xhc3RDaGFuZ2VkQnknKTtcclxuICAgIGNvbnN0IGhhc0NoYW5nZVRyYWNraW5nUHJvcGVydGllcyA9IHdpdGhvdXRDaGFuZ2VUcmFja2luZ1Byb3BlcnRpZXMubGVuZ3RoIDwgZGlzdGluY3RQcm9wZXJ0aWVzLmxlbmd0aDtcclxuXHJcbiAgICAvLyBGaXJzdCB0aGUgaWQsIHRoZW4gYWxsIG90aGVyIHByb3BlcnRpZXNcclxuICAgIGNvbnN0IHNvcnRlZFByb3BlcnRpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXHJcbiAgICAgIFsnaWQnLCAwXSxcclxuICAgICAgLi4ud2l0aG91dENoYW5nZVRyYWNraW5nUHJvcGVydGllc1xyXG4gICAgXTtcclxuXHJcbiAgICAvLyBBbmQgY2hhbmdlIHRyYWNraW5nIHByb3BlcnRpZXMgYXQgdGhlIGVuZFxyXG4gICAgaWYgKGhhc0NoYW5nZVRyYWNraW5nUHJvcGVydGllcykge1xyXG4gICAgICBzb3J0ZWRQcm9wZXJ0aWVzLnB1c2goWydjcmVhdGVkQXQnLCBuZXcgRGF0ZSgpXSk7XHJcbiAgICAgIHNvcnRlZFByb3BlcnRpZXMucHVzaChbJ2NyZWF0ZWRCeScsICcnXSk7XHJcbiAgICAgIHNvcnRlZFByb3BlcnRpZXMucHVzaChbJ2xhc3RDaGFuZ2VkQXQnLCBuZXcgRGF0ZSgpXSk7XHJcbiAgICAgIHNvcnRlZFByb3BlcnRpZXMucHVzaChbJ2xhc3RDaGFuZ2VkQnknLCAnJ10pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbHVtbnMgPSBzb3J0ZWRQcm9wZXJ0aWVzXHJcbiAgICAgIC5tYXAocCA9PiAoe1xyXG4gICAgICAgIGhlYWRlcjogUkVTVHdvcmxkTGlzdFZpZXdDb21wb25lbnQudG9UaXRsZUNhc2UocFswXSksXHJcbiAgICAgICAgZmllbGQ6IHBbMF0sXHJcbiAgICAgICAgdHlwZTogUkVTVHdvcmxkTGlzdFZpZXdDb21wb25lbnQuZ2V0Q29sdW1uVHlwZShwWzFdKSxcclxuICAgICAgfSkpO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q29sdW1uVHlwZSh2YWx1ZTogdW5rbm93bik6IENvbHVtblR5cGUge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpXHJcbiAgICAgIHJldHVybiBDb2x1bW5UeXBlLnRleHQ7XHJcblxyXG4gICAgaWYgKF8uaXNOdW1iZXIodmFsdWUpKVxyXG4gICAgICByZXR1cm4gQ29sdW1uVHlwZS5udW1lcmljO1xyXG5cclxuICAgIGlmIChfLmlzRGF0ZSh2YWx1ZSkpXHJcbiAgICAgIHJldHVybiBDb2x1bW5UeXBlLmRhdGU7XHJcblxyXG4gICAgaWYgKF8uaXNTdHJpbmcodmFsdWUpKVxyXG4gICAgICByZXR1cm4gQ29sdW1uVHlwZS50ZXh0O1xyXG5cclxuICAgIGlmIChfLmlzQm9vbGVhbih2YWx1ZSkpXHJcbiAgICAgIHJldHVybiBDb2x1bW5UeXBlLmJvb2xlYW47XHJcblxyXG4gICAgcmV0dXJuIENvbHVtblR5cGUudGV4dDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHRvVGl0bGVDYXNlKGFueUNhc2U6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGFueUNhc2VcclxuICAgICAgLnJlcGxhY2UoLyhfKSsvZywgJyAnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVyc2NvcmUgdG8gd2hpdGVzcGFjZVxyXG4gICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXVthLXpdKS9nLCBcIiQxICQyXCIpICAgICAgICAgICAvLyBpbnNlcnQgc3BhY2UgYmVmb3JlIGVhY2ggbmV3IHdvcmQgaWYgdGhlcmUgaXMgbm9uZVxyXG4gICAgICAucmVwbGFjZSgvKFtBLVpdW2Etel0pKFtBLVpdKS9nLCBcIiQxICQyXCIpICAgICAgICAgICAvLyBpbnNlcnQgc3BhY2UgYWZ0ZXIgZWFjaCB3b3JkIGlmIHRoZXJlIGlzIG5vbmVcclxuICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0rW2Etel0pL2csIFwiJDEgJDJcIikgICAgICAgICAgLy8gaW5zZXJ0IHNwYWNlIGFmdGVyIHNpbmdsZSBsZXR0ZXIgd29yZCBpZiB0aGVyZSBpcyBub25lXHJcbiAgICAgIC5yZXBsYWNlKC8oW0EtWl0rKShbQS1aXVthLXpdW2Etel0pL2csIFwiJDEgJDJcIikgICAgIC8vIGluc2VydCBzcGFjZSBiZWZvcmUgc2luZ2xlIGxldHRlciB3b3JkIGlmIHRoZXJlIGlzIG5vbmVcclxuICAgICAgLnJlcGxhY2UoLyhbYS16XSspKFtBLVowLTldKykvZywgXCIkMSAkMlwiKSAgICAgICAgICAgLy8gaW5zZXJ0IHNwYWNlIGFmdGVyIG51bWJlcnNcclxuICAgICAgLnJlcGxhY2UoL14uLywgKG1hdGNoKSA9PiBtYXRjaC50b1VwcGVyQ2FzZSgpKTsgICAgIC8vIGNoYW5nZSBmaXJzdCBsZXR0ZXIgdG8gYmUgdXBwZXIgY2FzZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVQYXJhbWV0ZXJzRnJvbUV2ZW50KGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XHJcbiAgICBjb25zdCBvRGF0YVBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICRmaWx0ZXI6IHRoaXMuY3JlYXRlRmlsdGVyRnJvbUV2ZW50KGV2ZW50KSxcclxuICAgICAgJG9yZGVyYnk6IFJFU1R3b3JsZExpc3RWaWV3Q29tcG9uZW50LmNyZWF0ZU9yZGVyQnlGcm9tRXZlbnQoZXZlbnQpLFxyXG4gICAgICAkdG9wOiBSRVNUd29ybGRMaXN0Vmlld0NvbXBvbmVudC5jcmVhdGVUb3BGcm9tRXZlbnQoZXZlbnQpLFxyXG4gICAgICAkc2tpcDogUkVTVHdvcmxkTGlzdFZpZXdDb21wb25lbnQuY3JlYXRlU2tpcEZyb21FdmVudChldmVudClcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG9EYXRhUGFyYW1ldGVycztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVTa2lwRnJvbUV2ZW50KGV2ZW50OiBMYXp5TG9hZEV2ZW50KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBldmVudC5maXJzdDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVUb3BGcm9tRXZlbnQoZXZlbnQ6IExhenlMb2FkRXZlbnQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGV2ZW50LnJvd3M7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlT3JkZXJCeUZyb21FdmVudChldmVudDogTGF6eUxvYWRFdmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoZXZlbnQuc29ydEZpZWxkKSB7XHJcbiAgICAgIGNvbnN0IG9yZGVyID0gIWV2ZW50LnNvcnRPcmRlciB8fCBldmVudC5zb3J0T3JkZXIgPiAwID8gJ2FzYycgOiAnZGVzYyc7XHJcbiAgICAgIHJldHVybiBgJHtldmVudC5zb3J0RmllbGR9ICR7b3JkZXJ9YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJGcm9tRXZlbnQoZXZlbnQ6IExhenlMb2FkRXZlbnQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFldmVudC5maWx0ZXJzKVxyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlciA9IE9iamVjdC5lbnRyaWVzKGV2ZW50LmZpbHRlcnMpXHJcbiAgICAgIC8vIFRoZSB0eXBlIGRlZmluaXRpb24gaXMgd3JvbmcsIGV2ZW50LmZpbHRlcnMgaGFzIHZhbHVlcyBvZiB0eXBlIEZpbHRlck1ldGFkYXRhW10gYW5kIG5vdCBGaWx0ZXJNZXRhZGF0YS5cclxuICAgICAgLm1hcCgoW3Byb3BlcnR5LCBmaWx0ZXJdKSA9PiAoeyBwcm9wZXJ0eTogcHJvcGVydHksIGZpbHRlcnM6IGZpbHRlciBhcyBGaWx0ZXJNZXRhZGF0YVtdIH0pKVxyXG4gICAgICAubWFwKGYgPT4gdGhpcy5jcmVhdGVGaWx0ZXJGb3JQcm9wZXJ0eUFycmF5KGYucHJvcGVydHksIGYuZmlsdGVycykpXHJcbiAgICAgIC5maWx0ZXIoZiA9PiAhIWYpXHJcbiAgICAgIC5qb2luKCcgYW5kICcpO1xyXG5cclxuICAgIGlmIChmaWx0ZXIgPT09ICcnKVxyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIHJldHVybiBgKCR7ZmlsdGVyfSlgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJGb3JQcm9wZXJ0eUFycmF5KHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlcnM6IEZpbHRlck1ldGFkYXRhW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZmlsdGVyID0gZmlsdGVyc1xyXG4gICAgICAubWFwKGYgPT4gdGhpcy5jcmVhdGVGaWx0ZXJGb3JQcm9wZXJ0eShwcm9wZXJ0eSwgZikpXHJcbiAgICAgIC5maWx0ZXIoZiA9PiAhIWYpXHJcbiAgICAgIC5qb2luKGAgJHtmaWx0ZXJzWzBdLm9wZXJhdG9yfSBgKTtcclxuXHJcbiAgICBpZiAoZmlsdGVyID09PSAnJylcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICByZXR1cm4gYCgke2ZpbHRlcn0pYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyRm9yUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgZmlsdGVyOiBGaWx0ZXJNZXRhZGF0YSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIWZpbHRlci52YWx1ZSlcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCBvRGF0YU9wZXJhdG9yID0gUkVTVHdvcmxkTGlzdFZpZXdDb21wb25lbnQuY3JlYXRlT0RhdGFPcGVyYXRvcihcclxuICAgICAgZmlsdGVyLm1hdGNoTW9kZSxcclxuICAgICk7XHJcbiAgICBjb25zdCBjb21wYXJpc29uVmFsdWUgPSB0aGlzLmNyZWF0ZUNvbXBhcmlzb25WYWx1ZShwcm9wZXJ0eSwgZmlsdGVyLnZhbHVlKTtcclxuXHJcbiAgICBzd2l0Y2ggKG9EYXRhT3BlcmF0b3IpIHtcclxuICAgICAgY2FzZSAnY29udGFpbnMnOlxyXG4gICAgICBjYXNlICdub3QgY29udGFpbnMnOlxyXG4gICAgICBjYXNlICdzdGFydHN3aXRoJzpcclxuICAgICAgY2FzZSAnZW5kc3dpdGgnOlxyXG4gICAgICAgIHJldHVybiBgJHtvRGF0YU9wZXJhdG9yfSgke3Byb3BlcnR5fSwgJHtjb21wYXJpc29uVmFsdWV9KWA7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGAke3Byb3BlcnR5fSAke29EYXRhT3BlcmF0b3J9ICR7Y29tcGFyaXNvblZhbHVlfWA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVPRGF0YU9wZXJhdG9yKG1hdGNoTW9kZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKG1hdGNoTW9kZSkge1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5TVEFSVFNfV0lUSDpcclxuICAgICAgICByZXR1cm4gJ3N0YXJ0c3dpdGgnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5DT05UQUlOUzpcclxuICAgICAgICByZXR1cm4gJ2NvbnRhaW5zJztcclxuICAgICAgY2FzZSBGaWx0ZXJNYXRjaE1vZGUuTk9UX0NPTlRBSU5TOlxyXG4gICAgICAgIHJldHVybiAnbm90IGNvbnRhaW5zJztcclxuICAgICAgY2FzZSBGaWx0ZXJNYXRjaE1vZGUuRU5EU19XSVRIOlxyXG4gICAgICAgIHJldHVybiAnZW5kc3dpdGgnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5FUVVBTFM6XHJcbiAgICAgICAgcmV0dXJuICdlcSc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLk5PVF9FUVVBTFM6XHJcbiAgICAgICAgcmV0dXJuICduZSc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLklOOlxyXG4gICAgICAgIHJldHVybiAnaW4nO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5MRVNTX1RIQU46XHJcbiAgICAgICAgcmV0dXJuICdsdCc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLkxFU1NfVEhBTl9PUl9FUVVBTF9UTzpcclxuICAgICAgICByZXR1cm4gJ2xlJztcclxuICAgICAgY2FzZSBGaWx0ZXJNYXRjaE1vZGUuR1JFQVRFUl9USEFOOlxyXG4gICAgICAgIHJldHVybiAnZ3QnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE86XHJcbiAgICAgICAgcmV0dXJuICdnZSc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLklTOlxyXG4gICAgICAgIHJldHVybiAnZXEnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5JU19OT1Q6XHJcbiAgICAgICAgcmV0dXJuICduZSc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLkJFRk9SRTpcclxuICAgICAgICByZXR1cm4gJ2x0JztcclxuICAgICAgY2FzZSBGaWx0ZXJNYXRjaE1vZGUuQUZURVI6XHJcbiAgICAgICAgcmV0dXJuICdndCc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLkRBVEVfQUZURVI6XHJcbiAgICAgICAgcmV0dXJuICdnZSc7XHJcbiAgICAgIGNhc2UgRmlsdGVyTWF0Y2hNb2RlLkRBVEVfQkVGT1JFOlxyXG4gICAgICAgIHJldHVybiAnbHQnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5EQVRFX0lTOlxyXG4gICAgICAgIHJldHVybiAnZXEnO1xyXG4gICAgICBjYXNlIEZpbHRlck1hdGNoTW9kZS5EQVRFX0lTX05PVDpcclxuICAgICAgICByZXR1cm4gJ25lJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBtYXRjaE1vZGUgJHttYXRjaE1vZGV9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNvbXBhcmlzb25WYWx1ZShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgcmV0dXJuICdudWxsJztcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMuZmllbGQgPT09IHByb3BlcnR5KTtcclxuICAgIGlmIChjb2x1bW5zLmxlbmd0aCAhPT0gMSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB0aGUgY29sdW1uIGZvciB0aGUgcHJvcGVydHkgJHtwcm9wZXJ0eX0gd2hpY2ggaXMgc3BlY2lmaWVkIGluIHRoZSBmaWx0ZXIuYCk7XHJcblxyXG4gICAgY29uc3QgdHlwZSA9IGNvbHVtbnNbMF0udHlwZTtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBDb2x1bW5UeXBlLmJvb2xlYW46XHJcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XHJcbiAgICAgIGNhc2UgQ29sdW1uVHlwZS5kYXRlOlxyXG4gICAgICAgIHJldHVybiBgY2FzdCgkeyh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpfSwgRWRtLkRhdGVUaW1lT2Zmc2V0KWA7XHJcbiAgICAgIGNhc2UgQ29sdW1uVHlwZS5udW1lcmljOlxyXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xyXG4gICAgICBjYXNlIENvbHVtblR5cGUudGV4dDpcclxuICAgICAgICByZXR1cm4gYCcke3ZhbHVlfSdgO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb2x1bW4gdHlwZSAnJHt0eXBlfSdgKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPHAtdGFibGUgW3ZhbHVlXT1cInZhbHVlXCJcclxuICAgICAgICAgW2xhenldPVwidHJ1ZVwiXHJcbiAgICAgICAgIFtsYXp5TG9hZE9uSW5pdF09XCJmYWxzZVwiXHJcbiAgICAgICAgIChvbkxhenlMb2FkKT1cImxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxyXG4gICAgICAgICBbcm93c109XCJyb3dzXCJcclxuICAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dzUGVyUGFnZVwiXHJcbiAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcclxuICAgICAgICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgW3Nob3dJbml0aWFsU29ydEJhZGdlXT1cInRydWVcIlxyXG4gICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCI+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgIDx0cj5cclxuICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmZpZWxkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInAtZC1mbGV4IHAtamMtYmV0d2VlbiBwLWFpLWNlbnRlclwiPlxyXG4gICAgICAgICAge3tjb2wuaGVhZGVyfX1cclxuICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wuZmllbGRcIj48L3Atc29ydEljb24+XHJcbiAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgW3R5cGVdPVwiY29sLnR5cGVcIiBbZmllbGRdPVwiY29sLmZpZWxkXCIgZGlzcGxheT1cIm1lbnVcIj48L3AtY29sdW1uRmlsdGVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3RoPlxyXG4gICAgICA8dGg+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIiBwVG9vbHRpcD1cIkNyZWF0ZSBuZXdcIiB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCI+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwicC1idXR0b24tc3VjY2Vzc1wiIGljb249XCJmYXMgZmEtcGx1c1wiIHBCdXR0b24gW3JvdXRlckxpbmtdPVwiWycvZWRpdCcsIGFwaU5hbWUsIG5ld0hyZWZdXCI+PC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGg+XHJcbiAgICA8L3RyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWVudGl0eSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cclxuICAgIDx0cj5cclxuICAgICAgPHRkIFtuZ1N3aXRjaF09XCJjb2wudHlwZVwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiPlxyXG4gICAgICAgICAgPHAtYXZhdGFyICpuZ0lmPVwiY29sLmZpZWxkID09PSAnY3JlYXRlZEJ5JyB8fCBjb2wuZmllbGQgPT09ICdsYXN0Q2hhbmdlZEJ5J1wiIFtwVG9vbHRpcF09XCJlbnRpdHlbY29sLmZpZWxkXVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIFtpbWFnZV09XCJhdmF0YXJHZW5lcmF0b3IuZ2V0SW1hZ2UoZW50aXR5W2NvbC5maWVsZF0pXCIgW2xhYmVsXT1cImF2YXRhckdlbmVyYXRvci5nZXRMYWJlbChlbnRpdHlbY29sLmZpZWxkXSlcIiBbc3R5bGVdPVwiYXZhdGFyR2VuZXJhdG9yLmdldFN0eWxlKGVudGl0eVtjb2wuZmllbGRdKVwiIHNoYXBlPVwiY2lyY2xlXCI+PC9wLWF2YXRhcj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sLmZpZWxkICE9PSAnY3JlYXRlZEJ5JyAmJiBjb2wuZmllbGQgIT09ICdsYXN0Q2hhbmdlZEJ5J1wiPnt7ZW50aXR5W2NvbC5maWVsZF19fTwvc3Bhbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ251bWVyaWMnXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj57e2VudGl0eVtjb2wuZmllbGRdfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidib29sZWFuJ1wiIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+PHAtdHJpU3RhdGVDaGVja2JveCBbKG5nTW9kZWwpXT1cImVudGl0eVtjb2wuZmllbGRdXCIgW3JlYWRvbmx5XT1cInRydWVcIj48L3AtdHJpU3RhdGVDaGVja2JveD48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiIFtwVG9vbHRpcF09XCJlbnRpdHlbY29sLmZpZWxkXVwiPnt7ZW50aXR5W2NvbC5maWVsZF0gfCBkYXRlOmRhdGVGb3JtYXR9fTwvc3Bhbj5cclxuICAgICAgPC90ZD5cclxuICAgICAgPHRkPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgIDxhIHBCdXR0b24gcFRvb2x0aXA9XCJWaWV3L0VkaXRcIiB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCIgW3JvdXRlckxpbmtdPVwiW2VkaXRMaW5rLCBhcGlOYW1lLCBlbnRpdHkuX2xpbmtzPy5zZWxmWzBdLmhyZWZdXCIgaWNvbj1cImZhcyBmYS1lZGl0XCI+PC9hPlxyXG4gICAgICAgICAgPGJ1dHRvbiBwVG9vbHRpcD1cIkRlbGV0ZVwiIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIiBwQnV0dG9uICpuZ0lmPVwiZW50aXR5Ll9saW5rcy5kZWxldGVcIiAoY2xpY2spPVwic2hvd0RlbGV0ZUNvbmZpcm1hdGlvTW9kYWwoZW50aXR5KVwiIGljb249XCJmYXMgZmEtdHJhc2gtYWx0XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibXgtMiBwLWJ1dHRvbi1kYW5nZXJcIj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC90ZD5cclxuICAgIDwvdHI+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgPHRyPlxyXG4gICAgICA8dGQgY29sc3Bhbj1cIjhcIj5ObyBlbnRyaWVzIGZvdW5kLjwvdGQ+XHJcbiAgICA8L3RyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG48L3AtdGFibGU+XHJcblxyXG48cC10b2FzdD48L3AtdG9hc3Q+XHJcbjxwLWNvbmZpcm1EaWFsb2c+PC9wLWNvbmZpcm1EaWFsb2c+XHJcbiJdfQ==
|