@wertzui/ngx-restworld-client 4.3.0 → 5.0.0

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.
Files changed (26) hide show
  1. package/esm2020/lib/pipes/as.pipe.mjs +3 -3
  2. package/esm2020/lib/pipes/safe-url.pipe.mjs +3 -3
  3. package/esm2020/lib/restworld-client.module.mjs +36 -38
  4. package/esm2020/lib/services/avatar-generator.mjs +4 -4
  5. package/esm2020/lib/services/form.service.mjs +9 -9
  6. package/esm2020/lib/services/restworld-client-collection.mjs +3 -3
  7. package/esm2020/lib/services/settings.service.mjs +3 -3
  8. package/esm2020/lib/views/restworld-edit-form/restworld-edit-form.component.mjs +29 -26
  9. package/esm2020/lib/views/restworld-edit-view/restworld-edit-view.component.mjs +16 -16
  10. package/esm2020/lib/views/restworld-file-view/restworld-file-view.component.mjs +8 -8
  11. package/esm2020/lib/views/restworld-image-view/restworld-image-view.component.mjs +14 -14
  12. package/esm2020/lib/views/restworld-list-view/restworld-list-view.component.mjs +13 -13
  13. package/fesm2015/wertzui-ngx-restworld-client.mjs +130 -129
  14. package/fesm2015/wertzui-ngx-restworld-client.mjs.map +1 -1
  15. package/fesm2020/wertzui-ngx-restworld-client.mjs +130 -129
  16. package/fesm2020/wertzui-ngx-restworld-client.mjs.map +1 -1
  17. package/{wertzui-ngx-restworld-client.d.ts → index.d.ts} +0 -0
  18. package/lib/pipes/as.pipe.d.ts +1 -1
  19. package/lib/pipes/safe-url.pipe.d.ts +1 -1
  20. package/lib/services/form.service.d.ts +5 -5
  21. package/lib/views/restworld-edit-form/restworld-edit-form.component.d.ts +13 -8
  22. package/lib/views/restworld-edit-view/restworld-edit-view.component.d.ts +4 -4
  23. package/lib/views/restworld-file-view/restworld-file-view.component.d.ts +1 -1
  24. package/lib/views/restworld-image-view/restworld-image-view.component.d.ts +1 -1
  25. package/lib/views/restworld-list-view/restworld-list-view.component.d.ts +1 -1
  26. package/package.json +24 -24
@@ -1,6 +1,6 @@
1
1
  import { Component, Input } from '@angular/core';
2
2
  import { PropertyType } from '@wertzui/ngx-hal-client';
3
- import { FormArray, FormGroup } from '@angular/forms';
3
+ import { UntypedFormArray, UntypedFormGroup } from '@angular/forms';
4
4
  import { ProblemDetails } from '../../models/problem-details';
5
5
  import { ContentChild } from '@angular/core';
6
6
  import * as i0 from "@angular/core";
@@ -10,15 +10,15 @@ import * as i3 from "@angular/common";
10
10
  import * as i4 from "@angular/router";
11
11
  import * as i5 from "../../services/form.service";
12
12
  import * as i6 from "ngx-valdemort";
