@vendure/admin-ui 1.7.0 → 1.7.2

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 (40) hide show
  1. package/bundles/vendure-admin-ui-catalog.umd.js +8 -1
  2. package/bundles/vendure-admin-ui-catalog.umd.js.map +1 -1
  3. package/bundles/vendure-admin-ui-core.umd.js +28 -11
  4. package/bundles/vendure-admin-ui-core.umd.js.map +1 -1
  5. package/bundles/vendure-admin-ui-customer.umd.js +5 -4
  6. package/bundles/vendure-admin-ui-customer.umd.js.map +1 -1
  7. package/bundles/vendure-admin-ui-order.umd.js +10 -7
  8. package/bundles/vendure-admin-ui-order.umd.js.map +1 -1
  9. package/core/common/generated-types.d.ts +2 -1
  10. package/core/common/utilities/configurable-operation-utils.d.ts +4 -1
  11. package/core/common/version.d.ts +1 -1
  12. package/core/vendure-admin-ui-core.metadata.json +1 -1
  13. package/customer/vendure-admin-ui-customer.metadata.json +1 -1
  14. package/esm2015/catalog/components/generate-product-variants/generate-product-variants.component.js +1 -1
  15. package/esm2015/catalog/components/option-value-input/option-value-input.component.js +8 -2
  16. package/esm2015/core/common/generated-types.js +2 -2
  17. package/esm2015/core/common/introspection-result.js +1 -1
  18. package/esm2015/core/common/utilities/configurable-operation-utils.js +8 -2
  19. package/esm2015/core/common/version.js +2 -2
  20. package/esm2015/core/components/app-shell/app-shell.component.js +1 -1
  21. package/esm2015/core/data/definitions/order-definitions.js +443 -443
  22. package/esm2015/core/data/definitions/product-definitions.js +743 -743
  23. package/esm2015/core/data/utils/remove-readonly-custom-fields.js +4 -1
  24. package/esm2015/core/shared/components/dropdown/dropdown-menu.component.js +11 -11
  25. package/esm2015/core/shared/components/dropdown/dropdown-trigger.directive.js +1 -1
  26. package/esm2015/core/shared/pipes/locale-currency.pipe.js +10 -2
  27. package/esm2015/customer/components/customer-group-list/customer-group-list.component.js +6 -5
  28. package/esm2015/order/components/order-editor/order-editor.component.js +9 -5
  29. package/fesm2015/vendure-admin-ui-catalog.js +7 -1
  30. package/fesm2015/vendure-admin-ui-catalog.js.map +1 -1
  31. package/fesm2015/vendure-admin-ui-core.js +1260 -1243
  32. package/fesm2015/vendure-admin-ui-core.js.map +1 -1
  33. package/fesm2015/vendure-admin-ui-customer.js +5 -4
  34. package/fesm2015/vendure-admin-ui-customer.js.map +1 -1
  35. package/fesm2015/vendure-admin-ui-order.js +8 -4
  36. package/fesm2015/vendure-admin-ui-order.js.map +1 -1
  37. package/order/vendure-admin-ui-order.metadata.json +1 -1
  38. package/package.json +2 -2
  39. package/static/styles/_variables.scss +1 -0
  40. package/static/styles/global/_sass-overrides.scss +1 -1
@@ -1,8 +1,9 @@
1
1
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core';
2
2
  import { FormArray, FormControl, FormGroup, Validators } from '@angular/forms';
3
3
  import { ActivatedRoute, Router } from '@angular/router';
4
- import { BaseDetailComponent, DataService, HistoryEntryType, ModalService, NotificationService, ServerConfigService, SortOrder, } from '@vendure/admin-ui/core';
4
+ import { BaseDetailComponent, DataService, HistoryEntryType, ModalService, NotificationService, ServerConfigService, SortOrder, transformRelationCustomFieldInputs, } from '@vendure/admin-ui/core';
5
5
  import { assertNever, notNullOrUndefined } from '@vendure/common/lib/shared-utils';
6
+ import { simpleDeepClone } from '@vendure/common/lib/simple-deep-clone';
6
7
  import { concat, EMPTY, of, Subject } from 'rxjs';
7
8
  import { distinctUntilChanged, map, mapTo, shareReplay, startWith, switchMap, takeUntil, } from 'rxjs/operators';
8
9
  import { OrderTransitionService } from '../../providers/order-transition.service';
@@ -265,7 +266,10 @@ export class OrderEditorComponent extends BaseDetailComponent {
265
266
  }