13
- import * as i7 from "primeng/tabview";
14
- import * as i8 from "primeng/skeleton";
15
- import * as i9 from "../restworld-edit-form/restworld-edit-form.component";
16
- import * as i10 from "primeng/progressspinner";
17
- import * as i11 from "primeng/toast";
18
- import * as i12 from "primeng/confirmdialog";
19
- import * as i13 from "@angular/forms";
20
- import * as i14 from "primeng/button";
21
- import * as i15 from "primeng/ripple";
13
+ import * as i7 from "@angular/forms";
14
+ import * as i8 from "primeng/button";
15
+ import * as i9 from "primeng/confirmdialog";
16
+ import * as i10 from "primeng/toast";
17
+ import * as i11 from "primeng/tabview";
18
+ import * as i12 from "primeng/skeleton";
19
+ import * as i13 from "primeng/progressspinner";
20
+ import * as i14 from "primeng/ripple";
21
+ import * as i15 from "../restworld-edit-form/restworld-edit-form.component";
22
22
  export class RESTworldEditViewComponent {
23
23
  constructor(_clients, _confirmationService, _messageService, _location, _router, _formService, valdemortConfig) {
24
24
  this._clients = _clients;
@@ -144,9 +144,9 @@ export class RESTworldEditViewComponent {
144
144
  this.isLoading = false;
145
145
  }
146
146
  static getSubControl(control, pathElement) {
147
- if (control instanceof FormGroup)
147
+ if (control instanceof UntypedFormGroup)
148
148
  return control.controls[pathElement];
149
- if (control instanceof FormArray) {
149
+ if (control instanceof UntypedFormArray) {
150
150
  const index = Number.parseInt(pathElement);
151
151
  if (Number.isInteger(index))
152
152
  return control.controls[index];
@@ -239,9 +239,9 @@ export class RESTworldEditViewComponent {
239
239
  reader.readAsDataURL(file);
240
240
  }
241
241
  }
242
- RESTworldEditViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTworldEditViewComponent, deps: [{ token: i1.RESTworldClientCollection }, { token: i2.ConfirmationService }, { token: i2.MessageService }, { token: i3.Location }, { token: i4.Router }, { token: i5.FormService }, { token: i6.ValdemortConfig }], target: i0.ɵɵFactoryTarget.Component });
243
- RESTworldEditViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: RESTworldEditViewComponent, selector: "rw-edit", inputs: { apiName: "apiName", uri: "uri" }, queries: [{ propertyName: "extraTabsRef", first: true, predicate: ["extraTabs"], descendants: true }, { propertyName: "buttonsRef", first: true, predicate: ["buttons"], descendants: true }, { propertyName: "inputOptionsSingleRef", first: true, predicate: ["inputOptionsSingle"], descendants: true }, { propertyName: "inputOptionsMultipleRef", first: true, predicate: ["inputOptionsMultiple"], descendants: true }, { propertyName: "inputOptionsRef", first: true, predicate: ["inputOptions"], descendants: true }, { propertyName: "inputHiddenRef", first: true, predicate: ["inputHidden"], descendants: true }, { propertyName: "inputTextRef", first: true, predicate: ["inputText"], descendants: true }, { propertyName: "inputTextareaRef", first: true, predicate: ["inputTextarea"], descendants: true }, { propertyName: "inputSearchRef", first: true, predicate: ["inputSearch"], descendants: true }, { propertyName: "inputTelRef", first: true, predicate: ["inputTel"], descendants: true }, { propertyName: "inputUrlRef", first: true, predicate: ["inputUrl"], descendants: true }, { propertyName: "inputEmailRef", first: true, predicate: ["inputEmail"], descendants: true }, { propertyName: "inputPasswordRef", first: true, predicate: ["inputPassword"], descendants: true }, { propertyName: "inputDateRef", first: true, predicate: ["inputDate"], descendants: true }, { propertyName: "inputMonthRef", first: true, predicate: ["inputMonth"], descendants: true }, { propertyName: "inputWeekRef", first: true, predicate: ["inputWeek"], descendants: true }, { propertyName: "inputTimeRef", first: true, predicate: ["inputTime"], descendants: true }, { propertyName: "inputDatetimeLocalRef", first: true, predicate: ["inputDatetimeLocal"], descendants: true }, { propertyName: "inputNumberRef", first: true, predicate: ["inputNumber"], descendants: true }, { propertyName: "inputRangeRef", first: true, predicate: ["inputRange"], descendants: true }, { propertyName: "inputColorRef", first: true, predicate: ["inputColor"], descendants: true }, { propertyName: "inputBoolRef", first: true, predicate: ["inputBool"], descendants: true }, { propertyName: "inputDatetimeOffsetRef", first: true, predicate: ["inputDatetimeOffset"], descendants: true }, { propertyName: "inputDurationRef", first: true, predicate: ["inputDuration"], descendants: true }, { propertyName: "inputImageRef", first: true, predicate: ["inputImage"], descendants: true }, { propertyName: "inputFileRef", first: true, predicate: ["inputFile"], descendants: true }, { propertyName: "inputDefaultRef", first: true, predicate: ["inputDefault"], descendants: true }], ngImport: i0, template: "<div class=\"grid\">\r\n <div class=\"col\">\r\n <h1>Edit resource</h1>\r\n </div>\r\n</div>\r\n\r\n<p-tabView>\r\n\r\n <p-tabPanel *ngIf=\"isLoadingForTheFirstTime\" header=\"Loading\">\r\n <div *ngFor=\"let i of [1, 2, 3, 4, 5]\" class=\"grid field\">\r\n <p-skeleton class=\"col-12 mb-2 md:col-2 md:mb-0\" height=\"39px\"></p-skeleton>\r\n <div class=\"col-12 md:col-10\">\r\n <p-skeleton class=\"w-full\" height=\"39px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n\r\n <p-tabPanel *ngFor=\"let item of templates | keyvalue\" [header]=\"item.value.title || item.key\" [disabled]=\"isLoading\">\r\n <form [formGroup]=\"formTabs[item.key]\" (ngSubmit)=\"submit(item.key, item.value, formTabs[item.key].value)\">\r\n <div class=\"blockable-container\">\r\n <div class=\"blockable-element\">\r\n <rw-form [formGroup]=\"formTabs[item.key]\" [template]=\"item.value\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n <div class=\"blockable-overlay\" *ngIf=\"isLoading\">\r\n <p-progressSpinner></p-progressSpinner>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <ng-template #defaultButtons>\r\n <button pButton pRipple type=\"submit\" label=\"Save\" icon=\"far fa-save\" class=\"mx-2 p-button-success\" [disabled]=\"isLoading || !canSubmit(item.key)\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Reload\" icon=\"fas fa-redo\" class=\"mx-2 p-button-info\" (click)=\"load()\" [disabled]=\"isLoading\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Delete\" icon=\"far fa-trash-alt\" class=\"ml-2 p-button-danger\" (click)=\"showDeleteConfirmatioModal()\" [disabled]=\"!resource || isLoading || !canDelete\"></button>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"buttonsRef || defaultButtons\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </p-tabPanel>\r\n\r\n <ng-template #defaultExtraTabs>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"extraTabsRef || defaultExtraTabs\"></ng-container>\r\n\r\n</p-tabView>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n", styles: ["::ng-deep .p-tooltip{max-width:-moz-fit-content!important;max-width:fit-content!important}.blockable-container{display:grid;place-items:center;grid-template-areas:\"inner\"}.blockable-element{grid-area:inner;width:100%}.blockable-overlay{grid-area:inner;height:100%;width:100%;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1}.field.grid>label.hasChildren{border-right:1px solid rgba(0,0,0,.1)}\n"], components: [{ type: i7.TabView, selector: "p-tabView", inputs: ["orientation", "style", "styleClass", "controlClose", "scrollable", "activeIndex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { type: i7.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { type: i8.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { type: i9.RestworldEditFormComponent, selector: "rw-form", inputs: ["formGroup", "template", "apiName"] }, { type: i10.ProgressSpinner, selector: "p-progressSpinner", inputs: ["style", "styleClass", "strokeWidth", "fill", "animationDuration"] }, { type: i11.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { type: i12.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: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i13.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i13.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i14.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i15.Ripple, selector: "[pRipple]" }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "keyvalue": i3.KeyValuePipe } });
244
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTworldEditViewComponent, decorators: [{
242
+ RESTworldEditViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: RESTworldEditViewComponent, deps: [{ token: i1.RESTworldClientCollection }, { token: i2.ConfirmationService }, { token: i2.MessageService }, { token: i3.Location }, { token: i4.Router }, { token: i5.FormService }, { token: i6.ValdemortConfig }], target: i0.ɵɵFactoryTarget.Component });
243
+ RESTworldEditViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.9", type: RESTworldEditViewComponent, selector: "rw-edit", inputs: { apiName: "apiName", uri: "uri" }, queries: [{ propertyName: "extraTabsRef", first: true, predicate: ["extraTabs"], descendants: true }, { propertyName: "buttonsRef", first: true, predicate: ["buttons"], descendants: true }, { propertyName: "inputOptionsSingleRef", first: true, predicate: ["inputOptionsSingle"], descendants: true }, { propertyName: "inputOptionsMultipleRef", first: true, predicate: ["inputOptionsMultiple"], descendants: true }, { propertyName: "inputOptionsRef", first: true, predicate: ["inputOptions"], descendants: true }, { propertyName: "inputHiddenRef", first: true, predicate: ["inputHidden"], descendants: true }, { propertyName: "inputTextRef", first: true, predicate: ["inputText"], descendants: true }, { propertyName: "inputTextareaRef", first: true, predicate: ["inputTextarea"], descendants: true }, { propertyName: "inputSearchRef", first: true, predicate: ["inputSearch"], descendants: true }, { propertyName: "inputTelRef", first: true, predicate: ["inputTel"], descendants: true }, { propertyName: "inputUrlRef", first: true, predicate: ["inputUrl"], descendants: true }, { propertyName: "inputEmailRef", first: true, predicate: ["inputEmail"], descendants: true }, { propertyName: "inputPasswordRef", first: true, predicate: ["inputPassword"], descendants: true }, { propertyName: "inputDateRef", first: true, predicate: ["inputDate"], descendants: true }, { propertyName: "inputMonthRef", first: true, predicate: ["inputMonth"], descendants: true }, { propertyName: "inputWeekRef", first: true, predicate: ["inputWeek"], descendants: true }, { propertyName: "inputTimeRef", first: true, predicate: ["inputTime"], descendants: true }, { propertyName: "inputDatetimeLocalRef", first: true, predicate: ["inputDatetimeLocal"], descendants: true }, { propertyName: "inputNumberRef", first: true, predicate: ["inputNumber"], descendants: true }, { propertyName: "inputRangeRef", first: true, predicate: ["inputRange"], descendants: true }, { propertyName: "inputColorRef", first: true, predicate: ["inputColor"], descendants: true }, { propertyName: "inputBoolRef", first: true, predicate: ["inputBool"], descendants: true }, { propertyName: "inputDatetimeOffsetRef", first: true, predicate: ["inputDatetimeOffset"], descendants: true }, { propertyName: "inputDurationRef", first: true, predicate: ["inputDuration"], descendants: true }, { propertyName: "inputImageRef", first: true, predicate: ["inputImage"], descendants: true }, { propertyName: "inputFileRef", first: true, predicate: ["inputFile"], descendants: true }, { propertyName: "inputDefaultRef", first: true, predicate: ["inputDefault"], descendants: true }], ngImport: i0, template: "<div class=\"grid\">\r\n <div class=\"col\">\r\n <h1>Edit resource</h1>\r\n </div>\r\n</div>\r\n\r\n<p-tabView>\r\n\r\n <p-tabPanel *ngIf=\"isLoadingForTheFirstTime\" header=\"Loading\">\r\n <div *ngFor=\"let i of [1, 2, 3, 4, 5]\" class=\"grid field\">\r\n <p-skeleton class=\"col-12 mb-2 md:col-2 md:mb-0\" height=\"39px\"></p-skeleton>\r\n <div class=\"col-12 md:col-10\">\r\n <p-skeleton class=\"w-full\" height=\"39px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n\r\n <p-tabPanel *ngFor=\"let item of templates | keyvalue\" [header]=\"item.value.title || item.key\" [disabled]=\"isLoading\">\r\n <form [formGroup]=\"formTabs[item.key]\" (ngSubmit)=\"submit(item.key, item.value, formTabs[item.key].value)\">\r\n <div class=\"blockable-container\">\r\n <div class=\"blockable-element\">\r\n <rw-form [formGroup]=\"formTabs[item.key]\" [template]=\"item.value\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n <div class=\"blockable-overlay\" *ngIf=\"isLoading\">\r\n <p-progressSpinner></p-progressSpinner>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <ng-template #defaultButtons>\r\n <button pButton pRipple type=\"submit\" label=\"Save\" icon=\"far fa-save\" class=\"mx-2 p-button-success\" [disabled]=\"isLoading || !canSubmit(item.key)\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Reload\" icon=\"fas fa-redo\" class=\"mx-2 p-button-info\" (click)=\"load()\" [disabled]=\"isLoading\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Delete\" icon=\"far fa-trash-alt\" class=\"ml-2 p-button-danger\" (click)=\"showDeleteConfirmatioModal()\" [disabled]=\"!resource || isLoading || !canDelete\"></button>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"buttonsRef || defaultButtons\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </p-tabPanel>\r\n\r\n <ng-template #defaultExtraTabs>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"extraTabsRef || defaultExtraTabs\"></ng-container>\r\n\r\n</p-tabView>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n", styles: ["::ng-deep .p-tooltip{max-width:-moz-fit-content!important;max-width:fit-content!important}.blockable-container{display:grid;place-items:center;grid-template-areas:\"inner\"}.blockable-element{grid-area:inner;width:100%}.blockable-overlay{grid-area:inner;height:100%;width:100%;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1}.field.grid>label.hasChildren{border-right:1px solid rgba(0,0,0,.1)}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i9.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"] }, { kind: "component", type: i10.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: i11.TabView, selector: "p-tabView", inputs: ["orientation", "style", "styleClass", "controlClose", "scrollable", "activeIndex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i11.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: i12.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["style", "styleClass", "strokeWidth", "fill", "animationDuration"] }, { kind: "directive", type: i14.Ripple, selector: "[pRipple]" }, { kind: "component", type: i15.RestworldEditFormComponent, selector: "rw-form", inputs: ["formGroup", "template", "apiName"] }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }] });
244
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: RESTworldEditViewComponent, decorators: [{
245
245
  type: Component,
246
246
  args: [{ selector: 'rw-edit', template: "<div class=\"grid\">\r\n <div class=\"col\">\r\n <h1>Edit resource</h1>\r\n </div>\r\n</div>\r\n\r\n<p-tabView>\r\n\r\n <p-tabPanel *ngIf=\"isLoadingForTheFirstTime\" header=\"Loading\">\r\n <div *ngFor=\"let i of [1, 2, 3, 4, 5]\" class=\"grid field\">\r\n <p-skeleton class=\"col-12 mb-2 md:col-2 md:mb-0\" height=\"39px\"></p-skeleton>\r\n <div class=\"col-12 md:col-10\">\r\n <p-skeleton class=\"w-full\" height=\"39px\"></p-skeleton>\r\n </div>\r\n </div>\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n <p-skeleton width=\"120px\" height=\"39px\" class=\"mx-2\"></p-skeleton>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n\r\n <p-tabPanel *ngFor=\"let item of templates | keyvalue\" [header]=\"item.value.title || item.key\" [disabled]=\"isLoading\">\r\n <form [formGroup]=\"formTabs[item.key]\" (ngSubmit)=\"submit(item.key, item.value, formTabs[item.key].value)\">\r\n <div class=\"blockable-container\">\r\n <div class=\"blockable-element\">\r\n <rw-form [formGroup]=\"formTabs[item.key]\" [template]=\"item.value\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n <div class=\"blockable-overlay\" *ngIf=\"isLoading\">\r\n <p-progressSpinner></p-progressSpinner>\r\n </div>\r\n </div>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col\">\r\n <div class=\"flex justify-content-end w-full\">\r\n <ng-template #defaultButtons>\r\n <button pButton pRipple type=\"submit\" label=\"Save\" icon=\"far fa-save\" class=\"mx-2 p-button-success\" [disabled]=\"isLoading || !canSubmit(item.key)\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Reload\" icon=\"fas fa-redo\" class=\"mx-2 p-button-info\" (click)=\"load()\" [disabled]=\"isLoading\"></button>\r\n <button pButton pRipple type=\"button\" label=\"Delete\" icon=\"far fa-trash-alt\" class=\"ml-2 p-button-danger\" (click)=\"showDeleteConfirmatioModal()\" [disabled]=\"!resource || isLoading || !canDelete\"></button>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"buttonsRef || defaultButtons\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </p-tabPanel>\r\n\r\n <ng-template #defaultExtraTabs>\r\n </ng-template>\r\n <ng-container *ngTemplateOutlet=\"extraTabsRef || defaultExtraTabs\"></ng-container>\r\n\r\n</p-tabView>\r\n\r\n<p-toast></p-toast>\r\n<p-confirmDialog></p-confirmDialog>\r\n", styles: ["::ng-deep .p-tooltip{max-width:-moz-fit-content!important;max-width:fit-content!important}.blockable-container{display:grid;place-items:center;grid-template-areas:\"inner\"}.blockable-element{grid-area:inner;width:100%}.blockable-overlay{grid-area:inner;height:100%;width:100%;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1}.field.grid>label.hasChildren{border-right:1px solid rgba(0,0,0,.1)}\n"] }]
247
247
  }], ctorParameters: function () { return [{ type: i1.RESTworldClientCollection }, { type: i2.ConfirmationService }, { type: i2.MessageService }, { type: i3.Location }, { type: i4.Router }, { type: i5.FormService }, { type: i6.ValdemortConfig }]; }, propDecorators: { apiName: [{
@@ -330,4 +330,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImpor
330
330
  type: ContentChild,
331
331
  args: ['inputDefault', { static: false }]
332
332
  }] } });
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWVkaXQtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LXZpZXcvcmVzdHdvcmxkLWVkaXQtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LXZpZXcvcmVzdHdvcmxkLWVkaXQtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUEwRCxNQUFNLHlCQUF5QixDQUFDO0FBRy9HLE9BQU8sRUFBbUIsU0FBUyxFQUFlLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXBGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVU3QyxNQUFNLE9BQU8sMEJBQTBCO0lBZ0pyQyxZQUNVLFFBQW1DLEVBQ25DLG9CQUF5QyxFQUN6QyxlQUErQixFQUMvQixTQUFtQixFQUNuQixPQUFlLEVBQ2YsWUFBeUIsRUFDakMsZUFBZ0M7UUFOeEIsYUFBUSxHQUFSLFFBQVEsQ0FBMkI7UUFDbkMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtRQUN6QyxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0IsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsaUJBQVksR0FBWixZQUFZLENBQWE7UUEvSTNCLGVBQVUsR0FBYyxFQUFFLENBQUM7UUFTM0Is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LFlBQVk7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJNUMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFByb3BlcnR5VHlwZSwgUmVzb3VyY2UsIFRlbXBsYXRlLCBUZW1wbGF0ZXMsIEZvcm1zUmVzb3VyY2UsIFByb3BlcnR5IH0gZnJvbSAnQHdlcnR6dWkvbmd4LWhhbC1jbGllbnQnO1xyXG5pbXBvcnQgeyBSRVNUd29ybGRDbGllbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0d29ybGQtY2xpZW50JztcclxuaW1wb3J0IHsgUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3R3b3JsZC1jbGllbnQtY29sbGVjdGlvbic7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBQcm9ibGVtRGV0YWlscyB9IGZyb20gJy4uLy4uL21vZGVscy9wcm9ibGVtLWRldGFpbHMnO1xyXG5pbXBvcnQgeyBDb250ZW50Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVmFsZGVtb3J0Q29uZmlnIH0gZnJvbSAnbmd4LXZhbGRlbW9ydCc7XHJcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncnctZWRpdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc3R3b3JsZC1lZGl0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1lZGl0LXZpZXcuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSRVNUd29ybGRFZGl0Vmlld0NvbXBvbmVudCB7XHJcbiAgcHVibGljIGdldCBQcm9wZXJ0eVR5cGUoKSB7XHJcbiAgICByZXR1cm4gUHJvcGVydHlUeXBlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHRlbXBsYXRlcygpIHtcclxuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZXM7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3RlbXBsYXRlczogVGVtcGxhdGVzID0ge307XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNMb2FkaW5nRm9yVGhlRmlyc3RUaW1lKCkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudGVtcGxhdGVzKS5sZW5ndGggPT09IDAgJiYgdGhpcy5pc0xvYWRpbmc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGZvcm1UYWJzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1UYWJzO1xyXG4gIH1cclxuICBwcml2YXRlIF9mb3JtVGFiczogeyBbbmFtZTogc3RyaW5nXTogRm9ybUdyb3VwIH0gPSB7fTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGFwaU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fYXBpTmFtZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgYXBpTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FwaU5hbWU7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2FwaU5hbWU/OiBzdHJpbmc7XHJcbiAgLy9ASW5wdXQoKVxyXG4gIC8vcHVibGljIHNldCByZWwodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gIC8vICB0aGlzLl9yZWwgPSB2YWx1ZTtcclxuICAvL31cclxuICAvL3B1YmxpYyBnZXQgcmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgLy8gIHJldHVybiB0aGlzLl9yZWw7XHJcbiAgLy99XHJcbiAgLy9wcml2YXRlIF9yZWw/OiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IHVyaSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl91cmkgPSB2YWx1ZTtcclxuICAgIHRoaXMubG9hZCgpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHVyaSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VyaTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfdXJpPzogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJlc291cmNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlO1xyXG4gIH1cclxuICBwcml2YXRlIF9yZXNvdXJjZT86IFJlc291cmNlO1xyXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcclxuICBwdWJsaWMgZ2V0IGNhblNhdmUoKSB7XHJcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLnJlc291cmNlPy5fbGlua3NbXCJzYXZlXCJdPy5sZW5ndGg7XHJcbiAgICByZXR1cm4gbGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgbGVuZ3RoID4gMDtcclxuICB9XHJcbiAgcHVibGljIGdldCBjYW5EZWxldGUoKSB7XHJcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLnJlc291cmNlPy5fbGlua3NbXCJkZWxldGVcIl0/Lmxlbmd0aDtcclxuICAgIHJldHVybiBsZW5ndGggIT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPiAwO1xyXG4gIH1cclxuICBwdWJsaWMgY2FuU3VibWl0KHRlbXBsYXRlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtVGFic1t0ZW1wbGF0ZU5hbWVdO1xyXG4gICAgcmV0dXJuIGZvcm0gJiYgZm9ybS52YWxpZDtcclxuICB9XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2V4dHJhVGFicycsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGV4dHJhVGFic1JlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdidXR0b25zJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgYnV0dG9uc1JlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dE9wdGlvbnNTaW5nbGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dE9wdGlvbnNTaW5nbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRPcHRpb25zTXVsdGlwbGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dE9wdGlvbnNNdWx0aXBsZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dE9wdGlvbnMnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dE9wdGlvbnNSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRIaWRkZW4nLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dEhpZGRlblJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dFRleHQnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFRleHRSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRUZXh0YXJlYScsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0VGV4dGFyZWFSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRTZWFyY2gnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFNlYXJjaFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dFRlbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0VGVsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VXJsJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRVcmxSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRFbWFpbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0RW1haWxSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRQYXNzd29yZCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0UGFzc3dvcmRSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREYXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXREYXRlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0TW9udGgnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dE1vbnRoUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0V2VlaycsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0V2Vla1JlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dFRpbWUnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFRpbWVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREYXRldGltZUxvY2FsJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXREYXRldGltZUxvY2FsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0TnVtYmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXROdW1iZXJSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRSYW5nZScsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0UmFuZ2VSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRDb2xvcicsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0Q29sb3JSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRCb29sJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRCb29sUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RGF0ZXRpbWVPZmZzZXQnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dERhdGV0aW1lT2Zmc2V0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RHVyYXRpb24nLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dER1cmF0aW9uUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0SW1hZ2UnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dEltYWdlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RmlsZScsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0RmlsZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dERlZmF1bHQnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dERlZmF1bHRSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9jbGllbnRzOiBSRVNUd29ybGRDbGllbnRDb2xsZWN0aW9uLFxyXG4gICAgcHJpdmF0ZSBfY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBfZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxyXG4gICAgdmFsZGVtb3J0Q29uZmlnOiBWYWxkZW1vcnRDb25maWcpIHtcclxuICAgIHZhbGRlbW9ydENvbmZpZy5lcnJvckNsYXNzZXMgPSAncC1lcnJvciB0ZXh0LXNtJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUb29sdGlwKHJlc291cmNlOiBSZXNvdXJjZSwga2V5c1RvRXhjbHVkZT86IHN0cmluZ1tdKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRvb2x0aXAgPSBPYmplY3QuZW50cmllcyhyZXNvdXJjZSlcclxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICEoa2V5LnN0YXJ0c1dpdGgoJ18nKSB8fCBbJ2NyZWF0ZWRBdCcsICdjcmVhdGVkQnknLCAnbGFzdENoYW5nZWRBdCcsICdsYXN0Q2hhbmdlZEJ5JywgJ3RpbWVzdGFtcCddLmluY2x1ZGVzKGtleSkgfHwga2V5c1RvRXhjbHVkZT8uaW5jbHVkZXMoa2V5KSkpXHJcbiAgICAgIC5yZWR1Y2UoKHByZXYsIFtrZXksIHZhbHVlXSwgaW5kZXgpID0+IGAke3ByZXZ9JHtpbmRleCA9PT0gMCA/ICcnIDogJ1xcbid9JHtrZXl9OiAke1JFU1R3b3JsZEVkaXRWaWV3Q29tcG9uZW50Lmpzb25TdHJpbmdpZnlXaXRoRWxpcHNpcyh2YWx1ZSl9YCwgJycpO1xyXG5cclxuICAgIHJldHVybiB0b29sdGlwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMganNvblN0cmluZ2lmeVdpdGhFbGlwc2lzKHZhbHVlOiB1bmtub3duKSB7XHJcbiAgICBjb25zdCBtYXhMZW5ndGggPSAyMDA7XHJcbiAgICBjb25zdCBlbmQgPSAxMDtcclxuICAgIGNvbnN0IHN0YXJ0ID0gbWF4TGVuZ3RoIC0gZW5kIC0gMjtcclxuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICBjb25zdCBzaG9ydGVuZWQgPSBqc29uLmxlbmd0aCA+IG1heExlbmd0aCA/IGpzb24uc3Vic3RyaW5nKDAsIHN0YXJ0KSArICfigKYnICsganNvbi5zdWJzdHJpbmcoanNvbi5sZW5ndGggLSBlbmQpIDoganNvbjtcclxuXHJcbiAgICByZXR1cm4gc2hvcnRlbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDbGllbnQoKTogUkVTVHdvcmxkQ2xpZW50IHtcclxuICAgIGlmICghdGhpcy5hcGlOYW1lKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgYSBjbGllbnQsIGJlY2F1c2UgdGhlIGFwaU5hbWUgaXMgbm90IHNldC4nKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50cy5nZXRDbGllbnQodGhpcy5hcGlOYW1lKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzdWJtaXQodGVtcGxhdGVOYW1lOiBzdHJpbmcsIHRlbXBsYXRlOiBUZW1wbGF0ZSwgZm9ybVZhbHVlOiB7fSkge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldEJlZm9yZVNhdmUgPSB0ZW1wbGF0ZS50YXJnZXQ7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKS5zdWJtaXQodGVtcGxhdGUsIGZvcm1WYWx1ZSk7XHJcblxyXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgbGV0IHN1bW1hcnkgPSAnRXJyb3InO1xyXG4gICAgICAgIGxldCBkZXRhaWwgPSAnRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSByZXNvdXJjZS4nO1xyXG4gICAgICAgIGlmIChQcm9ibGVtRGV0YWlscy5pc1Byb2JsZW1EZXRhaWxzKHJlc3BvbnNlLmJvZHkpKSB7XHJcbiAgICAgICAgICBjb25zdCBwcm9ibGVtRGV0YWlscyA9IHJlc3BvbnNlLmJvZHkgYXMgUHJvYmxlbURldGFpbHM7XHJcbiAgICAgICAgICBzdW1tYXJ5ID0gcHJvYmxlbURldGFpbHMudGl0bGUgfHwgc3VtbWFyeTtcclxuICAgICAgICAgIGRldGFpbCA9IHByb2JsZW1EZXRhaWxzLmRldGFpbCB8fCBkZXRhaWw7XHJcbiAgICAgICAgICAvLyBkaXNwbGF5IHZhbGlkYXRpb24gZXJyb3JzXHJcbiAgICAgICAgICBpZiAocHJvYmxlbURldGFpbHNbJ2Vycm9ycyddIGFzIHt9KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1UYWJzW3RlbXBsYXRlTmFtZV07XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgZXJyb3JzRm9yS2V5XSBvZiBPYmplY3QuZW50cmllcyhwcm9ibGVtRGV0YWlsc1snZXJyb3JzJ10gYXMge30pKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IGtleS5zcGxpdCgvXFwufFxcWy8pLm1hcChlID0+IGUucmVwbGFjZShcIl1cIiwgXCJcIikpO1xyXG4gICAgICAgICAgICAgIC8vIFRoZSBwYXRoIG1pZ2h0IHN0YXJ0IHdpdGggYSAkLCBpbmRpY2F0aW5nIHRoZSByb290LlxyXG4gICAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA+IDAgJiYgcGF0aFswXSA9PT0gJyQnKVxyXG4gICAgICAgICAgICAgICAgcGF0aC5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gcGF0aC5yZWR1Y2U8QWJzdHJhY3RDb250cm9sPihSRVNUd29ybGRFZGl0Vmlld0NvbXBvbmVudC5nZXRTdWJDb250cm9sLCBmb3JtKTtcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbC5zZXRFcnJvcnMoeyAuLi5mb3JtQ29udHJvbC5lcnJvcnMsIC4uLnsgcmVtb3RlOiBlcnJvcnNGb3JLZXkgfSB9KTtcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiBzdW1tYXJ5LCBkZXRhaWw6IGRldGFpbCwgZGF0YTogcmVzcG9uc2UsIGxpZmU6IDEwMDAwIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlUmVzb3VyY2UgPSAocmVzcG9uc2UuYm9keSBhcyBGb3Jtc1Jlc291cmNlKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRBZnRlclNhdmUgPSByZXNwb25zZVJlc291cmNlLl90ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXS50YXJnZXQ7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT5cclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdTYXZlZCcsIGRldGFpbDogJ1RoZSByZXNvdXJjZSBoYXMgYmVlbiBzYXZlZC4nIH0pLFxyXG4gICAgICAgICAgMTAwKTtcclxuXHJcbiAgICAgICAgaWYgKHRhcmdldEJlZm9yZVNhdmUgIT09IHRhcmdldEFmdGVyU2F2ZSkge1xyXG4gICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnL2VkaXQnLCB0aGlzLmFwaU5hbWUsIHJlc3BvbnNlUmVzb3VyY2UuX2xpbmtzLnNlbGZbMF0uaHJlZl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIGNhdGNoIChlOiB1bmtub3duKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGBBbiB1bmtub3duIGVycm9yIG9jY3VycmVkLiAke0pTT04uc3RyaW5naWZ5KGUpfWAsIGxpZmU6IDEwMDAwIH0pO1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0U3ViQ29udHJvbChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHBhdGhFbGVtZW50OiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApXHJcbiAgICAgIHJldHVybiBjb250cm9sLmNvbnRyb2xzW3BhdGhFbGVtZW50XTtcclxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KHBhdGhFbGVtZW50KTtcclxuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5kZXgpKVxyXG4gICAgICAgIHJldHVybiBjb250cm9sLmNvbnRyb2xzW2luZGV4XTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dEZWxldGVDb25maXJtYXRpb01vZGFsKCkge1xyXG4gICAgdGhpcy5fY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgbWVzc2FnZTogJ0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyByZXNvdXJjZT8nLFxyXG4gICAgICBoZWFkZXI6ICdDb25maXJtIGRlbGV0ZScsXHJcbiAgICAgIGljb246ICdmYXIgZmEtdHJhc2gtYWx0JyxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB0aGlzLmRlbGV0ZSgpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSB8fCAhdGhpcy51cmkgfHwgIXRoaXMucmVzb3VyY2UpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMucmVzb3VyY2UsIHRoaXMuZm9ybVRhYnMudmFsdWUpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuZGVsZXRlKHRoaXMucmVzb3VyY2UpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PlxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnRGVsZXRlZCcsIGRldGFpbDogJ1RoZSByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkLicgfSksXHJcbiAgICAgIDEwMCk7XHJcblxyXG4gICAgdGhpcy5fbG9jYXRpb24uYmFjaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSB8fCAhdGhpcy51cmkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpLmdldFNpbmdsZSh0aGlzLnVyaSk7XHJcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IFByb2JsZW1EZXRhaWxzLmlzUHJvYmxlbURldGFpbHMocmVzcG9uc2UuYm9keSkgfHwgIXJlc3BvbnNlLmJvZHkpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogJ0Vycm9yIHdoaWxlIGxvYWRpbmcgdGhlIHJlc291cmNlIGZyb20gdGhlIEFQSS4nLCBkYXRhOiByZXNwb25zZSB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc3BvbnNlLmJvZHk7XHJcbiAgICAgIHRoaXMuX3RlbXBsYXRlcyA9IGF3YWl0IHRoaXMuZ2V0QWxsVGVtcGxhdGVzKHRoaXMuX3Jlc291cmNlKTtcclxuICAgICAgdGhpcy5fZm9ybVRhYnMgPSB0aGlzLl9mb3JtU2VydmljZS5jcmVhdGVGb3JtR3JvdXBzRnJvbVRlbXBsYXRlcyh0aGlzLl90ZW1wbGF0ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNldEluaXRpYWxTZWxlY3RlZE9wdGlvbnNFbGVtZW50c0ZvclRlbXBsYXRlcyh0ZW1wbGF0ZXM6IFRlbXBsYXRlcywgc2tpcERlZmF1bHRUZW1wbGF0ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKVxyXG4gICAgICAuZmlsdGVyKChbbmFtZSxdKSA9PiAhc2tpcERlZmF1bHRUZW1wbGF0ZSB8fCBuYW1lICE9PSAnZGVmYXVsdCcpXHJcbiAgICAgIC5tYXAoKFssIHRlbXBsYXRlXSkgPT4gdGhpcy5zZXRJbml0aWFsU2VsZWN0ZWRPcHRpb25zRWxlbWVudHNGb3JUZW1wbGF0ZSh0ZW1wbGF0ZSkpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2V0SW5pdGlhbFNlbGVjdGVkT3B0aW9uc0VsZW1lbnRzRm9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBwcm9wZXJ0eVByb21pc2VzID0gdGVtcGxhdGUucHJvcGVydGllc1xyXG4gICAgICAuZmlsdGVyKHByb3BlcnR5ID0+IHByb3BlcnR5Py5vcHRpb25zPy5saW5rPy5ocmVmKVxyXG4gICAgICAubWFwKHByb3BlcnR5ID0+IHRoaXMuc2V0SW5pdGlhbFNlbGVjdGVkT3B0aW9uc0VsZW1lbnRGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpO1xyXG4gICAgY29uc3QgbmVzdGVkVGVtcGxhdGVQcm9taXNlZCA9IHRlbXBsYXRlLnByb3BlcnRpZXNcclxuICAgICAgLmZpbHRlcihwcm9wZXJ0eSA9PiBwcm9wZXJ0eT8uX3RlbXBsYXRlcylcclxuICAgICAgLm1hcChwcm9wZXJ0eSA9PiB0aGlzLnNldEluaXRpYWxTZWxlY3RlZE9wdGlvbnNFbGVtZW50c0ZvclRlbXBsYXRlcyhwcm9wZXJ0eS5fdGVtcGxhdGVzLCB0cnVlKSk7XHJcbiAgICBjb25zdCBhbGxQcm9taXNlcyA9IHByb3BlcnR5UHJvbWlzZXMuY29uY2F0KG5lc3RlZFRlbXBsYXRlUHJvbWlzZWQpO1xyXG5cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKGFsbFByb21pc2VzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2V0SW5pdGlhbFNlbGVjdGVkT3B0aW9uc0VsZW1lbnRGb3JQcm9wZXJ0eShwcm9wZXJ0eTogUHJvcGVydHkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9wZXJ0eT8ub3B0aW9ucztcclxuXHJcbiAgICBpZiAoIW9wdGlvbnM/Lmxpbms/LmhyZWYpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0ZW1wbGF0ZWRVcmkgPSBvcHRpb25zLmxpbmsuaHJlZjtcclxuICAgIGNvbnN0IGZpbHRlciA9IGAke29wdGlvbnMudmFsdWVGaWVsZH0gZXEgJHtwcm9wZXJ0eS52YWx1ZX1gO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpLmdldExpc3RCeVVyaSh0ZW1wbGF0ZWRVcmksIHsgJGZpbHRlcjogZmlsdGVyLCAkdG9wOiAxMCB9KTtcclxuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSB8fCAhcmVzcG9uc2UuYm9keSkge1xyXG4gICAgICBjb25zdCBtZXNzYWdlID0gYEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGdldHRpbmcgdGhlIGZpbHRlcmVkIGl0ZW1zLmA7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IG1lc3NhZ2UsIGRhdGE6IHJlc3BvbnNlIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXRlbXMgPSByZXNwb25zZS5ib2R5Ll9lbWJlZGRlZC5pdGVtcztcclxuICAgIG9wdGlvbnMuaW5saW5lID0gaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldEFsbFRlbXBsYXRlcyhyZXNvdXJjZTogUmVzb3VyY2UpOiBQcm9taXNlPFRlbXBsYXRlcz4ge1xyXG4gICAgY29uc3QgZm9ybVJlc3BvbnNlcyA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuZ2V0QWxsRm9ybXMocmVzb3VyY2UpO1xyXG5cclxuICAgIGNvbnN0IGZhaWxlZFJlc3BvbnNlcyA9IGZvcm1SZXNwb25zZXMuZmlsdGVyKHJlc3BvbnNlID0+ICFyZXNwb25zZS5vayB8fCBQcm9ibGVtRGV0YWlscy5pc1Byb2JsZW1EZXRhaWxzKHJlc3BvbnNlLmJvZHkpIHx8ICFyZXNwb25zZS5ib2R5KTtcclxuICAgIGlmIChmYWlsZWRSZXNwb25zZXMubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgZmFpbGVkUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogJ0Vycm9yIHdoaWxlIGxvYWRpbmcgdGhlIHJlc291cmNlIGZyb20gdGhlIEFQSS4nLCBkYXRhOiByZXNwb25zZSB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmb3JtVGVtcGxhdGVzID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uZm9ybVJlc3BvbnNlcy5tYXAocmVzcG9uc2UgPT4gKHJlc3BvbnNlLmJvZHkgYXMgRm9ybXNSZXNvdXJjZSkuX3RlbXBsYXRlcykpIGFzIFRlbXBsYXRlcztcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNldEluaXRpYWxTZWxlY3RlZE9wdGlvbnNFbGVtZW50c0ZvclRlbXBsYXRlcyhmb3JtVGVtcGxhdGVzLCBmYWxzZSk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm1UZW1wbGF0ZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW1hZ2VDaGFuZ2VkKGZvcm1Db250cm9sOiBGb3JtQ29udHJvbCwgZXZlbnQ6IHsgZmlsZXM6IEZpbGVbXSB9KTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWxlID0gZXZlbnQuZmlsZXNbMF07XHJcbiAgICBjb25zb2xlLmxvZyhmaWxlKTtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCB1cmkgPSByZWFkZXIucmVzdWx0O1xyXG4gICAgICBjb25zb2xlLmxvZyh1cmkpO1xyXG4gICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZSh1cmkpO1xyXG4gICAgfTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgIDxoMT5FZGl0IHJlc291cmNlPC9oMT5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48cC10YWJWaWV3PlxyXG5cclxuICA8cC10YWJQYW5lbCAqbmdJZj1cImlzTG9hZGluZ0ZvclRoZUZpcnN0VGltZVwiIGhlYWRlcj1cIkxvYWRpbmdcIj5cclxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGkgb2YgWzEsIDIsIDMsIDQsIDVdXCIgY2xhc3M9XCJncmlkIGZpZWxkXCI+XHJcbiAgICAgIDxwLXNrZWxldG9uIGNsYXNzPVwiY29sLTEyIG1iLTIgbWQ6Y29sLTIgbWQ6bWItMFwiIGhlaWdodD1cIjM5cHhcIj48L3Atc2tlbGV0b24+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWQ6Y29sLTEwXCI+XHJcbiAgICAgICAgPHAtc2tlbGV0b24gY2xhc3M9XCJ3LWZ1bGxcIiBoZWlnaHQ9XCIzOXB4XCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImdyaWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsXCI+XHJcbiAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjEyMHB4XCIgaGVpZ2h0PVwiMzlweFwiIGNsYXNzPVwibXgtMlwiPjwvcC1za2VsZXRvbj5cclxuICAgICAgICAgIDxwLXNrZWxldG9uIHdpZHRoPVwiMTIwcHhcIiBoZWlnaHQ9XCIzOXB4XCIgY2xhc3M9XCJteC0yXCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICAgICAgPHAtc2tlbGV0b24gd2lkdGg9XCIxMjBweFwiIGhlaWdodD1cIjM5cHhcIiBjbGFzcz1cIm14LTJcIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9wLXRhYlBhbmVsPlxyXG5cclxuICA8cC10YWJQYW5lbCAqbmdGb3I9XCJsZXQgaXRlbSBvZiB0ZW1wbGF0ZXMgfCBrZXl2YWx1ZVwiIFtoZWFkZXJdPVwiaXRlbS52YWx1ZS50aXRsZSB8fCBpdGVtLmtleVwiIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdcIj5cclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVRhYnNbaXRlbS5rZXldXCIgKG5nU3VibWl0KT1cInN1Ym1pdChpdGVtLmtleSwgaXRlbS52YWx1ZSwgZm9ybVRhYnNbaXRlbS5rZXldLnZhbHVlKVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmxvY2thYmxlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJibG9ja2FibGUtZWxlbWVudFwiPlxyXG4gICAgICAgICAgPHJ3LWZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtVGFic1tpdGVtLmtleV1cIiBbdGVtcGxhdGVdPVwiaXRlbS52YWx1ZVwiIFthcGlOYW1lXT1cImFwaU5hbWVcIj48L3J3LWZvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrYWJsZS1vdmVybGF5XCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lcj48L3AtcHJvZ3Jlc3NTcGlubmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCB3LWZ1bGxcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0QnV0dG9ucz5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwic3VibWl0XCIgbGFiZWw9XCJTYXZlXCIgaWNvbj1cImZhciBmYS1zYXZlXCIgY2xhc3M9XCJteC0yIHAtYnV0dG9uLXN1Y2Nlc3NcIiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nIHx8ICFjYW5TdWJtaXQoaXRlbS5rZXkpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGxhYmVsPVwiUmVsb2FkXCIgaWNvbj1cImZhcyBmYS1yZWRvXCIgY2xhc3M9XCJteC0yIHAtYnV0dG9uLWluZm9cIiAoY2xpY2spPVwibG9hZCgpXCIgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBsYWJlbD1cIkRlbGV0ZVwiIGljb249XCJmYXIgZmEtdHJhc2gtYWx0XCIgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLWRhbmdlclwiIChjbGljayk9XCJzaG93RGVsZXRlQ29uZmlybWF0aW9Nb2RhbCgpXCIgW2Rpc2FibGVkXT1cIiFyZXNvdXJjZSB8fCBpc0xvYWRpbmcgfHwgIWNhbkRlbGV0ZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1JlZiB8fCBkZWZhdWx0QnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvcC10YWJQYW5lbD5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RXh0cmFUYWJzPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImV4dHJhVGFic1JlZiB8fCBkZWZhdWx0RXh0cmFUYWJzXCI+PC9uZy1jb250YWluZXI+XHJcblxyXG48L3AtdGFiVmlldz5cclxuXHJcbjxwLXRvYXN0PjwvcC10b2FzdD5cclxuPHAtY29uZmlybURpYWxvZz48L3AtY29uZmlybURpYWxvZz5cclxuIl19
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWVkaXQtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LXZpZXcvcmVzdHdvcmxkLWVkaXQtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LXZpZXcvcmVzdHdvcmxkLWVkaXQtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUEwRCxNQUFNLHlCQUF5QixDQUFDO0FBRy9HLE9BQU8sRUFBbUIsZ0JBQWdCLEVBQXNCLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVTdDLE1BQU0sT0FBTywwQkFBMEI7SUFnSnJDLFlBQ1UsUUFBbUMsRUFDbkMsb0JBQXlDLEVBQ3pDLGVBQStCLEVBQy9CLFNBQW1CLEVBQ25CLE9BQWUsRUFDZixZQUF5QixFQUNqQyxlQUFnQztRQU54QixhQUFRLEdBQVIsUUFBUSxDQUEyQjtRQUNuQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUMvQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQS9JM0IsZUFBVSxHQUFjLEVBQUUsQ0FBQztR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QUFZO3NCQURYLFlBQVk7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJNUMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFByb3BlcnR5VHlwZSwgUmVzb3VyY2UsIFRlbXBsYXRlLCBUZW1wbGF0ZXMsIEZvcm1zUmVzb3VyY2UsIFByb3BlcnR5IH0gZnJvbSAnQHdlcnR6dWkvbmd4LWhhbC1jbGllbnQnO1xyXG5pbXBvcnQgeyBSRVNUd29ybGRDbGllbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0d29ybGQtY2xpZW50JztcclxuaW1wb3J0IHsgUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3R3b3JsZC1jbGllbnQtY29sbGVjdGlvbic7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBQcm9ibGVtRGV0YWlscyB9IGZyb20gJy4uLy4uL21vZGVscy9wcm9ibGVtLWRldGFpbHMnO1xyXG5pbXBvcnQgeyBDb250ZW50Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVmFsZGVtb3J0Q29uZmlnIH0gZnJvbSAnbmd4LXZhbGRlbW9ydCc7XHJcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncnctZWRpdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc3R3b3JsZC1lZGl0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1lZGl0LXZpZXcuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSRVNUd29ybGRFZGl0Vmlld0NvbXBvbmVudCB7XHJcbiAgcHVibGljIGdldCBQcm9wZXJ0eVR5cGUoKSB7XHJcbiAgICByZXR1cm4gUHJvcGVydHlUeXBlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHRlbXBsYXRlcygpIHtcclxuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZXM7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3RlbXBsYXRlczogVGVtcGxhdGVzID0ge307XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNMb2FkaW5nRm9yVGhlRmlyc3RUaW1lKCkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudGVtcGxhdGVzKS5sZW5ndGggPT09IDAgJiYgdGhpcy5pc0xvYWRpbmc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGZvcm1UYWJzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1UYWJzO1xyXG4gIH1cclxuICBwcml2YXRlIF9mb3JtVGFiczogeyBbbmFtZTogc3RyaW5nXTogVW50eXBlZEZvcm1Hcm91cCB9ID0ge307XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBhcGlOYW1lKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2FwaU5hbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMubG9hZCgpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGFwaU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9hcGlOYW1lO1xyXG4gIH1cclxuICBwcml2YXRlIF9hcGlOYW1lPzogc3RyaW5nO1xyXG4gIC8vQElucHV0KClcclxuICAvL3B1YmxpYyBzZXQgcmVsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAvLyAgdGhpcy5fcmVsID0gdmFsdWU7XHJcbiAgLy99XHJcbiAgLy9wdWJsaWMgZ2V0IHJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gIC8vICByZXR1cm4gdGhpcy5fcmVsO1xyXG4gIC8vfVxyXG4gIC8vcHJpdmF0ZSBfcmVsPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCB1cmkodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fdXJpID0gdmFsdWU7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcbiAgcHVibGljIGdldCB1cmkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl91cmk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3VyaT86IHN0cmluZztcclxuXHJcbiAgcHVibGljIGdldCByZXNvdXJjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcmVzb3VyY2U/OiBSZXNvdXJjZTtcclxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgcHVibGljIGdldCBjYW5TYXZlKCkge1xyXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZXNvdXJjZT8uX2xpbmtzW1wic2F2ZVwiXT8ubGVuZ3RoO1xyXG4gICAgcmV0dXJuIGxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIGxlbmd0aCA+IDA7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY2FuRGVsZXRlKCkge1xyXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZXNvdXJjZT8uX2xpbmtzW1wiZGVsZXRlXCJdPy5sZW5ndGg7XHJcbiAgICByZXR1cm4gbGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgbGVuZ3RoID4gMDtcclxuICB9XHJcbiAgcHVibGljIGNhblN1Ym1pdCh0ZW1wbGF0ZU5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybVRhYnNbdGVtcGxhdGVOYW1lXTtcclxuICAgIHJldHVybiBmb3JtICYmIGZvcm0udmFsaWQ7XHJcbiAgfVxyXG5cclxuICBAQ29udGVudENoaWxkKCdleHRyYVRhYnMnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBleHRyYVRhYnNSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnYnV0dG9ucycsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGJ1dHRvbnNSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRPcHRpb25zU2luZ2xlJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRPcHRpb25zU2luZ2xlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0T3B0aW9uc011bHRpcGxlJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRPcHRpb25zTXVsdGlwbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRPcHRpb25zJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRPcHRpb25zUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0SGlkZGVuJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRIaWRkZW5SZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRUZXh0JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRUZXh0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VGV4dGFyZWEnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFRleHRhcmVhUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0U2VhcmNoJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRTZWFyY2hSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRUZWwnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFRlbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dFVybCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0VXJsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RW1haWwnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dEVtYWlsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0UGFzc3dvcmQnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFBhc3N3b3JkUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RGF0ZScsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0RGF0ZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dE1vbnRoJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRNb250aFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dFdlZWsnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFdlZWtSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRUaW1lJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRUaW1lUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RGF0ZXRpbWVMb2NhbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0RGF0ZXRpbWVMb2NhbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dE51bWJlcicsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0TnVtYmVyUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0UmFuZ2UnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dFJhbmdlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0Q29sb3InLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dENvbG9yUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0Qm9vbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIGlucHV0Qm9vbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dERhdGV0aW1lT2Zmc2V0JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXREYXRldGltZU9mZnNldFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dER1cmF0aW9uJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXREdXJhdGlvblJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dEltYWdlJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXRJbWFnZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAQ29udGVudENoaWxkKCdpbnB1dEZpbGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBpbnB1dEZpbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREZWZhdWx0JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgaW5wdXREZWZhdWx0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfY2xpZW50czogUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvbixcclxuICAgIHByaXZhdGUgX2NvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgX2Zvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSxcclxuICAgIHZhbGRlbW9ydENvbmZpZzogVmFsZGVtb3J0Q29uZmlnKSB7XHJcbiAgICB2YWxkZW1vcnRDb25maWcuZXJyb3JDbGFzc2VzID0gJ3AtZXJyb3IgdGV4dC1zbSc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VG9vbHRpcChyZXNvdXJjZTogUmVzb3VyY2UsIGtleXNUb0V4Y2x1ZGU/OiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0b29sdGlwID0gT2JqZWN0LmVudHJpZXMocmVzb3VyY2UpXHJcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhKGtleS5zdGFydHNXaXRoKCdfJykgfHwgWydjcmVhdGVkQXQnLCAnY3JlYXRlZEJ5JywgJ2xhc3RDaGFuZ2VkQXQnLCAnbGFzdENoYW5nZWRCeScsICd0aW1lc3RhbXAnXS5pbmNsdWRlcyhrZXkpIHx8IGtleXNUb0V4Y2x1ZGU/LmluY2x1ZGVzKGtleSkpKVxyXG4gICAgICAucmVkdWNlKChwcmV2LCBba2V5LCB2YWx1ZV0sIGluZGV4KSA9PiBgJHtwcmV2fSR7aW5kZXggPT09IDAgPyAnJyA6ICdcXG4nfSR7a2V5fTogJHtSRVNUd29ybGRFZGl0Vmlld0NvbXBvbmVudC5qc29uU3RyaW5naWZ5V2l0aEVsaXBzaXModmFsdWUpfWAsICcnKTtcclxuXHJcbiAgICByZXR1cm4gdG9vbHRpcDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGpzb25TdHJpbmdpZnlXaXRoRWxpcHNpcyh2YWx1ZTogdW5rbm93bikge1xyXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gMjAwO1xyXG4gICAgY29uc3QgZW5kID0gMTA7XHJcbiAgICBjb25zdCBzdGFydCA9IG1heExlbmd0aCAtIGVuZCAtIDI7XHJcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgY29uc3Qgc2hvcnRlbmVkID0ganNvbi5sZW5ndGggPiBtYXhMZW5ndGggPyBqc29uLnN1YnN0cmluZygwLCBzdGFydCkgKyAn4oCmJyArIGpzb24uc3Vic3RyaW5nKGpzb24ubGVuZ3RoIC0gZW5kKSA6IGpzb247XHJcblxyXG4gICAgcmV0dXJuIHNob3J0ZW5lZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q2xpZW50KCk6IFJFU1R3b3JsZENsaWVudCB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGEgY2xpZW50LCBiZWNhdXNlIHRoZSBhcGlOYW1lIGlzIG5vdCBzZXQuJyk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudHMuZ2V0Q2xpZW50KHRoaXMuYXBpTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc3VibWl0KHRlbXBsYXRlTmFtZTogc3RyaW5nLCB0ZW1wbGF0ZTogVGVtcGxhdGUsIGZvcm1WYWx1ZToge30pIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0YXJnZXRCZWZvcmVTYXZlID0gdGVtcGxhdGUudGFyZ2V0O1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuc3VibWl0KHRlbXBsYXRlLCBmb3JtVmFsdWUpO1xyXG5cclxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgIGxldCBzdW1tYXJ5ID0gJ0Vycm9yJztcclxuICAgICAgICBsZXQgZGV0YWlsID0gJ0Vycm9yIHdoaWxlIHNhdmluZyB0aGUgcmVzb3VyY2UuJztcclxuICAgICAgICBpZiAoUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSkge1xyXG4gICAgICAgICAgY29uc3QgcHJvYmxlbURldGFpbHMgPSByZXNwb25zZS5ib2R5IGFzIFByb2JsZW1EZXRhaWxzO1xyXG4gICAgICAgICAgc3VtbWFyeSA9IHByb2JsZW1EZXRhaWxzLnRpdGxlIHx8IHN1bW1hcnk7XHJcbiAgICAgICAgICBkZXRhaWwgPSBwcm9ibGVtRGV0YWlscy5kZXRhaWwgfHwgZGV0YWlsO1xyXG4gICAgICAgICAgLy8gZGlzcGxheSB2YWxpZGF0aW9uIGVycm9yc1xyXG4gICAgICAgICAgaWYgKHByb2JsZW1EZXRhaWxzWydlcnJvcnMnXSBhcyB7fSkge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtVGFic1t0ZW1wbGF0ZU5hbWVdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVycm9yc0ZvcktleV0gb2YgT2JqZWN0LmVudHJpZXMocHJvYmxlbURldGFpbHNbJ2Vycm9ycyddIGFzIHt9KSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBrZXkuc3BsaXQoL1xcLnxcXFsvKS5tYXAoZSA9PiBlLnJlcGxhY2UoXCJdXCIsIFwiXCIpKTtcclxuICAgICAgICAgICAgICAvLyBUaGUgcGF0aCBtaWdodCBzdGFydCB3aXRoIGEgJCwgaW5kaWNhdGluZyB0aGUgcm9vdC5cclxuICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPiAwICYmIHBhdGhbMF0gPT09ICckJylcclxuICAgICAgICAgICAgICAgIHBhdGguc2hpZnQoKTtcclxuICAgICAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHBhdGgucmVkdWNlPEFic3RyYWN0Q29udHJvbD4oUkVTVHdvcmxkRWRpdFZpZXdDb21wb25lbnQuZ2V0U3ViQ29udHJvbCwgZm9ybSk7XHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgLi4uZm9ybUNvbnRyb2wuZXJyb3JzLCAuLi57IHJlbW90ZTogZXJyb3JzRm9yS2V5IH0gfSk7XHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogc3VtbWFyeSwgZGV0YWlsOiBkZXRhaWwsIGRhdGE6IHJlc3BvbnNlLCBsaWZlOiAxMDAwMCB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCByZXNwb25zZVJlc291cmNlID0gKHJlc3BvbnNlLmJvZHkgYXMgRm9ybXNSZXNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0QWZ0ZXJTYXZlID0gcmVzcG9uc2VSZXNvdXJjZS5fdGVtcGxhdGVzW3RlbXBsYXRlTmFtZV0udGFyZ2V0O1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+XHJcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnU2F2ZWQnLCBkZXRhaWw6ICdUaGUgcmVzb3VyY2UgaGFzIGJlZW4gc2F2ZWQuJyB9KSxcclxuICAgICAgICAgIDEwMCk7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRCZWZvcmVTYXZlICE9PSB0YXJnZXRBZnRlclNhdmUpIHtcclxuICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbJy9lZGl0JywgdGhpcy5hcGlOYW1lLCByZXNwb25zZVJlc291cmNlLl9saW5rcy5zZWxmWzBdLmhyZWZdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZTogdW5rbm93bikge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiBgQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4gJHtKU09OLnN0cmluZ2lmeShlKX1gLCBsaWZlOiAxMDAwMCB9KTtcclxuICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGdldFN1YkNvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoRWxlbWVudDogc3RyaW5nKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cClcclxuICAgICAgcmV0dXJuIGNvbnRyb2wuY29udHJvbHNbcGF0aEVsZW1lbnRdO1xyXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUFycmF5KSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KHBhdGhFbGVtZW50KTtcclxuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5kZXgpKVxyXG4gICAgICAgIHJldHVybiBjb250cm9sLmNvbnRyb2xzW2luZGV4XTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dEZWxldGVDb25maXJtYXRpb01vZGFsKCkge1xyXG4gICAgdGhpcy5fY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgbWVzc2FnZTogJ0RvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyByZXNvdXJjZT8nLFxyXG4gICAgICBoZWFkZXI6ICdDb25maXJtIGRlbGV0ZScsXHJcbiAgICAgIGljb246ICdmYXIgZmEtdHJhc2gtYWx0JyxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB0aGlzLmRlbGV0ZSgpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSB8fCAhdGhpcy51cmkgfHwgIXRoaXMucmVzb3VyY2UpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMucmVzb3VyY2UsIHRoaXMuZm9ybVRhYnMudmFsdWUpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuZGVsZXRlKHRoaXMucmVzb3VyY2UpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PlxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnRGVsZXRlZCcsIGRldGFpbDogJ1RoZSByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkLicgfSksXHJcbiAgICAgIDEwMCk7XHJcblxyXG4gICAgdGhpcy5fbG9jYXRpb24uYmFjaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSB8fCAhdGhpcy51cmkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpLmdldFNpbmdsZSh0aGlzLnVyaSk7XHJcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IFByb2JsZW1EZXRhaWxzLmlzUHJvYmxlbURldGFpbHMocmVzcG9uc2UuYm9keSkgfHwgIXJlc3BvbnNlLmJvZHkpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogJ0Vycm9yIHdoaWxlIGxvYWRpbmcgdGhlIHJlc291cmNlIGZyb20gdGhlIEFQSS4nLCBkYXRhOiByZXNwb25zZSB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc3BvbnNlLmJvZHk7XHJcbiAgICAgIHRoaXMuX3RlbXBsYXRlcyA9IGF3YWl0IHRoaXMuZ2V0QWxsVGVtcGxhdGVzKHRoaXMuX3Jlc291cmNlKTtcclxuICAgICAgdGhpcy5fZm9ybVRhYnMgPSB0aGlzLl9mb3JtU2VydmljZS5jcmVhdGVGb3JtR3JvdXBzRnJvbVRlbXBsYXRlcyh0aGlzLl90ZW1wbGF0ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNldEluaXRpYWxTZWxlY3RlZE9wdGlvbnNFbGVtZW50c0ZvclRlbXBsYXRlcyh0ZW1wbGF0ZXM6IFRlbXBsYXRlcywgc2tpcERlZmF1bHRUZW1wbGF0ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKVxyXG4gICAgICAuZmlsdGVyKChbbmFtZSxdKSA9PiAhc2tpcERlZmF1bHRUZW1wbGF0ZSB8fCBuYW1lICE9PSAnZGVmYXVsdCcpXHJcbiAgICAgIC5tYXAoKFssIHRlbXBsYXRlXSkgPT4gdGhpcy5zZXRJbml0aWFsU2VsZWN0ZWRPcHRpb25zRWxlbWVudHNGb3JUZW1wbGF0ZSh0ZW1wbGF0ZSkpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2V0SW5pdGlhbFNlbGVjdGVkT3B0aW9uc0VsZW1lbnRzRm9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBwcm9wZXJ0eVByb21pc2VzID0gdGVtcGxhdGUucHJvcGVydGllc1xyXG4gICAgICAuZmlsdGVyKHByb3BlcnR5ID0+IHByb3BlcnR5Py5vcHRpb25zPy5saW5rPy5ocmVmKVxyXG4gICAgICAubWFwKHByb3BlcnR5ID0+IHRoaXMuc2V0SW5pdGlhbFNlbGVjdGVkT3B0aW9uc0VsZW1lbnRGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpO1xyXG4gICAgY29uc3QgbmVzdGVkVGVtcGxhdGVQcm9taXNlZCA9IHRlbXBsYXRlLnByb3BlcnRpZXNcclxuICAgICAgLmZpbHRlcihwcm9wZXJ0eSA9PiBwcm9wZXJ0eT8uX3RlbXBsYXRlcylcclxuICAgICAgLm1hcChwcm9wZXJ0eSA9PiB0aGlzLnNldEluaXRpYWxTZWxlY3RlZE9wdGlvbnNFbGVtZW50c0ZvclRlbXBsYXRlcyhwcm9wZXJ0eS5fdGVtcGxhdGVzLCB0cnVlKSk7XHJcbiAgICBjb25zdCBhbGxQcm9taXNlcyA9IHByb3BlcnR5UHJvbWlzZXMuY29uY2F0KG5lc3RlZFRlbXBsYXRlUHJvbWlzZWQpO1xyXG5cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKGFsbFByb21pc2VzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2V0SW5pdGlhbFNlbGVjdGVkT3B0aW9uc0VsZW1lbnRGb3JQcm9wZXJ0eShwcm9wZXJ0eTogUHJvcGVydHkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9wZXJ0eT8ub3B0aW9ucztcclxuXHJcbiAgICBpZiAoIW9wdGlvbnM/Lmxpbms/LmhyZWYpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0ZW1wbGF0ZWRVcmkgPSBvcHRpb25zLmxpbmsuaHJlZjtcclxuICAgIGNvbnN0IGZpbHRlciA9IGAke29wdGlvbnMudmFsdWVGaWVsZH0gZXEgJHtwcm9wZXJ0eS52YWx1ZX1gO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpLmdldExpc3RCeVVyaSh0ZW1wbGF0ZWRVcmksIHsgJGZpbHRlcjogZmlsdGVyLCAkdG9wOiAxMCB9KTtcclxuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSB8fCAhcmVzcG9uc2UuYm9keSkge1xyXG4gICAgICBjb25zdCBtZXNzYWdlID0gYEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGdldHRpbmcgdGhlIGZpbHRlcmVkIGl0ZW1zLmA7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IG1lc3NhZ2UsIGRhdGE6IHJlc3BvbnNlIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXRlbXMgPSByZXNwb25zZS5ib2R5Ll9lbWJlZGRlZC5pdGVtcztcclxuICAgIG9wdGlvbnMuaW5saW5lID0gaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldEFsbFRlbXBsYXRlcyhyZXNvdXJjZTogUmVzb3VyY2UpOiBQcm9taXNlPFRlbXBsYXRlcz4ge1xyXG4gICAgY29uc3QgZm9ybVJlc3BvbnNlcyA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuZ2V0QWxsRm9ybXMocmVzb3VyY2UpO1xyXG5cclxuICAgIGNvbnN0IGZhaWxlZFJlc3BvbnNlcyA9IGZvcm1SZXNwb25zZXMuZmlsdGVyKHJlc3BvbnNlID0+ICFyZXNwb25zZS5vayB8fCBQcm9ibGVtRGV0YWlscy5pc1Byb2JsZW1EZXRhaWxzKHJlc3BvbnNlLmJvZHkpIHx8ICFyZXNwb25zZS5ib2R5KTtcclxuICAgIGlmIChmYWlsZWRSZXNwb25zZXMubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgZmFpbGVkUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogJ0Vycm9yIHdoaWxlIGxvYWRpbmcgdGhlIHJlc291cmNlIGZyb20gdGhlIEFQSS4nLCBkYXRhOiByZXNwb25zZSB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmb3JtVGVtcGxhdGVzID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uZm9ybVJlc3BvbnNlcy5tYXAocmVzcG9uc2UgPT4gKHJlc3BvbnNlLmJvZHkgYXMgRm9ybXNSZXNvdXJjZSkuX3RlbXBsYXRlcykpIGFzIFRlbXBsYXRlcztcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNldEluaXRpYWxTZWxlY3RlZE9wdGlvbnNFbGVtZW50c0ZvclRlbXBsYXRlcyhmb3JtVGVtcGxhdGVzLCBmYWxzZSk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm1UZW1wbGF0ZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW1hZ2VDaGFuZ2VkKGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wsIGV2ZW50OiB7IGZpbGVzOiBGaWxlW10gfSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmZpbGVzWzBdO1xyXG4gICAgY29uc29sZS5sb2coZmlsZSk7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgY29uc3QgdXJpID0gcmVhZGVyLnJlc3VsdDtcclxuICAgICAgY29uc29sZS5sb2codXJpKTtcclxuICAgICAgZm9ybUNvbnRyb2wuc2V0VmFsdWUodXJpKTtcclxuICAgIH07XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImdyaWRcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICA8aDE+RWRpdCByZXNvdXJjZTwvaDE+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPHAtdGFiVmlldz5cclxuXHJcbiAgPHAtdGFiUGFuZWwgKm5nSWY9XCJpc0xvYWRpbmdGb3JUaGVGaXJzdFRpbWVcIiBoZWFkZXI9XCJMb2FkaW5nXCI+XHJcbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpIG9mIFsxLCAyLCAzLCA0LCA1XVwiIGNsYXNzPVwiZ3JpZCBmaWVsZFwiPlxyXG4gICAgICA8cC1za2VsZXRvbiBjbGFzcz1cImNvbC0xMiBtYi0yIG1kOmNvbC0yIG1kOm1iLTBcIiBoZWlnaHQ9XCIzOXB4XCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1kOmNvbC0xMFwiPlxyXG4gICAgICAgIDxwLXNrZWxldG9uIGNsYXNzPVwidy1mdWxsXCIgaGVpZ2h0PVwiMzlweFwiPjwvcC1za2VsZXRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIHctZnVsbFwiPlxyXG4gICAgICAgICAgPHAtc2tlbGV0b24gd2lkdGg9XCIxMjBweFwiIGhlaWdodD1cIjM5cHhcIiBjbGFzcz1cIm14LTJcIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjEyMHB4XCIgaGVpZ2h0PVwiMzlweFwiIGNsYXNzPVwibXgtMlwiPjwvcC1za2VsZXRvbj5cclxuICAgICAgICAgIDxwLXNrZWxldG9uIHdpZHRoPVwiMTIwcHhcIiBoZWlnaHQ9XCIzOXB4XCIgY2xhc3M9XCJteC0yXCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvcC10YWJQYW5lbD5cclxuXHJcbiAgPHAtdGFiUGFuZWwgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdGVtcGxhdGVzIHwga2V5dmFsdWVcIiBbaGVhZGVyXT1cIml0ZW0udmFsdWUudGl0bGUgfHwgaXRlbS5rZXlcIiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCI+XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1UYWJzW2l0ZW0ua2V5XVwiIChuZ1N1Ym1pdCk9XCJzdWJtaXQoaXRlbS5rZXksIGl0ZW0udmFsdWUsIGZvcm1UYWJzW2l0ZW0ua2V5XS52YWx1ZSlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImJsb2NrYWJsZS1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2thYmxlLWVsZW1lbnRcIj5cclxuICAgICAgICAgIDxydy1mb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVRhYnNbaXRlbS5rZXldXCIgW3RlbXBsYXRlXT1cIml0ZW0udmFsdWVcIiBbYXBpTmFtZV09XCJhcGlOYW1lXCI+PC9ydy1mb3JtPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJibG9ja2FibGUtb3ZlcmxheVwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XHJcbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXI+PC9wLXByb2dyZXNzU3Bpbm5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEJ1dHRvbnM+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cInN1Ym1pdFwiIGxhYmVsPVwiU2F2ZVwiIGljb249XCJmYXIgZmEtc2F2ZVwiIGNsYXNzPVwibXgtMiBwLWJ1dHRvbi1zdWNjZXNzXCIgW2Rpc2FibGVkXT1cImlzTG9hZGluZyB8fCAhY2FuU3VibWl0KGl0ZW0ua2V5KVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBsYWJlbD1cIlJlbG9hZFwiIGljb249XCJmYXMgZmEtcmVkb1wiIGNsYXNzPVwibXgtMiBwLWJ1dHRvbi1pbmZvXCIgKGNsaWNrKT1cImxvYWQoKVwiIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgbGFiZWw9XCJEZWxldGVcIiBpY29uPVwiZmFyIGZhLXRyYXNoLWFsdFwiIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1kYW5nZXJcIiAoY2xpY2spPVwic2hvd0RlbGV0ZUNvbmZpcm1hdGlvTW9kYWwoKVwiIFtkaXNhYmxlZF09XCIhcmVzb3VyY2UgfHwgaXNMb2FkaW5nIHx8ICFjYW5EZWxldGVcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnNSZWYgfHwgZGVmYXVsdEJ1dHRvbnNcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuICA8L3AtdGFiUGFuZWw+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEV4dHJhVGFicz5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJleHRyYVRhYnNSZWYgfHwgZGVmYXVsdEV4dHJhVGFic1wiPjwvbmctY29udGFpbmVyPlxyXG5cclxuPC9wLXRhYlZpZXc+XHJcblxyXG48cC10b2FzdD48L3AtdG9hc3Q+XHJcbjxwLWNvbmZpcm1EaWFsb2c+PC9wLWNvbmZpcm1EaWFsb2c+XHJcbiJdfQ==
@@ -2,10 +2,10 @@ import { Component, forwardRef, Input, ViewChildren } from '@angular/core';
2
2
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
3
  import { FileUpload } from 'primeng/fileupload';
4
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 "@angular/common";
8
- import * as i4 from "primeng/tooltip";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "primeng/tooltip";
7
+ import * as i3 from "primeng/button";
8
+ import * as i4 from "primeng/fileupload";
9
9
  import * as i5 from "../../pipes/safe-url.pipe";
10
10
  export class RESTWorldFileViewComponent {
11
11
  constructor() {
@@ -33,13 +33,13 @@ export class RESTWorldFileViewComponent {
33
33
  reader.readAsDataURL(file);
34
34
  }
35
35
  }
36
- RESTWorldFileViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTWorldFileViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
37
- RESTWorldFileViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: RESTWorldFileViewComponent, selector: "rw-file", inputs: { accept: "accept", fileName: "fileName" }, providers: [{
36
+ RESTWorldFileViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: RESTWorldFileViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
37
+ RESTWorldFileViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.9", type: RESTWorldFileViewComponent, selector: "rw-file", inputs: { accept: "accept", fileName: "fileName" }, providers: [{
38
38
  provide: NG_VALUE_ACCESSOR,
39
39
  useExisting: forwardRef(() => RESTWorldFileViewComponent),
40
40
  multi: true
41
- }], 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 file present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download file\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload chooseIcon=\"pi-upload fas fa-upload\" pTooltip=\"Upload new file\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || ''\" [customUpload]=\"true\" (uploadHandler)=\"fileChanged($event)\"></p-fileUpload>\r\n</div>\r\n", styles: ["a{text-decoration:none;height:calc(1rem + 18px)}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", "ariaLabel"], 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"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.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"] }], pipes: { "safeUrl": i5.SafeUrlPipe } });
42
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTWorldFileViewComponent, decorators: [{
41
+ }], 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 file present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download file\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload chooseIcon=\"pi-upload fas fa-upload\" pTooltip=\"Upload new file\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || ''\" [customUpload]=\"true\" (uploadHandler)=\"fileChanged($event)\"></p-fileUpload>\r\n</div>\r\n", styles: ["a{text-decoration:none;height:calc(1rem + 18px)}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i4.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", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError"] }, { kind: "pipe", type: i5.SafeUrlPipe, name: "safeUrl" }] });
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: RESTWorldFileViewComponent, decorators: [{
43
43
  type: Component,
44
44
  args: [{ selector: 'rw-file', providers: [{
45
45
  provide: NG_VALUE_ACCESSOR,
@@ -4,16 +4,16 @@ import { ImageCropperComponent } from 'ngx-image-cropper';
4
4
  import { FileUpload } from 'primeng/fileupload';
5
5
  import { Dialog } from 'primeng/dialog';
6
6
  import * as i0 from "@angular/core";
7
- import * as i1 from "primeng/button";
8
- import * as i2 from "primeng/fileupload";
9
- import * as i3 from "primeng/dialog";
10
- import * as i4 from "ngx-image-cropper";
11
- import * as i5 from "primeng/colorpicker";
12
- import * as i6 from "@angular/common";
13
- import * as i7 from "primeng/tooltip";
14
- import * as i8 from "@angular/forms";
15
- import * as i9 from "primeng/inputtext";
16
- import * as i10 from "primeng/ripple";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "primeng/tooltip";
10
+ import * as i4 from "primeng/inputtext";
11
+ import * as i5 from "primeng/button";
12
+ import * as i6 from "primeng/ripple";
13
+ import * as i7 from "primeng/fileupload";
14
+ import * as i8 from "ngx-image-cropper";
15
+ import * as i9 from "primeng/dialog";
16
+ import * as i10 from "primeng/colorpicker";
17
17
  import * as i11 from "../../pipes/safe-url.pipe";
18
18
  export class RESTWorldImageViewComponent {
19
19
  constructor() {
@@ -67,13 +67,13 @@ export class RESTWorldImageViewComponent {
67
67
  this.displayCropDialog = false;
68
68
  }
69
69
  }
70
- RESTWorldImageViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTWorldImageViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
71
- RESTWorldImageViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: RESTWorldImageViewComponent, selector: "rw-image", inputs: { alt: "alt", accept: "accept", fileName: "fileName", alignImage: "alignImage", aspectRatio: "aspectRatio", backgroundColor: "backgroundColor", canvasRotation: "canvasRotation", containWithinAspectRatio: "containWithinAspectRatio", cropper: "cropper", cropperMaxHeight: "cropperMaxHeight", cropperMaxWidth: "cropperMaxWidth", cropperMinHeight: "cropperMinHeight", cropperMinWidth: "cropperMinWidth", cropperStaticHeight: "cropperStaticHeight", cropperStaticWidth: "cropperStaticWidth", format: "format", imageQuality: "imageQuality", initialStepSize: "initialStepSize", maintainAspectRatio: "maintainAspectRatio", onlyScaleDown: "onlyScaleDown", resizeToWidth: "resizeToWidth", resizeToHeight: "resizeToHeight", roundCropper: "roundCropper" }, providers: [{
70
+ RESTWorldImageViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: RESTWorldImageViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
71
+ RESTWorldImageViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.9", type: RESTWorldImageViewComponent, selector: "rw-image", inputs: { alt: "alt", accept: "accept", fileName: "fileName", alignImage: "alignImage", aspectRatio: "aspectRatio", backgroundColor: "backgroundColor", canvasRotation: "canvasRotation", containWithinAspectRatio: "containWithinAspectRatio", cropper: "cropper", cropperMaxHeight: "cropperMaxHeight", cropperMaxWidth: "cropperMaxWidth", cropperMinHeight: "cropperMinHeight", cropperMinWidth: "cropperMinWidth", cropperStaticHeight: "cropperStaticHeight", cropperStaticWidth: "cropperStaticWidth", format: "format", imageQuality: "imageQuality", initialStepSize: "initialStepSize", maintainAspectRatio: "maintainAspectRatio", onlyScaleDown: "onlyScaleDown", resizeToWidth: "resizeToWidth", resizeToHeight: "resizeToHeight", roundCropper: "roundCropper" }, providers: [{
72
72
  provide: NG_VALUE_ACCESSOR,
73
73
  useExisting: forwardRef(() => RESTWorldImageViewComponent),
74
74
  multi: true
75
- }], viewQueries: [{ propertyName: "fileUploads", predicate: FileUpload, descendants: true }, { propertyName: "imageCroppers", predicate: ImageCropperComponent, descendants: true }, { propertyName: "dialogs", predicate: Dialog, 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 || 'image/*'\" [customUpload]=\"true\" (uploadHandler)=\"imageChanged($event)\" pTooltip=\"Upload new image\"></p-fileUpload>\r\n <img *ngIf=\"uri\" class=\"thumbnail\" [src]=\"uri | safeUrl\" [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\r\n [autoCrop]=\"true\"\r\n (imageCropped)=\"croppedImageChanged($event)\"\r\n [alignImage]=\"alignImage ?? 'center'\"\r\n [aspectRatio]=\"aspectRatio ?? 1\"\r\n [backgroundColor]=\"backgroundColor ?? null\"\r\n [canvasRotation]=\"canvasRotation ?? 0\"\r\n [containWithinAspectRatio]=\"containWithinAspectRatio ?? false\"\r\n [cropper]=\"cropper ?? { x1: -100, y1: -100, x2: 10000, y2: 10000 }\"\r\n [cropperMaxHeight]=\"cropperMaxHeight ?? 0\"\r\n [cropperMaxWidth]=\"cropperMaxWidth ?? 0\"\r\n [cropperMinHeight]=\"cropperMinHeight ?? 0\"\r\n [cropperMinWidth]=\"cropperMinWidth ?? 0\"\r\n [cropperStaticHeight]=\"cropperStaticHeight ?? 0\"\r\n [cropperStaticWidth]=\"cropperStaticWidth ?? 0\"\r\n [format]=\"format ?? 'png'\"\r\n [imageQuality]=\"imageQuality ?? 92\"\r\n [initialStepSize]=\"initialStepSize ?? 3\"\r\n [maintainAspectRatio]=\"maintainAspectRatio ?? true\"\r\n [onlyScaleDown]=\"onlyScaleDown ?? false\"\r\n [resizeToWidth]=\"resizeToWidth ?? 0\"\r\n [resizeToHeight]=\"resizeToHeight ?? 0\"\r\n [roundCropper]=\"roundCropper ?? false\"\r\n [imageFile]=\"tempImageFile!\"\r\n [imageURL]=\"uri!\"\r\n ></image-cropper>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"flex-auto align-items-center\">\r\n <span>Background color:&nbsp;</span>\r\n <p-colorPicker [(ngModel)]=\"backgroundColor\" appendTo=\"body\" class=\"ml-1 mr-1\"></p-colorPicker>\r\n <input pInputText [(ngModel)]=\"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.thumbnail{height:calc(1rem + 18px);cursor:zoom-in;border-radius:3px}a{text-decoration:none;height:calc(1rem + 18px)}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", "ariaLabel"], 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: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "cropper", "alignImage", "disabled"], 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 } });
76
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RESTWorldImageViewComponent, decorators: [{
75
+ }], viewQueries: [{ propertyName: "fileUploads", predicate: FileUpload, descendants: true }, { propertyName: "imageCroppers", predicate: ImageCropperComponent, descendants: true }, { propertyName: "dialogs", predicate: Dialog, 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 || 'image/*'\" [customUpload]=\"true\" (uploadHandler)=\"imageChanged($event)\" pTooltip=\"Upload new image\"></p-fileUpload>\r\n <img *ngIf=\"uri\" class=\"thumbnail\" [src]=\"uri | safeUrl\" [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\r\n [autoCrop]=\"true\"\r\n (imageCropped)=\"croppedImageChanged($event)\"\r\n [alignImage]=\"alignImage ?? 'center'\"\r\n [aspectRatio]=\"aspectRatio ?? 1\"\r\n [backgroundColor]=\"backgroundColor ?? null\"\r\n [canvasRotation]=\"canvasRotation ?? 0\"\r\n [containWithinAspectRatio]=\"containWithinAspectRatio ?? false\"\r\n [cropper]=\"cropper ?? { x1: -100, y1: -100, x2: 10000, y2: 10000 }\"\r\n [cropperMaxHeight]=\"cropperMaxHeight ?? 0\"\r\n [cropperMaxWidth]=\"cropperMaxWidth ?? 0\"\r\n [cropperMinHeight]=\"cropperMinHeight ?? 0\"\r\n [cropperMinWidth]=\"cropperMinWidth ?? 0\"\r\n [cropperStaticHeight]=\"cropperStaticHeight ?? 0\"\r\n [cropperStaticWidth]=\"cropperStaticWidth ?? 0\"\r\n [format]=\"format ?? 'png'\"\r\n [imageQuality]=\"imageQuality ?? 92\"\r\n [initialStepSize]=\"initialStepSize ?? 3\"\r\n [maintainAspectRatio]=\"maintainAspectRatio ?? true\"\r\n [onlyScaleDown]=\"onlyScaleDown ?? false\"\r\n [resizeToWidth]=\"resizeToWidth ?? 0\"\r\n [resizeToHeight]=\"resizeToHeight ?? 0\"\r\n [roundCropper]=\"roundCropper ?? false\"\r\n [imageFile]=\"tempImageFile!\"\r\n [imageURL]=\"uri!\"\r\n ></image-cropper>\r\n <div class=\"flex justify-content-end\">\r\n <div class=\"flex-auto align-items-center\">\r\n <span>Background color:&nbsp;</span>\r\n <p-colorPicker [(ngModel)]=\"backgroundColor\" appendTo=\"body\" class=\"ml-1 mr-1\"></p-colorPicker>\r\n <input pInputText [(ngModel)]=\"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.thumbnail{height:calc(1rem + 18px);cursor:zoom-in;border-radius:3px}a{text-decoration:none;height:calc(1rem + 18px)}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i4.InputText, selector: "[pInputText]" }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i5.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i6.Ripple, selector: "[pRipple]" }, { kind: "component", type: i7.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", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError"] }, { kind: "component", type: i8.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "cropper", "alignImage", "disabled"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange"] }, { kind: "component", type: i9.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"] }, { kind: "component", type: i10.ColorPicker, selector: "p-colorPicker", inputs: ["style", "styleClass", "inline", "format", "appendTo", "disabled", "tabindex", "inputId", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onChange", "onShow", "onHide"] }, { kind: "pipe", type: i11.SafeUrlPipe, name: "safeUrl" }] });
76
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: RESTWorldImageViewComponent, decorators: [{
77
77
  type: Component,
78
78
  args: [{ selector: 'rw-image', providers: [{
79
79
  provide: NG_VALUE_ACCESSOR,