266
267
  previewAndModify(order) {
267
268
  var _a;
268
- const input = Object.assign(Object.assign(Object.assign(Object.assign({}, this.modifyOrderInput), (this.billingAddressForm.dirty ? { updateBillingAddress: this.billingAddressForm.value } : {})), (this.shippingAddressForm.dirty
269
+ const modifyOrderInput = Object.assign(Object.assign({}, this.modifyOrderInput), { adjustOrderLines: this.modifyOrderInput.adjustOrderLines.map(line => {
270
+ return transformRelationCustomFieldInputs(simpleDeepClone(line), this.orderLineCustomFields);
271
+ }) });
272
+ const input = Object.assign(Object.assign(Object.assign(Object.assign({}, modifyOrderInput), (this.billingAddressForm.dirty ? { updateBillingAddress: this.billingAddressForm.value } : {})), (this.shippingAddressForm.dirty
269
273
  ? { updateShippingAddress: this.shippingAddressForm.value }
270
274
  : {})), { dryRun: true, couponCodes: this.couponCodesControl.dirty ? this.couponCodesControl.value : undefined, note: (_a = this.note) !== null && _a !== void 0 ? _a : '', options: {
271
275
  recalculateShipping: this.recalculateShipping,
@@ -359,9 +363,9 @@ export class OrderEditorComponent extends BaseDetailComponent {
359
363
  OrderEditorComponent.decorators = [
360
364
  { type: Component, args: [{
361
365
  selector: 'vdr-order-editor',
362
- template: "<vdr-action-bar *ngIf=\"entity$ | async as order\">\r\n <vdr-ab-left>\r\n <div class=\"flex clr-align-items-center\">\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <button class=\"btn btn-secondary\" (click)=\"transitionToPriorState(order)\">\r\n {{ 'order.cancel-modification' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngIf=\"entity$ | async as order\">\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-lg-8\">\r\n <table class=\"order-table table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th *ngIf=\"orderLineCustomFields.length\">{{ 'common.custom-fields' | translate }}</th>\r\n <th>{{ 'order.total' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"let line of order.lines; let i = index\"\r\n class=\"order-line\"\r\n [class.is-cancelled]=\"line.quantity === 0\"\r\n [class.modified]=\"isLineModified(line)\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img\r\n *ngIf=\"line.featuredAsset\"\r\n [src]=\"line.featuredAsset | assetPreview: 'tiny'\"\r\n />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ line.unitPriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.unitPrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n [value]=\"line.quantity\"\r\n (input)=\"updateLineQuantity(line, $event.target.value)\"\r\n />\r\n <vdr-line-refunds [line]=\"line\" [payments]=\"order.payments\"></vdr-line-refunds>\r\n <vdr-line-fulfillment\r\n [line]=\"line\"\r\n [orderState]=\"order.state\"\r\n ></vdr-line-fulfillment>\r\n </td>\r\n <td *ngIf=\"orderLineCustomFields.length\" class=\"order-line-custom-field align-middle\">\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"orderLineCustomFieldsFormArray.get([i])\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{ line.linePriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.linePrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr\r\n *ngFor=\"let addedLine of addedLines; trackBy: trackByProductVariantId; let i = index\"\r\n class=\"modified\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img\r\n *ngIf=\"addedLine.productAsset\"\r\n [src]=\"addedLine.productAsset | assetPreview: 'tiny'\"\r\n />\r\n </td>\r\n <td class=\"align-middle name\">{{ addedLine.productVariantName }}</td>\r\n <td class=\"align-middle sku\">{{ addedLine.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ addedLine.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ addedLine.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n [value]=\"addedLine.quantity\"\r\n (input)=\"updateAddedItemQuantity(addedLine, $event.target.value)\"\r\n />\r\n <button class=\"icon-button\" (click)=\"removeAddedItem(i)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </td>\r\n <td *ngIf=\"orderLineCustomFields.length\" class=\"order-line-custom-field align-middle\">\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"addItemCustomFieldsFormArray.get([i])\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{\r\n (addedLine.priceWithTax * addedLine.quantity) / 100\r\n | currency: order.currencyCode\r\n }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{\r\n (addedLine.price * addedLine.quantity) / 100\r\n | currency: order.currencyCode\r\n }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr class=\"surcharge\" *ngFor=\"let surcharge of order.surcharges\">\r\n <td class=\"align-middle name left\" colspan=\"2\">{{ surcharge.description }}</td>\r\n <td class=\"align-middle sku\">{{ surcharge.sku }}</td>\r\n <td class=\"align-middle\"></td>\r\n <td></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"align-middle total\">\r\n {{ surcharge.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ surcharge.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr\r\n class=\"surcharge modified\"\r\n *ngFor=\"let surcharge of modifyOrderInput.surcharges; let i = index\"\r\n >\r\n <td class=\"align-middle name left\" colspan=\"2\">\r\n {{ surcharge.description }}\r\n <button class=\"icon-button\" (click)=\"removeSurcharge(i)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </td>\r\n <td class=\"align-middle sku\">{{ surcharge.sku }}</td>\r\n <td class=\"align-middle\"></td>\r\n <td></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"align-middle total\">\r\n <ng-container *ngIf=\"getSurchargePrices(surcharge) as surchargePrice\">\r\n {{ surchargePrice.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ surchargePrice.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr class=\"shipping\">\r\n <td class=\"left clr-align-middle\">{{ 'order.shipping' | translate }}</td>\r\n <td class=\"clr-align-middle\">{{ order.shippingLines[0]?.shippingMethod?.name }}</td>\r\n <td colspan=\"3\"></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"clr-align-middle\">\r\n {{ order.shippingWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ order.shipping | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <h4 class=\"mb2\">{{ 'order.modifications' | translate }}</h4>\r\n <clr-accordion>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.add-item-to-order' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-product-selector class=\"mb4\" (productSelected)=\"addItemSelectedVariant = $event\">\r\n </vdr-product-selector>\r\n <div *ngIf=\"addItemSelectedVariant\" class=\"flex mb4\">\r\n <img\r\n *ngIf=\"addItemSelectedVariant.productAsset as asset\"\r\n [src]=\"asset | assetPreview: 'tiny'\"\r\n class=\"mr4\"\r\n />\r\n <div>\r\n <strong class=\"mr4\">{{ addItemSelectedVariant.productVariantName }}</strong>\r\n <small>{{ addItemSelectedVariant.sku }}</small>\r\n <div>\r\n {{\r\n getSelectedItemPrice(addItemSelectedVariant)\r\n | localeCurrency: order.currencyCode\r\n }}\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [readonly]=\"!addItemSelectedVariant\"\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"addItemCustomFieldsForm\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"!addItemSelectedVariant || addItemCustomFieldsForm.invalid\"\r\n (click)=\"addItemToOrder(addItemSelectedVariant)\"\r\n >\r\n {{ 'order.add-item-to-order' | translate }}\r\n </button>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.set-coupon-codes' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <ng-select\r\n [items]=\"availableCouponCodes$ | async\"\r\n appendTo=\"body\"\r\n bindLabel=\"code\"\r\n bindValue=\"code\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n [hideSelected]=\"true\"\r\n [minTermLength]=\"2\"\r\n typeToSearchText=\"\"\r\n [typeahead]=\"couponCodeInput$\"\r\n [formControl]=\"couponCodesControl\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <vdr-chip>{{ item.code }}</vdr-chip> {{ item.promotionName }}\r\n </ng-template>\r\n </ng-select>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.add-surcharge' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <form [formGroup]=\"surchargeForm\" (submit)=\"addSurcharge(surchargeForm.value)\">\r\n <vdr-form-field [label]=\"'common.description' | translate\" for=\"description\"\r\n ><input id=\"description\" type=\"text\" formControlName=\"description\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.product-sku' | translate\" for=\"sku\"\r\n ><input id=\"sku\" type=\"text\" formControlName=\"sku\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'common.price' | translate\" for=\"price\"\r\n ><vdr-currency-input\r\n [currencyCode]=\"order.currencyCode\"\r\n id=\"price\"\r\n formControlName=\"price\"\r\n ></vdr-currency-input\r\n ></vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"\r\n 'catalog.price-includes-tax-at'\r\n | translate: { rate: surchargeForm.get('taxRate')?.value }\r\n \"\r\n for=\"priceIncludesTax\"\r\n ><input\r\n id=\"priceIncludesTax\"\r\n type=\"checkbox\"\r\n clrCheckbox\r\n formControlName=\"priceIncludesTax\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.tax-rate' | translate\" for=\"taxRate\"\r\n ><vdr-affixed-input suffix=\"%\"\r\n ><input\r\n id=\"taxRate\"\r\n type=\"number\"\r\n min=\"0\"\r\n max=\"100\"\r\n formControlName=\"taxRate\" /></vdr-affixed-input\r\n ></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.tax-description' | translate\" for=\"taxDescription\"\r\n ><input id=\"taxDescription\" type=\"text\" formControlName=\"taxDescription\"\r\n /></vdr-form-field>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"\r\n surchargeForm.invalid ||\r\n surchargeForm.pristine ||\r\n surchargeForm.get('price')?.value === 0\r\n \"\r\n >\r\n {{ 'order.add-surcharge' | translate }}\r\n </button>\r\n </form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.edit-shipping-address' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-address-form\r\n [formGroup]=\"shippingAddressForm\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [customFields]=\"addressCustomFields\"\r\n ></vdr-address-form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.edit-billing-address' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-address-form\r\n [formGroup]=\"billingAddressForm\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [customFields]=\"addressCustomFields\"\r\n ></vdr-address-form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n </clr-accordion>\r\n </div>\r\n <div class=\"clr-col-lg-4 order-cards\">\r\n <div class=\"card\">\r\n <div class=\"card-header\">\r\n {{ 'order.modification-summary' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <ul>\r\n <li *ngIf=\"modifyOrderInput.addItems?.length\">\r\n {{\r\n 'order.modification-adding-items'\r\n | translate: { count: modifyOrderInput.addItems?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"modifyOrderInput.adjustOrderLines?.length\">\r\n {{\r\n 'order.modification-adjusting-lines'\r\n | translate: { count: modifyOrderInput.adjustOrderLines?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"modifyOrderInput.surcharges?.length\">\r\n {{\r\n 'order.modification-adding-surcharges'\r\n | translate: { count: modifyOrderInput.surcharges?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"shippingAddressForm.dirty\">\r\n {{ 'order.modification-updating-shipping-address' | translate }}\r\n </li>\r\n <li *ngIf=\"billingAddressForm.dirty\">\r\n {{ 'order.modification-updating-billing-address' | translate }}\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"card-block\">\r\n <label class=\"clr-control-label\">{{ 'order.note' | translate }}</label>\r\n <textarea [(ngModel)]=\"note\" name=\"note\" clrTextarea required></textarea>\r\n <clr-checkbox-wrapper class=\"\">\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"recalculateShipping\" />\r\n <label>{{ 'order.modification-recalculate-shipping' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n <div class=\"card-footer\">\r\n <button\r\n class=\"btn btn-primary\"\r\n [disabled]=\"!canPreviewChanges()\"\r\n (click)=\"previewAndModify(order)\"\r\n >\r\n {{ 'order.preview-changes' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n",
366
+ template: "<vdr-action-bar *ngIf=\"entity$ | async as order\">\r\n <vdr-ab-left>\r\n <div class=\"flex clr-align-items-center\">\r\n <vdr-entity-info [entity]=\"entity$ | async\"></vdr-entity-info>\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <button class=\"btn btn-secondary\" (click)=\"transitionToPriorState(order)\">\r\n {{ 'order.cancel-modification' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngIf=\"entity$ | async as order\">\r\n <div class=\"clr-row\">\r\n <div class=\"clr-col-lg-8\">\r\n <table class=\"order-table table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'order.product-name' | translate }}</th>\r\n <th>{{ 'order.product-sku' | translate }}</th>\r\n <th>{{ 'order.unit-price' | translate }}</th>\r\n <th>{{ 'order.quantity' | translate }}</th>\r\n <th *ngIf=\"orderLineCustomFields.length\">{{ 'common.custom-fields' | translate }}</th>\r\n <th>{{ 'order.total' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"let line of order.lines; let i = index\"\r\n class=\"order-line\"\r\n [class.is-cancelled]=\"line.quantity === 0\"\r\n [class.modified]=\"isLineModified(line)\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img\r\n *ngIf=\"line.featuredAsset\"\r\n [src]=\"line.featuredAsset | assetPreview: 'tiny'\"\r\n />\r\n </td>\r\n <td class=\"align-middle name\">{{ line.productVariant.name }}</td>\r\n <td class=\"align-middle sku\">{{ line.productVariant.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ line.unitPriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.unitPrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n [value]=\"line.quantity\"\r\n (input)=\"updateLineQuantity(line, $event.target.value)\"\r\n />\r\n <vdr-line-refunds [line]=\"line\" [payments]=\"order.payments\"></vdr-line-refunds>\r\n <vdr-line-fulfillment\r\n [line]=\"line\"\r\n [orderState]=\"order.state\"\r\n ></vdr-line-fulfillment>\r\n </td>\r\n <td *ngIf=\"orderLineCustomFields.length\" class=\"order-line-custom-field align-middle\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"OrderLine\"\r\n [customFields]=\"orderLineCustomFields\"\r\n [customFieldsFormGroup]=\"orderLineCustomFieldsFormArray.get([i])\"\r\n [compact]=\"true\"\r\n ></vdr-tabbed-custom-fields>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{ line.linePriceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ line.linePrice | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr\r\n *ngFor=\"let addedLine of addedLines; trackBy: trackByProductVariantId; let i = index\"\r\n class=\"modified\"\r\n >\r\n <td class=\"align-middle thumb\">\r\n <img\r\n *ngIf=\"addedLine.productAsset\"\r\n [src]=\"addedLine.productAsset | assetPreview: 'tiny'\"\r\n />\r\n </td>\r\n <td class=\"align-middle name\">{{ addedLine.productVariantName }}</td>\r\n <td class=\"align-middle sku\">{{ addedLine.sku }}</td>\r\n <td class=\"align-middle unit-price\">\r\n {{ addedLine.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ addedLine.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n <td class=\"align-middle quantity\">\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n [value]=\"addedLine.quantity\"\r\n (input)=\"updateAddedItemQuantity(addedLine, $event.target.value)\"\r\n />\r\n <button class=\"icon-button\" (click)=\"removeAddedItem(i)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </td>\r\n <td *ngIf=\"orderLineCustomFields.length\" class=\"order-line-custom-field align-middle\">\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"addItemCustomFieldsFormArray.get([i])\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n </td>\r\n <td class=\"align-middle total\">\r\n {{\r\n (addedLine.priceWithTax * addedLine.quantity) / 100\r\n | currency: order.currencyCode\r\n }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{\r\n (addedLine.price * addedLine.quantity) / 100\r\n | currency: order.currencyCode\r\n }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr class=\"surcharge\" *ngFor=\"let surcharge of order.surcharges\">\r\n <td class=\"align-middle name left\" colspan=\"2\">{{ surcharge.description }}</td>\r\n <td class=\"align-middle sku\">{{ surcharge.sku }}</td>\r\n <td class=\"align-middle\"></td>\r\n <td></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"align-middle total\">\r\n {{ surcharge.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ surcharge.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n <tr\r\n class=\"surcharge modified\"\r\n *ngFor=\"let surcharge of modifyOrderInput.surcharges; let i = index\"\r\n >\r\n <td class=\"align-middle name left\" colspan=\"2\">\r\n {{ surcharge.description }}\r\n <button class=\"icon-button\" (click)=\"removeSurcharge(i)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </td>\r\n <td class=\"align-middle sku\">{{ surcharge.sku }}</td>\r\n <td class=\"align-middle\"></td>\r\n <td></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"align-middle total\">\r\n <ng-container *ngIf=\"getSurchargePrices(surcharge) as surchargePrice\">\r\n {{ surchargePrice.priceWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ surchargePrice.price | localeCurrency: order.currencyCode }}\r\n </div>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr class=\"shipping\">\r\n <td class=\"left clr-align-middle\">{{ 'order.shipping' | translate }}</td>\r\n <td class=\"clr-align-middle\">{{ order.shippingLines[0]?.shippingMethod?.name }}</td>\r\n <td colspan=\"3\"></td>\r\n <td *ngIf=\"orderLineCustomFields.length\"></td>\r\n <td class=\"clr-align-middle\">\r\n {{ order.shippingWithTax | localeCurrency: order.currencyCode }}\r\n <div class=\"net-price\" [title]=\"'order.net-price' | translate\">\r\n {{ order.shipping | localeCurrency: order.currencyCode }}\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <h4 class=\"mb2\">{{ 'order.modifications' | translate }}</h4>\r\n <clr-accordion>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.add-item-to-order' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-product-selector class=\"mb4\" (productSelected)=\"addItemSelectedVariant = $event\">\r\n </vdr-product-selector>\r\n <div *ngIf=\"addItemSelectedVariant\" class=\"flex mb4\">\r\n <img\r\n *ngIf=\"addItemSelectedVariant.productAsset as asset\"\r\n [src]=\"asset | assetPreview: 'tiny'\"\r\n class=\"mr4\"\r\n />\r\n <div>\r\n <strong class=\"mr4\">{{ addItemSelectedVariant.productVariantName }}</strong>\r\n <small>{{ addItemSelectedVariant.sku }}</small>\r\n <div>\r\n {{\r\n getSelectedItemPrice(addItemSelectedVariant)\r\n | localeCurrency: order.currencyCode\r\n }}\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let customField of orderLineCustomFields\">\r\n <vdr-custom-field-control\r\n [readonly]=\"!addItemSelectedVariant\"\r\n [customField]=\"customField\"\r\n [customFieldsFormGroup]=\"addItemCustomFieldsForm\"\r\n entityName=\"OrderLine\"\r\n [compact]=\"true\"\r\n ></vdr-custom-field-control>\r\n </ng-container>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"!addItemSelectedVariant || addItemCustomFieldsForm.invalid\"\r\n (click)=\"addItemToOrder(addItemSelectedVariant)\"\r\n >\r\n {{ 'order.add-item-to-order' | translate }}\r\n </button>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.set-coupon-codes' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <ng-select\r\n [items]=\"availableCouponCodes$ | async\"\r\n appendTo=\"body\"\r\n bindLabel=\"code\"\r\n bindValue=\"code\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n [hideSelected]=\"true\"\r\n [minTermLength]=\"2\"\r\n typeToSearchText=\"\"\r\n [typeahead]=\"couponCodeInput$\"\r\n [formControl]=\"couponCodesControl\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <vdr-chip>{{ item.code }}</vdr-chip>\r\n {{ item.promotionName }}\r\n </ng-template>\r\n </ng-select>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.add-surcharge' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <form [formGroup]=\"surchargeForm\" (submit)=\"addSurcharge(surchargeForm.value)\">\r\n <vdr-form-field [label]=\"'common.description' | translate\" for=\"description\"\r\n ><input id=\"description\" type=\"text\" formControlName=\"description\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.product-sku' | translate\" for=\"sku\"\r\n ><input id=\"sku\" type=\"text\" formControlName=\"sku\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'common.price' | translate\" for=\"price\">\r\n <vdr-currency-input\r\n [currencyCode]=\"order.currencyCode\"\r\n id=\"price\"\r\n formControlName=\"price\"\r\n ></vdr-currency-input>\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"\r\n 'catalog.price-includes-tax-at'\r\n | translate: { rate: surchargeForm.get('taxRate')?.value }\r\n \"\r\n for=\"priceIncludesTax\"\r\n ><input\r\n id=\"priceIncludesTax\"\r\n type=\"checkbox\"\r\n clrCheckbox\r\n formControlName=\"priceIncludesTax\"\r\n /></vdr-form-field>\r\n <vdr-form-field [label]=\"'order.tax-rate' | translate\" for=\"taxRate\">\r\n <vdr-affixed-input suffix=\"%\"\r\n ><input\r\n id=\"taxRate\"\r\n type=\"number\"\r\n min=\"0\"\r\n max=\"100\"\r\n formControlName=\"taxRate\"\r\n /></vdr-affixed-input>\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'order.tax-description' | translate\" for=\"taxDescription\"\r\n ><input id=\"taxDescription\" type=\"text\" formControlName=\"taxDescription\"\r\n /></vdr-form-field>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"\r\n surchargeForm.invalid ||\r\n surchargeForm.pristine ||\r\n surchargeForm.get('price')?.value === 0\r\n \"\r\n >\r\n {{ 'order.add-surcharge' | translate }}\r\n </button>\r\n </form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.edit-shipping-address' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-address-form\r\n [formGroup]=\"shippingAddressForm\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [customFields]=\"addressCustomFields\"\r\n ></vdr-address-form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n <clr-accordion-panel>\r\n <clr-accordion-title>{{ 'order.edit-billing-address' | translate }}</clr-accordion-title>\r\n <clr-accordion-content *clrIfExpanded>\r\n <vdr-address-form\r\n [formGroup]=\"billingAddressForm\"\r\n [availableCountries]=\"availableCountries$ | async\"\r\n [customFields]=\"addressCustomFields\"\r\n ></vdr-address-form>\r\n </clr-accordion-content>\r\n </clr-accordion-panel>\r\n </clr-accordion>\r\n </div>\r\n <div class=\"clr-col-lg-4 order-cards\">\r\n <div class=\"card\">\r\n <div class=\"card-header\">\r\n {{ 'order.modification-summary' | translate }}\r\n </div>\r\n <div class=\"card-block\">\r\n <ul>\r\n <li *ngIf=\"modifyOrderInput.addItems?.length\">\r\n {{\r\n 'order.modification-adding-items'\r\n | translate: { count: modifyOrderInput.addItems?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"modifyOrderInput.adjustOrderLines?.length\">\r\n {{\r\n 'order.modification-adjusting-lines'\r\n | translate: { count: modifyOrderInput.adjustOrderLines?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"modifyOrderInput.surcharges?.length\">\r\n {{\r\n 'order.modification-adding-surcharges'\r\n | translate: { count: modifyOrderInput.surcharges?.length }\r\n }}\r\n </li>\r\n <li *ngIf=\"shippingAddressForm.dirty\">\r\n {{ 'order.modification-updating-shipping-address' | translate }}\r\n </li>\r\n <li *ngIf=\"billingAddressForm.dirty\">\r\n {{ 'order.modification-updating-billing-address' | translate }}\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"card-block\">\r\n <label class=\"clr-control-label\">{{ 'order.note' | translate }}</label>\r\n <textarea [(ngModel)]=\"note\" name=\"note\" clrTextarea required></textarea>\r\n <clr-checkbox-wrapper class=\"\">\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"recalculateShipping\" />\r\n <label>{{ 'order.modification-recalculate-shipping' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n <div class=\"card-footer\">\r\n <button\r\n class=\"btn btn-primary\"\r\n [disabled]=\"!canPreviewChanges()\"\r\n (click)=\"previewAndModify(order)\"\r\n >\r\n {{ 'order.preview-changes' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n",
363
367
  changeDetection: ChangeDetectionStrategy.OnPush,
364
- styles: [".order-table .is-cancelled td{text-decoration:line-through;background-color:var(--color-component-bg-200)}.order-table .sub-total td{border-top:1px dashed var(--color-component-border-200)}.order-table .total td{font-weight:bold;border-top:1px dashed var(--color-component-border-200)}.order-table td.custom-fields-row{border-top-style:dashed;border-top-color:var(--color-grey-200)}.order-table .order-line-custom-fields{display:flex;flex-wrap:wrap}.order-table .order-line-custom-fields .custom-field{text-align:start;max-width:200px;overflow:hidden;text-overflow:ellipsis;margin-bottom:6px;margin-right:18px}.order-table .order-line-custom-field{background-color:var(--color-component-bg-100)}.order-table .order-line-custom-field .custom-field-ellipsis{color:var(--color-text-300)}.order-table .net-price{font-size:11px;color:var(--color-text-300)}.order-table .promotions-label{-webkit-text-decoration:underline dotted var(--color-text-200);text-decoration:underline dotted var(--color-text-200);font-size:11px;margin-top:6px;cursor:pointer;text-transform:lowercase}.order-table .thumb img{width:50px;height:50px}.order-table tr.modified td{background-color:var(--color-warning-100)}\n"]
368
+ styles: [".order-table .is-cancelled td{text-decoration:line-through;background-color:var(--color-component-bg-200)}.order-table .sub-total td{border-top:1px dashed var(--color-component-border-200)}.order-table .total td{font-weight:bold;border-top:1px dashed var(--color-component-border-200)}.order-table td.custom-fields-row{border-top-style:dashed;border-top-color:var(--color-grey-200)}.order-table .order-line-custom-fields{display:flex;flex-wrap:wrap}.order-table .order-line-custom-fields .custom-field{text-align:start;max-width:200px;overflow:hidden;text-overflow:ellipsis;margin-bottom:6px;margin-right:18px}.order-table .order-line-custom-field{background-color:var(--color-component-bg-100)}.order-table .order-line-custom-field .custom-field-ellipsis{color:var(--color-text-300)}.order-table .net-price{font-size:11px;color:var(--color-text-300)}.order-table .promotions-label{-webkit-text-decoration:underline dotted var(--color-text-200);text-decoration:underline dotted var(--color-text-200);font-size:11px;margin-top:6px;cursor:pointer;text-transform:lowercase}.order-table .thumb img{width:50px;height:50px}.order-table tr.modified td{background-color:var(--color-warning-100)}.order-table .order-line-custom-field{text-align:start}\n"]
365
369
  },] }
366
370
  ];
367
371
  OrderEditorComponent.ctorParameters = () => [
@@ -374,4 +378,4 @@ OrderEditorComponent.ctorParameters = () => [
374
378
  { type: ModalService },
375
379
  { type: OrderTransitionService }
376
380
  ];
377
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvb3JkZXIvc3JjL2NvbXBvbmVudHMvb3JkZXItZWRpdG9yL29yZGVyLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUdILG1CQUFtQixFQUVuQixXQUFXLEVBR1gsZ0JBQWdCLEVBRWhCLFlBQVksRUFFWixtQkFBbUIsRUFJbkIsbUJBQW1CLEVBQ25CLFNBQVMsR0FFWixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlELE9BQU8sRUFDSCxvQkFBb0IsRUFDcEIsR0FBRyxFQUNILEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEdBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRixPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLGdDQUFnQyxHQUNuQyxNQUFNLG9FQUFvRSxDQUFDO0FBdUI1RSxNQUFNLE9BQU8sb0JBQ1QsU0FBUSxtQkFBeUM7SUFnQ2pELFlBQ0ksTUFBYyxFQUNkLEtBQXFCLEVBQ3JCLG1CQUF3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WUFDNUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RCxLQUFLLE1BQU0sY0FBYyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDbkQsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDakMsTUFBTSxLQUFLLEdBQUcsTUFBQyxPQUFlLENBQUMsWUFBWSwwQ0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDcEQsNEJBQTRCLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ3pFO1lBQ0QsZUFBZSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztTQUM1RTtJQUNMLENBQUM7SUFFUyxhQUFhLENBQUMsTUFBNEIsRUFBRSxZQUEwQjtRQUM1RSxjQUFjO0lBQ2xCLENBQUM7OztZQWpiSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIseW1zQkFBNEM7Z0JBRTVDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNsRDs7O1lBM0R3QixNQUFNO1lBQXRCLGNBQWM7WUFpQm5CLG1CQUFtQjtZQW5CVyxpQkFBaUI7WUFRL0MsV0FBVztZQU9YLG1CQUFtQjtZQUZuQixZQUFZO1lBc0JQLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQge1xyXG4gICAgQWRkSXRlbUlucHV0LFxyXG4gICAgQWRqdXN0T3JkZXJMaW5lSW5wdXQsXHJcbiAgICBCYXNlRGV0YWlsQ29tcG9uZW50LFxyXG4gICAgQ3VzdG9tRmllbGRDb25maWcsXHJcbiAgICBEYXRhU2VydmljZSxcclxuICAgIEVycm9yUmVzdWx0LFxyXG4gICAgR2V0QXZhaWxhYmxlQ291bnRyaWVzLFxyXG4gICAgSGlzdG9yeUVudHJ5VHlwZSxcclxuICAgIExhbmd1YWdlQ29kZSxcclxuICAgIE1vZGFsU2VydmljZSxcclxuICAgIE1vZGlmeU9yZGVySW5wdXQsXHJcbiAgICBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgT3JkZXJBZGRyZXNzRnJhZ21lbnQsXHJcbiAgICBPcmRlckRldGFpbCxcclxuICAgIFByb2R1Y3RTZWxlY3RvclNlYXJjaCxcclxuICAgIFNlcnZlckNvbmZpZ1NlcnZpY2UsXHJcbiAgICBTb3J0T3JkZXIsXHJcbiAgICBTdXJjaGFyZ2VJbnB1dCxcclxufSBmcm9tICdAdmVuZHVyZS9hZG1pbi11aS9jb3JlJztcclxuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIsIG5vdE51bGxPclVuZGVmaW5lZCB9IGZyb20gJ0B2ZW5kdXJlL2NvbW1vbi9saWIvc2hhcmVkLXV0aWxzJztcclxuaW1wb3J0IHsgY29uY2F0LCBFTVBUWSwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gICAgbWFwLFxyXG4gICAgbWFwVG8sXHJcbiAgICBzaGFyZVJlcGxheSxcclxuICAgIHN0YXJ0V2l0aCxcclxuICAgIHN3aXRjaE1hcCxcclxuICAgIHRha2VVbnRpbCxcclxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBPcmRlclRyYW5zaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL29yZGVyLXRyYW5zaXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgICBPcmRlckVkaXRSZXN1bHRUeXBlLFxyXG4gICAgT3JkZXJFZGl0c1ByZXZpZXdEaWFsb2dDb21wb25lbnQsXHJcbn0gZnJvbSAnLi4vb3JkZXItZWRpdHMtcHJldmlldy1kaWFsb2cvb3JkZXItZWRpdHMtcHJldmlldy1kaWFsb2cuY29tcG9uZW50JztcclxuXHJcbmludGVyZmFjZSBBZGRlZExpbmUge1xyXG4gICAgcHJvZHVjdFZhcmlhbnRJZDogc3RyaW5nO1xyXG4gICAgcHJvZHVjdEFzc2V0PzogUHJvZHVjdFNlbGVjdG9yU2VhcmNoLlByb2R1Y3RBc3NldCB8IG51bGw7XHJcbiAgICBwcm9kdWN0VmFyaWFudE5hbWU6IHN0cmluZztcclxuICAgIHNrdTogc3RyaW5nO1xyXG4gICAgcHJpY2VXaXRoVGF4OiBudW1iZXI7XHJcbiAgICBwcmljZTogbnVtYmVyO1xyXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcclxufVxyXG5cclxudHlwZSBNb2RpZnlPcmRlckRhdGEgPSBPbWl0PE1vZGlmeU9yZGVySW5wdXQsICdhZGRJdGVtcycgfCAnYWRqdXN0T3JkZXJMaW5lcyc+ICYge1xyXG4gICAgYWRkSXRlbXM6IEFycmF5PEFkZEl0ZW1JbnB1dCAmIHsgY3VzdG9tRmllbGRzPzogYW55IH0+O1xyXG4gICAgYWRqdXN0T3JkZXJMaW5lczogQXJyYXk8QWRqdXN0T3JkZXJMaW5lSW5wdXQgJiB7IGN1c3RvbUZpZWxkcz86IGFueSB9PjtcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd2ZHItb3JkZXItZWRpdG9yJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9vcmRlci1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vb3JkZXItZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyRWRpdG9yQ29tcG9uZW50XHJcbiAgICBleHRlbmRzIEJhc2VEZXRhaWxDb21wb25lbnQ8T3JkZXJEZXRhaWwuRnJhZ21lbnQ+XHJcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XHJcbntcclxuICAgIGF2YWlsYWJsZUNvdW50cmllcyQ6IE9ic2VydmFibGU8R2V0QXZhaWxhYmxlQ291bnRyaWVzLkl0ZW1zW10+O1xyXG4gICAgYXZhaWxhYmxlQ291cG9uQ29kZXMkOiBPYnNlcnZhYmxlPEFycmF5PHsgY29kZTogc3RyaW5nOyBwcm9tb3Rpb25OYW1lOiBzdHJpbmcgfT4+O1xyXG4gICAgY291cG9uQ29kZUlucHV0JCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICAgIGFkZHJlc3NDdXN0b21GaWVsZHM6IEN1c3RvbUZpZWxkQ29uZmlnW107XHJcbiAgICBkZXRhaWxGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgICBjb3Vwb25Db2Rlc0NvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuICAgIG9yZGVyTGluZUN1c3RvbUZpZWxkc0Zvcm1BcnJheTogRm9ybUFycmF5O1xyXG4gICAgYWRkSXRlbUN1c3RvbUZpZWxkc0Zvcm1BcnJheTogRm9ybUFycmF5O1xyXG4gICAgYWRkSXRlbUN1c3RvbUZpZWxkc0Zvcm06IEZvcm1Hcm91cDtcclxuICAgIGFkZEl0ZW1TZWxlY3RlZFZhcmlhbnQ6IFByb2R1Y3RTZWxlY3RvclNlYXJjaC5JdGVtcyB8IHVuZGVmaW5lZDtcclxuICAgIG9yZGVyTGluZUN1c3RvbUZpZWxkczogQ3VzdG9tRmllbGRDb25maWdbXTtcclxuICAgIG1vZGlmeU9yZGVySW5wdXQ6IE1vZGlmeU9yZGVyRGF0YSA9IHtcclxuICAgICAgICBkcnlSdW46IHRydWUsXHJcbiAgICAgICAgb3JkZXJJZDogJycsXHJcbiAgICAgICAgYWRkSXRlbXM6IFtdLFxyXG4gICAgICAgIGFkanVzdE9yZGVyTGluZXM6IFtdLFxyXG4gICAgICAgIHN1cmNoYXJnZXM6IFtdLFxyXG4gICAgICAgIG5vdGU6ICcnLFxyXG4gICAgICAgIHVwZGF0ZVNoaXBwaW5nQWRkcmVzczoge30sXHJcbiAgICAgICAgdXBkYXRlQmlsbGluZ0FkZHJlc3M6IHt9LFxyXG4gICAgfTtcclxuICAgIHN1cmNoYXJnZUZvcm06IEZvcm1Hcm91cDtcclxuICAgIHNoaXBwaW5nQWRkcmVzc0Zvcm06IEZvcm1Hcm91cDtcclxuICAgIGJpbGxpbmdBZGRyZXNzRm9ybTogRm9ybUdyb3VwO1xyXG4gICAgbm90ZSA9ICcnO1xyXG4gICAgcmVjYWxjdWxhdGVTaGlwcGluZyA9IHRydWU7XHJcbiAgICBwcmV2aW91c1N0YXRlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGFkZGVkVmFyaWFudHMgPSBuZXcgTWFwPHN0cmluZywgUHJvZHVjdFNlbGVjdG9yU2VhcmNoLkl0ZW1zPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBzZXJ2ZXJDb25maWdTZXJ2aWNlOiBTZXJ2ZXJDb25maWdTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByb3RlY3RlZCBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBvcmRlclRyYW5zaXRpb25TZXJ2aWNlOiBPcmRlclRyYW5zaXRpb25TZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIocm91dGUsIHJvdXRlciwgc2VydmVyQ29uZmlnU2VydmljZSwgZGF0YVNlcnZpY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBhZGRlZExpbmVzKCk6IEFkZGVkTGluZVtdIHtcclxuICAgICAgICBjb25zdCBnZXRTaW5nbGVQcmljZVZhbHVlID0gKHByaWNlOiBQcm9kdWN0U2VsZWN0b3JTZWFyY2guUHJpY2UpID0+XHJcbiAgICAgICAgICAgIHByaWNlLl9fdHlwZW5hbWUgPT09ICdTaW5nbGVQcmljZScgPyBwcmljZS52YWx1ZSA6IDA7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLm1vZGlmeU9yZGVySW5wdXQuYWRkSXRlbXMgfHwgW10pXHJcbiAgICAgICAgICAgIC5tYXAocm93ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnRJbmZvID0gdGhpcy5hZGRlZFZhcmlhbnRzLmdldChyb3cucHJvZHVjdFZhcmlhbnRJZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFudEluZm8pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi52YXJpYW50SW5mbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IGdldFNpbmdsZVByaWNlVmFsdWUodmFyaWFudEluZm8ucHJpY2UpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmljZVdpdGhUYXg6IGdldFNpbmdsZVByaWNlVmFsdWUodmFyaWFudEluZm8ucHJpY2VXaXRoVGF4KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IHJvdy5xdWFudGl0eSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmlsdGVyKG5vdE51bGxPclVuZGVmaW5lZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5kYXRhU2VydmljZS5wcm9tb3Rpb24uZ2V0UHJvbW90aW9ucygpO1xyXG4gICAgICAgIHRoaXMuYWRkcmVzc0N1c3RvbUZpZWxkcyA9IHRoaXMuZ2V0Q3VzdG9tRmllbGRDb25maWcoJ0FkZHJlc3MnKTtcclxuICAgICAgICB0aGlzLm1vZGlmeU9yZGVySW5wdXQub3JkZXJJZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpIGFzIHN0cmluZztcclxuICAgICAgICB0aGlzLm9yZGVyTGluZUN1c3RvbUZpZWxkcyA9IHRoaXMuZ2V0Q3VzdG9tRmllbGRDb25maWcoJ09yZGVyTGluZScpO1xyXG4gICAgICAgIHRoaXMuZW50aXR5JC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKG9yZGVyID0+IHtcclxuICAgICAgICAgICAgaWYgKG9yZGVyLmNvdXBvbkNvZGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3Vwb25Db2Rlc0NvbnRyb2wuc2V0VmFsdWUob3JkZXIuY291cG9uQ29kZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc3VyY2hhcmdlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgICAgICBza3U6IG5ldyBGb3JtQ29udHJvbCgnJyksXHJcbiAgICAgICAgICAgICAgICBwcmljZTogbmV3IEZvcm1Db250cm9sKDAsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICAgICAgICAgICAgcHJpY2VJbmNsdWRlc1RheDogbmV3IEZvcm1Db250cm9sKHRydWUpLFxyXG4gICAgICAgICAgICAgICAgdGF4UmF0ZTogbmV3IEZvcm1Db250cm9sKDApLFxyXG4gICAgICAgICAgICAgICAgdGF4RGVzY3JpcHRpb246IG5ldyBGb3JtQ29udHJvbCgnJyksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hpcHBpbmdBZGRyZXNzRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGlwcGluZ0FkZHJlc3NGb3JtID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVsbE5hbWU6IG5ldyBGb3JtQ29udHJvbChvcmRlci5zaGlwcGluZ0FkZHJlc3M/LmZ1bGxOYW1lKSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wYW55OiBuZXcgRm9ybUNvbnRyb2wob3JkZXIuc2hpcHBpbmdBZGRyZXNzPy5jb21wYW55KSxcclxuICAgICAgICAgICAgICAgICAgICBzdHJlZXRMaW5lMTogbmV3IEZvcm1Db250cm9sKG9yZGVyLnNoaXBwaW5nQWRkcmVzcz8uc3RyZWV0TGluZTEpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0cmVldExpbmUyOiBuZXcgRm9ybUNvbnRyb2wob3JkZXIuc2hpcHBpbmdBZGRyZXNzPy5zdHJlZXRMaW5lMiksXHJcbiAgICAgICAgICAgICAgICAgICAgY2l0eTogbmV3IEZvcm1Db250cm9sKG9yZGVyLnNoaXBwaW5nQWRkcmVzcz8uY2l0eSksXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdmluY2U6IG5ldyBGb3JtQ29udHJvbChvcmRlci5zaGlwcGluZ0FkZHJlc3M/LnByb3ZpbmNlKSxcclxuICAgICAgICAgICAgICAgICAgICBwb3N0YWxDb2RlOiBuZXcgRm9ybUNvbnRyb2wob3JkZXIuc2hpcHBpbmdBZGRyZXNzPy5wb3N0YWxDb2RlKSxcclxuICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogbmV3IEZvcm1Db250cm9sKG9yZGVyLnNoaXBwaW5nQWRkcmVzcz8uY291bnRyeUNvZGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBob25lTnVtYmVyOiBuZXcgRm9ybUNvbnRyb2wob3JkZXIuc2hpcHBpbmdBZGRyZXNzPy5waG9uZU51bWJlciksXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQWRkcmVzc0N1c3RvbUZpZWxkc0Zvcm1Hcm91cCh0aGlzLnNoaXBwaW5nQWRkcmVzc0Zvcm0sIG9yZGVyLnNoaXBwaW5nQWRkcmVzcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmJpbGxpbmdBZGRyZXNzRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaWxsaW5nQWRkcmVzc0Zvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgICAgICAgICAgICAgICBmdWxsTmFtZTogbmV3IEZvcm1Db250cm9sKG9yZGVyLmJpbGxpbmdBZGRyZXNzPy5mdWxsTmFtZSksXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGFueTogbmV3IEZvcm1Db250cm9sKG9yZGVyLmJpbGxpbmdBZGRyZXNzPy5jb21wYW55KSxcclxuICAgICAgICAgICAgICAgICAgICBzdHJlZXRMaW5lMTogbmV3IEZvcm1Db250cm9sKG9yZGVyLmJpbGxpbmdBZGRyZXNzPy5zdHJlZXRMaW5lMSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZWV0TGluZTI6IG5ldyBGb3JtQ29udHJvbChvcmRlci5iaWxsaW5nQWRkcmVzcz8uc3RyZWV0TGluZTIpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNpdHk6IG5ldyBGb3JtQ29udHJvbChvcmRlci5iaWxsaW5nQWRkcmVzcz8uY2l0eSksXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdmluY2U6IG5ldyBGb3JtQ29udHJvbChvcmRlci5iaWxsaW5nQWRkcmVzcz8ucHJvdmluY2UpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvc3RhbENvZGU6IG5ldyBGb3JtQ29udHJvbChvcmRlci5iaWxsaW5nQWRkcmVzcz8ucG9zdGFsQ29kZSksXHJcbiAgICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGU6IG5ldyBGb3JtQ29udHJvbChvcmRlci5iaWxsaW5nQWRkcmVzcz8uY291bnRyeUNvZGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBob25lTnVtYmVyOiBuZXcgRm9ybUNvbnRyb2wob3JkZXIuYmlsbGluZ0FkZHJlc3M/LnBob25lTnVtYmVyKSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBZGRyZXNzQ3VzdG9tRmllbGRzRm9ybUdyb3VwKHRoaXMuYmlsbGluZ0FkZHJlc3NGb3JtLCBvcmRlci5iaWxsaW5nQWRkcmVzcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5vcmRlckxpbmVDdXN0b21GaWVsZHNGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG9yZGVyLmxpbmVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgeyBuYW1lIH0gb2YgdGhpcy5vcmRlckxpbmVDdXN0b21GaWVsZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtR3JvdXAuYWRkQ29udHJvbChuYW1lLCBuZXcgRm9ybUNvbnRyb2woKGxpbmUgYXMgYW55KS5jdXN0b21GaWVsZHNbbmFtZV0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGlmeVJvdyA9IHRoaXMubW9kaWZ5T3JkZXJJbnB1dC5hZGp1c3RPcmRlckxpbmVzLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGwgPT4gbC5vcmRlckxpbmVJZCA9PT0gbGluZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbW9kaWZ5Um93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeVJvdyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyTGluZUlkOiBsaW5lLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IGxpbmUucXVhbnRpdHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5T3JkZXJJbnB1dC5hZGp1c3RPcmRlckxpbmVzLnB1c2gobW9kaWZ5Um93KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3JkZXJMaW5lQ3VzdG9tRmllbGRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlSb3cuY3VzdG9tRmllbGRzID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9yZGVyTGluZUN1c3RvbUZpZWxkc0Zvcm1BcnJheS5wdXNoKGZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZUNvdXBvbkNvZGVzJCA9IGNvbmNhdChcclxuICAgICAgICAgICAgdGhpcy5jb3Vwb25Db2RlSW5wdXQkLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKFxyXG4gICAgICAgICAgICAgICAgICAgIHRlcm0gPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5wcm9tb3Rpb24uZ2V0UHJvbW90aW9ucygxMCwgMCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291cG9uQ29kZTogeyBjb250YWluczogdGVybSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5zaW5nbGUkLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIG1hcCgoeyBwcm9tb3Rpb25zIH0pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICAgICAgICAgIHByb21vdGlvbnMuaXRlbXMubWFwKHAgPT4gKHsgY29kZTogcC5jb3Vwb25Db2RlISwgcHJvbW90aW9uTmFtZTogcC5uYW1lIH0pKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgoW10pLFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5hZGRJdGVtQ3VzdG9tRmllbGRzRm9ybUFycmF5ID0gbmV3IEZvcm1BcnJheShbXSk7XHJcbiAgICAgICAgdGhpcy5hZGRJdGVtQ3VzdG9tRmllbGRzRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgIGZvciAoY29uc3QgY3VzdG9tRmllbGQgb2YgdGhpcy5vcmRlckxpbmVDdXN0b21GaWVsZHMpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRJdGVtQ3VzdG9tRmllbGRzRm9ybS5hZGRDb250cm9sKGN1c3RvbUZpZWxkLm5hbWUsIG5ldyBGb3JtQ29udHJvbCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVDb3VudHJpZXMkID0gdGhpcy5kYXRhU2VydmljZS5zZXR0aW5nc1xyXG4gICAgICAgICAgICAuZ2V0QXZhaWxhYmxlQ291bnRyaWVzKClcclxuICAgICAgICAgICAgLm1hcFNpbmdsZShyZXN1bHQgPT4gcmVzdWx0LmNvdW50cmllcy5pdGVtcylcclxuICAgICAgICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2Uub3JkZXJcclxuICAgICAgICAgICAgLmdldE9yZGVySGlzdG9yeSh0aGlzLmlkLCB7XHJcbiAgICAgICAgICAgICAgICB0YWtlOiAxLFxyXG4gICAgICAgICAgICAgICAgc29ydDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogU29ydE9yZGVyLkRFU0MsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IHR5cGU6IHsgZXE6IEhpc3RvcnlFbnRyeVR5cGUuT1JERVJfU1RBVEVfVFJBTlNJVElPTiB9IH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zaW5nbGUkLnN1YnNjcmliZSgoeyBvcmRlciB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzU3RhdGUgPSBvcmRlcj8uaGlzdG9yeS5pdGVtc1swXS5kYXRhLmZyb207XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyYW5zaXRpb25Ub1ByaW9yU3RhdGUob3JkZXI6IE9yZGVyRGV0YWlsLkZyYWdtZW50KSB7XHJcbiAgICAgICAgdGhpcy5vcmRlclRyYW5zaXRpb25TZXJ2aWNlXHJcbiAgICAgICAgICAgIC50cmFuc2l0aW9uVG9QcmVNb2RpZnlpbmdTdGF0ZShvcmRlci5pZCwgb3JkZXIubmV4dFN0YXRlcylcclxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLiddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNhblByZXZpZXdDaGFuZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHsgYWRkSXRlbXMsIGFkanVzdE9yZGVyTGluZXMsIHN1cmNoYXJnZXMgfSA9IHRoaXMubW9kaWZ5T3JkZXJJbnB1dDtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAhIWFkZEl0ZW1zPy5sZW5ndGggfHxcclxuICAgICAgICAgICAgISFzdXJjaGFyZ2VzPy5sZW5ndGggfHxcclxuICAgICAgICAgICAgISFhZGp1c3RPcmRlckxpbmVzPy5sZW5ndGggfHxcclxuICAgICAgICAgICAgKHRoaXMuc2hpcHBpbmdBZGRyZXNzRm9ybS5kaXJ0eSAmJiB0aGlzLnNoaXBwaW5nQWRkcmVzc0Zvcm0udmFsaWQpIHx8XHJcbiAgICAgICAgICAgICh0aGlzLmJpbGxpbmdBZGRyZXNzRm9ybS5kaXJ0eSAmJiB0aGlzLmJpbGxpbmdBZGRyZXNzRm9ybS52YWxpZCkgfHxcclxuICAgICAgICAgICAgdGhpcy5jb3Vwb25Db2Rlc0NvbnRyb2wuZGlydHlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTGluZU1vZGlmaWVkKGxpbmU6IE9yZGVyRGV0YWlsLkxpbmVzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5tb2RpZnlPcmRlcklucHV0LmFkanVzdE9yZGVyTGluZXM/LmZpbmQoXHJcbiAgICAgICAgICAgIGwgPT4gbC5vcmRlckxpbmVJZCA9PT0gbGluZS5pZCAmJiBsLnF1YW50aXR5ICE9PSBsaW5lLnF1YW50aXR5LFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTGluZVF1YW50aXR5KGxpbmU6IE9yZGVyRGV0YWlsLkxpbmVzLCBxdWFudGl0eTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgeyBhZGp1c3RPcmRlckxpbmVzIH0gPSB0aGlzLm1vZGlmeU9yZGVySW5wdXQ7XHJcbiAgICAgICAgbGV0IHJvdyA9IGFkanVzdE9yZGVyTGluZXM/LmZpbmQobCA9PiBsLm9yZGVyTGluZUlkID09PSBsaW5lLmlkKTtcclxuICAgICAgICBpZiAocm93ICYmICtxdWFudGl0eSA9PT0gbGluZS5xdWFudGl0eSkge1xyXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG1vZGlmaWNhdGlvbiBpZiB0aGUgcXVhbnRpdHkgaXMgdGhlIHNhbWUgYXNcclxuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG9yZGVyXHJcbiAgICAgICAgICAgIGFkanVzdE9yZGVyTGluZXM/LnNwbGljZShhZGp1c3RPcmRlckxpbmVzPy5pbmRleE9mKHJvdyksIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXJvdykge1xyXG4gICAgICAgICAgICByb3cgPSB7IG9yZGVyTGluZUlkOiBsaW5lLmlkLCBxdWFudGl0eTogK3F1YW50aXR5IH07XHJcbiAgICAgICAgICAgIGFkanVzdE9yZGVyTGluZXM/LnB1c2gocm93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcm93LnF1YW50aXR5ID0gK3F1YW50aXR5O1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUFkZGVkSXRlbVF1YW50aXR5KGl0ZW06IEFkZGVkTGluZSwgcXVhbnRpdHk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMubW9kaWZ5T3JkZXJJbnB1dC5hZGRJdGVtcz8uZmluZChsID0+IGwucHJvZHVjdFZhcmlhbnRJZCA9PT0gaXRlbS5wcm9kdWN0VmFyaWFudElkKTtcclxuICAgICAgICBpZiAocm93KSB7XHJcbiAgICAgICAgICAgIHJvdy5xdWFudGl0eSA9ICtxdWFudGl0eTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdHJhY2tCeVByb2R1Y3RWYXJpYW50SWQoaW5kZXg6IG51bWJlciwgaXRlbTogQWRkZWRMaW5lKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0ucHJvZHVjdFZhcmlhbnRJZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RlZEl0ZW1QcmljZShyZXN1bHQ6IFByb2R1Y3RTZWxlY3RvclNlYXJjaC5JdGVtcyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XHJcbiAgICAgICAgc3dpdGNoIChyZXN1bHQ/LnByaWNlV2l0aFRheC5fX3R5cGVuYW1lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ1NpbmdsZVByaWNlJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucHJpY2VXaXRoVGF4LnZhbHVlO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZEl0ZW1Ub09yZGVyKHJlc3VsdDogUHJvZHVjdFNlbGVjdG9yU2VhcmNoLkl0ZW1zIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjdXN0b21GaWVsZHMgPSB0aGlzLm9yZGVyTGluZUN1c3RvbUZpZWxkcy5sZW5ndGhcclxuICAgICAgICAgICAgPyB0aGlzLmFkZEl0ZW1DdXN0b21GaWVsZHNGb3JtLnZhbHVlXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCByb3cgPSB0aGlzLm1vZGlmeU9yZGVySW5wdXQuYWRkSXRlbXM/LmZpbmQobCA9PlxyXG4gICAgICAgICAgICB0aGlzLmlzTWF0Y2hpbmdBZGRJdGVtUm93KGwsIHJlc3VsdCwgY3VzdG9tRmllbGRzKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICghcm93KSB7XHJcbiAgICAgICAgICAgIHJvdyA9IHsgcHJvZHVjdFZhcmlhbnRJZDogcmVzdWx0LnByb2R1Y3RWYXJpYW50SWQsIHF1YW50aXR5OiAxIH07XHJcbiAgICAgICAgICAgIGlmIChjdXN0b21GaWVsZHMpIHtcclxuICAgICAgICAgICAgICAgIHJvdy5jdXN0b21GaWVsZHMgPSBjdXN0b21GaWVsZHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5tb2RpZnlPcmRlcklucHV0LmFkZEl0ZW1zPy5wdXNoKHJvdyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcm93LnF1YW50aXR5Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXN0b21GaWVsZHMpIHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGN1c3RvbUZpZWxkcykpIHtcclxuICAgICAgICAgICAgICAgIGZvcm1Hcm91cC5hZGRDb250cm9sKGtleSwgbmV3IEZvcm1Db250cm9sKHZhbHVlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5hZGRJdGVtQ3VzdG9tRmllbGRzRm9ybUFycmF5LnB1c2goZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3cuY3VzdG9tRmllbGRzID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZEl0ZW1DdXN0b21GaWVsZHNGb3JtLnJlc2V0KHt9KTtcclxuICAgICAgICB0aGlzLmFkZEl0ZW1TZWxlY3RlZFZhcmlhbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5hZGRlZFZhcmlhbnRzLnNldChyZXN1bHQucHJvZHVjdFZhcmlhbnRJZCwgcmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzTWF0Y2hpbmdBZGRJdGVtUm93KFxyXG4gICAgICAgIHJvdzogTW9kaWZ5T3JkZXJEYXRhWydhZGRJdGVtcyddW251bWJlcl0sXHJcbiAgICAgICAgcmVzdWx0OiBQcm9kdWN0U2VsZWN0b3JTZWFyY2guSXRlbXMsXHJcbiAgICAgICAgY3VzdG9tRmllbGRzOiBhbnksXHJcbiAgICApOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICByb3cucHJvZHVjdFZhcmlhbnRJZCA9PT0gcmVzdWx0LnByb2R1Y3RWYXJpYW50SWQgJiZcclxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocm93LmN1c3RvbUZpZWxkcykgPT09IEpTT04uc3RyaW5naWZ5KGN1c3RvbUZpZWxkcylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUFkZGVkSXRlbShpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZnlPcmRlcklucHV0LmFkZEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgaWYgKC0xIDwgaW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRJdGVtQ3VzdG9tRmllbGRzRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3VyY2hhcmdlUHJpY2VzKHN1cmNoYXJnZTogU3VyY2hhcmdlSW5wdXQpIHtcclxuICAgICAgICBjb25zdCBwcmljZVdpdGhUYXggPSBzdXJjaGFyZ2UucHJpY2VJbmNsdWRlc1RheFxyXG4gICAgICAgICAgICA/IHN1cmNoYXJnZS5wcmljZVxyXG4gICAgICAgICAgICA6IE1hdGgucm91bmQoc3VyY2hhcmdlLnByaWNlICogKCgxMDAgKyAoc3VyY2hhcmdlLnRheFJhdGUgfHwgMCkpIC8gMTAwKSk7XHJcbiAgICAgICAgY29uc3QgcHJpY2UgPSBzdXJjaGFyZ2UucHJpY2VJbmNsdWRlc1RheFxyXG4gICAgICAgICAgICA/IE1hdGgucm91bmQoc3VyY2hhcmdlLnByaWNlIC8gKCgxMDAgKyAoc3VyY2hhcmdlLnRheFJhdGUgfHwgMCkpIC8gMTAwKSlcclxuICAgICAgICAgICAgOiBzdXJjaGFyZ2UucHJpY2U7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJpY2UsXHJcbiAgICAgICAgICAgIHByaWNlV2l0aFRheCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFN1cmNoYXJnZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZnlPcmRlcklucHV0LnN1cmNoYXJnZXM/LnB1c2godmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc3VyY2hhcmdlRm9ybS5yZXNldCh7XHJcbiAgICAgICAgICAgIHByaWNlOiAwLFxyXG4gICAgICAgICAgICBwcmljZUluY2x1ZGVzVGF4OiB0cnVlLFxyXG4gICAgICAgICAgICB0YXhSYXRlOiAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVN1cmNoYXJnZShpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZnlPcmRlcklucHV0LnN1cmNoYXJnZXM/LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJldmlld0FuZE1vZGlmeShvcmRlcjogT3JkZXJEZXRhaWwuRnJhZ21lbnQpIHtcclxuICAgICAgICBjb25zdCBpbnB1dDogTW9kaWZ5T3JkZXJJbnB1dCA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5tb2RpZnlPcmRlcklucHV0LFxyXG4gICAgICAgICAgICAuLi4odGhpcy5iaWxsaW5nQWRkcmVzc0Zvcm0uZGlydHkgPyB7IHVwZGF0ZUJpbGxpbmdBZGRyZXNzOiB0aGlzLmJpbGxpbmdBZGRyZXNzRm9ybS52YWx1ZSB9IDoge30pLFxyXG4gICAgICAgICAgICAuLi4odGhpcy5zaGlwcGluZ0FkZHJlc3NGb3JtLmRpcnR5XHJcbiAgICAgICAgICAgICAgICA/IHsgdXBkYXRlU2hpcHBpbmdBZGRyZXNzOiB0aGlzLnNoaXBwaW5nQWRkcmVzc0Zvcm0udmFsdWUgfVxyXG4gICAgICAgICAgICAgICAgOiB7fSksXHJcbiAgICAgICAgICAgIGRyeVJ1bjogdHJ1ZSxcclxuICAgICAgICAgICAgY291cG9uQ29kZXM6IHRoaXMuY291cG9uQ29kZXNDb250cm9sLmRpcnR5ID8gdGhpcy5jb3Vwb25Db2Rlc0NvbnRyb2wudmFsdWUgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIG5vdGU6IHRoaXMubm90ZSA/PyAnJyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgcmVjYWxjdWxhdGVTaGlwcGluZzogdGhpcy5yZWNhbGN1bGF0ZVNoaXBwaW5nLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxUb3RhbFdpdGhUYXggPSBvcmRlci50b3RhbFdpdGhUYXg7XHJcbiAgICAgICAgdGhpcy5kYXRhU2VydmljZS5vcmRlclxyXG4gICAgICAgICAgICAubW9kaWZ5T3JkZXIoaW5wdXQpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh7IG1vZGlmeU9yZGVyIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGlmeU9yZGVyLl9fdHlwZW5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnT3JkZXInOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kYWxTZXJ2aWNlLmZyb21Db21wb25lbnQoT3JkZXJFZGl0c1ByZXZpZXdEaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAneGwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxUb3RhbFdpdGhUYXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiBtb2RpZnlPcmRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJMaW5lQ3VzdG9tRmllbGRzOiB0aGlzLm9yZGVyTGluZUN1c3RvbUZpZWxkcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5T3JkZXJJbnB1dDogaW5wdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdJbnN1ZmZpY2llbnRTdG9ja0Vycm9yJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTmVnYXRpdmVRdWFudGl0eUVycm9yJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTm9DaGFuZ2VzU3BlY2lmaWVkRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdPcmRlckxpbWl0RXJyb3InOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdPcmRlck1vZGlmaWNhdGlvblN0YXRlRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQYXltZW50TWV0aG9kTWlzc2luZ0Vycm9yJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUmVmdW5kUGF5bWVudElkTWlzc2luZ0Vycm9yJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ291cG9uQ29kZUxpbWl0RXJyb3InOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDb3Vwb25Db2RlRXhwaXJlZEVycm9yJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ291cG9uQ29kZUludmFsaWRFcnJvcic6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcihtb2RpZnlPcmRlci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSBhcyBjb25zdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBudWxsOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSBhcyBjb25zdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnROZXZlcihtb2RpZnlPcmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQucmVzdWx0ID09PSBPcmRlckVkaXRSZXN1bHRUeXBlLkNhbmNlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1mZXRjaCBzbyB0aGF0IHRoZSBwcmV2aWV3IHZhbHVlcyBnZXQgb3ZlcndyaXR0ZW4gaW4gdGhlIGNhY2hlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5vcmRlci5nZXRPcmRlcih0aGlzLmlkKS5tYXBTaW5nbGUoKCkgPT4gZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIHRoZSBtb2RpZmljYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2V0UnVuSW5wdXQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pbnB1dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeVJ1bjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0ID09PSBPcmRlckVkaXRSZXN1bHRUeXBlLlJlZnVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2V0UnVuSW5wdXQucmVmdW5kID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheW1lbnRJZDogcmVzdWx0LnJlZnVuZFBheW1lbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IHJlc3VsdC5yZWZ1bmROb3RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5vcmRlci5tb2RpZnlPcmRlcih3ZXRSdW5JbnB1dCkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoeyBtb2RpZnlPcmRlciB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmeU9yZGVyLl9fdHlwZW5hbWUgPT09ICdPcmRlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJpY2VEZWx0YSA9IG1vZGlmeU9yZGVyLnRvdGFsV2l0aFRheCAtIG9yaWdpbmFsVG90YWxXaXRoVGF4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0U3RhdGUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA8IHByaWNlRGVsdGEgPyAnQXJyYW5naW5nQWRkaXRpb25hbFBheW1lbnQnIDogdGhpcy5wcmV2aW91c1N0YXRlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2Uub3JkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uVG9TdGF0ZShvcmRlci5pZCwgbmV4dFN0YXRlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUobWFwVG8odHJ1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcigobW9kaWZ5T3JkZXIgYXMgRXJyb3JSZXN1bHQpLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi4vJ10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRBZGRyZXNzQ3VzdG9tRmllbGRzRm9ybUdyb3VwKFxyXG4gICAgICAgIHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwLFxyXG4gICAgICAgIGFkZHJlc3M/OiBPcmRlckFkZHJlc3NGcmFnbWVudCB8IG51bGwsXHJcbiAgICApIHtcclxuICAgICAgICBpZiAoYWRkcmVzcyAmJiB0aGlzLmFkZHJlc3NDdXN0b21GaWVsZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NDdXN0b21GaWVsZHNGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjdXN0b21GaWVsZERlZiBvZiB0aGlzLmFkZHJlc3NDdXN0b21GaWVsZHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjdXN0b21GaWVsZERlZi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoYWRkcmVzcyBhcyBhbnkpLmN1c3RvbUZpZWxkcz8uW25hbWVdO1xyXG4gICAgICAgICAgICAgICAgYWRkcmVzc0N1c3RvbUZpZWxkc0Zvcm1Hcm91cC5hZGRDb250cm9sKG5hbWUsIG5ldyBGb3JtQ29udHJvbCh2YWx1ZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmVudEZvcm1Hcm91cC5hZGRDb250cm9sKCdjdXN0b21GaWVsZHMnLCBhZGRyZXNzQ3VzdG9tRmllbGRzRm9ybUdyb3VwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNldEZvcm1WYWx1ZXMoZW50aXR5OiBPcmRlckRldGFpbC5GcmFnbWVudCwgbGFuZ3VhZ2VDb2RlOiBMYW5ndWFnZUNvZGUpOiB2b2lkIHtcclxuICAgICAgICAvKiBub3QgdXNlZCAqL1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
381
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvb3JkZXIvc3JjL2NvbXBvbmVudHMvb3JkZXItZWRpdG9yL29yZGVyLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUdILG1CQUFtQixFQUVuQixXQUFXLEVBR1gsZ0JBQWdCLEVBRWhCLFlBQVksRUFFWixtQkFBbUIsRUFJbkIsbUJBQW1CLEVBQ25CLFNBQVMsRUFFVCxrQ0FBa0MsR0FDckMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUNILG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsR0FDWixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2xGLE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsZ0NBQWdDLEdBQ25DLE1BQU0sb0VBQW9FLENBQUM7QUF1QjVFLE1BQU0sT0FBTyxv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aGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHtcclxuICAgIEFkZEl0ZW1JbnB1dCxcclxuICAgIEFkanVzdE9yZGVyTGluZUlucHV0LFxyXG4gICAgQmFzZURldGFpbENvbXBvbmVudCxcclxuICAgIEN1c3RvbUZpZWxkQ29uZmlnLFxyXG4gICAgRGF0YVNlcnZpY2UsXHJcbiAgICBFcnJvclJlc3VsdCxcclxuICAgIEdldEF2YWlsYWJsZUNvdW50cmllcyxcclxuICAgIEhpc3RvcnlFbnRyeVR5cGUsXHJcbiAgICBMYW5ndWFnZUNvZGUsXHJcbiAgICBNb2RhbFNlcnZpY2UsXHJcbiAgICBNb2RpZnlPcmRlcklucHV0LFxyXG4gICAgTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIE9yZGVyQWRkcmVzc0ZyYWdtZW50LFxyXG4gICAgT3JkZXJEZXRhaWwsXHJcbiAgICBQcm9kdWN0U2VsZWN0b3JTZWFyY2gsXHJcbiAgICBTZXJ2ZXJDb25maWdTZXJ2aWNlLFxyXG4gICAgU29ydE9yZGVyLFxyXG4gICAgU3VyY2hhcmdlSW5wdXQsXHJcbiAgICB0cmFuc2Zvcm1SZWxhdGlvbkN1c3RvbUZpZWxkSW5wdXRzLFxyXG59IGZyb20gJ0B2ZW5kdXJlL2FkbWluLXVpL2NvcmUnO1xyXG5pbXBvcnQgeyBhc3NlcnROZXZlciwgbm90TnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi9zaGFyZWQtdXRpbHMnO1xyXG5pbXBvcnQgeyBzaW1wbGVEZWVwQ2xvbmUgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL3NpbXBsZS1kZWVwLWNsb25lJztcclxuaW1wb3J0IHsgY29uY2F0LCBFTVBUWSwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gICAgbWFwLFxyXG4gICAgbWFwVG8sXHJcbiAgICBzaGFyZVJlcGxheSxcclxuICAgIHN0YXJ0V2l0aCxcclxuICAgIHN3aXRjaE1hcCxcclxuICAgIHRha2VVbnRpbCxcclxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBPcmRlclRyYW5zaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL29yZGVyLXRyYW5zaXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgICBPcmRlckVkaXRSZXN1bHRUeXBlLFxyXG4gICAgT3JkZXJFZGl0c1ByZXZpZXdEaWFsb2dDb21wb25lbnQsXHJcbn0gZnJvbSAnLi4vb3JkZXItZWRpdHMtcHJldmlldy1kaWFsb2cvb3JkZXItZWRpdHMtcHJldmlldy1kaWFsb2cuY29tcG9uZW50JztcclxuXHJcbmludGVyZmFjZSBBZGRlZExpbmUge1xyXG4gICAgcHJvZHVjdFZhcmlhbnRJZDogc3RyaW5nO1xyXG4gICAgcHJvZHVjdEFzc2V0PzogUHJvZHVjdFNlbGVjdG9yU2VhcmNoLlByb2R1Y3RBc3NldCB8IG51bGw7XHJcbiAgICBwcm9kdWN0VmFyaWFudE5hbWU6IHN0cmluZztcclxuICAgIHNrdTogc3RyaW5nO1xyXG4gICAgcHJpY2VXaXRoVGF4OiBudW1iZXI7XHJcbiAgICBwcmljZTogbnVtYmVyO1xyXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcclxufVxyXG5cclxudHlwZSBNb2RpZnlPcmRlckRhdGEgPSBPbWl0PE1vZGlmeU9yZGVySW5wdXQsICdhZGRJdGVtcycgfCAnYWRqdXN0T3JkZXJMaW5lcyc+ICYge1xyXG4gICAgYWRkSXRlbXM6IEFycmF5PEFkZEl0ZW1JbnB1dCAmIHsgY3VzdG9tRmllbGRzPzogYW55IH0+O1xyXG4gICAgYWRqdXN0T3JkZXJMaW5lczogQXJyYXk8QWRqdXN0T3JkZXJMaW5lSW5wdXQgJiB7IGN1c3RvbUZpZWxkcz86IGFueSB9PjtcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd2ZHItb3JkZXItZWRpdG9yJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9vcmRlci1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vb3JkZXItZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyRWRpdG9yQ29tcG9uZW50XHJcbiAgICBleHRlbmRzIEJhc2VEZXRhaWxDb21wb25lbnQ8T3JkZXJEZXRhaWwuRnJhZ21lbnQ+XHJcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XHJcbntcclxuICAgIGF2YWlsYWJsZUNvdW50cmllcyQ6IE9ic2VydmFibGU8R2V0QXZhaWxhYmxlQ291bnRyaWVzLkl0ZW1zW10+O1xyXG4gICAgYXZhaWxhYmxlQ291cG9uQ29kZXMkOiBPYnNlcnZhYmxlPEFycmF5PHsgY29kZTogc3RyaW5nOyBwcm9tb3Rpb25OYW1lOiBzdHJpbmcgfT4+O1xyXG4gICAgY291cG9uQ29kZUlucHV0JCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICAgIGFkZHJlc3NDdXN0b21GaWVsZHM6IEN1c3RvbUZpZWxkQ29uZmlnW107XHJcbiAgICBkZXRhaWxGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgICBjb3Vwb25Db2Rlc0NvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuICAgIG9yZGVyTGluZUN1c3RvbUZpZWxkc0Zvcm1BcnJheTogRm9ybUFycmF5O1xyXG4gICAgYWRkSXRlbUN1c3RvbUZpZWxkc0Zvcm1BcnJheTogRm9ybUFycmF5O1xyXG4gICAgYWRkSXRlbUN1c3RvbUZpZWxkc0Zvcm06IEZvcm1Hcm91cDtcclxuICAgIGFkZEl0ZW1TZWxlY3RlZFZhcmlhbnQ6IFByb2R1Y3RTZWxlY3RvclNlYXJjaC5JdGVtcyB8IHVuZGVmaW5lZDtcclxuICAgIG9yZGVyTGluZUN1c3RvbUZpZWxkczogQ3VzdG9tRmllbGRDb25maWdbXTtcclxuICAgIG1vZGlmeU9yZGVySW5wdXQ6IE1vZGlmeU9yZGVyRGF0YSA9IHtcclxuICAgICAgICBkcnlSdW46IHRydWUsXHJcbiAgICAgICAgb3JkZXJJZDogJycsXHJcbiAgICAgICAgYWRkSXRlbXM6IFtdLFxyXG4gICAgICAgIGFkanVzdE9yZGVyTGluZXM6IFtdLFxyXG4gICAgICAgIHN1cmNoYXJnZXM6IFtdLFxyXG4gICAgICAgIG5vdGU6ICcnLFxyXG4gICAgICAgIHVwZGF0ZVNoaXBwaW5nQWRkcmVzczoge30sXHJcbiAgICAgICAgdXBkYXRlQmlsbGluZ0FkZHJlc3M6IHt9LFxyXG4gICAgfTtcclxuICAgIHN1cmNoYXJnZUZvcm06IEZvcm1Hcm91cDtcclxuICAgIHNoaXBwaW5nQWRkcmVzc0Zvcm06IEZvcm1Hcm91cDtcclxuICAgIGJpbGxpbmdBZGRyZXNzRm9ybTogRm9ybUdyb3VwO1xyXG4gICAgbm90ZSA9ICcnO1xyXG4gICAgcmVjYWxjdWxhdGVTaGlwcGluZyA9IHRydWU7XHJcbiAgICBwcmV2aW91c1N0YXRlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGFkZGVkVmFyaWFudHMgPSBuZXcgTWFwPHN0cmluZywgUHJvZHVjdFNlbGVjdG9yU2VhcmNoLkl0ZW1zPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBzZXJ2ZXJDb25maWdTZXJ2aWNlOiBTZXJ2ZXJDb25maWdTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByb3RlY3RlZCBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBvcmRlclRyYW5zaXRpb25TZXJ2aWNlOiBPcmRlclRyYW5zaXRpb25TZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIocm91dGUsIHJvdXRlciwgc2VydmVyQ29uZmlnU2VydmljZSwgZGF0YVNlcnZpY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBhZGRlZExpbmVzKCk6IEFkZGVkTGluZVtdIHtcclxuICAgICAgICBjb25zdCBnZXRTaW5nbGVQcmljZVZhbHVlID0gKHByaWNlOiBQcm9kdWN0U2VsZWN0b3JTZWFyY2guUHJpY2UpID0+XHJcbiAgICAgICAgICAgIHByaWNlLl9fdHlwZW5hbWUgPT09ICdTaW5nbGVQcmljZScgPyBwcmljZS52YWx1ZSA6IDA7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLm1vZGlmeU9yZGVySW5wdXQuYWRkSXRlbXMgfHwgW10pXHJcbiAgICAgICAgICAgIC5tYXAocm93ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnRJbmZvID0gdGhpcy5hZGRlZFZhcmlhbnRzLmdldChyb3cucHJvZHVjdFZhcmlhbnRJZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFudEluZm8pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi52YXJpYW50SW5mbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IGdldFNpbmdsZVByaWNlVmFsdWUodmFyaWFudEluZm8ucHJpY2UpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmljZVdpdGhUYXg6IGdldFNpbmdsZVByaWNlVmFsdWUodmFyaWFudEluZm8ucHJpY2VXaXRoVGF4KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IHJvdy5xdWFudGl0eSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmlsdGVyKG5vdE51bGxPclVuZGVmaW5lZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5kYXRhU2VydmljZS5wcm9tb3Rpb24uZ2V0UHJvbW90aW9ucygpO1xyXG4gICAgICAgIHRoaXMuYWRkcmVzc0N1c3RvbUZpZWxkcyA9IHRoaXMuZ2V0Q3VzdG9tRmllbGRDb25maWcoJ0FkZHJlc3MnKTtcclxuICAgICAgICB0aGlzLm1vZGlmeU9yZGVySW5wdXQub3JkZXJJZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpIGFzIHN0cmluZztcclxuICAgICAgICB0aGlzLm9yZGVyTGluZUN1c3RvbUZpZWxkcyA9IHRoaXMuZ2V0Q3VzdG9tRmllbGRDb25maWcoJ09yZGVyTGluZScpO1xyXG4gICAgICAgIHRoaXMuZW50aXR5JC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKG9yZGVyID0+IHtcclxuICAgICAgICAgICAgaWYgKG9yZGVyLmNvdXBvbkNvZGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3Vwb25Db2Rlc0NvbnRyb2wuc2V0VmFsdWUob3JkZXIuY291cG9uQ29kZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc3VyY2hhcmdlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgICAgICBza3U6IG5ldyBGb3JtQ29udHJvbCgnJyksXHJcbiAgICAgICAgICAgICAgICBwcmljZTogbmV3IEZvcm1Db250cm9sKDAsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICAgICAgICAgICAgcHJpY2VJbmNsdWRlc1RheDogbmV3IEZvcm1Db250cm9sKHRydWUpLFxyXG4gICAgICAgICAgICAgICAgdGF4UmF0ZTogbmV3IEZvcm1Db250cm9sKDApLFxyXG4gICAgICAgICAgICAgICAgdGF4RGVzY3JpcHRpb246IG5ldyBGb3JtQ29udHJvbCgnJyksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hpcHBpbmdBZGRyZXNzRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGlwcGluZ0FkZHJlc3NGb3JtID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVsbE5hbWU6IG5ldyBGb3JtQ29udHJvbChvcmRlci5zaGlwcGluZ0FkZHJlc3M/LmZ1bGxOYW1lKSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wYW55OiBuZXcgRm9ybUNvbnRyb2wob3JkZXIuc2hpcHBpbmdBZGRyZXNzPy5jb21wYW55KSxcclxuICAgICAgICAgICAgICAgICAgICBzdHJlZXRMaW5lMTogbmV3IEZvcm1Db250cm9sKG9yZGVyLnNoaXBwaW5nQWRkcmVzcz8uc3RyZWV0TGluZTEpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0cmVldExpbmUyOiBuZXcgRm9ybUNvbnRyb2wob3JkZXIuc2hpcHBpbmdBZGRyZXNzPy5zdHJlZXRMaW5lMiksXHJcbiAgICAgICAgICAgICAgICAgICAgY2l0eTogbmV3IEZvcm1Db250cm9sKG9yZGVyLnNoaXBwaW5nQWRkcmVzcz8uY2l0eSksXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdmluY2U6IG5ldyBGb3JtQ29udHJvbChvcmRlci5zaGlwcGluZ0FkZHJlc3M/LnByb3ZpbmNlKSxcclxuICAgICAgICAgICAgICAgICAgICBwb3N0YWxDb2RlOiBuZXcgRm9ybUNvbnRyb2wob3JkZXIuc2hpcHBpbmdBZGRyZXNzPy5wb3N0YWxDb2RlKSxcclxuICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogbmV3IEZvcm1Db250cm9sKG9yZGVyLnNoaXBwaW5nQWRkcmVzcz8uY291bnRyeUNvZGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBob25lTnVtYmVyOiBuZXcgRm9ybUNvbnRyb2wob3JkZXIuc2hpcHBpbmdBZGRyZXNzPy5waG9uZU51bWJlciksXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQWRkcmVzc0N1c3RvbUZpZWxkc0Zvcm1Hcm91cCh0aGlzLnNoaXBwaW5nQWRkcmVzc0Zvcm0sIG9yZGVyLnNoaXBwaW5nQWRkcmVzcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmJpbGxpbmdBZGRyZXNzRm9ybSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaWxsaW5nQWRkcmVzc0Zvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgICAgICAgICAgICAgICBmdWxsTmFtZTogbmV3IEZvcm1Db250cm9sKG9yZGVyLmJpbGxpbmdBZGRyZXNzPy5mdWxsTmFtZSksXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGFueTogbmV3IEZvcm1Db250cm9sKG9yZGVyLmJpbGxpbmdBZGRyZXNzPy5jb21wYW55KSxcclxuICAgICAgICAgICAgICAgICAgICBzdHJlZXRMaW5lMTogbmV3IEZvcm1Db250cm9sKG9yZGVyLmJpbGxpbmdBZGRyZXNzPy5zdHJlZXRMaW5lMSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZWV0TGluZTI6IG5ldyBGb3JtQ29udHJvbChvcmRlci5iaWxsaW5nQWRkcmVzcz8uc3RyZWV0TGluZTIpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNpdHk6IG5ldyBGb3JtQ29udHJvbChvcmRlci5iaWxsaW5nQWRkcmVzcz8uY2l0eSksXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdmluY2U6IG5ldyBGb3JtQ29udHJvbChvcmRlci5iaWxsaW5nQWRkcmVzcz8ucHJvdmluY2UpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvc3RhbENvZGU6IG5ldyBGb3JtQ29udHJvbChvcmRlci5iaWxsaW5nQWRkcmVzcz8ucG9zdGFsQ29kZSksXHJcbiAgICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGU6IG5ldyBGb3JtQ29udHJvbChvcmRlci5iaWxsaW5nQWRkcmVzcz8uY291bnRyeUNvZGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBob25lTnVtYmVyOiBuZXcgRm9ybUNvbnRyb2wob3JkZXIuYmlsbGluZ0FkZHJlc3M/LnBob25lTnVtYmVyKSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBZGRyZXNzQ3VzdG9tRmllbGRzRm9ybUdyb3VwKHRoaXMuYmlsbGluZ0FkZHJlc3NGb3JtLCBvcmRlci5iaWxsaW5nQWRkcmVzcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5vcmRlckxpbmVDdXN0b21GaWVsZHNGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG9yZGVyLmxpbmVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgeyBuYW1lIH0gb2YgdGhpcy5vcmRlckxpbmVDdXN0b21GaWVsZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtR3JvdXAuYWRkQ29udHJvbChuYW1lLCBuZXcgRm9ybUNvbnRyb2woKGxpbmUgYXMgYW55KS5jdXN0b21GaWVsZHNbbmFtZV0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGlmeVJvdyA9IHRoaXMubW9kaWZ5T3JkZXJJbnB1dC5hZGp1c3RPcmRlckxpbmVzLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGwgPT4gbC5vcmRlckxpbmVJZCA9PT0gbGluZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbW9kaWZ5Um93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeVJvdyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyTGluZUlkOiBsaW5lLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IGxpbmUucXVhbnRpdHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5T3JkZXJJbnB1dC5hZGp1c3RPcmRlckxpbmVzLnB1c2gobW9kaWZ5Um93KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3JkZXJMaW5lQ3VzdG9tRmllbGRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlSb3cuY3VzdG9tRmllbGRzID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9yZGVyTGluZUN1c3RvbUZpZWxkc0Zvcm1BcnJheS5wdXNoKGZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZUNvdXBvbkNvZGVzJCA9IGNvbmNhdChcclxuICAgICAgICAgICAgdGhpcy5jb3Vwb25Db2RlSW5wdXQkLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKFxyXG4gICAgICAgICAgICAgICAgICAgIHRlcm0gPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5wcm9tb3Rpb24uZ2V0UHJvbW90aW9ucygxMCwgMCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291cG9uQ29kZTogeyBjb250YWluczogdGVybSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5zaW5nbGUkLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIG1hcCgoeyBwcm9tb3Rpb25zIH0pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICAgICAgICAgIHByb21vdGlvbnMuaXRlbXMubWFwKHAgPT4gKHsgY29kZTogcC5jb3Vwb25Db2RlISwgcHJvbW90aW9uTmFtZTogcC5uYW1lIH0pKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgoW10pLFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5hZGRJdGVtQ3VzdG9tRmllbGRzRm9ybUFycmF5ID0gbmV3IEZvcm1BcnJheShbXSk7XHJcbiAgICAgICAgdGhpcy5hZGRJdGVtQ3VzdG9tRmllbGRzRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgIGZvciAoY29uc3QgY3VzdG9tRmllbGQgb2YgdGhpcy5vcmRlckxpbmVDdXN0b21GaWVsZHMpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRJdGVtQ3VzdG9tRmllbGRzRm9ybS5hZGRDb250cm9sKGN1c3RvbUZpZWxkLm5hbWUsIG5ldyBGb3JtQ29udHJvbCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVDb3VudHJpZXMkID0gdGhpcy5kYXRhU2VydmljZS5zZXR0aW5nc1xyXG4gICAgICAgICAgICAuZ2V0QXZhaWxhYmxlQ291bnRyaWVzKClcclxuICAgICAgICAgICAgLm1hcFNpbmdsZShyZXN1bHQgPT4gcmVzdWx0LmNvdW50cmllcy5pdGVtcylcclxuICAgICAgICAgICAgLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2Uub3JkZXJcclxuICAgICAgICAgICAgLmdldE9yZGVySGlzdG9yeSh0aGlzLmlkLCB7XHJcbiAgICAgICAgICAgICAgICB0YWtlOiAxLFxyXG4gICAgICAgICAgICAgICAgc29ydDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogU29ydE9yZGVyLkRFU0MsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IHR5cGU6IHsgZXE6IEhpc3RvcnlFbnRyeVR5cGUuT1JERVJfU1RBVEVfVFJBTlNJVElPTiB9IH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zaW5nbGUkLnN1YnNjcmliZSgoeyBvcmRlciB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzU3RhdGUgPSBvcmRlcj8uaGlzdG9yeS5pdGVtc1swXS5kYXRhLmZyb207XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyYW5zaXRpb25Ub1ByaW9yU3RhdGUob3JkZXI6IE9yZGVyRGV0YWlsLkZyYWdtZW50KSB7XHJcbiAgICAgICAgdGhpcy5vcmRlclRyYW5zaXRpb25TZXJ2aWNlXHJcbiAgICAgICAgICAgIC50cmFuc2l0aW9uVG9QcmVNb2RpZnlpbmdTdGF0ZShvcmRlci5pZCwgb3JkZXIubmV4dFN0YXRlcylcclxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLiddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNhblByZXZpZXdDaGFuZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHsgYWRkSXRlbXMsIGFkanVzdE9yZGVyTGluZXMsIHN1cmNoYXJnZXMgfSA9IHRoaXMubW9kaWZ5T3JkZXJJbnB1dDtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAhIWFkZEl0ZW1zPy5sZW5ndGggfHxcclxuICAgICAgICAgICAgISFzdXJjaGFyZ2VzPy5sZW5ndGggfHxcclxuICAgICAgICAgICAgISFhZGp1c3RPcmRlckxpbmVzPy5sZW5ndGggfHxcclxuICAgICAgICAgICAgKHRoaXMuc2hpcHBpbmdBZGRyZXNzRm9ybS5kaXJ0eSAmJiB0aGlzLnNoaXBwaW5nQWRkcmVzc0Zvcm0udmFsaWQpIHx8XHJcbiAgICAgICAgICAgICh0aGlzLmJpbGxpbmdBZGRyZXNzRm9ybS5kaXJ0eSAmJiB0aGlzLmJpbGxpbmdBZGRyZXNzRm9ybS52YWxpZCkgfHxcclxuICAgICAgICAgICAgdGhpcy5jb3Vwb25Db2Rlc0NvbnRyb2wuZGlydHlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTGluZU1vZGlmaWVkKGxpbmU6IE9yZGVyRGV0YWlsLkxpbmVzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5tb2RpZnlPcmRlcklucHV0LmFkanVzdE9yZGVyTGluZXM/LmZpbmQoXHJcbiAgICAgICAgICAgIGwgPT4gbC5vcmRlckxpbmVJZCA9PT0gbGluZS5pZCAmJiBsLnF1YW50aXR5ICE9PSBsaW5lLnF1YW50aXR5LFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTGluZVF1YW50aXR5KGxpbmU6IE9yZGVyRGV0YWlsLkxpbmVzLCBxdWFudGl0eTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgeyBhZGp1c3RPcmRlckxpbmVzIH0gPSB0aGlzLm1vZGlmeU9yZGVySW5wdXQ7XHJcbiAgICAgICAgbGV0IHJvdyA9IGFkanVzdE9yZGVyTGluZXM/LmZpbmQobCA9PiBsLm9yZGVyTGluZUlkID09PSBsaW5lLmlkKTtcclxuICAgICAgICBpZiAocm93ICYmICtxdWFudGl0eSA9PT0gbGluZS5xdWFudGl0eSkge1xyXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG1vZGlmaWNhdGlvbiBpZiB0aGUgcXVhbnRpdHkgaXMgdGhlIHNhbWUgYXNcclxuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG9yZGVyXHJcbiAgICAgICAgICAgIGFkanVzdE9yZGVyTGluZXM/LnNwbGljZShhZGp1c3RPcmRlckxpbmVzPy5pbmRleE9mKHJvdyksIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXJvdykge1xyXG4gICAgICAgICAgICByb3cgPSB7IG9yZGVyTGluZUlkOiBsaW5lLmlkLCBxdWFudGl0eTogK3F1YW50aXR5IH07XHJcbiAgICAgICAgICAgIGFkanVzdE9yZGVyTGluZXM/LnB1c2gocm93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcm93LnF1YW50aXR5ID0gK3F1YW50aXR5O1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUFkZGVkSXRlbVF1YW50aXR5KGl0ZW06IEFkZGVkTGluZSwgcXVhbnRpdHk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMubW9kaWZ5T3JkZXJJbnB1dC5hZGRJdGVtcz8uZmluZChsID0+IGwucHJvZHVjdFZhcmlhbnRJZCA9PT0gaXRlbS5wcm9kdWN0VmFyaWFudElkKTtcclxuICAgICAgICBpZiAocm93KSB7XHJcbiAgICAgICAgICAgIHJvdy5xdWFudGl0eSA9ICtxdWFudGl0eTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdHJhY2tCeVByb2R1Y3RWYXJpYW50SWQoaW5kZXg6IG51bWJlciwgaXRlbTogQWRkZWRMaW5lKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0ucHJvZHVjdFZhcmlhbnRJZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RlZEl0ZW1QcmljZShyZXN1bHQ6IFByb2R1Y3RTZWxlY3RvclNlYXJjaC5JdGVtcyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XHJcbiAgICAgICAgc3dpdGNoIChyZXN1bHQ/LnByaWNlV2l0aFRheC5fX3R5cGVuYW1lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ1NpbmdsZVByaWNlJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucHJpY2VXaXRoVGF4LnZhbHVlO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZEl0ZW1Ub09yZGVyKHJlc3VsdDogUHJvZHVjdFNlbGVjdG9yU2VhcmNoLkl0ZW1zIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjdXN0b21GaWVsZHMgPSB0aGlzLm9yZGVyTGluZUN1c3RvbUZpZWxkcy5sZW5ndGhcclxuICAgICAgICAgICAgPyB0aGlzLmFkZEl0ZW1DdXN0b21GaWVsZHNGb3JtLnZhbHVlXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCByb3cgPSB0aGlzLm1vZGlmeU9yZGVySW5wdXQuYWRkSXRlbXM/LmZpbmQobCA9PlxyXG4gICAgICAgICAgICB0aGlzLmlzTWF0Y2hpbmdBZGRJdGVtUm93KGwsIHJlc3VsdCwgY3VzdG9tRmllbGRzKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICghcm93KSB7XHJcbiAgICAgICAgICAgIHJvdyA9IHsgcHJvZHVjdFZhcmlhbnRJZDogcmVzdWx0LnByb2R1Y3RWYXJpYW50SWQsIHF1YW50aXR5OiAxIH07XHJcbiAgICAgICAgICAgIGlmIChjdXN0b21GaWVsZHMpIHtcclxuICAgICAgICAgICAgICAgIHJvdy5jdXN0b21GaWVsZHMgPSBjdXN0b21GaWVsZHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5tb2RpZnlPcmRlcklucHV0LmFkZEl0ZW1zPy5wdXNoKHJvdyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcm93LnF1YW50aXR5Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXN0b21GaWVsZHMpIHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGN1c3RvbUZpZWxkcykpIHtcclxuICAgICAgICAgICAgICAgIGZvcm1Hcm91cC5hZGRDb250cm9sKGtleSwgbmV3IEZvcm1Db250cm9sKHZhbHVlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5hZGRJdGVtQ3VzdG9tRmllbGRzRm9ybUFycmF5LnB1c2goZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3cuY3VzdG9tRmllbGRzID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZEl0ZW1DdXN0b21GaWVsZHNGb3JtLnJlc2V0KHt9KTtcclxuICAgICAgICB0aGlzLmFkZEl0ZW1TZWxlY3RlZFZhcmlhbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5hZGRlZFZhcmlhbnRzLnNldChyZXN1bHQucHJvZHVjdFZhcmlhbnRJZCwgcmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzTWF0Y2hpbmdBZGRJdGVtUm93KFxyXG4gICAgICAgIHJvdzogTW9kaWZ5T3JkZXJEYXRhWydhZGRJdGVtcyddW251bWJlcl0sXHJcbiAgICAgICAgcmVzdWx0OiBQcm9kdWN0U2VsZWN0b3JTZWFyY2guSXRlbXMsXHJcbiAgICAgICAgY3VzdG9tRmllbGRzOiBhbnksXHJcbiAgICApOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICByb3cucHJvZHVjdFZhcmlhbnRJZCA9PT0gcmVzdWx0LnByb2R1Y3RWYXJpYW50SWQgJiZcclxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocm93LmN1c3RvbUZpZWxkcykgPT09IEpTT04uc3RyaW5naWZ5KGN1c3RvbUZpZWxkcylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUFkZGVkSXRlbShpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZnlPcmRlcklucHV0LmFkZEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgaWYgKC0xIDwgaW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRJdGVtQ3VzdG9tRmllbGRzRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3VyY2hhcmdlUHJpY2VzKHN1cmNoYXJnZTogU3VyY2hhcmdlSW5wdXQpIHtcclxuICAgICAgICBjb25zdCBwcmljZVdpdGhUYXggPSBzdXJjaGFyZ2UucHJpY2VJbmNsdWRlc1RheFxyXG4gICAgICAgICAgICA/IHN1cmNoYXJnZS5wcmljZVxyXG4gICAgICAgICAgICA6IE1hdGgucm91bmQoc3VyY2hhcmdlLnByaWNlICogKCgxMDAgKyAoc3VyY2hhcmdlLnRheFJhdGUgfHwgMCkpIC8gMTAwKSk7XHJcbiAgICAgICAgY29uc3QgcHJpY2UgPSBzdXJjaGFyZ2UucHJpY2VJbmNsdWRlc1RheFxyXG4gICAgICAgICAgICA/IE1hdGgucm91bmQoc3VyY2hhcmdlLnByaWNlIC8gKCgxMDAgKyAoc3VyY2hhcmdlLnRheFJhdGUgfHwgMCkpIC8gMTAwKSlcclxuICAgICAgICAgICAgOiBzdXJjaGFyZ2UucHJpY2U7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJpY2UsXHJcbiAgICAgICAgICAgIHByaWNlV2l0aFRheCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFN1cmNoYXJnZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZnlPcmRlcklucHV0LnN1cmNoYXJnZXM/LnB1c2godmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc3VyY2hhcmdlRm9ybS5yZXNldCh7XHJcbiAgICAgICAgICAgIHByaWNlOiAwLFxyXG4gICAgICAgICAgICBwcmljZUluY2x1ZGVzVGF4OiB0cnVlLFxyXG4gICAgICAgICAgICB0YXhSYXRlOiAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVN1cmNoYXJnZShpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZnlPcmRlcklucHV0LnN1cmNoYXJnZXM/LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJldmlld0FuZE1vZGlmeShvcmRlcjogT3JkZXJEZXRhaWwuRnJhZ21lbnQpIHtcclxuICAgICAgICBjb25zdCBtb2RpZnlPcmRlcklucHV0OiBNb2RpZnlPcmRlckRhdGEgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMubW9kaWZ5T3JkZXJJbnB1dCxcclxuICAgICAgICAgICAgYWRqdXN0T3JkZXJMaW5lczogdGhpcy5tb2RpZnlPcmRlcklucHV0LmFkanVzdE9yZGVyTGluZXMubWFwKGxpbmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVJlbGF0aW9uQ3VzdG9tRmllbGRJbnB1dHMoc2ltcGxlRGVlcENsb25lKGxpbmUpLCB0aGlzLm9yZGVyTGluZUN1c3RvbUZpZWxkcyk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgaW5wdXQ6IE1vZGlmeU9yZGVySW5wdXQgPSB7XHJcbiAgICAgICAgICAgIC4uLm1vZGlmeU9yZGVySW5wdXQsXHJcbiAgICAgICAgICAgIC4uLih0aGlzLmJpbGxpbmdBZGRyZXNzRm9ybS5kaXJ0eSA/IHsgdXBkYXRlQmlsbGluZ0FkZHJlc3M6IHRoaXMuYmlsbGluZ0FkZHJlc3NGb3JtLnZhbHVlIH0gOiB7fSksXHJcbiAgICAgICAgICAgIC4uLih0aGlzLnNoaXBwaW5nQWRkcmVzc0Zvcm0uZGlydHlcclxuICAgICAgICAgICAgICAgID8geyB1cGRhdGVTaGlwcGluZ0FkZHJlc3M6IHRoaXMuc2hpcHBpbmdBZGRyZXNzRm9ybS52YWx1ZSB9XHJcbiAgICAgICAgICAgICAgICA6IHt9KSxcclxuICAgICAgICAgICAgZHJ5UnVuOiB0cnVlLFxyXG4gICAgICAgICAgICBjb3Vwb25Db2RlczogdGhpcy5jb3Vwb25Db2Rlc0NvbnRyb2wuZGlydHkgPyB0aGlzLmNvdXBvbkNvZGVzQ29udHJvbC52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgbm90ZTogdGhpcy5ub3RlID8/ICcnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICByZWNhbGN1bGF0ZVNoaXBwaW5nOiB0aGlzLnJlY2FsY3VsYXRlU2hpcHBpbmcsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFRvdGFsV2l0aFRheCA9IG9yZGVyLnRvdGFsV2l0aFRheDtcclxuICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLm9yZGVyXHJcbiAgICAgICAgICAgIC5tb2RpZnlPcmRlcihpbnB1dClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHsgbW9kaWZ5T3JkZXIgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kaWZ5T3JkZXIuX190eXBlbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdPcmRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RhbFNlcnZpY2UuZnJvbUNvbXBvbmVudChPcmRlckVkaXRzUHJldmlld0RpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICd4bCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2FibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2Fsczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRvdGFsV2l0aFRheCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXI6IG1vZGlmeU9yZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckxpbmVDdXN0b21GaWVsZHM6IHRoaXMub3JkZXJMaW5lQ3VzdG9tRmllbGRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlPcmRlcklucHV0OiBpbnB1dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0luc3VmZmljaWVudFN0b2NrRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOZWdhdGl2ZVF1YW50aXR5RXJyb3InOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOb0NoYW5nZXNTcGVjaWZpZWRFcnJvcic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ09yZGVyTGltaXRFcnJvcic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ09yZGVyTW9kaWZpY2F0aW9uU3RhdGVFcnJvcic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1BheW1lbnRNZXRob2RNaXNzaW5nRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSZWZ1bmRQYXltZW50SWRNaXNzaW5nRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDb3Vwb25Db2RlTGltaXRFcnJvcic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0NvdXBvbkNvZGVFeHBpcmVkRXJyb3InOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDb3Vwb25Db2RlSW52YWxpZEVycm9yJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKG1vZGlmeU9yZGVyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlIGFzIGNvbnN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG51bGw6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlIGFzIGNvbnN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5ldmVyKG1vZGlmeU9yZGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0IHx8IHJlc3VsdC5yZXN1bHQgPT09IE9yZGVyRWRpdFJlc3VsdFR5cGUuQ2FuY2VsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWZldGNoIHNvIHRoYXQgdGhlIHByZXZpZXcgdmFsdWVzIGdldCBvdmVyd3JpdHRlbiBpbiB0aGUgY2FjaGUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLm9yZGVyLmdldE9yZGVyKHRoaXMuaWQpLm1hcFNpbmdsZSgoKSA9PiBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gdGhlIG1vZGlmaWNhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3ZXRSdW5JbnB1dCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmlucHV0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ5UnVuOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQgPT09IE9yZGVyRWRpdFJlc3VsdFR5cGUuUmVmdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZXRSdW5JbnB1dC5yZWZ1bmQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bWVudElkOiByZXN1bHQucmVmdW5kUGF5bWVudElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVzdWx0LnJlZnVuZE5vdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLm9yZGVyLm1vZGlmeU9yZGVyKHdldFJ1bklucHV0KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh7IG1vZGlmeU9yZGVyIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZ5T3JkZXIuX190eXBlbmFtZSA9PT0gJ09yZGVyJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmljZURlbHRhID0gbW9kaWZ5T3JkZXIudG90YWxXaXRoVGF4IC0gb3JpZ2luYWxUb3RhbFdpdGhUYXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTdGF0ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDwgcHJpY2VEZWx0YSA/ICdBcnJhbmdpbmdBZGRpdGlvbmFsUGF5bWVudCcgOiB0aGlzLnByZXZpb3VzU3RhdGU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5vcmRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zaXRpb25Ub1N0YXRlKG9yZGVyLmlkLCBuZXh0U3RhdGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZShtYXBUbyh0cnVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKChtb2RpZnlPcmRlciBhcyBFcnJvclJlc3VsdCkubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLi8nXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZEFkZHJlc3NDdXN0b21GaWVsZHNGb3JtR3JvdXAoXHJcbiAgICAgICAgcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXAsXHJcbiAgICAgICAgYWRkcmVzcz86IE9yZGVyQWRkcmVzc0ZyYWdtZW50IHwgbnVsbCxcclxuICAgICkge1xyXG4gICAgICAgIGlmIChhZGRyZXNzICYmIHRoaXMuYWRkcmVzc0N1c3RvbUZpZWxkcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgYWRkcmVzc0N1c3RvbUZpZWxkc0Zvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGN1c3RvbUZpZWxkRGVmIG9mIHRoaXMuYWRkcmVzc0N1c3RvbUZpZWxkcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGN1c3RvbUZpZWxkRGVmLm5hbWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IChhZGRyZXNzIGFzIGFueSkuY3VzdG9tRmllbGRzPy5bbmFtZV07XHJcbiAgICAgICAgICAgICAgICBhZGRyZXNzQ3VzdG9tRmllbGRzRm9ybUdyb3VwLmFkZENvbnRyb2wobmFtZSwgbmV3IEZvcm1Db250cm9sKHZhbHVlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyZW50Rm9ybUdyb3VwLmFkZENvbnRyb2woJ2N1c3RvbUZpZWxkcycsIGFkZHJlc3NDdXN0b21GaWVsZHNGb3JtR3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2V0Rm9ybVZhbHVlcyhlbnRpdHk6IE9yZGVyRGV0YWlsLkZyYWdtZW50LCBsYW5ndWFnZUNvZGU6IExhbmd1YWdlQ29kZSk6IHZvaWQge1xyXG4gICAgICAgIC8qIG5vdCB1c2VkICovXHJcbiAgICB9XHJcbn1cclxuIl19
@@ -3500,7 +3500,13 @@ class OptionValueInputComponent {
3500
3500
  this.addOptionValue();
3501
3501
  }
3502
3502
  addOptionValue() {
3503
- const options = this.parseInputIntoOptions(this.input);
3503
+ const options = this.parseInputIntoOptions(this.input).filter(option => {
3504
+ var _a;
3505
+ // do not add an option with the same name
3506
+ // as an existing option
3507
+ const existing = (_a = this.options) !== null && _a !== void 0 ? _a : this.formValue;
3508
+ return !(existing === null || existing === void 0 ? void 0 : existing.find(o => (o === null || o === void 0 ? void 0 : o.name) === option.name));
3509
+ });
3504
3510
  if (!this.formValue && this.options) {
3505
3511
  for (const option of options) {
3506
3512
  this.add.emit(option);