@vendure/admin-ui 2.0.0-next.10 → 2.0.0-next.13

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 (173) hide show
  1. package/catalog/components/generate-product-variants/generate-product-variants.component.d.ts +3 -3
  2. package/catalog/components/option-value-input/option-value-input.component.d.ts +21 -9
  3. package/catalog/components/product-variants-editor/product-variants-editor.component.d.ts +10 -3
  4. package/core/common/generated-types.d.ts +242 -127
  5. package/core/common/utilities/configurable-operation-utils.d.ts +4 -2
  6. package/core/common/version.d.ts +1 -1
  7. package/core/data/definitions/order-definitions.d.ts +2 -0
  8. package/core/data/definitions/product-definitions.d.ts +1 -0
  9. package/core/data/providers/order-data.service.d.ts +1 -0
  10. package/core/data/providers/product-data.service.d.ts +1 -0
  11. package/core/public_api.d.ts +11 -1
  12. package/core/shared/components/custom-field-control/custom-field-control.component.d.ts +6 -2
  13. package/core/shared/components/dropdown/dropdown-menu.component.d.ts +2 -1
  14. package/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.component.d.ts +31 -0
  15. package/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.service.d.ts +34 -0
  16. package/core/shared/components/rich-text-editor/prosemirror/custom-nodes.d.ts +4 -0
  17. package/core/shared/components/rich-text-editor/prosemirror/inputrules.d.ts +5 -5
  18. package/core/shared/components/rich-text-editor/prosemirror/menu/links.d.ts +1 -1
  19. package/core/shared/components/rich-text-editor/prosemirror/menu/menu-common.d.ts +12 -0
  20. package/core/shared/components/rich-text-editor/prosemirror/menu/menu-plugin.d.ts +9 -0
  21. package/core/shared/components/rich-text-editor/prosemirror/menu/sub-menu-with-icon.d.ts +14 -0
  22. package/core/shared/components/rich-text-editor/prosemirror/plugins/image-plugin.d.ts +7 -0
  23. package/core/shared/components/rich-text-editor/prosemirror/plugins/link-select-plugin.d.ts +1 -1
  24. package/core/shared/components/rich-text-editor/prosemirror/plugins/raw-editor-plugin.d.ts +7 -0
  25. package/core/shared/components/rich-text-editor/prosemirror/plugins/tables-plugin.d.ts +13 -0
  26. package/core/shared/components/rich-text-editor/prosemirror/prosemirror.service.d.ts +7 -3
  27. package/core/shared/components/rich-text-editor/prosemirror/types.d.ts +0 -2
  28. package/core/shared/components/rich-text-editor/raw-html-dialog/raw-html-dialog.component.d.ts +21 -0
  29. package/core/shared/components/rich-text-editor/rich-text-editor.component.d.ts +6 -2
  30. package/core/shared/dynamic-form-inputs/code-editor-form-input/base-code-editor-form-input.component.d.ts +30 -0
  31. package/core/shared/dynamic-form-inputs/code-editor-form-input/html-editor-form-input.component.d.ts +22 -0
  32. package/core/shared/dynamic-form-inputs/code-editor-form-input/json-editor-form-input.component.d.ts +5 -17
  33. package/core/shared/dynamic-form-inputs/register-dynamic-input-components.d.ts +3 -1
  34. package/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.d.ts +10 -2
  35. package/core/shared/pipes/custom-field-label.pipe.d.ts +4 -10
  36. package/core/shared/shared.module.d.ts +33 -30
  37. package/customer/components/customer-group-list/customer-group-list.component.d.ts +6 -4
  38. package/esm2020/catalog/components/assets/assets.component.mjs +1 -1
  39. package/esm2020/catalog/components/collection-detail/collection-detail.component.mjs +1 -1
  40. package/esm2020/catalog/components/collection-tree/collection-tree-node.component.mjs +2 -2
  41. package/esm2020/catalog/components/facet-detail/facet-detail.component.mjs +1 -1
  42. package/esm2020/catalog/components/facet-list/facet-list.component.mjs +1 -1
  43. package/esm2020/catalog/components/generate-product-variants/generate-product-variants.component.mjs +12 -4
  44. package/esm2020/catalog/components/option-value-input/option-value-input.component.mjs +65 -11
  45. package/esm2020/catalog/components/product-list/product-list.component.mjs +1 -1
  46. package/esm2020/catalog/components/product-variants-editor/product-variants-editor.component.mjs +107 -12
  47. package/esm2020/core/common/generated-types.mjs +2 -1
  48. package/esm2020/core/common/introspection-result.mjs +191 -255
  49. package/esm2020/core/common/utilities/configurable-operation-utils.mjs +13 -10
  50. package/esm2020/core/common/version.mjs +2 -2
  51. package/esm2020/core/components/app-shell/app-shell.component.mjs +2 -2
  52. package/esm2020/core/components/channel-switcher/channel-switcher.component.mjs +1 -1
  53. package/esm2020/core/components/main-nav/main-nav.component.mjs +2 -2
  54. package/esm2020/core/components/user-menu/user-menu.component.mjs +1 -1
  55. package/esm2020/core/data/definitions/order-definitions.mjs +39 -25
  56. package/esm2020/core/data/definitions/product-definitions.mjs +743 -735
  57. package/esm2020/core/data/providers/order-data.service.mjs +7 -2
  58. package/esm2020/core/data/providers/product-data.service.mjs +5 -2
  59. package/esm2020/core/public_api.mjs +12 -2
  60. package/esm2020/core/shared/components/asset-preview-links/asset-preview-links.component.mjs +1 -1
  61. package/esm2020/core/shared/components/custom-field-control/custom-field-control.component.mjs +10 -4
  62. package/esm2020/core/shared/components/data-table/data-table.component.mjs +3 -3
  63. package/esm2020/core/shared/components/datetime-picker/datetime-picker.component.mjs +1 -1
  64. package/esm2020/core/shared/components/dropdown/dropdown-menu.component.mjs +25 -22
  65. package/esm2020/core/shared/components/dropdown/dropdown-trigger.directive.mjs +1 -1
  66. package/esm2020/core/shared/components/entity-info/entity-info.component.mjs +1 -1
  67. package/esm2020/core/shared/components/facet-value-selector/facet-value-selector.component.mjs +1 -1
  68. package/esm2020/core/shared/components/history-entry-detail/history-entry-detail.component.mjs +1 -1
  69. package/esm2020/core/shared/components/language-selector/language-selector.component.mjs +1 -1
  70. package/esm2020/core/shared/components/rich-text-editor/external-image-dialog/external-image-dialog.component.mjs +3 -3
  71. package/esm2020/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.component.mjs +132 -0
  72. package/esm2020/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.service.mjs +46 -0
  73. package/esm2020/core/shared/components/rich-text-editor/prosemirror/custom-nodes.mjs +57 -0
  74. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/links.mjs +4 -4
  75. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu-common.mjs +22 -1
  76. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu-plugin.mjs +12 -0
  77. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu.mjs +73 -18
  78. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/sub-menu-with-icon.mjs +16 -0
  79. package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/image-plugin.mjs +100 -0
  80. package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/raw-editor-plugin.mjs +96 -0
  81. package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/tables-plugin.mjs +166 -0
  82. package/esm2020/core/shared/components/rich-text-editor/prosemirror/prosemirror.service.mjs +42 -16
  83. package/esm2020/core/shared/components/rich-text-editor/prosemirror/types.mjs +1 -1
  84. package/esm2020/core/shared/components/rich-text-editor/raw-html-dialog/raw-html-dialog.component.mjs +59 -0
  85. package/esm2020/core/shared/components/rich-text-editor/rich-text-editor.component.mjs +14 -7
  86. package/esm2020/core/shared/components/ui-extension-point/ui-extension-point.component.mjs +1 -1
  87. package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/base-code-editor-form-input.component.mjs +57 -0
  88. package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/html-editor-form-input.component.mjs +63 -0
  89. package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/json-editor-form-input.component.mjs +48 -83
  90. package/esm2020/core/shared/dynamic-form-inputs/facet-value-form-input/facet-value-form-input.component.mjs +1 -1
  91. package/esm2020/core/shared/dynamic-form-inputs/register-dynamic-input-components.mjs +3 -1
  92. package/esm2020/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.mjs +21 -11
  93. package/esm2020/core/shared/pipes/custom-field-label.pipe.mjs +7 -19
  94. package/esm2020/core/shared/shared.module.mjs +15 -3
  95. package/esm2020/customer/components/address-card/address-card.component.mjs +1 -1
  96. package/esm2020/customer/components/customer-group-list/customer-group-list.component.mjs +29 -15
  97. package/esm2020/customer/components/customer-history/customer-history.component.mjs +1 -1
  98. package/esm2020/customer/components/customer-list/customer-list.component.mjs +1 -1
  99. package/esm2020/dashboard/components/dashboard/dashboard.component.mjs +1 -1
  100. package/esm2020/marketing/components/promotion-detail/promotion-detail.component.mjs +1 -1
  101. package/esm2020/marketing/components/promotion-list/promotion-list.component.mjs +1 -1
  102. package/esm2020/order/components/fulfill-order-dialog/fulfill-order-dialog.component.mjs +6 -2
  103. package/esm2020/order/components/fulfillment-card/fulfillment-card.component.mjs +1 -1
  104. package/esm2020/order/components/fulfillment-detail/fulfillment-detail.component.mjs +8 -17
  105. package/esm2020/order/components/line-fulfillment/line-fulfillment.component.mjs +8 -22
  106. package/esm2020/order/components/order-custom-fields-card/order-custom-fields-card.component.mjs +30 -6
  107. package/esm2020/order/components/order-detail/order-detail.component.mjs +79 -39
  108. package/esm2020/order/components/order-history/order-history.component.mjs +1 -1
  109. package/esm2020/order/components/order-list/order-list.component.mjs +23 -16
  110. package/esm2020/order/components/order-payment-card/order-payment-card.component.mjs +3 -3
  111. package/esm2020/order/components/order-table/order-table.component.mjs +11 -3
  112. package/esm2020/order/components/refund-order-dialog/refund-order-dialog.component.mjs +1 -1
  113. package/esm2020/settings/components/administrator-list/administrator-list.component.mjs +1 -1
  114. package/esm2020/settings/components/channel-list/channel-list.component.mjs +1 -1
  115. package/esm2020/settings/components/country-list/country-list.component.mjs +1 -1
  116. package/esm2020/settings/components/payment-method-detail/payment-method-detail.component.mjs +1 -1
  117. package/esm2020/settings/components/payment-method-list/payment-method-list.component.mjs +1 -1
  118. package/esm2020/settings/components/role-list/role-list.component.mjs +1 -1
  119. package/esm2020/settings/components/shipping-method-detail/shipping-method-detail.component.mjs +1 -1
  120. package/esm2020/settings/components/shipping-method-list/shipping-method-list.component.mjs +1 -1
  121. package/esm2020/settings/components/tax-category-list/tax-category-list.component.mjs +1 -1
  122. package/esm2020/settings/components/tax-rate-list/tax-rate-list.component.mjs +1 -1
  123. package/esm2020/settings/components/zone-list/zone-list.component.mjs +1 -1
  124. package/esm2020/system/components/job-list/job-list.component.mjs +1 -1
  125. package/fesm2015/vendure-admin-ui-catalog.mjs +192 -28
  126. package/fesm2015/vendure-admin-ui-catalog.mjs.map +1 -1
  127. package/fesm2015/vendure-admin-ui-core.mjs +1988 -1208
  128. package/fesm2015/vendure-admin-ui-core.mjs.map +1 -1
  129. package/fesm2015/vendure-admin-ui-customer.mjs +29 -17
  130. package/fesm2015/vendure-admin-ui-customer.mjs.map +1 -1
  131. package/fesm2015/vendure-admin-ui-dashboard.mjs +1 -1
  132. package/fesm2015/vendure-admin-ui-marketing.mjs +2 -2
  133. package/fesm2015/vendure-admin-ui-order.mjs +164 -104
  134. package/fesm2015/vendure-admin-ui-order.mjs.map +1 -1
  135. package/fesm2015/vendure-admin-ui-settings.mjs +11 -11
  136. package/fesm2015/vendure-admin-ui-system.mjs +1 -1
  137. package/fesm2020/vendure-admin-ui-catalog.mjs +185 -28
  138. package/fesm2020/vendure-admin-ui-catalog.mjs.map +1 -1
  139. package/fesm2020/vendure-admin-ui-core.mjs +1986 -1212
  140. package/fesm2020/vendure-admin-ui-core.mjs.map +1 -1
  141. package/fesm2020/vendure-admin-ui-customer.mjs +29 -17
  142. package/fesm2020/vendure-admin-ui-customer.mjs.map +1 -1
  143. package/fesm2020/vendure-admin-ui-dashboard.mjs +1 -1
  144. package/fesm2020/vendure-admin-ui-marketing.mjs +2 -2
  145. package/fesm2020/vendure-admin-ui-order.mjs +162 -103
  146. package/fesm2020/vendure-admin-ui-order.mjs.map +1 -1
  147. package/fesm2020/vendure-admin-ui-settings.mjs +11 -11
  148. package/fesm2020/vendure-admin-ui-system.mjs +1 -1
  149. package/order/components/order-custom-fields-card/order-custom-fields-card.component.d.ts +4 -2
  150. package/order/components/order-list/order-list.component.d.ts +1 -0
  151. package/order/components/order-table/order-table.component.d.ts +1 -0
  152. package/package.json +13 -12
  153. package/static/i18n-messages/cs.json +6 -3
  154. package/static/i18n-messages/de.json +6 -3
  155. package/static/i18n-messages/en.json +7 -3
  156. package/static/i18n-messages/es.json +6 -3
  157. package/static/i18n-messages/fr.json +6 -3
  158. package/static/i18n-messages/it.json +6 -3
  159. package/static/i18n-messages/pl.json +6 -3
  160. package/static/i18n-messages/pt_BR.json +6 -3
  161. package/static/i18n-messages/pt_PT.json +6 -3
  162. package/static/i18n-messages/ru.json +6 -3
  163. package/static/i18n-messages/uk.json +6 -3
  164. package/static/i18n-messages/zh_Hans.json +6 -3
  165. package/static/i18n-messages/zh_Hant.json +6 -3
  166. package/static/styles/_variables.scss +3 -0
  167. package/static/styles/global/_sass-overrides.scss +3 -0
  168. package/static/styles/global/_utilities.scss +1 -0
  169. package/static/styles/styles.scss +1 -0
  170. package/static/styles/ui-extension-theme.scss +1 -0
  171. package/static/theme.min.css +1 -1
  172. package/core/shared/components/rich-text-editor/prosemirror/menu/images.d.ts +0 -4
  173. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/images.mjs +0 -36
@@ -148,7 +148,7 @@ export class OrderHistoryComponent {
148
148
  }
149
149
  }
150
150
  OrderHistoryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: OrderHistoryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
151
- OrderHistoryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: OrderHistoryComponent, selector: "vdr-order-history", inputs: { order: "order", history: "history" }, outputs: { addNote: "addNote", updateNote: "updateNote", deleteNote: "deleteNote" }, ngImport: i0, template: "<h4>{{ 'order.order-history' | translate }}</h4>\r\n<div class=\"entry-list\" [class.expanded]=\"expanded\">\r\n <vdr-timeline-entry iconShape=\"note\" displayType=\"muted\" [featured]=\"true\">\r\n <div class=\"note-entry\">\r\n <textarea [(ngModel)]=\"note\" name=\"note\" class=\"note\"></textarea>\r\n <button class=\"btn btn-secondary\" [disabled]=\"!note\" (click)=\"addNoteToOrder()\">\r\n {{ 'common.add-note' | translate }}\r\n </button>\r\n </div>\r\n <div class=\"visibility-select\">\r\n <clr-checkbox-wrapper>\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"noteIsPrivate\" />\r\n <label>{{ 'order.note-is-private' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n <span *ngIf=\"noteIsPrivate\" class=\"private\">\r\n {{ 'order.note-only-visible-to-administrators' | translate }}\r\n </span>\r\n <span *ngIf=\"!noteIsPrivate\" class=\"public\">\r\n {{ 'order.note-visible-to-customer' | translate }}\r\n </span>\r\n </div>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry\r\n *ngFor=\"let entry of history\"\r\n [displayType]=\"getDisplayType(entry)\"\r\n [iconShape]=\"getTimelineIcon(entry)\"\r\n [createdAt]=\"entry.createdAt\"\r\n [name]=\"getName(entry)\"\r\n [featured]=\"isFeatured(entry)\"\r\n [collapsed]=\"!expanded && !isFeatured(entry)\"\r\n (expandClick)=\"expanded = !expanded\"\r\n >\r\n <ng-container [ngSwitch]=\"entry.type\">\r\n <ng-container *ngSwitchCase=\"type.ORDER_STATE_TRANSITION\">\r\n <div class=\"title\" *ngIf=\"entry.data.to === 'Delivered'\">\r\n {{ 'order.history-order-fulfilled' | translate }}\r\n </div>\r\n <div class=\"title\" *ngIf=\"entry.data.to === 'Cancelled'\">\r\n {{ 'order.history-order-cancelled' | translate }}\r\n </div>\r\n <ng-template [ngIf]=\"entry.data.to !== 'Cancelled' && entry.data.to !== 'Delivered'\">\r\n {{\r\n 'order.history-order-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_MODIFIED\">\r\n <div class=\"title\">\r\n {{ 'order.history-order-modified' | translate }}\r\n </div>\r\n <ng-container *ngIf=\"getModification(entry.data.modificationId) as modification\">\r\n {{ 'order.modify-order-price-difference' | translate }}:\r\n <strong>{{ modification.priceChange | localeCurrency: order.currencyCode }}</strong>\r\n <vdr-chip colorType=\"success\" *ngIf=\"modification.isSettled\">{{\r\n 'order.modification-settled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip colorType=\"error\" *ngIf=\"!modification.isSettled\">{{\r\n 'order.modification-not-settled' | translate\r\n }}</vdr-chip>\r\n <vdr-history-entry-detail>\r\n <vdr-modification-detail\r\n [order]=\"order\"\r\n [modification]=\"modification\"\r\n ></vdr-modification-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_PAYMENT_TRANSITION\">\r\n <ng-container *ngIf=\"entry.data.to === 'Settled'; else regularPaymentTransition\">\r\n <div class=\"title\">\r\n {{ 'order.history-payment-settled' | translate }}\r\n </div>\r\n {{ 'order.transaction-id' | translate }}: {{ getPayment(entry)?.transactionId }}\r\n <vdr-history-entry-detail *ngIf=\"getPayment(entry) as payment\">\r\n <vdr-payment-detail\r\n [payment]=\"payment\"\r\n [currencyCode]=\"order.currencyCode\"\r\n ></vdr-payment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-template #regularPaymentTransition>\r\n {{\r\n 'order.history-payment-transition'\r\n | translate\r\n : {\r\n from: entry.data.from,\r\n to: entry.data.to,\r\n id: getPayment(entry)?.transactionId\r\n }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_REFUND_TRANSITION\">\r\n {{\r\n 'order.history-refund-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to, id: entry.data.refundId }\r\n }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_CANCELLATION\">\r\n {{ 'order.history-items-cancelled' | translate: { count: entry.data.orderItemIds.length } }}\r\n <vdr-history-entry-detail *ngIf=\"getCancelledItems(entry) as items\">\r\n <vdr-labeled-data [label]=\"'order.cancellation-reason' | translate\">\r\n {{ entry.data.reason }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.contents' | translate\">\r\n <vdr-simple-item-list [items]=\"items\"></vdr-simple-item-list>\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.shipping-cancelled' | translate\">\r\n {{ entry.data.shippingCancelled }}\r\n </vdr-labeled-data>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_FULFILLMENT\">\r\n {{ 'order.history-fulfillment-created' | translate }}\r\n <vdr-history-entry-detail *ngIf=\"getFulfillment(entry) as fulfillment\">\r\n <vdr-fulfillment-detail\r\n [fulfillmentId]=\"fulfillment.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_FULFILLMENT_TRANSITION\">\r\n <ng-container *ngIf=\"entry.data.to === 'Delivered'\">\r\n <div class=\"title\">\r\n {{ 'order.history-fulfillment-delivered' | translate }}\r\n </div>\r\n {{ 'order.tracking-code' | translate }}: {{ getFulfillment(entry)?.trackingCode }}\r\n </ng-container>\r\n <ng-container *ngIf=\"entry.data.to === 'Shipped'\">\r\n <div class=\"title\">\r\n {{ 'order.history-fulfillment-shipped' | translate }}\r\n </div>\r\n {{ 'order.tracking-code' | translate }}: {{ getFulfillment(entry)?.trackingCode }}\r\n </ng-container>\r\n <ng-container *ngIf=\"entry.data.to !== 'Delivered' && entry.data.to !== 'Shipped'\">\r\n {{\r\n 'order.history-fulfillment-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to }\r\n }}\r\n </ng-container>\r\n <vdr-history-entry-detail *ngIf=\"getFulfillment(entry) as fulfillment\">\r\n <vdr-fulfillment-detail\r\n [fulfillmentId]=\"fulfillment.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_NOTE\">\r\n <div class=\"flex\">\r\n <div class=\"note-text\">\r\n <span *ngIf=\"entry.isPublic\" class=\"note-visibility public\">{{\r\n 'common.public' | translate\r\n }}</span>\r\n <span *ngIf=\"!entry.isPublic\" class=\"note-visibility private\">{{\r\n 'common.private' | translate\r\n }}</span>\r\n {{ entry.data.note }}\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"updateNote.emit(entry)\"\r\n [disabled]=\"!('UpdateOrder' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"deleteNote.emit(entry)\"\r\n [disabled]=\"!('UpdateOrder' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_COUPON_APPLIED\">\r\n {{ 'order.history-coupon-code-applied' | translate }}:\r\n <vdr-chip>\r\n <a [routerLink]=\"['/marketing', 'promotions', entry.data.promotionId]\">{{\r\n entry.data.couponCode\r\n }}</a>\r\n </vdr-chip>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_COUPON_REMOVED\">\r\n {{ 'order.history-coupon-code-removed' | translate }}:\r\n <vdr-chip\r\n ><span class=\"cancelled-coupon-code\">{{ entry.data.couponCode }}</span></vdr-chip\r\n >\r\n </ng-container>\r\n </ng-container>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry [isLast]=\"true\" [createdAt]=\"order.createdAt\" [featured]=\"true\">\r\n <div class=\"title\">\r\n {{ 'order.history-order-created' | translate }}\r\n </div>\r\n </vdr-timeline-entry>\r\n</div>\r\n", styles: [":host{margin-top:48px;display:block}.entry-list{margin-top:24px;margin-left:24px;margin-right:12px}.note-entry{display:flex;align-items:center}.note-entry .note{flex:1}.note-entry button{margin:0}.visibility-select{display:flex;justify-content:space-between;align-items:baseline}.visibility-select .public{color:var(--color-warning-500)}.visibility-select .private{color:var(--color-success-500)}textarea.note{flex:1;height:36px;border-radius:3px;margin-right:6px}.note-text{color:var(--color-grey-800);white-space:pre-wrap}.cancelled-coupon-code{text-decoration:line-through}.note-visibility{text-transform:lowercase}.note-visibility.public{color:var(--color-warning-500)}.note-visibility.private{color:var(--color-success-500)}\n"], components: [{ type: i1.TimelineEntryComponent, selector: "vdr-timeline-entry", inputs: ["displayType", "createdAt", "name", "featured", "iconShape", "isLast", "collapsed"], outputs: ["expandClick"] }, { type: i2.ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { type: i1.ChipComponent, selector: "vdr-chip", inputs: ["icon", "invert", "colorFrom", "colorType"], outputs: ["iconClick"] }, { type: i1.HistoryEntryDetailComponent, selector: "vdr-history-entry-detail" }, { type: i3.ModificationDetailComponent, selector: "vdr-modification-detail", inputs: ["order", "modification"] }, { type: i4.PaymentDetailComponent, selector: "vdr-payment-detail", inputs: ["payment", "currencyCode"] }, { type: i1.LabeledDataComponent, selector: "vdr-labeled-data", inputs: ["label"] }, { type: i5.SimpleItemListComponent, selector: "vdr-simple-item-list", inputs: ["items"] }, { type: i6.FulfillmentDetailComponent, selector: "vdr-fulfillment-detail", inputs: ["fulfillmentId", "order"] }, { type: i1.DropdownComponent, selector: "vdr-dropdown", inputs: ["manualToggle"] }, { type: i1.DropdownMenuComponent, selector: "vdr-dropdown-menu", inputs: ["vdrPosition"] }], directives: [{ type: i1.FormFieldControlDirective, selector: "input, textarea, select" }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i2.ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { type: i2.ClrLabel, selector: "label", inputs: ["for"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i1.DropdownTriggerDirective, selector: "[vdrDropdownTrigger]" }, { type: i2.ClrIconCustomTag, selector: "clr-icon" }, { type: i1.DropdownItemDirective, selector: "[vdrDropdownItem]" }, { type: i9.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }], pipes: { "translate": i10.TranslatePipe, "localeCurrency": i1.LocaleCurrencyPipe, "hasPermission": i1.HasPermissionPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
151
+ OrderHistoryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: OrderHistoryComponent, selector: "vdr-order-history", inputs: { order: "order", history: "history" }, outputs: { addNote: "addNote", updateNote: "updateNote", deleteNote: "deleteNote" }, ngImport: i0, template: "<h4>{{ 'order.order-history' | translate }}</h4>\r\n<div class=\"entry-list\" [class.expanded]=\"expanded\">\r\n <vdr-timeline-entry iconShape=\"note\" displayType=\"muted\" [featured]=\"true\">\r\n <div class=\"note-entry\">\r\n <textarea [(ngModel)]=\"note\" name=\"note\" class=\"note\"></textarea>\r\n <button class=\"btn btn-secondary\" [disabled]=\"!note\" (click)=\"addNoteToOrder()\">\r\n {{ 'common.add-note' | translate }}\r\n </button>\r\n </div>\r\n <div class=\"visibility-select\">\r\n <clr-checkbox-wrapper>\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"noteIsPrivate\" />\r\n <label>{{ 'order.note-is-private' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n <span *ngIf=\"noteIsPrivate\" class=\"private\">\r\n {{ 'order.note-only-visible-to-administrators' | translate }}\r\n </span>\r\n <span *ngIf=\"!noteIsPrivate\" class=\"public\">\r\n {{ 'order.note-visible-to-customer' | translate }}\r\n </span>\r\n </div>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry\r\n *ngFor=\"let entry of history\"\r\n [displayType]=\"getDisplayType(entry)\"\r\n [iconShape]=\"getTimelineIcon(entry)\"\r\n [createdAt]=\"entry.createdAt\"\r\n [name]=\"getName(entry)\"\r\n [featured]=\"isFeatured(entry)\"\r\n [collapsed]=\"!expanded && !isFeatured(entry)\"\r\n (expandClick)=\"expanded = !expanded\"\r\n >\r\n <ng-container [ngSwitch]=\"entry.type\">\r\n <ng-container *ngSwitchCase=\"type.ORDER_STATE_TRANSITION\">\r\n <div class=\"title\" *ngIf=\"entry.data.to === 'Delivered'\">\r\n {{ 'order.history-order-fulfilled' | translate }}\r\n </div>\r\n <div class=\"title\" *ngIf=\"entry.data.to === 'Cancelled'\">\r\n {{ 'order.history-order-cancelled' | translate }}\r\n </div>\r\n <ng-template [ngIf]=\"entry.data.to !== 'Cancelled' && entry.data.to !== 'Delivered'\">\r\n {{\r\n 'order.history-order-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_MODIFIED\">\r\n <div class=\"title\">\r\n {{ 'order.history-order-modified' | translate }}\r\n </div>\r\n <ng-container *ngIf=\"getModification(entry.data.modificationId) as modification\">\r\n {{ 'order.modify-order-price-difference' | translate }}:\r\n <strong>{{ modification.priceChange | localeCurrency: order.currencyCode }}</strong>\r\n <vdr-chip colorType=\"success\" *ngIf=\"modification.isSettled\">{{\r\n 'order.modification-settled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip colorType=\"error\" *ngIf=\"!modification.isSettled\">{{\r\n 'order.modification-not-settled' | translate\r\n }}</vdr-chip>\r\n <vdr-history-entry-detail>\r\n <vdr-modification-detail\r\n [order]=\"order\"\r\n [modification]=\"modification\"\r\n ></vdr-modification-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_PAYMENT_TRANSITION\">\r\n <ng-container *ngIf=\"entry.data.to === 'Settled'; else regularPaymentTransition\">\r\n <div class=\"title\">\r\n {{ 'order.history-payment-settled' | translate }}\r\n </div>\r\n {{ 'order.transaction-id' | translate }}: {{ getPayment(entry)?.transactionId }}\r\n <vdr-history-entry-detail *ngIf=\"getPayment(entry) as payment\">\r\n <vdr-payment-detail\r\n [payment]=\"payment\"\r\n [currencyCode]=\"order.currencyCode\"\r\n ></vdr-payment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-template #regularPaymentTransition>\r\n {{\r\n 'order.history-payment-transition'\r\n | translate\r\n : {\r\n from: entry.data.from,\r\n to: entry.data.to,\r\n id: getPayment(entry)?.transactionId\r\n }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_REFUND_TRANSITION\">\r\n {{\r\n 'order.history-refund-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to, id: entry.data.refundId }\r\n }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_CANCELLATION\">\r\n {{ 'order.history-items-cancelled' | translate: { count: entry.data.orderItemIds.length } }}\r\n <vdr-history-entry-detail *ngIf=\"getCancelledItems(entry) as items\">\r\n <vdr-labeled-data [label]=\"'order.cancellation-reason' | translate\">\r\n {{ entry.data.reason }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.contents' | translate\">\r\n <vdr-simple-item-list [items]=\"items\"></vdr-simple-item-list>\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.shipping-cancelled' | translate\">\r\n {{ entry.data.shippingCancelled }}\r\n </vdr-labeled-data>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_FULFILLMENT\">\r\n {{ 'order.history-fulfillment-created' | translate }}\r\n <vdr-history-entry-detail *ngIf=\"getFulfillment(entry) as fulfillment\">\r\n <vdr-fulfillment-detail\r\n [fulfillmentId]=\"fulfillment.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_FULFILLMENT_TRANSITION\">\r\n <ng-container *ngIf=\"entry.data.to === 'Delivered'\">\r\n <div class=\"title\">\r\n {{ 'order.history-fulfillment-delivered' | translate }}\r\n </div>\r\n {{ 'order.tracking-code' | translate }}: {{ getFulfillment(entry)?.trackingCode }}\r\n </ng-container>\r\n <ng-container *ngIf=\"entry.data.to === 'Shipped'\">\r\n <div class=\"title\">\r\n {{ 'order.history-fulfillment-shipped' | translate }}\r\n </div>\r\n {{ 'order.tracking-code' | translate }}: {{ getFulfillment(entry)?.trackingCode }}\r\n </ng-container>\r\n <ng-container *ngIf=\"entry.data.to !== 'Delivered' && entry.data.to !== 'Shipped'\">\r\n {{\r\n 'order.history-fulfillment-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to }\r\n }}\r\n </ng-container>\r\n <vdr-history-entry-detail *ngIf=\"getFulfillment(entry) as fulfillment\">\r\n <vdr-fulfillment-detail\r\n [fulfillmentId]=\"fulfillment.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_NOTE\">\r\n <div class=\"flex\">\r\n <div class=\"note-text\">\r\n <span *ngIf=\"entry.isPublic\" class=\"note-visibility public\">{{\r\n 'common.public' | translate\r\n }}</span>\r\n <span *ngIf=\"!entry.isPublic\" class=\"note-visibility private\">{{\r\n 'common.private' | translate\r\n }}</span>\r\n {{ entry.data.note }}\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"updateNote.emit(entry)\"\r\n [disabled]=\"!('UpdateOrder' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"deleteNote.emit(entry)\"\r\n [disabled]=\"!('UpdateOrder' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_COUPON_APPLIED\">\r\n {{ 'order.history-coupon-code-applied' | translate }}:\r\n <vdr-chip>\r\n <a [routerLink]=\"['/marketing', 'promotions', entry.data.promotionId]\">{{\r\n entry.data.couponCode\r\n }}</a>\r\n </vdr-chip>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_COUPON_REMOVED\">\r\n {{ 'order.history-coupon-code-removed' | translate }}:\r\n <vdr-chip\r\n ><span class=\"cancelled-coupon-code\">{{ entry.data.couponCode }}</span></vdr-chip\r\n >\r\n </ng-container>\r\n </ng-container>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry [isLast]=\"true\" [createdAt]=\"order.createdAt\" [featured]=\"true\">\r\n <div class=\"title\">\r\n {{ 'order.history-order-created' | translate }}\r\n </div>\r\n </vdr-timeline-entry>\r\n</div>\r\n", styles: [":host{margin-top:48px;display:block}.entry-list{margin-top:24px;margin-left:24px;margin-right:12px}.note-entry{display:flex;align-items:center}.note-entry .note{flex:1}.note-entry button{margin:0}.visibility-select{display:flex;justify-content:space-between;align-items:baseline}.visibility-select .public{color:var(--color-warning-500)}.visibility-select .private{color:var(--color-success-500)}textarea.note{flex:1;height:36px;border-radius:3px;margin-right:6px}.note-text{color:var(--color-grey-800);white-space:pre-wrap}.cancelled-coupon-code{text-decoration:line-through}.note-visibility{text-transform:lowercase}.note-visibility.public{color:var(--color-warning-500)}.note-visibility.private{color:var(--color-success-500)}\n"], components: [{ type: i1.TimelineEntryComponent, selector: "vdr-timeline-entry", inputs: ["displayType", "createdAt", "name", "featured", "iconShape", "isLast", "collapsed"], outputs: ["expandClick"] }, { type: i2.ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { type: i1.ChipComponent, selector: "vdr-chip", inputs: ["icon", "invert", "colorFrom", "colorType"], outputs: ["iconClick"] }, { type: i1.HistoryEntryDetailComponent, selector: "vdr-history-entry-detail" }, { type: i3.ModificationDetailComponent, selector: "vdr-modification-detail", inputs: ["order", "modification"] }, { type: i4.PaymentDetailComponent, selector: "vdr-payment-detail", inputs: ["payment", "currencyCode"] }, { type: i1.LabeledDataComponent, selector: "vdr-labeled-data", inputs: ["label"] }, { type: i5.SimpleItemListComponent, selector: "vdr-simple-item-list", inputs: ["items"] }, { type: i6.FulfillmentDetailComponent, selector: "vdr-fulfillment-detail", inputs: ["fulfillmentId", "order"] }, { type: i1.DropdownComponent, selector: "vdr-dropdown", inputs: ["manualToggle"] }, { type: i1.DropdownMenuComponent, selector: "vdr-dropdown-menu", inputs: ["vdrPosition", "customClasses"] }], directives: [{ type: i1.FormFieldControlDirective, selector: "input, textarea, select" }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i2.ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { type: i2.ClrLabel, selector: "label", inputs: ["for"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i1.DropdownTriggerDirective, selector: "[vdrDropdownTrigger]" }, { type: i2.ClrIconCustomTag, selector: "clr-icon" }, { type: i1.DropdownItemDirective, selector: "[vdrDropdownItem]" }, { type: i9.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }], pipes: { "translate": i10.TranslatePipe, "localeCurrency": i1.LocaleCurrencyPipe, "hasPermission": i1.HasPermissionPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
152
152
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: OrderHistoryComponent, decorators: [{
153
153
  type: Component,
154
154
  args: [{ selector: 'vdr-order-history', changeDetection: ChangeDetectionStrategy.OnPush, template: "<h4>{{ 'order.order-history' | translate }}</h4>\r\n<div class=\"entry-list\" [class.expanded]=\"expanded\">\r\n <vdr-timeline-entry iconShape=\"note\" displayType=\"muted\" [featured]=\"true\">\r\n <div class=\"note-entry\">\r\n <textarea [(ngModel)]=\"note\" name=\"note\" class=\"note\"></textarea>\r\n <button class=\"btn btn-secondary\" [disabled]=\"!note\" (click)=\"addNoteToOrder()\">\r\n {{ 'common.add-note' | translate }}\r\n </button>\r\n </div>\r\n <div class=\"visibility-select\">\r\n <clr-checkbox-wrapper>\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"noteIsPrivate\" />\r\n <label>{{ 'order.note-is-private' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n <span *ngIf=\"noteIsPrivate\" class=\"private\">\r\n {{ 'order.note-only-visible-to-administrators' | translate }}\r\n </span>\r\n <span *ngIf=\"!noteIsPrivate\" class=\"public\">\r\n {{ 'order.note-visible-to-customer' | translate }}\r\n </span>\r\n </div>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry\r\n *ngFor=\"let entry of history\"\r\n [displayType]=\"getDisplayType(entry)\"\r\n [iconShape]=\"getTimelineIcon(entry)\"\r\n [createdAt]=\"entry.createdAt\"\r\n [name]=\"getName(entry)\"\r\n [featured]=\"isFeatured(entry)\"\r\n [collapsed]=\"!expanded && !isFeatured(entry)\"\r\n (expandClick)=\"expanded = !expanded\"\r\n >\r\n <ng-container [ngSwitch]=\"entry.type\">\r\n <ng-container *ngSwitchCase=\"type.ORDER_STATE_TRANSITION\">\r\n <div class=\"title\" *ngIf=\"entry.data.to === 'Delivered'\">\r\n {{ 'order.history-order-fulfilled' | translate }}\r\n </div>\r\n <div class=\"title\" *ngIf=\"entry.data.to === 'Cancelled'\">\r\n {{ 'order.history-order-cancelled' | translate }}\r\n </div>\r\n <ng-template [ngIf]=\"entry.data.to !== 'Cancelled' && entry.data.to !== 'Delivered'\">\r\n {{\r\n 'order.history-order-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_MODIFIED\">\r\n <div class=\"title\">\r\n {{ 'order.history-order-modified' | translate }}\r\n </div>\r\n <ng-container *ngIf=\"getModification(entry.data.modificationId) as modification\">\r\n {{ 'order.modify-order-price-difference' | translate }}:\r\n <strong>{{ modification.priceChange | localeCurrency: order.currencyCode }}</strong>\r\n <vdr-chip colorType=\"success\" *ngIf=\"modification.isSettled\">{{\r\n 'order.modification-settled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip colorType=\"error\" *ngIf=\"!modification.isSettled\">{{\r\n 'order.modification-not-settled' | translate\r\n }}</vdr-chip>\r\n <vdr-history-entry-detail>\r\n <vdr-modification-detail\r\n [order]=\"order\"\r\n [modification]=\"modification\"\r\n ></vdr-modification-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_PAYMENT_TRANSITION\">\r\n <ng-container *ngIf=\"entry.data.to === 'Settled'; else regularPaymentTransition\">\r\n <div class=\"title\">\r\n {{ 'order.history-payment-settled' | translate }}\r\n </div>\r\n {{ 'order.transaction-id' | translate }}: {{ getPayment(entry)?.transactionId }}\r\n <vdr-history-entry-detail *ngIf=\"getPayment(entry) as payment\">\r\n <vdr-payment-detail\r\n [payment]=\"payment\"\r\n [currencyCode]=\"order.currencyCode\"\r\n ></vdr-payment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-template #regularPaymentTransition>\r\n {{\r\n 'order.history-payment-transition'\r\n | translate\r\n : {\r\n from: entry.data.from,\r\n to: entry.data.to,\r\n id: getPayment(entry)?.transactionId\r\n }\r\n }}\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_REFUND_TRANSITION\">\r\n {{\r\n 'order.history-refund-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to, id: entry.data.refundId }\r\n }}\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_CANCELLATION\">\r\n {{ 'order.history-items-cancelled' | translate: { count: entry.data.orderItemIds.length } }}\r\n <vdr-history-entry-detail *ngIf=\"getCancelledItems(entry) as items\">\r\n <vdr-labeled-data [label]=\"'order.cancellation-reason' | translate\">\r\n {{ entry.data.reason }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.contents' | translate\">\r\n <vdr-simple-item-list [items]=\"items\"></vdr-simple-item-list>\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.shipping-cancelled' | translate\">\r\n {{ entry.data.shippingCancelled }}\r\n </vdr-labeled-data>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_FULFILLMENT\">\r\n {{ 'order.history-fulfillment-created' | translate }}\r\n <vdr-history-entry-detail *ngIf=\"getFulfillment(entry) as fulfillment\">\r\n <vdr-fulfillment-detail\r\n [fulfillmentId]=\"fulfillment.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_FULFILLMENT_TRANSITION\">\r\n <ng-container *ngIf=\"entry.data.to === 'Delivered'\">\r\n <div class=\"title\">\r\n {{ 'order.history-fulfillment-delivered' | translate }}\r\n </div>\r\n {{ 'order.tracking-code' | translate }}: {{ getFulfillment(entry)?.trackingCode }}\r\n </ng-container>\r\n <ng-container *ngIf=\"entry.data.to === 'Shipped'\">\r\n <div class=\"title\">\r\n {{ 'order.history-fulfillment-shipped' | translate }}\r\n </div>\r\n {{ 'order.tracking-code' | translate }}: {{ getFulfillment(entry)?.trackingCode }}\r\n </ng-container>\r\n <ng-container *ngIf=\"entry.data.to !== 'Delivered' && entry.data.to !== 'Shipped'\">\r\n {{\r\n 'order.history-fulfillment-transition'\r\n | translate: { from: entry.data.from, to: entry.data.to }\r\n }}\r\n </ng-container>\r\n <vdr-history-entry-detail *ngIf=\"getFulfillment(entry) as fulfillment\">\r\n <vdr-fulfillment-detail\r\n [fulfillmentId]=\"fulfillment.id\"\r\n [order]=\"order\"\r\n ></vdr-fulfillment-detail>\r\n </vdr-history-entry-detail>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_NOTE\">\r\n <div class=\"flex\">\r\n <div class=\"note-text\">\r\n <span *ngIf=\"entry.isPublic\" class=\"note-visibility public\">{{\r\n 'common.public' | translate\r\n }}</span>\r\n <span *ngIf=\"!entry.isPublic\" class=\"note-visibility private\">{{\r\n 'common.private' | translate\r\n }}</span>\r\n {{ entry.data.note }}\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"updateNote.emit(entry)\"\r\n [disabled]=\"!('UpdateOrder' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"deleteNote.emit(entry)\"\r\n [disabled]=\"!('UpdateOrder' | hasPermission)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_COUPON_APPLIED\">\r\n {{ 'order.history-coupon-code-applied' | translate }}:\r\n <vdr-chip>\r\n <a [routerLink]=\"['/marketing', 'promotions', entry.data.promotionId]\">{{\r\n entry.data.couponCode\r\n }}</a>\r\n </vdr-chip>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"type.ORDER_COUPON_REMOVED\">\r\n {{ 'order.history-coupon-code-removed' | translate }}:\r\n <vdr-chip\r\n ><span class=\"cancelled-coupon-code\">{{ entry.data.couponCode }}</span></vdr-chip\r\n >\r\n </ng-container>\r\n </ng-container>\r\n </vdr-timeline-entry>\r\n <vdr-timeline-entry [isLast]=\"true\" [createdAt]=\"order.createdAt\" [featured]=\"true\">\r\n <div class=\"title\">\r\n {{ 'order.history-order-created' | translate }}\r\n </div>\r\n </vdr-timeline-entry>\r\n</div>\r\n", styles: [":host{margin-top:48px;display:block}.entry-list{margin-top:24px;margin-left:24px;margin-right:12px}.note-entry{display:flex;align-items:center}.note-entry .note{flex:1}.note-entry button{margin:0}.visibility-select{display:flex;justify-content:space-between;align-items:baseline}.visibility-select .public{color:var(--color-warning-500)}.visibility-select .private{color:var(--color-success-500)}textarea.note{flex:1;height:36px;border-radius:3px;margin-right:6px}.note-text{color:var(--color-grey-800);white-space:pre-wrap}.cancelled-coupon-code{text-decoration:line-through}.note-visibility{text-transform:lowercase}.note-visibility.public{color:var(--color-warning-500)}.note-visibility.private{color:var(--color-success-500)}\n"] }]
@@ -1,7 +1,7 @@
1
1
  import { ChangeDetectionStrategy, Component } from '@angular/core';
2
2
  import { FormControl, FormGroup } from '@angular/forms';
3
3
  import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
4
- import { BaseListComponent, SortOrder, } from '@vendure/admin-ui/core';
4
+ import { BaseListComponent, LogicalOperator, SortOrder, } from '@vendure/admin-ui/core';
5
5
  import { merge } from 'rxjs';
6
6
  import { debounceTime, distinctUntilChanged, filter, map, takeUntil } from 'rxjs/operators';
7
7
  import * as i0 from "@angular/core";
@@ -18,6 +18,7 @@ export class OrderListComponent extends BaseListComponent {
18
18
  this.serverConfigService = serverConfigService;
19
19
  this.dataService = dataService;
20
20
  this.localStorageService = localStorageService;
21
+ this.searchControl = new FormControl('');
21
22
  this.searchOrderCodeControl = new FormControl('');
22
23
  this.searchLastNameControl = new FormControl('');
23
24
  this.orderStates = this.serverConfigService.getOrderProcessStates().map(item => item.name);
@@ -58,7 +59,7 @@ export class OrderListComponent extends BaseListComponent {
58
59
  // tslint:disable-next-line:no-shadowed-variable
59
60
  (take, skip) => this.dataService.order.getOrders({ take, skip }).refetchOnChannelChange(), data => data.orders,
60
61
  // tslint:disable-next-line:no-shadowed-variable
61
- (skip, take) => this.createQueryOptions(skip, take, this.searchOrderCodeControl.value, this.searchLastNameControl.value, this.route.snapshot.queryParamMap.get('filter') || 'open'));
62
+ (skip, take) => this.createQueryOptions(skip, take, this.searchControl.value, this.route.snapshot.queryParamMap.get('filter') || 'open'));
62
63
  const lastFilters = this.localStorageService.get('orderListLastCustomFilters');
63
64
  if (lastFilters) {
64
65
  this.setQueryParam(lastFilters, { replaceUrl: true });
@@ -67,7 +68,7 @@ export class OrderListComponent extends BaseListComponent {
67
68
  ngOnInit() {
68
69
  super.ngOnInit();
69
70
  this.activePreset$ = this.route.queryParamMap.pipe(map(qpm => qpm.get('filter') || 'open'), distinctUntilChanged());
70
- const searchTerms$ = merge(this.searchOrderCodeControl.valueChanges, this.searchLastNameControl.valueChanges).pipe(filter(value => 2 < value.length || value.length === 0), debounceTime(250));
71
+ const searchTerms$ = merge(this.searchControl.valueChanges).pipe(filter(value => 2 < value.length || value.length === 0), debounceTime(250));
71
72
  merge(searchTerms$, this.route.queryParamMap)
72
73
  .pipe(takeUntil(this.destroy$))
73
74
  .subscribe(val => {
@@ -106,10 +107,11 @@ export class OrderListComponent extends BaseListComponent {
106
107
  }
107
108
  createQueryOptions(
108
109
  // tslint:disable-next-line:no-shadowed-variable
109
- skip, take, orderCodeSearchTerm, customerNameSearchTerm, activeFilterPreset) {
110
+ skip, take, searchTerm, activeFilterPreset) {
110
111
  const filterConfig = this.filterPresets.find(p => p.name === activeFilterPreset);
111
112
  // tslint:disable-next-line:no-shadowed-variable
112
- const filter = {};
113
+ let filter = {};
114
+ let filterOperator = LogicalOperator.AND;
113
115
  if (filterConfig) {
114
116
  if (filterConfig.config.active != null) {
115
117
  filter.active = {
@@ -151,15 +153,19 @@ export class OrderListComponent extends BaseListComponent {
151
153
  };
152
154
  }
153
155
  }
154
- if (customerNameSearchTerm) {
155
- filter.customerLastName = {
156
- contains: customerNameSearchTerm,
157
- };
158
- }
159
- if (orderCodeSearchTerm) {
160
- filter.code = {
161
- contains: orderCodeSearchTerm,
156
+ if (searchTerm) {
157
+ filter = {
158
+ customerLastName: {
159
+ contains: searchTerm,
160
+ },
161
+ transactionId: {
162
+ contains: searchTerm,
163
+ },
164
+ code: {
165
+ contains: searchTerm,
166
+ },
162
167
  };
168
+ filterOperator = LogicalOperator.OR;
163
169
  }
164
170
  return {
165
171
  options: {
@@ -171,6 +177,7 @@ export class OrderListComponent extends BaseListComponent {
171
177
  sort: {
172
178
  updatedAt: SortOrder.DESC,
173
179
  },
180
+ filterOperator,
174
181
  },
175
182
  };
176
183
  }
@@ -184,9 +191,9 @@ export class OrderListComponent extends BaseListComponent {
184
191
  }
185
192
  }
186
193
  OrderListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: OrderListComponent, deps: [{ token: i1.ServerConfigService }, { token: i1.DataService }, { token: i1.LocalStorageService }, { token: i2.Router }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
187
- OrderListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: OrderListComponent, selector: "vdr-order-list", usesInheritance: true, ngImport: i0, template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"search-form\">\r\n <div class=\"btn-group btn-outline-primary\" *ngIf=\"activePreset$ | async as activePreset\">\r\n <button\r\n class=\"btn\"\r\n *ngFor=\"let preset of filterPresets\"\r\n [class.btn-primary]=\"activePreset === preset.name\"\r\n (click)=\"selectFilterPreset(preset.name)\"\r\n >\r\n {{ preset.label | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n [class.btn-primary]=\"activePreset === 'custom'\"\r\n (click)=\"selectFilterPreset('custom')\"\r\n >\r\n {{ 'order.filter-custom' | translate }}\r\n <clr-icon shape=\"angle down\"></clr-icon>\r\n </button>\r\n </div>\r\n\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchOrderCodeControl\"\r\n [placeholder]=\"'order.search-by-order-code' | translate\"\r\n class=\"search-input\"\r\n />\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchLastNameControl\"\r\n [placeholder]=\"'order.search-by-customer-last-name' | translate\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n <div class=\"custom-filters\" [class.expanded]=\"(activePreset$ | async) === 'custom'\">\r\n <form [formGroup]=\"customFilterForm\">\r\n <div class=\"flex align-center\">\r\n <ng-select\r\n [items]=\"orderStates\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n formControlName=\"states\"\r\n [placeholder]=\"'state.all-orders' | translate\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">{{ item | stateI18nToken | translate }}</ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\"> {{ item | stateI18nToken | translate }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </ng-template>\r\n </ng-select>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"customFilterForm.pristine\"\r\n (click)=\"applyCustomFilters()\"\r\n >\r\n {{ 'order.apply-filters' | translate }}\r\n <clr-icon shape=\"filter\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex\">\r\n <div>\r\n <label>{{ 'order.placed-at-start' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtStart\"></vdr-datetime-picker>\r\n </div>\r\n <div>\r\n <label>{{ 'order.placed-at-end' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtEnd\"></vdr-datetime-picker>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-list\"></vdr-action-bar-items>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.customer' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.state' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.total' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.updated-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.placed-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.shipping' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">{{ order.code }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.updatedAt | timeAgo }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | localeDate: 'medium' }}</td>\r\n <td class=\"left align-middle\">{{ getShippingNames(order) }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"order.state === 'Modifying' ? ['./', order.id, 'modify'] : ['./', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n", styles: [".search-form{display:flex;flex-direction:column;align-items:baseline;width:100%;margin-bottom:6px}@media screen and (min-width: 768px){.search-form{flex-direction:row}}.search-input{margin-left:6px;margin-top:6px;min-width:300px}.custom-filters{overflow:hidden;max-height:0;padding-bottom:6px}.custom-filters.expanded{max-height:initial}.custom-filters>form{display:flex;flex-direction:column;align-items:center}.custom-filters>form>div{width:100%}ng-select{flex:1;min-width:200px;height:36px}ng-select ::ng-deep .ng-select-container{height:36px}\n"], components: [{ type: i1.ActionBarComponent, selector: "vdr-action-bar" }, { type: i1.ActionBarLeftComponent, selector: "vdr-ab-left", inputs: ["grow"] }, { type: i3.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { type: i1.DatetimePickerComponent, selector: "vdr-datetime-picker", inputs: ["yearRange", "weekStartDay", "timeGranularityInterval", "min", "max", "readonly"] }, { type: i1.ActionBarRightComponent, selector: "vdr-ab-right", inputs: ["grow"] }, { type: i1.ActionBarItemsComponent, selector: "vdr-action-bar-items", inputs: ["locationId"] }, { type: i1.DataTableComponent, selector: "vdr-data-table", inputs: ["items", "itemsPerPage", "currentPage", "totalItems", "allSelected", "isRowSelectedFn", "emptyStateLabel"], outputs: ["allSelectChange", "rowSelectChange", "pageChange", "itemsPerPageChange"] }, { type: i1.DataTableColumnComponent, selector: "vdr-dt-column", inputs: ["expand"] }, { type: i1.CustomerLabelComponent, selector: "vdr-customer-label", inputs: ["customer"] }, { type: i1.OrderStateLabelComponent, selector: "vdr-order-state-label", inputs: ["state"] }, { type: i1.TableRowActionComponent, selector: "vdr-table-row-action", inputs: ["linkTo", "label", "iconShape", "disabled"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.ClrIconCustomTag, selector: "clr-icon" }, { type: i1.FormFieldControlDirective, selector: "input, textarea, select" }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i3.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { type: i3.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { type: i5.ClrLabel, selector: "label", inputs: ["for"] }], pipes: { "async": i4.AsyncPipe, "translate": i7.TranslatePipe, "stateI18nToken": i1.StateI18nTokenPipe, "localeCurrency": i1.LocaleCurrencyPipe, "timeAgo": i1.TimeAgoPipe, "localeDate": i1.LocaleDatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
194
+ OrderListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: OrderListComponent, selector: "vdr-order-list", usesInheritance: true, ngImport: i0, template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"search-form\">\r\n <div class=\"btn-group btn-outline-primary\" *ngIf=\"activePreset$ | async as activePreset\">\r\n <button\r\n class=\"btn\"\r\n *ngFor=\"let preset of filterPresets\"\r\n [class.btn-primary]=\"activePreset === preset.name\"\r\n (click)=\"selectFilterPreset(preset.name)\"\r\n >\r\n {{ preset.label | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n [class.btn-primary]=\"activePreset === 'custom'\"\r\n (click)=\"selectFilterPreset('custom')\"\r\n >\r\n {{ 'order.filter-custom' | translate }}\r\n <clr-icon shape=\"angle down\"></clr-icon>\r\n </button>\r\n </div>\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchControl\"\r\n [placeholder]=\"'order.search-by-order-filters' | translate\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n <div class=\"custom-filters\" [class.expanded]=\"(activePreset$ | async) === 'custom'\">\r\n <form [formGroup]=\"customFilterForm\">\r\n <div class=\"flex align-center\">\r\n <ng-select\r\n [items]=\"orderStates\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n formControlName=\"states\"\r\n [placeholder]=\"'state.all-orders' | translate\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">{{ item | stateI18nToken | translate }}</ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\"> {{ item | stateI18nToken | translate }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </ng-template>\r\n </ng-select>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"customFilterForm.pristine\"\r\n (click)=\"applyCustomFilters()\"\r\n >\r\n {{ 'order.apply-filters' | translate }}\r\n <clr-icon shape=\"filter\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex\">\r\n <div>\r\n <label>{{ 'order.placed-at-start' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtStart\"></vdr-datetime-picker>\r\n </div>\r\n <div>\r\n <label>{{ 'order.placed-at-end' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtEnd\"></vdr-datetime-picker>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-list\"></vdr-action-bar-items>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.customer' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.state' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.total' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.updated-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.placed-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.shipping' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">{{ order.code }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.updatedAt | timeAgo }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | localeDate: 'medium' }}</td>\r\n <td class=\"left align-middle\">{{ getShippingNames(order) }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"order.state === 'Modifying' ? ['./', order.id, 'modify'] : ['./', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n", styles: [".search-form{display:flex;flex-direction:column;align-items:baseline;width:100%;margin-bottom:6px}@media screen and (min-width: 768px){.search-form{flex-direction:row}}.search-input{margin-left:6px;margin-top:6px;min-width:300px}.custom-filters{overflow:hidden;max-height:0;padding-bottom:6px}.custom-filters.expanded{max-height:initial}.custom-filters>form{display:flex;flex-direction:column;align-items:center}.custom-filters>form>div{width:100%}ng-select{flex:1;min-width:200px;height:36px}ng-select ::ng-deep .ng-select-container{height:36px}\n"], components: [{ type: i1.ActionBarComponent, selector: "vdr-action-bar" }, { type: i1.ActionBarLeftComponent, selector: "vdr-ab-left", inputs: ["grow"] }, { type: i3.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { type: i1.DatetimePickerComponent, selector: "vdr-datetime-picker", inputs: ["yearRange", "weekStartDay", "timeGranularityInterval", "min", "max", "readonly"] }, { type: i1.ActionBarRightComponent, selector: "vdr-ab-right", inputs: ["grow"] }, { type: i1.ActionBarItemsComponent, selector: "vdr-action-bar-items", inputs: ["locationId"] }, { type: i1.DataTableComponent, selector: "vdr-data-table", inputs: ["items", "itemsPerPage", "currentPage", "totalItems", "allSelected", "isRowSelectedFn", "emptyStateLabel"], outputs: ["allSelectChange", "rowSelectChange", "pageChange", "itemsPerPageChange"] }, { type: i1.DataTableColumnComponent, selector: "vdr-dt-column", inputs: ["expand"] }, { type: i1.CustomerLabelComponent, selector: "vdr-customer-label", inputs: ["customer"] }, { type: i1.OrderStateLabelComponent, selector: "vdr-order-state-label", inputs: ["state"] }, { type: i1.TableRowActionComponent, selector: "vdr-table-row-action", inputs: ["linkTo", "label", "iconShape", "disabled"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.ClrIconCustomTag, selector: "clr-icon" }, { type: i1.FormFieldControlDirective, selector: "input, textarea, select" }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i3.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { type: i3.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { type: i5.ClrLabel, selector: "label", inputs: ["for"] }], pipes: { "async": i4.AsyncPipe, "translate": i7.TranslatePipe, "stateI18nToken": i1.StateI18nTokenPipe, "localeCurrency": i1.LocaleCurrencyPipe, "timeAgo": i1.TimeAgoPipe, "localeDate": i1.LocaleDatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
188
195
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: OrderListComponent, decorators: [{
189
196
  type: Component,
190
- args: [{ selector: 'vdr-order-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"search-form\">\r\n <div class=\"btn-group btn-outline-primary\" *ngIf=\"activePreset$ | async as activePreset\">\r\n <button\r\n class=\"btn\"\r\n *ngFor=\"let preset of filterPresets\"\r\n [class.btn-primary]=\"activePreset === preset.name\"\r\n (click)=\"selectFilterPreset(preset.name)\"\r\n >\r\n {{ preset.label | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n [class.btn-primary]=\"activePreset === 'custom'\"\r\n (click)=\"selectFilterPreset('custom')\"\r\n >\r\n {{ 'order.filter-custom' | translate }}\r\n <clr-icon shape=\"angle down\"></clr-icon>\r\n </button>\r\n </div>\r\n\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchOrderCodeControl\"\r\n [placeholder]=\"'order.search-by-order-code' | translate\"\r\n class=\"search-input\"\r\n />\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchLastNameControl\"\r\n [placeholder]=\"'order.search-by-customer-last-name' | translate\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n <div class=\"custom-filters\" [class.expanded]=\"(activePreset$ | async) === 'custom'\">\r\n <form [formGroup]=\"customFilterForm\">\r\n <div class=\"flex align-center\">\r\n <ng-select\r\n [items]=\"orderStates\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n formControlName=\"states\"\r\n [placeholder]=\"'state.all-orders' | translate\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">{{ item | stateI18nToken | translate }}</ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\"> {{ item | stateI18nToken | translate }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </ng-template>\r\n </ng-select>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"customFilterForm.pristine\"\r\n (click)=\"applyCustomFilters()\"\r\n >\r\n {{ 'order.apply-filters' | translate }}\r\n <clr-icon shape=\"filter\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex\">\r\n <div>\r\n <label>{{ 'order.placed-at-start' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtStart\"></vdr-datetime-picker>\r\n </div>\r\n <div>\r\n <label>{{ 'order.placed-at-end' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtEnd\"></vdr-datetime-picker>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-list\"></vdr-action-bar-items>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.customer' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.state' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.total' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.updated-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.placed-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.shipping' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">{{ order.code }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.updatedAt | timeAgo }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | localeDate: 'medium' }}</td>\r\n <td class=\"left align-middle\">{{ getShippingNames(order) }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"order.state === 'Modifying' ? ['./', order.id, 'modify'] : ['./', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n", styles: [".search-form{display:flex;flex-direction:column;align-items:baseline;width:100%;margin-bottom:6px}@media screen and (min-width: 768px){.search-form{flex-direction:row}}.search-input{margin-left:6px;margin-top:6px;min-width:300px}.custom-filters{overflow:hidden;max-height:0;padding-bottom:6px}.custom-filters.expanded{max-height:initial}.custom-filters>form{display:flex;flex-direction:column;align-items:center}.custom-filters>form>div{width:100%}ng-select{flex:1;min-width:200px;height:36px}ng-select ::ng-deep .ng-select-container{height:36px}\n"] }]
197
+ args: [{ selector: 'vdr-order-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"search-form\">\r\n <div class=\"btn-group btn-outline-primary\" *ngIf=\"activePreset$ | async as activePreset\">\r\n <button\r\n class=\"btn\"\r\n *ngFor=\"let preset of filterPresets\"\r\n [class.btn-primary]=\"activePreset === preset.name\"\r\n (click)=\"selectFilterPreset(preset.name)\"\r\n >\r\n {{ preset.label | translate }}\r\n </button>\r\n <button\r\n class=\"btn\"\r\n [class.btn-primary]=\"activePreset === 'custom'\"\r\n (click)=\"selectFilterPreset('custom')\"\r\n >\r\n {{ 'order.filter-custom' | translate }}\r\n <clr-icon shape=\"angle down\"></clr-icon>\r\n </button>\r\n </div>\r\n <input\r\n type=\"text\"\r\n name=\"searchTerm\"\r\n [formControl]=\"searchControl\"\r\n [placeholder]=\"'order.search-by-order-filters' | translate\"\r\n class=\"search-input\"\r\n />\r\n </div>\r\n <div class=\"custom-filters\" [class.expanded]=\"(activePreset$ | async) === 'custom'\">\r\n <form [formGroup]=\"customFilterForm\">\r\n <div class=\"flex align-center\">\r\n <ng-select\r\n [items]=\"orderStates\"\r\n appendTo=\"body\"\r\n [addTag]=\"false\"\r\n [multiple]=\"true\"\r\n formControlName=\"states\"\r\n [placeholder]=\"'state.all-orders' | translate\"\r\n [clearable]=\"true\"\r\n [searchable]=\"false\"\r\n >\r\n <ng-template ng-option-tmp let-item=\"item\">{{ item | stateI18nToken | translate }}</ng-template>\r\n <ng-template ng-label-tmp let-item=\"item\" let-clear=\"clear\">\r\n <span class=\"ng-value-label\"> {{ item | stateI18nToken | translate }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </ng-template>\r\n </ng-select>\r\n <button\r\n class=\"btn btn-secondary\"\r\n [disabled]=\"customFilterForm.pristine\"\r\n (click)=\"applyCustomFilters()\"\r\n >\r\n {{ 'order.apply-filters' | translate }}\r\n <clr-icon shape=\"filter\"></clr-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex\">\r\n <div>\r\n <label>{{ 'order.placed-at-start' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtStart\"></vdr-datetime-picker>\r\n </div>\r\n <div>\r\n <label>{{ 'order.placed-at-end' | translate }}</label>\r\n <vdr-datetime-picker formControlName=\"placedAtEnd\"></vdr-datetime-picker>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"order-list\"></vdr-action-bar-items>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<vdr-data-table\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-dt-column>{{ 'common.code' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.customer' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.state' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.total' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'common.updated-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.placed-at' | translate }}</vdr-dt-column>\r\n <vdr-dt-column>{{ 'order.shipping' | translate }}</vdr-dt-column>\r\n <vdr-dt-column></vdr-dt-column>\r\n <ng-template let-order=\"item\">\r\n <td class=\"left align-middle\">{{ order.code }}</td>\r\n <td class=\"left align-middle\">\r\n <vdr-customer-label [customer]=\"order.customer\"></vdr-customer-label>\r\n </td>\r\n <td class=\"left align-middle\">\r\n <vdr-order-state-label [state]=\"order.state\"></vdr-order-state-label>\r\n </td>\r\n <td class=\"left align-middle\">{{ order.totalWithTax | localeCurrency: order.currencyCode }}</td>\r\n <td class=\"left align-middle\">{{ order.updatedAt | timeAgo }}</td>\r\n <td class=\"left align-middle\">{{ order.orderPlacedAt | localeDate: 'medium' }}</td>\r\n <td class=\"left align-middle\">{{ getShippingNames(order) }}</td>\r\n <td class=\"right align-middle\">\r\n <vdr-table-row-action\r\n iconShape=\"shopping-cart\"\r\n [label]=\"'common.open' | translate\"\r\n [linkTo]=\"order.state === 'Modifying' ? ['./', order.id, 'modify'] : ['./', order.id]\"\r\n ></vdr-table-row-action>\r\n </td>\r\n </ng-template>\r\n</vdr-data-table>\r\n", styles: [".search-form{display:flex;flex-direction:column;align-items:baseline;width:100%;margin-bottom:6px}@media screen and (min-width: 768px){.search-form{flex-direction:row}}.search-input{margin-left:6px;margin-top:6px;min-width:300px}.custom-filters{overflow:hidden;max-height:0;padding-bottom:6px}.custom-filters.expanded{max-height:initial}.custom-filters>form{display:flex;flex-direction:column;align-items:center}.custom-filters>form>div{width:100%}ng-select{flex:1;min-width:200px;height:36px}ng-select ::ng-deep .ng-select-container{height:36px}\n"] }]
191
198
  }], ctorParameters: function () { return [{ type: i1.ServerConfigService }, { type: i1.DataService }, { type: i1.LocalStorageService }, { type: i2.Router }, { type: i2.ActivatedRoute }]; } });
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL29yZGVyL3NyYy9jb21wb25lbnRzL29yZGVyLWxpc3Qvb3JkZXItbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL29yZGVyL3NyYy9jb21wb25lbnRzL29yZGVyLWxpc3Qvb3JkZXItbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEQsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN0RSxPQUFPLEVBQ0gsaUJBQWlCLEVBT2pCLFNBQVMsR0FDWixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFtQjVGLE1BQU0sT0FBTyxrQkFDVCxTQUFRLGlCQUF5RTtJQTRDakYsWUFDWSxtQkFBd0MsRUFDeEMsV0FBd0IsRUFDeEIsbUJBQXdDLEVBQ2hELE1BQWMsRUFDZCxLQUFxQjtRQUVyQixLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBTmIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBNUNwRCwyQkFBc0IsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QywwQkFB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QixRQUFRLEVBQUUsc0JBQXNCO2FBQ25DLENBQUM7U0FDTDtRQUNELElBQUksbUJBQW1CLEVBQUU7WUFDckIsTUFBTSxDQUFDLElBQUksR0FBRztnQkFDVixRQUFRLEVBQUUsbUJBQW1CO2FBQ2hDLENBQUM7U0FDTDtRQUNELE9BQU87WUFDSCxPQUFPLEVBQUU7Z0JBQ0wsSUFBSTtnQkFDSixJQUFJO2dCQUNKLE1BQU0sRUFBRTtvQkFDSixHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztpQkFDcEI7Z0JBQ0QsSUFBSSxFQUFFO29CQUNGLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSTtpQkFDNUI7YUFDSjtTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBWTtRQUN6QixJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQzVCLE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvRjthQUFNO1lBQ0gsT0FBTyxFQUFFLENBQUM7U0FDYjtJQUNMLENBQUM7OytHQWhOUSxrQkFBa0I7bUdBQWxCLGtCQUFrQiw2RUNuQy9CLG0zTEF3SEE7MkZEckZhLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDSSxnQkFBZ0IsbUJBR1QsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgbWFya2VyIGFzIF8gfSBmcm9tICdAYmllc2JqZXJnL25neC10cmFuc2xhdGUtZXh0cmFjdC1tYXJrZXInO1xyXG5pbXBvcnQge1xyXG4gICAgQmFzZUxpc3RDb21wb25lbnQsXHJcbiAgICBEYXRhU2VydmljZSxcclxuICAgIEdldE9yZGVyTGlzdFF1ZXJ5LFxyXG4gICAgSXRlbU9mLFxyXG4gICAgTG9jYWxTdG9yYWdlU2VydmljZSxcclxuICAgIE9yZGVyTGlzdE9wdGlvbnMsXHJcbiAgICBTZXJ2ZXJDb25maWdTZXJ2aWNlLFxyXG4gICAgU29ydE9yZGVyLFxyXG59IGZyb20gJ0B2ZW5kdXJlL2FkbWluLXVpL2NvcmUnO1xyXG5pbXBvcnQgeyBPcmRlciB9IGZyb20gJ0B2ZW5kdXJlL2NvbW1vbi9saWIvZ2VuZXJhdGVkLXR5cGVzJztcclxuaW1wb3J0IHsgbWVyZ2UsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmludGVyZmFjZSBPcmRlckZpbHRlckNvbmZpZyB7XHJcbiAgICBhY3RpdmU/OiBib29sZWFuO1xyXG4gICAgc3RhdGVzPzogc3RyaW5nW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBGaWx0ZXJQcmVzZXQge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIGNvbmZpZzogT3JkZXJGaWx0ZXJDb25maWc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd2ZHItb3JkZXItbGlzdCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vb3JkZXItbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9vcmRlci1saXN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyTGlzdENvbXBvbmVudFxyXG4gICAgZXh0ZW5kcyBCYXNlTGlzdENvbXBvbmVudDxHZXRPcmRlckxpc3RRdWVyeSwgSXRlbU9mPEdldE9yZGVyTGlzdFF1ZXJ5LCAnb3JkZXJzJz4+XHJcbiAgICBpbXBsZW1lbnRzIE9uSW5pdFxyXG57XHJcbiAgICBzZWFyY2hPcmRlckNvZGVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICAgIHNlYXJjaExhc3ROYW1lQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XHJcbiAgICBjdXN0b21GaWx0ZXJGb3JtOiBGb3JtR3JvdXA7XHJcbiAgICBvcmRlclN0YXRlcyA9IHRoaXMuc2VydmVyQ29uZmlnU2VydmljZS5nZXRPcmRlclByb2Nlc3NTdGF0ZXMoKS5tYXAoaXRlbSA9PiBpdGVtLm5hbWUpO1xyXG4gICAgZmlsdGVyUHJlc2V0czogRmlsdGVyUHJlc2V0W10gPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnb3BlbicsXHJcbiAgICAgICAgICAgIGxhYmVsOiBfKCdvcmRlci5maWx0ZXItcHJlc2V0LW9wZW4nKSxcclxuICAgICAgICAgICAgY29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgc3RhdGVzOiB0aGlzLm9yZGVyU3RhdGVzLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICBzID0+IHMgIT09ICdEZWxpdmVyZWQnICYmIHMgIT09ICdDYW5jZWxsZWQnICYmIHMgIT09ICdTaGlwcGVkJyxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdzaGlwcGVkJyxcclxuICAgICAgICAgICAgbGFiZWw6IF8oJ29yZGVyLmZpbHRlci1wcmVzZXQtc2hpcHBlZCcpLFxyXG4gICAgICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBzdGF0ZXM6IFsnU2hpcHBlZCddLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnY29tcGxldGVkJyxcclxuICAgICAgICAgICAgbGFiZWw6IF8oJ29yZGVyLmZpbHRlci1wcmVzZXQtY29tcGxldGVkJyksXHJcbiAgICAgICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHN0YXRlczogWydEZWxpdmVyZWQnLCAnQ2FuY2VsbGVkJ10sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdhY3RpdmUnLFxyXG4gICAgICAgICAgICBsYWJlbDogXygnb3JkZXIuZmlsdGVyLXByZXNldC1hY3RpdmUnKSxcclxuICAgICAgICAgICAgY29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgIF07XHJcbiAgICBhY3RpdmVQcmVzZXQkOiBPYnNlcnZhYmxlPHN0cmluZz47XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBzZXJ2ZXJDb25maWdTZXJ2aWNlOiBTZXJ2ZXJDb25maWdTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9jYWxTdG9yYWdlU2VydmljZTogTG9jYWxTdG9yYWdlU2VydmljZSxcclxuICAgICAgICByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihyb3V0ZXIsIHJvdXRlKTtcclxuICAgICAgICBzdXBlci5zZXRRdWVyeUZuKFxyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICAgICAgICAgICAgKHRha2UsIHNraXApID0+IHRoaXMuZGF0YVNlcnZpY2Uub3JkZXIuZ2V0T3JkZXJzKHsgdGFrZSwgc2tpcCB9KS5yZWZldGNoT25DaGFubmVsQ2hhbmdlKCksXHJcbiAgICAgICAgICAgIGRhdGEgPT4gZGF0YS5vcmRlcnMsXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gICAgICAgICAgICAoc2tpcCwgdGFrZSkgPT5cclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUXVlcnlPcHRpb25zKFxyXG4gICAgICAgICAgICAgICAgICAgIHNraXAsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaE9yZGVyQ29kZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hMYXN0TmFtZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgnZmlsdGVyJykgfHwgJ29wZW4nLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGxhc3RGaWx0ZXJzID0gdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldCgnb3JkZXJMaXN0TGFzdEN1c3RvbUZpbHRlcnMnKTtcclxuICAgICAgICBpZiAobGFzdEZpbHRlcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRRdWVyeVBhcmFtKGxhc3RGaWx0ZXJzLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVQcmVzZXQkID0gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcChxcG0gPT4gcXBtLmdldCgnZmlsdGVyJykgfHwgJ29wZW4nKSxcclxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFRlcm1zJCA9IG1lcmdlKFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaE9yZGVyQ29kZUNvbnRyb2wudmFsdWVDaGFuZ2VzLFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaExhc3ROYW1lQ29udHJvbC52YWx1ZUNoYW5nZXMsXHJcbiAgICAgICAgKS5waXBlKFxyXG4gICAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gMiA8IHZhbHVlLmxlbmd0aCB8fCB2YWx1ZS5sZW5ndGggPT09IDApLFxyXG4gICAgICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIG1lcmdlKHNlYXJjaFRlcm1zJCwgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwKVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodmFsID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbU1hcCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcDtcclxuICAgICAgICB0aGlzLmN1c3RvbUZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgICAgICAgc3RhdGVzOiBuZXcgRm9ybUNvbnRyb2wocXVlcnlQYXJhbU1hcC5nZXRBbGwoJ3N0YXRlcycpID8/IFtdKSxcclxuICAgICAgICAgICAgcGxhY2VkQXRTdGFydDogbmV3IEZvcm1Db250cm9sKHF1ZXJ5UGFyYW1NYXAuZ2V0KCdwbGFjZWRBdFN0YXJ0JykpLFxyXG4gICAgICAgICAgICBwbGFjZWRBdEVuZDogbmV3IEZvcm1Db250cm9sKHF1ZXJ5UGFyYW1NYXAuZ2V0KCdwbGFjZWRBdEVuZCcpKSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RGaWx0ZXJQcmVzZXQocHJlc2V0TmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgbGFzdEN1c3RvbUZpbHRlcnMgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0KCdvcmRlckxpc3RMYXN0Q3VzdG9tRmlsdGVycycpID8/IHt9O1xyXG4gICAgICAgIGNvbnN0IGVtcHR5Q3VzdG9tRmlsdGVycyA9IHsgc3RhdGVzOiB1bmRlZmluZWQsIHBsYWNlZEF0U3RhcnQ6IHVuZGVmaW5lZCwgcGxhY2VkQXRFbmQ6IHVuZGVmaW5lZCB9O1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBwcmVzZXROYW1lID09PSAnY3VzdG9tJyA/IGxhc3RDdXN0b21GaWx0ZXJzIDogZW1wdHlDdXN0b21GaWx0ZXJzO1xyXG4gICAgICAgIHRoaXMuc2V0UXVlcnlQYXJhbShcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBwcmVzZXROYW1lLFxyXG4gICAgICAgICAgICAgICAgcGFnZTogMSxcclxuICAgICAgICAgICAgICAgIC4uLmZpbHRlcnMsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHsgcmVwbGFjZVVybDogdHJ1ZSB9LFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlDdXN0b21GaWx0ZXJzKCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuY3VzdG9tRmlsdGVyRm9ybS52YWx1ZTtcclxuICAgICAgICBjb25zdCBjdXN0b21GaWx0ZXJzID0ge1xyXG4gICAgICAgICAgICBzdGF0ZXM6IGZvcm1WYWx1ZS5zdGF0ZXMsXHJcbiAgICAgICAgICAgIHBsYWNlZEF0U3RhcnQ6IGZvcm1WYWx1ZS5wbGFjZWRBdFN0YXJ0LFxyXG4gICAgICAgICAgICBwbGFjZWRBdEVuZDogZm9ybVZhbHVlLnBsYWNlZEF0RW5kLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zZXRRdWVyeVBhcmFtKHtcclxuICAgICAgICAgICAgZmlsdGVyOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgLi4uY3VzdG9tRmlsdGVycyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmN1c3RvbUZpbHRlckZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0KCdvcmRlckxpc3RMYXN0Q3VzdG9tRmlsdGVycycsIGN1c3RvbUZpbHRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlUXVlcnlPcHRpb25zKFxyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gICAgICAgIHNraXA6IG51bWJlcixcclxuICAgICAgICB0YWtlOiBudW1iZXIsXHJcbiAgICAgICAgb3JkZXJDb2RlU2VhcmNoVGVybTogc3RyaW5nLFxyXG4gICAgICAgIGN1c3RvbWVyTmFtZVNlYXJjaFRlcm06IHN0cmluZyxcclxuICAgICAgICBhY3RpdmVGaWx0ZXJQcmVzZXQ/OiBzdHJpbmcsXHJcbiAgICApOiB7IG9wdGlvbnM6IE9yZGVyTGlzdE9wdGlvbnMgfSB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyQ29uZmlnID0gdGhpcy5maWx0ZXJQcmVzZXRzLmZpbmQocCA9PiBwLm5hbWUgPT09IGFjdGl2ZUZpbHRlclByZXNldCk7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICAgICAgY29uc3QgZmlsdGVyOiBhbnkgPSB7fTtcclxuICAgICAgICBpZiAoZmlsdGVyQ29uZmlnKSB7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJDb25maWcuY29uZmlnLmFjdGl2ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIuYWN0aXZlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVxOiBmaWx0ZXJDb25maWcuY29uZmlnLmFjdGl2ZSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGZpbHRlckNvbmZpZy5jb25maWcuc3RhdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW46IGZpbHRlckNvbmZpZy5jb25maWcuc3RhdGVzLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aXZlRmlsdGVyUHJlc2V0ID09PSAnY3VzdG9tJykge1xyXG4gICAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcDtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGVzID0gcXVlcnlQYXJhbXMuZ2V0QWxsKCdzdGF0ZXMnKSA/PyBbXTtcclxuICAgICAgICAgICAgY29uc3QgcGxhY2VkQXRTdGFydCA9IHF1ZXJ5UGFyYW1zLmdldCgncGxhY2VkQXRTdGFydCcpO1xyXG4gICAgICAgICAgICBjb25zdCBwbGFjZWRBdEVuZCA9IHF1ZXJ5UGFyYW1zLmdldCgncGxhY2VkQXRFbmQnKTtcclxuICAgICAgICAgICAgaWYgKHN0YXRlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBpbjogc3RhdGVzLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGxhY2VkQXRTdGFydCAmJiBwbGFjZWRBdEVuZCkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLm9yZGVyUGxhY2VkQXQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmV0d2Vlbjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogcGxhY2VkQXRTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBwbGFjZWRBdEVuZCxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwbGFjZWRBdFN0YXJ0KSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIub3JkZXJQbGFjZWRBdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBhZnRlcjogcGxhY2VkQXRTdGFydCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGxhY2VkQXRFbmQpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5vcmRlclBsYWNlZEF0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZTogcGxhY2VkQXRFbmQsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXN0b21lck5hbWVTZWFyY2hUZXJtKSB7XHJcbiAgICAgICAgICAgIGZpbHRlci5jdXN0b21lckxhc3ROYW1lID0ge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbnM6IGN1c3RvbWVyTmFtZVNlYXJjaFRlcm0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcmRlckNvZGVTZWFyY2hUZXJtKSB7XHJcbiAgICAgICAgICAgIGZpbHRlci5jb2RlID0ge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbnM6IG9yZGVyQ29kZVNlYXJjaFRlcm0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIHNraXAsXHJcbiAgICAgICAgICAgICAgICB0YWtlLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uKGZpbHRlciA/PyB7fSksXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc29ydDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogU29ydE9yZGVyLkRFU0MsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2hpcHBpbmdOYW1lcyhvcmRlcjogT3JkZXIpIHtcclxuICAgICAgICBpZiAob3JkZXIuc2hpcHBpbmdMaW5lcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9yZGVyLnNoaXBwaW5nTGluZXMubWFwKHNoaXBwaW5nTGluZSA9PiBzaGlwcGluZ0xpbmUuc2hpcHBpbmdNZXRob2QubmFtZSkuam9pbignLCAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjx2ZHItYWN0aW9uLWJhcj5cclxuICAgIDx2ZHItYWItbGVmdD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZvcm1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tb3V0bGluZS1wcmltYXJ5XCIgKm5nSWY9XCJhY3RpdmVQcmVzZXQkIHwgYXN5bmMgYXMgYWN0aXZlUHJlc2V0XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwcmVzZXQgb2YgZmlsdGVyUHJlc2V0c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJ0bi1wcmltYXJ5XT1cImFjdGl2ZVByZXNldCA9PT0gcHJlc2V0Lm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RGaWx0ZXJQcmVzZXQocHJlc2V0Lm5hbWUpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyBwcmVzZXQubGFiZWwgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYnRuLXByaW1hcnldPVwiYWN0aXZlUHJlc2V0ID09PSAnY3VzdG9tJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEZpbHRlclByZXNldCgnY3VzdG9tJylcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ICdvcmRlci5maWx0ZXItY3VzdG9tJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImFuZ2xlIGRvd25cIj48L2Nsci1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICBuYW1lPVwic2VhcmNoVGVybVwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic2VhcmNoT3JkZXJDb2RlQ29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ29yZGVyLnNlYXJjaC1ieS1vcmRlci1jb2RlJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgbmFtZT1cInNlYXJjaFRlcm1cIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaExhc3ROYW1lQ29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ29yZGVyLnNlYXJjaC1ieS1jdXN0b21lci1sYXN0LW5hbWUnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWZpbHRlcnNcIiBbY2xhc3MuZXhwYW5kZWRdPVwiKGFjdGl2ZVByZXNldCQgfCBhc3luYykgPT09ICdjdXN0b20nXCI+XHJcbiAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY3VzdG9tRmlsdGVyRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24tY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwib3JkZXJTdGF0ZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWRkVGFnXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ3N0YXRlLmFsbC1vcmRlcnMnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsZWFyYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCI+e3sgaXRlbSB8IHN0YXRlSTE4blRva2VuIHwgdHJhbnNsYXRlIH19PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLWxhYmVsLXRtcCBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtY2xlYXI9XCJjbGVhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy12YWx1ZS1sYWJlbFwiPiB7eyBpdGVtIHwgc3RhdGVJMThuVG9rZW4gfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5nLXZhbHVlLWljb24gcmlnaHRcIiAoY2xpY2spPVwiY2xlYXIoaXRlbSlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj7Dlzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3VzdG9tRmlsdGVyRm9ybS5wcmlzdGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseUN1c3RvbUZpbHRlcnMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnb3JkZXIuYXBwbHktZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwiZmlsdGVyXCI+PC9jbHItaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ29yZGVyLnBsYWNlZC1hdC1zdGFydCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dmRyLWRhdGV0aW1lLXBpY2tlciBmb3JtQ29udHJvbE5hbWU9XCJwbGFjZWRBdFN0YXJ0XCI+PC92ZHItZGF0ZXRpbWUtcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnb3JkZXIucGxhY2VkLWF0LWVuZCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dmRyLWRhdGV0aW1lLXBpY2tlciBmb3JtQ29udHJvbE5hbWU9XCJwbGFjZWRBdEVuZFwiPjwvdmRyLWRhdGV0aW1lLXBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3Zkci1hYi1sZWZ0PlxyXG4gICAgPHZkci1hYi1yaWdodD5cclxuICAgICAgICA8dmRyLWFjdGlvbi1iYXItaXRlbXMgbG9jYXRpb25JZD1cIm9yZGVyLWxpc3RcIj48L3Zkci1hY3Rpb24tYmFyLWl0ZW1zPlxyXG4gICAgPC92ZHItYWItcmlnaHQ+XHJcbjwvdmRyLWFjdGlvbi1iYXI+XHJcblxyXG48dmRyLWRhdGEtdGFibGVcclxuICAgIFtpdGVtc109XCJpdGVtcyQgfCBhc3luY1wiXHJcbiAgICBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZSQgfCBhc3luY1wiXHJcbiAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zJCB8IGFzeW5jXCJcclxuICAgIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZSQgfCBhc3luY1wiXHJcbiAgICAocGFnZUNoYW5nZSk9XCJzZXRQYWdlTnVtYmVyKCRldmVudClcIlxyXG4gICAgKGl0ZW1zUGVyUGFnZUNoYW5nZSk9XCJzZXRJdGVtc1BlclBhZ2UoJGV2ZW50KVwiXHJcbj5cclxuICAgIDx2ZHItZHQtY29sdW1uPnt7ICdjb21tb24uY29kZScgfCB0cmFuc2xhdGUgfX08L3Zkci1kdC1jb2x1bW4+XHJcbiAgICA8dmRyLWR0LWNvbHVtbj57eyAnb3JkZXIuY3VzdG9tZXInIHwgdHJhbnNsYXRlIH19PC92ZHItZHQtY29sdW1uPlxyXG4gICAgPHZkci1kdC1jb2x1bW4+e3sgJ29yZGVyLnN0YXRlJyB8IHRyYW5zbGF0ZSB9fTwvdmRyLWR0LWNvbHVtbj5cclxuICAgIDx2ZHItZHQtY29sdW1uPnt7ICdvcmRlci50b3RhbCcgfCB0cmFuc2xhdGUgfX08L3Zkci1kdC1jb2x1bW4+XHJcbiAgICA8dmRyLWR0LWNvbHVtbj57eyAnY29tbW9uLnVwZGF0ZWQtYXQnIHwgdHJhbnNsYXRlIH19PC92ZHItZHQtY29sdW1uPlxyXG4gICAgPHZkci1kdC1jb2x1bW4+e3sgJ29yZGVyLnBsYWNlZC1hdCcgfCB0cmFuc2xhdGUgfX08L3Zkci1kdC1jb2x1bW4+XHJcbiAgICA8dmRyLWR0LWNvbHVtbj57eyAnb3JkZXIuc2hpcHBpbmcnIHwgdHJhbnNsYXRlIH19PC92ZHItZHQtY29sdW1uPlxyXG4gICAgPHZkci1kdC1jb2x1bW4+PC92ZHItZHQtY29sdW1uPlxyXG4gICAgPG5nLXRlbXBsYXRlIGxldC1vcmRlcj1cIml0ZW1cIj5cclxuICAgICAgICA8dGQgY2xhc3M9XCJsZWZ0IGFsaWduLW1pZGRsZVwiPnt7IG9yZGVyLmNvZGUgfX08L3RkPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cImxlZnQgYWxpZ24tbWlkZGxlXCI+XHJcbiAgICAgICAgICAgIDx2ZHItY3VzdG9tZXItbGFiZWwgW2N1c3RvbWVyXT1cIm9yZGVyLmN1c3RvbWVyXCI+PC92ZHItY3VzdG9tZXItbGFiZWw+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJsZWZ0IGFsaWduLW1pZGRsZVwiPlxyXG4gICAgICAgICAgICA8dmRyLW9yZGVyLXN0YXRlLWxhYmVsIFtzdGF0ZV09XCJvcmRlci5zdGF0ZVwiPjwvdmRyLW9yZGVyLXN0YXRlLWxhYmVsPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibGVmdCBhbGlnbi1taWRkbGVcIj57eyBvcmRlci50b3RhbFdpdGhUYXggfCBsb2NhbGVDdXJyZW5jeTogb3JkZXIuY3VycmVuY3lDb2RlIH19PC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJsZWZ0IGFsaWduLW1pZGRsZVwiPnt7IG9yZGVyLnVwZGF0ZWRBdCB8IHRpbWVBZ28gfX08L3RkPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cImxlZnQgYWxpZ24tbWlkZGxlXCI+e3sgb3JkZXIub3JkZXJQbGFjZWRBdCB8IGxvY2FsZURhdGU6ICdtZWRpdW0nIH19PC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJsZWZ0IGFsaWduLW1pZGRsZVwiPnt7IGdldFNoaXBwaW5nTmFtZXMob3JkZXIpIH19PC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJyaWdodCBhbGlnbi1taWRkbGVcIj5cclxuICAgICAgICAgICAgPHZkci10YWJsZS1yb3ctYWN0aW9uXHJcbiAgICAgICAgICAgICAgICBpY29uU2hhcGU9XCJzaG9wcGluZy1jYXJ0XCJcclxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInY29tbW9uLm9wZW4nIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgIFtsaW5rVG9dPVwib3JkZXIuc3RhdGUgPT09ICdNb2RpZnlpbmcnID8gWycuLycsIG9yZGVyLmlkLCAnbW9kaWZ5J10gOiBbJy4vJywgb3JkZXIuaWRdXCJcclxuICAgICAgICAgICAgPjwvdmRyLXRhYmxlLXJvdy1hY3Rpb24+XHJcbiAgICAgICAgPC90ZD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbjwvdmRyLWRhdGEtdGFibGU+XHJcbiJdfQ==
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL29yZGVyL3NyYy9jb21wb25lbnRzL29yZGVyLWxpc3Qvb3JkZXItbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL29yZGVyL3NyYy9jb21wb25lbnRzL29yZGVyLWxpc3Qvb3JkZXItbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEQsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN0RSxPQUFPLEVBQ0gsaUJBQWlCLEVBS2pCLGVBQWUsRUFHZixTQUFTLEdBQ1osTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQUUsS0FBSyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBbUI1RixNQUFNLE9BQU8sa0JBQ1QsU0FBUSxpQkFBeUU7SUE2Q2pGLFlBQ1ksbUJBQXdDLEVBQ3hDLFdBQXdCLEVBQ3hCLG1CQUF3QyxFQUNoRCxNQUFjLEVBQ2QsS0FBcUI7UUFFckIsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQU5iLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQTdDcEQsa0JBQWEsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztR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Z0JBQWdCLEVBQUU7b0JBQ2QsUUFBUSxFQUFFLFVBQVU7aUJBQ3ZCO2dCQUNELGFBQWEsRUFBRTtvQkFDWCxRQUFRLEVBQUUsVUFBVTtpQkFDdkI7Z0JBQ0QsSUFBSSxFQUFFO29CQUNGLFFBQVEsRUFBRSxVQUFVO2lCQUN2QjthQUNKLENBQUM7WUFDRixjQUFjLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQztTQUN2QztRQUNELE9BQU87WUFDSCxPQUFPLEVBQUU7Z0JBQ0wsSUFBSTtnQkFDSixJQUFJO2dCQUNKLE1BQU0sRUFBRTtvQkFDSixHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztpQkFDcEI7Z0JBQ0QsSUFBSSxFQUFFO29CQUNGLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSTtpQkFDNUI7Z0JBQ0QsY0FBYzthQUNqQjtTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBWTtRQUN6QixJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQzVCLE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvRjthQUFNO1lBQ0gsT0FBTyxFQUFFLENBQUM7U0FDYjtJQUNMLENBQUM7OytHQWxOUSxrQkFBa0I7bUdBQWxCLGtCQUFrQiw2RUNwQy9CLDhqTEFnSEE7MkZENUVhLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDSSxnQkFBZ0IsbUJBR1QsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgbWFya2VyIGFzIF8gfSBmcm9tICdAYmllc2JqZXJnL25neC10cmFuc2xhdGUtZXh0cmFjdC1tYXJrZXInO1xyXG5pbXBvcnQge1xyXG4gICAgQmFzZUxpc3RDb21wb25lbnQsXHJcbiAgICBEYXRhU2VydmljZSxcclxuICAgIEdldE9yZGVyTGlzdFF1ZXJ5LFxyXG4gICAgSXRlbU9mLFxyXG4gICAgTG9jYWxTdG9yYWdlU2VydmljZSxcclxuICAgIExvZ2ljYWxPcGVyYXRvcixcclxuICAgIE9yZGVyTGlzdE9wdGlvbnMsXHJcbiAgICBTZXJ2ZXJDb25maWdTZXJ2aWNlLFxyXG4gICAgU29ydE9yZGVyLFxyXG59IGZyb20gJ0B2ZW5kdXJlL2FkbWluLXVpL2NvcmUnO1xyXG5pbXBvcnQgeyBPcmRlciB9IGZyb20gJ0B2ZW5kdXJlL2NvbW1vbi9saWIvZ2VuZXJhdGVkLXR5cGVzJztcclxuaW1wb3J0IHsgbWVyZ2UsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmludGVyZmFjZSBPcmRlckZpbHRlckNvbmZpZyB7XHJcbiAgICBhY3RpdmU/OiBib29sZWFuO1xyXG4gICAgc3RhdGVzPzogc3RyaW5nW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBGaWx0ZXJQcmVzZXQge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIGNvbmZpZzogT3JkZXJGaWx0ZXJDb25maWc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd2ZHItb3JkZXItbGlzdCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vb3JkZXItbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9vcmRlci1saXN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyTGlzdENvbXBvbmVudFxyXG4gICAgZXh0ZW5kcyBCYXNlTGlzdENvbXBvbmVudDxHZXRPcmRlckxpc3RRdWVyeSwgSXRlbU9mPEdldE9yZGVyTGlzdFF1ZXJ5LCAnb3JkZXJzJz4+XHJcbiAgICBpbXBsZW1lbnRzIE9uSW5pdFxyXG57XHJcbiAgICBzZWFyY2hDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICAgIHNlYXJjaE9yZGVyQ29kZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xyXG4gICAgc2VhcmNoTGFzdE5hbWVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICAgIGN1c3RvbUZpbHRlckZvcm06IEZvcm1Hcm91cDtcclxuICAgIG9yZGVyU3RhdGVzID0gdGhpcy5zZXJ2ZXJDb25maWdTZXJ2aWNlLmdldE9yZGVyUHJvY2Vzc1N0YXRlcygpLm1hcChpdGVtID0+IGl0ZW0ubmFtZSk7XHJcbiAgICBmaWx0ZXJQcmVzZXRzOiBGaWx0ZXJQcmVzZXRbXSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdvcGVuJyxcclxuICAgICAgICAgICAgbGFiZWw6IF8oJ29yZGVyLmZpbHRlci1wcmVzZXQtb3BlbicpLFxyXG4gICAgICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBzdGF0ZXM6IHRoaXMub3JkZXJTdGF0ZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgIHMgPT4gcyAhPT0gJ0RlbGl2ZXJlZCcgJiYgcyAhPT0gJ0NhbmNlbGxlZCcgJiYgcyAhPT0gJ1NoaXBwZWQnLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ3NoaXBwZWQnLFxyXG4gICAgICAgICAgICBsYWJlbDogXygnb3JkZXIuZmlsdGVyLXByZXNldC1zaGlwcGVkJyksXHJcbiAgICAgICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHN0YXRlczogWydTaGlwcGVkJ10sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdjb21wbGV0ZWQnLFxyXG4gICAgICAgICAgICBsYWJlbDogXygnb3JkZXIuZmlsdGVyLXByZXNldC1jb21wbGV0ZWQnKSxcclxuICAgICAgICAgICAgY29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgc3RhdGVzOiBbJ0RlbGl2ZXJlZCcsICdDYW5jZWxsZWQnXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2FjdGl2ZScsXHJcbiAgICAgICAgICAgIGxhYmVsOiBfKCdvcmRlci5maWx0ZXItcHJlc2V0LWFjdGl2ZScpLFxyXG4gICAgICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgXTtcclxuICAgIGFjdGl2ZVByZXNldCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHNlcnZlckNvbmZpZ1NlcnZpY2U6IFNlcnZlckNvbmZpZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKHJvdXRlciwgcm91dGUpO1xyXG4gICAgICAgIHN1cGVyLnNldFF1ZXJ5Rm4oXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gICAgICAgICAgICAodGFrZSwgc2tpcCkgPT4gdGhpcy5kYXRhU2VydmljZS5vcmRlci5nZXRPcmRlcnMoeyB0YWtlLCBza2lwIH0pLnJlZmV0Y2hPbkNoYW5uZWxDaGFuZ2UoKSxcclxuICAgICAgICAgICAgZGF0YSA9PiBkYXRhLm9yZGVycyxcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICAgICAgICAgIChza2lwLCB0YWtlKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVRdWVyeU9wdGlvbnMoXHJcbiAgICAgICAgICAgICAgICAgICAgc2tpcCxcclxuICAgICAgICAgICAgICAgICAgICB0YWtlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdmaWx0ZXInKSB8fCAnb3BlbicsXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgbGFzdEZpbHRlcnMgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0KCdvcmRlckxpc3RMYXN0Q3VzdG9tRmlsdGVycycpO1xyXG4gICAgICAgIGlmIChsYXN0RmlsdGVycykge1xyXG4gICAgICAgICAgICB0aGlzLnNldFF1ZXJ5UGFyYW0obGFzdEZpbHRlcnMsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZVByZXNldCQgPSB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1NYXAucGlwZShcclxuICAgICAgICAgICAgbWFwKHFwbSA9PiBxcG0uZ2V0KCdmaWx0ZXInKSB8fCAnb3BlbicpLFxyXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoVGVybXMkID0gbWVyZ2UodGhpcy5zZWFyY2hDb250cm9sLnZhbHVlQ2hhbmdlcykucGlwZShcclxuICAgICAgICAgICAgZmlsdGVyKHZhbHVlID0+IDIgPCB2YWx1ZS5sZW5ndGggfHwgdmFsdWUubGVuZ3RoID09PSAwKSxcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBtZXJnZShzZWFyY2hUZXJtcyQsIHRoaXMucm91dGUucXVlcnlQYXJhbU1hcClcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1NYXAgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXA7XHJcbiAgICAgICAgdGhpcy5jdXN0b21GaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgIHN0YXRlczogbmV3IEZvcm1Db250cm9sKHF1ZXJ5UGFyYW1NYXAuZ2V0QWxsKCdzdGF0ZXMnKSA/PyBbXSksXHJcbiAgICAgICAgICAgIHBsYWNlZEF0U3RhcnQ6IG5ldyBGb3JtQ29udHJvbChxdWVyeVBhcmFtTWFwLmdldCgncGxhY2VkQXRTdGFydCcpKSxcclxuICAgICAgICAgICAgcGxhY2VkQXRFbmQ6IG5ldyBGb3JtQ29udHJvbChxdWVyeVBhcmFtTWFwLmdldCgncGxhY2VkQXRFbmQnKSksXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0RmlsdGVyUHJlc2V0KHByZXNldE5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGxhc3RDdXN0b21GaWx0ZXJzID0gdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldCgnb3JkZXJMaXN0TGFzdEN1c3RvbUZpbHRlcnMnKSA/PyB7fTtcclxuICAgICAgICBjb25zdCBlbXB0eUN1c3RvbUZpbHRlcnMgPSB7IHN0YXRlczogdW5kZWZpbmVkLCBwbGFjZWRBdFN0YXJ0OiB1bmRlZmluZWQsIHBsYWNlZEF0RW5kOiB1bmRlZmluZWQgfTtcclxuICAgICAgICBjb25zdCBmaWx0ZXJzID0gcHJlc2V0TmFtZSA9PT0gJ2N1c3RvbScgPyBsYXN0Q3VzdG9tRmlsdGVycyA6IGVtcHR5Q3VzdG9tRmlsdGVycztcclxuICAgICAgICB0aGlzLnNldFF1ZXJ5UGFyYW0oXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlcjogcHJlc2V0TmFtZSxcclxuICAgICAgICAgICAgICAgIHBhZ2U6IDEsXHJcbiAgICAgICAgICAgICAgICAuLi5maWx0ZXJzLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7IHJlcGxhY2VVcmw6IHRydWUgfSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5Q3VzdG9tRmlsdGVycygpIHtcclxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmN1c3RvbUZpbHRlckZvcm0udmFsdWU7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRmlsdGVycyA9IHtcclxuICAgICAgICAgICAgc3RhdGVzOiBmb3JtVmFsdWUuc3RhdGVzLFxyXG4gICAgICAgICAgICBwbGFjZWRBdFN0YXJ0OiBmb3JtVmFsdWUucGxhY2VkQXRTdGFydCxcclxuICAgICAgICAgICAgcGxhY2VkQXRFbmQ6IGZvcm1WYWx1ZS5wbGFjZWRBdEVuZCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc2V0UXVlcnlQYXJhbSh7XHJcbiAgICAgICAgICAgIGZpbHRlcjogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgIC4uLmN1c3RvbUZpbHRlcnMsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jdXN0b21GaWx0ZXJGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldCgnb3JkZXJMaXN0TGFzdEN1c3RvbUZpbHRlcnMnLCBjdXN0b21GaWx0ZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVF1ZXJ5T3B0aW9ucyhcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICAgICAgICBza2lwOiBudW1iZXIsXHJcbiAgICAgICAgdGFrZTogbnVtYmVyLFxyXG4gICAgICAgIHNlYXJjaFRlcm06IHN0cmluZyxcclxuICAgICAgICBhY3RpdmVGaWx0ZXJQcmVzZXQ/OiBzdHJpbmcsXHJcbiAgICApOiB7IG9wdGlvbnM6IE9yZGVyTGlzdE9wdGlvbnMgfSB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyQ29uZmlnID0gdGhpcy5maWx0ZXJQcmVzZXRzLmZpbmQocCA9PiBwLm5hbWUgPT09IGFjdGl2ZUZpbHRlclByZXNldCk7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICAgICAgbGV0IGZpbHRlcjogYW55ID0ge307XHJcbiAgICAgICAgbGV0IGZpbHRlck9wZXJhdG9yOiBMb2dpY2FsT3BlcmF0b3IgPSBMb2dpY2FsT3BlcmF0b3IuQU5EO1xyXG4gICAgICAgIGlmIChmaWx0ZXJDb25maWcpIHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlckNvbmZpZy5jb25maWcuYWN0aXZlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5hY3RpdmUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXE6IGZpbHRlckNvbmZpZy5jb25maWcuYWN0aXZlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmlsdGVyQ29uZmlnLmNvbmZpZy5zdGF0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBpbjogZmlsdGVyQ29uZmlnLmNvbmZpZy5zdGF0ZXMsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVGaWx0ZXJQcmVzZXQgPT09ICdjdXN0b20nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwO1xyXG4gICAgICAgICAgICBjb25zdCBzdGF0ZXMgPSBxdWVyeVBhcmFtcy5nZXRBbGwoJ3N0YXRlcycpID8/IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBwbGFjZWRBdFN0YXJ0ID0gcXVlcnlQYXJhbXMuZ2V0KCdwbGFjZWRBdFN0YXJ0Jyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlZEF0RW5kID0gcXVlcnlQYXJhbXMuZ2V0KCdwbGFjZWRBdEVuZCcpO1xyXG4gICAgICAgICAgICBpZiAoc3RhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLnN0YXRlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGluOiBzdGF0ZXMsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwbGFjZWRBdFN0YXJ0ICYmIHBsYWNlZEF0RW5kKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIub3JkZXJQbGFjZWRBdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwbGFjZWRBdFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHBsYWNlZEF0RW5kLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBsYWNlZEF0U3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5vcmRlclBsYWNlZEF0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyOiBwbGFjZWRBdFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwbGFjZWRBdEVuZCkge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLm9yZGVyUGxhY2VkQXQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlOiBwbGFjZWRBdEVuZCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlYXJjaFRlcm0pIHtcclxuICAgICAgICAgICAgZmlsdGVyID0ge1xyXG4gICAgICAgICAgICAgICAgY3VzdG9tZXJMYXN0TmFtZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zOiBzZWFyY2hUZXJtLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluczogc2VhcmNoVGVybSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb2RlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbnM6IHNlYXJjaFRlcm0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBmaWx0ZXJPcGVyYXRvciA9IExvZ2ljYWxPcGVyYXRvci5PUjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgc2tpcCxcclxuICAgICAgICAgICAgICAgIHRha2UsXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi4oZmlsdGVyID8/IHt9KSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzb3J0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBTb3J0T3JkZXIuREVTQyxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJPcGVyYXRvcixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNoaXBwaW5nTmFtZXMob3JkZXI6IE9yZGVyKSB7XHJcbiAgICAgICAgaWYgKG9yZGVyLnNoaXBwaW5nTGluZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvcmRlci5zaGlwcGluZ0xpbmVzLm1hcChzaGlwcGluZ0xpbmUgPT4gc2hpcHBpbmdMaW5lLnNoaXBwaW5nTWV0aG9kLm5hbWUpLmpvaW4oJywgJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCI8dmRyLWFjdGlvbi1iYXI+XHJcbiAgICA8dmRyLWFiLWxlZnQ+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1mb3JtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLW91dGxpbmUtcHJpbWFyeVwiICpuZ0lmPVwiYWN0aXZlUHJlc2V0JCB8IGFzeW5jIGFzIGFjdGl2ZVByZXNldFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcHJlc2V0IG9mIGZpbHRlclByZXNldHNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5idG4tcHJpbWFyeV09XCJhY3RpdmVQcmVzZXQgPT09IHByZXNldC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RmlsdGVyUHJlc2V0KHByZXNldC5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgcHJlc2V0LmxhYmVsIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJ0bi1wcmltYXJ5XT1cImFjdGl2ZVByZXNldCA9PT0gJ2N1c3RvbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RGaWx0ZXJQcmVzZXQoJ2N1c3RvbScpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyAnb3JkZXIuZmlsdGVyLWN1c3RvbScgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8Y2xyLWljb24gc2hhcGU9XCJhbmdsZSBkb3duXCI+PC9jbHItaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICBuYW1lPVwic2VhcmNoVGVybVwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic2VhcmNoQ29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ29yZGVyLnNlYXJjaC1ieS1vcmRlci1maWx0ZXJzJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1maWx0ZXJzXCIgW2NsYXNzLmV4cGFuZGVkXT1cIihhY3RpdmVQcmVzZXQkIHwgYXN5bmMpID09PSAnY3VzdG9tJ1wiPlxyXG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImN1c3RvbUZpbHRlckZvcm1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIm9yZGVyU3RhdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2FkZFRhZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3RhdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidzdGF0ZS5hbGwtb3JkZXJzJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGVhcmFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZy1vcHRpb24tdG1wIGxldC1pdGVtPVwiaXRlbVwiPnt7IGl0ZW0gfCBzdGF0ZUkxOG5Ub2tlbiB8IHRyYW5zbGF0ZSB9fTwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZy1sYWJlbC10bXAgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWNsZWFyPVwiY2xlYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmctdmFsdWUtbGFiZWxcIj4ge3sgaXRlbSB8IHN0YXRlSTE4blRva2VuIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy12YWx1ZS1pY29uIHJpZ2h0XCIgKGNsaWNrKT1cImNsZWFyKGl0ZW0pXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+w5c8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1c3RvbUZpbHRlckZvcm0ucHJpc3RpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlDdXN0b21GaWx0ZXJzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ29yZGVyLmFwcGx5LWZpbHRlcnMnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImZpbHRlclwiPjwvY2xyLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdvcmRlci5wbGFjZWQtYXQtc3RhcnQnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHZkci1kYXRldGltZS1waWNrZXIgZm9ybUNvbnRyb2xOYW1lPVwicGxhY2VkQXRTdGFydFwiPjwvdmRyLWRhdGV0aW1lLXBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ29yZGVyLnBsYWNlZC1hdC1lbmQnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHZkci1kYXRldGltZS1waWNrZXIgZm9ybUNvbnRyb2xOYW1lPVwicGxhY2VkQXRFbmRcIj48L3Zkci1kYXRldGltZS1waWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC92ZHItYWItbGVmdD5cclxuICAgIDx2ZHItYWItcmlnaHQ+XHJcbiAgICAgICAgPHZkci1hY3Rpb24tYmFyLWl0ZW1zIGxvY2F0aW9uSWQ9XCJvcmRlci1saXN0XCI+PC92ZHItYWN0aW9uLWJhci1pdGVtcz5cclxuICAgIDwvdmRyLWFiLXJpZ2h0PlxyXG48L3Zkci1hY3Rpb24tYmFyPlxyXG5cclxuPHZkci1kYXRhLXRhYmxlXHJcbiAgICBbaXRlbXNdPVwiaXRlbXMkIHwgYXN5bmNcIlxyXG4gICAgW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2UkIHwgYXN5bmNcIlxyXG4gICAgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtcyQgfCBhc3luY1wiXHJcbiAgICBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2UkIHwgYXN5bmNcIlxyXG4gICAgKHBhZ2VDaGFuZ2UpPVwic2V0UGFnZU51bWJlcigkZXZlbnQpXCJcclxuICAgIChpdGVtc1BlclBhZ2VDaGFuZ2UpPVwic2V0SXRlbXNQZXJQYWdlKCRldmVudClcIlxyXG4+XHJcbiAgICA8dmRyLWR0LWNvbHVtbj57eyAnY29tbW9uLmNvZGUnIHwgdHJhbnNsYXRlIH19PC92ZHItZHQtY29sdW1uPlxyXG4gICAgPHZkci1kdC1jb2x1bW4+e3sgJ29yZGVyLmN1c3RvbWVyJyB8IHRyYW5zbGF0ZSB9fTwvdmRyLWR0LWNvbHVtbj5cclxuICAgIDx2ZHItZHQtY29sdW1uPnt7ICdvcmRlci5zdGF0ZScgfCB0cmFuc2xhdGUgfX08L3Zkci1kdC1jb2x1bW4+XHJcbiAgICA8dmRyLWR0LWNvbHVtbj57eyAnb3JkZXIudG90YWwnIHwgdHJhbnNsYXRlIH19PC92ZHItZHQtY29sdW1uPlxyXG4gICAgPHZkci1kdC1jb2x1bW4+e3sgJ2NvbW1vbi51cGRhdGVkLWF0JyB8IHRyYW5zbGF0ZSB9fTwvdmRyLWR0LWNvbHVtbj5cclxuICAgIDx2ZHItZHQtY29sdW1uPnt7ICdvcmRlci5wbGFjZWQtYXQnIHwgdHJhbnNsYXRlIH19PC92ZHItZHQtY29sdW1uPlxyXG4gICAgPHZkci1kdC1jb2x1bW4+e3sgJ29yZGVyLnNoaXBwaW5nJyB8IHRyYW5zbGF0ZSB9fTwvdmRyLWR0LWNvbHVtbj5cclxuICAgIDx2ZHItZHQtY29sdW1uPjwvdmRyLWR0LWNvbHVtbj5cclxuICAgIDxuZy10ZW1wbGF0ZSBsZXQtb3JkZXI9XCJpdGVtXCI+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibGVmdCBhbGlnbi1taWRkbGVcIj57eyBvcmRlci5jb2RlIH19PC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJsZWZ0IGFsaWduLW1pZGRsZVwiPlxyXG4gICAgICAgICAgICA8dmRyLWN1c3RvbWVyLWxhYmVsIFtjdXN0b21lcl09XCJvcmRlci5jdXN0b21lclwiPjwvdmRyLWN1c3RvbWVyLWxhYmVsPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibGVmdCBhbGlnbi1taWRkbGVcIj5cclxuICAgICAgICAgICAgPHZkci1vcmRlci1zdGF0ZS1sYWJlbCBbc3RhdGVdPVwib3JkZXIuc3RhdGVcIj48L3Zkci1vcmRlci1zdGF0ZS1sYWJlbD5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cImxlZnQgYWxpZ24tbWlkZGxlXCI+e3sgb3JkZXIudG90YWxXaXRoVGF4IHwgbG9jYWxlQ3VycmVuY3k6IG9yZGVyLmN1cnJlbmN5Q29kZSB9fTwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibGVmdCBhbGlnbi1taWRkbGVcIj57eyBvcmRlci51cGRhdGVkQXQgfCB0aW1lQWdvIH19PC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJsZWZ0IGFsaWduLW1pZGRsZVwiPnt7IG9yZGVyLm9yZGVyUGxhY2VkQXQgfCBsb2NhbGVEYXRlOiAnbWVkaXVtJyB9fTwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwibGVmdCBhbGlnbi1taWRkbGVcIj57eyBnZXRTaGlwcGluZ05hbWVzKG9yZGVyKSB9fTwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwicmlnaHQgYWxpZ24tbWlkZGxlXCI+XHJcbiAgICAgICAgICAgIDx2ZHItdGFibGUtcm93LWFjdGlvblxyXG4gICAgICAgICAgICAgICAgaWNvblNoYXBlPVwic2hvcHBpbmctY2FydFwiXHJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ2NvbW1vbi5vcGVuJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBbbGlua1RvXT1cIm9yZGVyLnN0YXRlID09PSAnTW9kaWZ5aW5nJyA/IFsnLi8nLCBvcmRlci5pZCwgJ21vZGlmeSddIDogWycuLycsIG9yZGVyLmlkXVwiXHJcbiAgICAgICAgICAgID48L3Zkci10YWJsZS1yb3ctYWN0aW9uPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L3Zkci1kYXRhLXRhYmxlPlxyXG4iXX0=
@@ -21,11 +21,11 @@ export class OrderPaymentCardComponent {
21
21
  if (!this.payment) {
22
22
  return [];
23
23
  }
24
- return this.payment.nextStates.filter(s => s !== 'Settled');
24
+ return this.payment.nextStates.filter(s => s !== 'Settled' && s !== 'Error');
25
25
  }
26
26
  }
27
27
  OrderPaymentCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: OrderPaymentCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
28
- OrderPaymentCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: OrderPaymentCardComponent, selector: "vdr-order-payment-card", inputs: { payment: "payment", currencyCode: "currencyCode" }, outputs: { settlePayment: "settlePayment", transitionPaymentState: "transitionPaymentState", settleRefund: "settleRefund" }, ngImport: i0, template: "<div class=\"card\">\r\n <div class=\"card-header payment-header\">\r\n <div>\r\n {{ 'order.payment' | translate }}\r\n <ng-container *ngIf=\"payment.transactionId\">#{{ payment.transactionId }}</ng-container>\r\n </div>\r\n <div class=\"payment-state\">\r\n <vdr-payment-state-label [state]=\"payment.state\"></vdr-payment-state-label>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-payment-detail [payment]=\"payment\" [currencyCode]=\"currencyCode\"></vdr-payment-detail>\r\n </div>\r\n <ng-container *ngFor=\"let refund of payment.refunds\">\r\n <div class=\"card-header payment-header\">\r\n <clr-icon shape=\"redo\" class=\"refund-icon\" dir=\"down\"></clr-icon>\r\n {{ 'order.refund' | translate }} #{{ refund.id }}\r\n <div class=\"clr-flex-fill\"></div>\r\n <vdr-refund-state-label [state]=\"refund.state\"></vdr-refund-state-label>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-labeled-data [label]=\"'common.created-at' | translate\">\r\n {{ refund.createdAt | localeDate: 'medium' }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-total' | translate\">\r\n {{ refund.total | localeCurrency: currencyCode }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.transaction-id' | translate\" *ngIf=\"refund.transactionId\">\r\n {{ refund.transactionId }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-reason' | translate\" *ngIf=\"refund.reason\">\r\n {{ refund.reason }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-metadata' | translate\" *ngIf=\"refundHasMetadata(refund)\">\r\n <vdr-object-tree [value]=\"refund.metadata\"></vdr-object-tree>\r\n </vdr-labeled-data>\r\n </div>\r\n <div class=\"card-footer\" *ngIf=\"refund.state === 'Pending'\">\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"settleRefund.emit(refund)\">\r\n {{ 'order.settle-refund' | translate }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer\" *ngIf=\"payment.nextStates.length\">\r\n <button\r\n class=\"btn btn-sm btn-primary\"\r\n *ngIf=\"payment.nextStates.includes('Settled')\"\r\n (click)=\"settlePayment.emit(payment)\"\r\n >\r\n {{ 'order.settle-payment' | translate }}\r\n </button>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <ng-container *ngFor=\"let nextState of nextOtherStates()\">\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n (click)=\"transitionPaymentState.emit({ payment: payment, state: nextState })\"\r\n >\r\n <ng-container *ngIf=\"nextState !== 'Cancelled'; else cancel\">\r\n <clr-icon shape=\"step-forward-2\"></clr-icon>\r\n {{\r\n 'order.transition-to-state'\r\n | translate: { state: (nextState | stateI18nToken | translate) }\r\n }}\r\n </ng-container>\r\n <ng-template #cancel>\r\n <clr-icon shape=\"error-standard\" class=\"is-error\"></clr-icon>\r\n {{ 'order.cancel-payment' | translate }}\r\n </ng-template>\r\n </button>\r\n </ng-container>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n</div>\r\n", styles: [".payment-header{display:flex;justify-content:space-between;align-items:center}.refund-icon{margin-right:6px;color:var(--color-grey-400)}.card-footer{display:flex;align-items:center;justify-content:flex-end}\n"], components: [{ type: i1.PaymentStateLabelComponent, selector: "vdr-payment-state-label", inputs: ["state"] }, { type: i2.PaymentDetailComponent, selector: "vdr-payment-detail", inputs: ["payment", "currencyCode"] }, { type: i3.RefundStateLabelComponent, selector: "vdr-refund-state-label", inputs: ["state"] }, { type: i4.LabeledDataComponent, selector: "vdr-labeled-data", inputs: ["label"] }, { type: i4.ObjectTreeComponent, selector: "vdr-object-tree", inputs: ["value", "isArrayItem"] }, { type: i4.DropdownComponent, selector: "vdr-dropdown", inputs: ["manualToggle"] }, { type: i4.DropdownMenuComponent, selector: "vdr-dropdown-menu", inputs: ["vdrPosition"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.ClrIconCustomTag, selector: "clr-icon" }, { type: i7.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { type: i4.DropdownTriggerDirective, selector: "[vdrDropdownTrigger]" }, { type: i4.DropdownItemDirective, selector: "[vdrDropdownItem]" }], pipes: { "translate": i8.TranslatePipe, "localeDate": i4.LocaleDatePipe, "localeCurrency": i4.LocaleCurrencyPipe, "stateI18nToken": i4.StateI18nTokenPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
28
+ OrderPaymentCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: OrderPaymentCardComponent, selector: "vdr-order-payment-card", inputs: { payment: "payment", currencyCode: "currencyCode" }, outputs: { settlePayment: "settlePayment", transitionPaymentState: "transitionPaymentState", settleRefund: "settleRefund" }, ngImport: i0, template: "<div class=\"card\">\r\n <div class=\"card-header payment-header\">\r\n <div>\r\n {{ 'order.payment' | translate }}\r\n <ng-container *ngIf=\"payment.transactionId\">#{{ payment.transactionId }}</ng-container>\r\n </div>\r\n <div class=\"payment-state\">\r\n <vdr-payment-state-label [state]=\"payment.state\"></vdr-payment-state-label>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-payment-detail [payment]=\"payment\" [currencyCode]=\"currencyCode\"></vdr-payment-detail>\r\n </div>\r\n <ng-container *ngFor=\"let refund of payment.refunds\">\r\n <div class=\"card-header payment-header\">\r\n <clr-icon shape=\"redo\" class=\"refund-icon\" dir=\"down\"></clr-icon>\r\n {{ 'order.refund' | translate }} #{{ refund.id }}\r\n <div class=\"clr-flex-fill\"></div>\r\n <vdr-refund-state-label [state]=\"refund.state\"></vdr-refund-state-label>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-labeled-data [label]=\"'common.created-at' | translate\">\r\n {{ refund.createdAt | localeDate: 'medium' }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-total' | translate\">\r\n {{ refund.total | localeCurrency: currencyCode }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.transaction-id' | translate\" *ngIf=\"refund.transactionId\">\r\n {{ refund.transactionId }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-reason' | translate\" *ngIf=\"refund.reason\">\r\n {{ refund.reason }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-metadata' | translate\" *ngIf=\"refundHasMetadata(refund)\">\r\n <vdr-object-tree [value]=\"refund.metadata\"></vdr-object-tree>\r\n </vdr-labeled-data>\r\n </div>\r\n <div class=\"card-footer\" *ngIf=\"refund.state === 'Pending'\">\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"settleRefund.emit(refund)\">\r\n {{ 'order.settle-refund' | translate }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer\" *ngIf=\"payment.nextStates.length\">\r\n <button\r\n class=\"btn btn-sm btn-primary\"\r\n *ngIf=\"payment.nextStates.includes('Settled')\"\r\n (click)=\"settlePayment.emit(payment)\"\r\n >\r\n {{ 'order.settle-payment' | translate }}\r\n </button>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <ng-container *ngFor=\"let nextState of nextOtherStates()\">\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n (click)=\"transitionPaymentState.emit({ payment: payment, state: nextState })\"\r\n >\r\n <ng-container *ngIf=\"nextState !== 'Cancelled'; else cancel\">\r\n <clr-icon shape=\"step-forward-2\"></clr-icon>\r\n {{\r\n 'order.transition-to-state'\r\n | translate: { state: (nextState | stateI18nToken | translate) }\r\n }}\r\n </ng-container>\r\n <ng-template #cancel>\r\n <clr-icon shape=\"error-standard\" class=\"is-error\"></clr-icon>\r\n {{ 'order.cancel-payment' | translate }}\r\n </ng-template>\r\n </button>\r\n </ng-container>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n</div>\r\n", styles: [".payment-header{display:flex;justify-content:space-between;align-items:center}.refund-icon{margin-right:6px;color:var(--color-grey-400)}.card-footer{display:flex;align-items:center;justify-content:flex-end}\n"], components: [{ type: i1.PaymentStateLabelComponent, selector: "vdr-payment-state-label", inputs: ["state"] }, { type: i2.PaymentDetailComponent, selector: "vdr-payment-detail", inputs: ["payment", "currencyCode"] }, { type: i3.RefundStateLabelComponent, selector: "vdr-refund-state-label", inputs: ["state"] }, { type: i4.LabeledDataComponent, selector: "vdr-labeled-data", inputs: ["label"] }, { type: i4.ObjectTreeComponent, selector: "vdr-object-tree", inputs: ["value", "isArrayItem"] }, { type: i4.DropdownComponent, selector: "vdr-dropdown", inputs: ["manualToggle"] }, { type: i4.DropdownMenuComponent, selector: "vdr-dropdown-menu", inputs: ["vdrPosition", "customClasses"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.ClrIconCustomTag, selector: "clr-icon" }, { type: i7.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { type: i4.DropdownTriggerDirective, selector: "[vdrDropdownTrigger]" }, { type: i4.DropdownItemDirective, selector: "[vdrDropdownItem]" }], pipes: { "translate": i8.TranslatePipe, "localeDate": i4.LocaleDatePipe, "localeCurrency": i4.LocaleCurrencyPipe, "stateI18nToken": i4.StateI18nTokenPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
29
29
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: OrderPaymentCardComponent, decorators: [{
30
30
  type: Component,
31
31
  args: [{ selector: 'vdr-order-payment-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"card\">\r\n <div class=\"card-header payment-header\">\r\n <div>\r\n {{ 'order.payment' | translate }}\r\n <ng-container *ngIf=\"payment.transactionId\">#{{ payment.transactionId }}</ng-container>\r\n </div>\r\n <div class=\"payment-state\">\r\n <vdr-payment-state-label [state]=\"payment.state\"></vdr-payment-state-label>\r\n </div>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-payment-detail [payment]=\"payment\" [currencyCode]=\"currencyCode\"></vdr-payment-detail>\r\n </div>\r\n <ng-container *ngFor=\"let refund of payment.refunds\">\r\n <div class=\"card-header payment-header\">\r\n <clr-icon shape=\"redo\" class=\"refund-icon\" dir=\"down\"></clr-icon>\r\n {{ 'order.refund' | translate }} #{{ refund.id }}\r\n <div class=\"clr-flex-fill\"></div>\r\n <vdr-refund-state-label [state]=\"refund.state\"></vdr-refund-state-label>\r\n </div>\r\n <div class=\"card-block\">\r\n <vdr-labeled-data [label]=\"'common.created-at' | translate\">\r\n {{ refund.createdAt | localeDate: 'medium' }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-total' | translate\">\r\n {{ refund.total | localeCurrency: currencyCode }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.transaction-id' | translate\" *ngIf=\"refund.transactionId\">\r\n {{ refund.transactionId }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-reason' | translate\" *ngIf=\"refund.reason\">\r\n {{ refund.reason }}\r\n </vdr-labeled-data>\r\n <vdr-labeled-data [label]=\"'order.refund-metadata' | translate\" *ngIf=\"refundHasMetadata(refund)\">\r\n <vdr-object-tree [value]=\"refund.metadata\"></vdr-object-tree>\r\n </vdr-labeled-data>\r\n </div>\r\n <div class=\"card-footer\" *ngIf=\"refund.state === 'Pending'\">\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"settleRefund.emit(refund)\">\r\n {{ 'order.settle-refund' | translate }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer\" *ngIf=\"payment.nextStates.length\">\r\n <button\r\n class=\"btn btn-sm btn-primary\"\r\n *ngIf=\"payment.nextStates.includes('Settled')\"\r\n (click)=\"settlePayment.emit(payment)\"\r\n >\r\n {{ 'order.settle-payment' | translate }}\r\n </button>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <ng-container *ngFor=\"let nextState of nextOtherStates()\">\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n vdrDropdownItem\r\n (click)=\"transitionPaymentState.emit({ payment: payment, state: nextState })\"\r\n >\r\n <ng-container *ngIf=\"nextState !== 'Cancelled'; else cancel\">\r\n <clr-icon shape=\"step-forward-2\"></clr-icon>\r\n {{\r\n 'order.transition-to-state'\r\n | translate: { state: (nextState | stateI18nToken | translate) }\r\n }}\r\n </ng-container>\r\n <ng-template #cancel>\r\n <clr-icon shape=\"error-standard\" class=\"is-error\"></clr-icon>\r\n {{ 'order.cancel-payment' | translate }}\r\n </ng-template>\r\n </button>\r\n </ng-container>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n</div>\r\n", styles: [".payment-header{display:flex;justify-content:space-between;align-items:center}.refund-icon{margin-right:6px;color:var(--color-grey-400)}.card-footer{display:flex;align-items:center;justify-content:flex-end}\n"] }]
@@ -40,4 +40,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
40
40
  }], settleRefund: [{
41
41
  type: Output
42
42
  }] } });
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcGF5bWVudC1jYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvb3JkZXIvc3JjL2NvbXBvbmVudHMvb3JkZXItcGF5bWVudC1jYXJkL29yZGVyLXBheW1lbnQtY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL29yZGVyL3NyYy9jb21wb25lbnRzL29yZGVyLXBheW1lbnQtY2FyZC9vcmRlci1wYXltZW50LWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVdoRyxNQUFNLE9BQU8seUJBQXlCO0lBTnRDO1FBU2Msa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQzVDLDJCQUFzQixHQUFHLElBQUksWUFBWSxFQUF1QyxDQUFDO1FBQ2pGLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQThCLENBQUM7S0FZM0U7SUFWRyxpQkFBaUIsQ0FBQyxNQUFtQztRQUNqRCxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2YsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7O3NIQWhCUSx5QkFBeUI7MEdBQXpCLHlCQUF5Qix5UENYdEMsa2tJQWdGQTsyRkRyRWEseUJBQXlCO2tCQU5yQyxTQUFTOytCQUNJLHdCQUF3QixtQkFHakIsdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDdXJyZW5jeUNvZGUsIE9yZGVyRGV0YWlsRnJhZ21lbnQgfSBmcm9tICdAdmVuZHVyZS9hZG1pbi11aS9jb3JlJztcclxuXHJcbnR5cGUgUGF5bWVudCA9IE5vbk51bGxhYmxlPE9yZGVyRGV0YWlsRnJhZ21lbnRbJ3BheW1lbnRzJ10+W251bWJlcl07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndmRyLW9yZGVyLXBheW1lbnQtY2FyZCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vb3JkZXItcGF5bWVudC1jYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL29yZGVyLXBheW1lbnQtY2FyZC5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBPcmRlclBheW1lbnRDYXJkQ29tcG9uZW50IHtcclxuICAgIEBJbnB1dCgpIHBheW1lbnQ6IFBheW1lbnQ7XHJcbiAgICBASW5wdXQoKSBjdXJyZW5jeUNvZGU6IEN1cnJlbmN5Q29kZTtcclxuICAgIEBPdXRwdXQoKSBzZXR0bGVQYXltZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxQYXltZW50PigpO1xyXG4gICAgQE91dHB1dCgpIHRyYW5zaXRpb25QYXltZW50U3RhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcGF5bWVudDogUGF5bWVudDsgc3RhdGU6IHN0cmluZyB9PigpO1xyXG4gICAgQE91dHB1dCgpIHNldHRsZVJlZnVuZCA9IG5ldyBFdmVudEVtaXR0ZXI8UGF5bWVudFsncmVmdW5kcyddW251bWJlcl0+KCk7XHJcblxyXG4gICAgcmVmdW5kSGFzTWV0YWRhdGEocmVmdW5kPzogUGF5bWVudFsncmVmdW5kcyddW251bWJlcl0pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISFyZWZ1bmQgJiYgT2JqZWN0LmtleXMocmVmdW5kLm1ldGFkYXRhKS5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIG5leHRPdGhlclN0YXRlcygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBheW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXltZW50Lm5leHRTdGF0ZXMuZmlsdGVyKHMgPT4gcyAhPT0gJ1NldHRsZWQnKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHBheW1lbnQtaGVhZGVyXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAge3sgJ29yZGVyLnBheW1lbnQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXltZW50LnRyYW5zYWN0aW9uSWRcIj4je3sgcGF5bWVudC50cmFuc2FjdGlvbklkIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBheW1lbnQtc3RhdGVcIj5cclxuICAgICAgICAgICAgPHZkci1wYXltZW50LXN0YXRlLWxhYmVsIFtzdGF0ZV09XCJwYXltZW50LnN0YXRlXCI+PC92ZHItcGF5bWVudC1zdGF0ZS1sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2tcIj5cclxuICAgICAgICA8dmRyLXBheW1lbnQtZGV0YWlsIFtwYXltZW50XT1cInBheW1lbnRcIiBbY3VycmVuY3lDb2RlXT1cImN1cnJlbmN5Q29kZVwiPjwvdmRyLXBheW1lbnQtZGV0YWlsPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByZWZ1bmQgb2YgcGF5bWVudC5yZWZ1bmRzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHBheW1lbnQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cInJlZG9cIiBjbGFzcz1cInJlZnVuZC1pY29uXCIgZGlyPVwiZG93blwiPjwvY2xyLWljb24+XHJcbiAgICAgICAgICAgIHt7ICdvcmRlci5yZWZ1bmQnIHwgdHJhbnNsYXRlIH19ICN7eyByZWZ1bmQuaWQgfX1cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1mbGV4LWZpbGxcIj48L2Rpdj5cclxuICAgICAgICAgICAgPHZkci1yZWZ1bmQtc3RhdGUtbGFiZWwgW3N0YXRlXT1cInJlZnVuZC5zdGF0ZVwiPjwvdmRyLXJlZnVuZC1zdGF0ZS1sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9ja1wiPlxyXG4gICAgICAgICAgICA8dmRyLWxhYmVsZWQtZGF0YSBbbGFiZWxdPVwiJ2NvbW1vbi5jcmVhdGVkLWF0JyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAge3sgcmVmdW5kLmNyZWF0ZWRBdCB8IGxvY2FsZURhdGU6ICdtZWRpdW0nIH19XHJcbiAgICAgICAgICAgIDwvdmRyLWxhYmVsZWQtZGF0YT5cclxuICAgICAgICAgICAgPHZkci1sYWJlbGVkLWRhdGEgW2xhYmVsXT1cIidvcmRlci5yZWZ1bmQtdG90YWwnIHwgdHJhbnNsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICB7eyByZWZ1bmQudG90YWwgfCBsb2NhbGVDdXJyZW5jeTogY3VycmVuY3lDb2RlIH19XHJcbiAgICAgICAgICAgIDwvdmRyLWxhYmVsZWQtZGF0YT5cclxuICAgICAgICAgICAgPHZkci1sYWJlbGVkLWRhdGEgW2xhYmVsXT1cIidvcmRlci50cmFuc2FjdGlvbi1pZCcgfCB0cmFuc2xhdGVcIiAqbmdJZj1cInJlZnVuZC50cmFuc2FjdGlvbklkXCI+XHJcbiAgICAgICAgICAgICAgICB7eyByZWZ1bmQudHJhbnNhY3Rpb25JZCB9fVxyXG4gICAgICAgICAgICA8L3Zkci1sYWJlbGVkLWRhdGE+XHJcbiAgICAgICAgICAgIDx2ZHItbGFiZWxlZC1kYXRhIFtsYWJlbF09XCInb3JkZXIucmVmdW5kLXJlYXNvbicgfCB0cmFuc2xhdGVcIiAqbmdJZj1cInJlZnVuZC5yZWFzb25cIj5cclxuICAgICAgICAgICAgICAgIHt7IHJlZnVuZC5yZWFzb24gfX1cclxuICAgICAgICAgICAgPC92ZHItbGFiZWxlZC1kYXRhPlxyXG4gICAgICAgICAgICA8dmRyLWxhYmVsZWQtZGF0YSBbbGFiZWxdPVwiJ29yZGVyLnJlZnVuZC1tZXRhZGF0YScgfCB0cmFuc2xhdGVcIiAqbmdJZj1cInJlZnVuZEhhc01ldGFkYXRhKHJlZnVuZClcIj5cclxuICAgICAgICAgICAgICAgIDx2ZHItb2JqZWN0LXRyZWUgW3ZhbHVlXT1cInJlZnVuZC5tZXRhZGF0YVwiPjwvdmRyLW9iamVjdC10cmVlPlxyXG4gICAgICAgICAgICA8L3Zkci1sYWJlbGVkLWRhdGE+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyXCIgKm5nSWY9XCJyZWZ1bmQuc3RhdGUgPT09ICdQZW5kaW5nJ1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzZXR0bGVSZWZ1bmQuZW1pdChyZWZ1bmQpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyAnb3JkZXIuc2V0dGxlLXJlZnVuZCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlclwiICpuZ0lmPVwicGF5bWVudC5uZXh0U3RhdGVzLmxlbmd0aFwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJwYXltZW50Lm5leHRTdGF0ZXMuaW5jbHVkZXMoJ1NldHRsZWQnKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXR0bGVQYXltZW50LmVtaXQocGF5bWVudClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAge3sgJ29yZGVyLnNldHRsZS1wYXltZW50JyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDx2ZHItZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ1dHRvblwiIHZkckRyb3Bkb3duVHJpZ2dlcj5cclxuICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImVsbGlwc2lzLXZlcnRpY2FsXCI+PC9jbHItaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDx2ZHItZHJvcGRvd24tbWVudSB2ZHJQb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbmV4dFN0YXRlIG9mIG5leHRPdGhlclN0YXRlcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZHJEcm9wZG93bkl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRyYW5zaXRpb25QYXltZW50U3RhdGUuZW1pdCh7IHBheW1lbnQ6IHBheW1lbnQsIHN0YXRlOiBuZXh0U3RhdGUgfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5leHRTdGF0ZSAhPT0gJ0NhbmNlbGxlZCc7IGVsc2UgY2FuY2VsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLWljb24gc2hhcGU9XCJzdGVwLWZvcndhcmQtMlwiPjwvY2xyLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmRlci50cmFuc2l0aW9uLXRvLXN0YXRlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBzdGF0ZTogKG5leHRTdGF0ZSB8IHN0YXRlSTE4blRva2VuIHwgdHJhbnNsYXRlKSB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjYW5jZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLWljb24gc2hhcGU9XCJlcnJvci1zdGFuZGFyZFwiIGNsYXNzPVwiaXMtZXJyb3JcIj48L2Nsci1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ29yZGVyLmNhbmNlbC1wYXltZW50JyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdmRyLWRyb3Bkb3duLW1lbnU+XHJcbiAgICAgICAgPC92ZHItZHJvcGRvd24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcGF5bWVudC1jYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvb3JkZXIvc3JjL2NvbXBvbmVudHMvb3JkZXItcGF5bWVudC1jYXJkL29yZGVyLXBheW1lbnQtY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL29yZGVyL3NyYy9jb21wb25lbnRzL29yZGVyLXBheW1lbnQtY2FyZC9vcmRlci1wYXltZW50LWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVdoRyxNQUFNLE9BQU8seUJBQXlCO0lBTnRDO1FBU2Msa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQzVDLDJCQUFzQixHQUFHLElBQUksWUFBWSxFQUF1QyxDQUFDO1FBQ2pGLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQThCLENBQUM7S0FZM0U7SUFWRyxpQkFBaUIsQ0FBQyxNQUFtQztRQUNqRCxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2YsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDakYsQ0FBQzs7c0hBaEJRLHlCQUF5QjswR0FBekIseUJBQXlCLHlQQ1h0Qyxra0lBZ0ZBOzJGRHJFYSx5QkFBeUI7a0JBTnJDLFNBQVM7K0JBQ0ksd0JBQXdCLG1CQUdqQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEN1cnJlbmN5Q29kZSwgT3JkZXJEZXRhaWxGcmFnbWVudCB9IGZyb20gJ0B2ZW5kdXJlL2FkbWluLXVpL2NvcmUnO1xyXG5cclxudHlwZSBQYXltZW50ID0gTm9uTnVsbGFibGU8T3JkZXJEZXRhaWxGcmFnbWVudFsncGF5bWVudHMnXT5bbnVtYmVyXTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd2ZHItb3JkZXItcGF5bWVudC1jYXJkJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9vcmRlci1wYXltZW50LWNhcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vb3JkZXItcGF5bWVudC1jYXJkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyUGF5bWVudENhcmRDb21wb25lbnQge1xyXG4gICAgQElucHV0KCkgcGF5bWVudDogUGF5bWVudDtcclxuICAgIEBJbnB1dCgpIGN1cnJlbmN5Q29kZTogQ3VycmVuY3lDb2RlO1xyXG4gICAgQE91dHB1dCgpIHNldHRsZVBheW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFBheW1lbnQ+KCk7XHJcbiAgICBAT3V0cHV0KCkgdHJhbnNpdGlvblBheW1lbnRTdGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYXltZW50OiBQYXltZW50OyBzdGF0ZTogc3RyaW5nIH0+KCk7XHJcbiAgICBAT3V0cHV0KCkgc2V0dGxlUmVmdW5kID0gbmV3IEV2ZW50RW1pdHRlcjxQYXltZW50WydyZWZ1bmRzJ11bbnVtYmVyXT4oKTtcclxuXHJcbiAgICByZWZ1bmRIYXNNZXRhZGF0YShyZWZ1bmQ/OiBQYXltZW50WydyZWZ1bmRzJ11bbnVtYmVyXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhIXJlZnVuZCAmJiBPYmplY3Qua2V5cyhyZWZ1bmQubWV0YWRhdGEpLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgbmV4dE90aGVyU3RhdGVzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICBpZiAoIXRoaXMucGF5bWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnBheW1lbnQubmV4dFN0YXRlcy5maWx0ZXIocyA9PiBzICE9PSAnU2V0dGxlZCcgJiYgcyAhPT0gJ0Vycm9yJyk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwYXltZW50LWhlYWRlclwiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIHt7ICdvcmRlci5wYXltZW50JyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGF5bWVudC50cmFuc2FjdGlvbklkXCI+I3t7IHBheW1lbnQudHJhbnNhY3Rpb25JZCB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXltZW50LXN0YXRlXCI+XHJcbiAgICAgICAgICAgIDx2ZHItcGF5bWVudC1zdGF0ZS1sYWJlbCBbc3RhdGVdPVwicGF5bWVudC5zdGF0ZVwiPjwvdmRyLXBheW1lbnQtc3RhdGUtbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrXCI+XHJcbiAgICAgICAgPHZkci1wYXltZW50LWRldGFpbCBbcGF5bWVudF09XCJwYXltZW50XCIgW2N1cnJlbmN5Q29kZV09XCJjdXJyZW5jeUNvZGVcIj48L3Zkci1wYXltZW50LWRldGFpbD5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVmdW5kIG9mIHBheW1lbnQucmVmdW5kc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwYXltZW50LWhlYWRlclwiPlxyXG4gICAgICAgICAgICA8Y2xyLWljb24gc2hhcGU9XCJyZWRvXCIgY2xhc3M9XCJyZWZ1bmQtaWNvblwiIGRpcj1cImRvd25cIj48L2Nsci1pY29uPlxyXG4gICAgICAgICAgICB7eyAnb3JkZXIucmVmdW5kJyB8IHRyYW5zbGF0ZSB9fSAje3sgcmVmdW5kLmlkIH19XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbHItZmxleC1maWxsXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDx2ZHItcmVmdW5kLXN0YXRlLWxhYmVsIFtzdGF0ZV09XCJyZWZ1bmQuc3RhdGVcIj48L3Zkci1yZWZ1bmQtc3RhdGUtbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2tcIj5cclxuICAgICAgICAgICAgPHZkci1sYWJlbGVkLWRhdGEgW2xhYmVsXT1cIidjb21tb24uY3JlYXRlZC1hdCcgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICAgICAgICAgIHt7IHJlZnVuZC5jcmVhdGVkQXQgfCBsb2NhbGVEYXRlOiAnbWVkaXVtJyB9fVxyXG4gICAgICAgICAgICA8L3Zkci1sYWJlbGVkLWRhdGE+XHJcbiAgICAgICAgICAgIDx2ZHItbGFiZWxlZC1kYXRhIFtsYWJlbF09XCInb3JkZXIucmVmdW5kLXRvdGFsJyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAge3sgcmVmdW5kLnRvdGFsIHwgbG9jYWxlQ3VycmVuY3k6IGN1cnJlbmN5Q29kZSB9fVxyXG4gICAgICAgICAgICA8L3Zkci1sYWJlbGVkLWRhdGE+XHJcbiAgICAgICAgICAgIDx2ZHItbGFiZWxlZC1kYXRhIFtsYWJlbF09XCInb3JkZXIudHJhbnNhY3Rpb24taWQnIHwgdHJhbnNsYXRlXCIgKm5nSWY9XCJyZWZ1bmQudHJhbnNhY3Rpb25JZFwiPlxyXG4gICAgICAgICAgICAgICAge3sgcmVmdW5kLnRyYW5zYWN0aW9uSWQgfX1cclxuICAgICAgICAgICAgPC92ZHItbGFiZWxlZC1kYXRhPlxyXG4gICAgICAgICAgICA8dmRyLWxhYmVsZWQtZGF0YSBbbGFiZWxdPVwiJ29yZGVyLnJlZnVuZC1yZWFzb24nIHwgdHJhbnNsYXRlXCIgKm5nSWY9XCJyZWZ1bmQucmVhc29uXCI+XHJcbiAgICAgICAgICAgICAgICB7eyByZWZ1bmQucmVhc29uIH19XHJcbiAgICAgICAgICAgIDwvdmRyLWxhYmVsZWQtZGF0YT5cclxuICAgICAgICAgICAgPHZkci1sYWJlbGVkLWRhdGEgW2xhYmVsXT1cIidvcmRlci5yZWZ1bmQtbWV0YWRhdGEnIHwgdHJhbnNsYXRlXCIgKm5nSWY9XCJyZWZ1bmRIYXNNZXRhZGF0YShyZWZ1bmQpXCI+XHJcbiAgICAgICAgICAgICAgICA8dmRyLW9iamVjdC10cmVlIFt2YWx1ZV09XCJyZWZ1bmQubWV0YWRhdGFcIj48L3Zkci1vYmplY3QtdHJlZT5cclxuICAgICAgICAgICAgPC92ZHItbGFiZWxlZC1kYXRhPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlclwiICpuZ0lmPVwicmVmdW5kLnN0YXRlID09PSAnUGVuZGluZydcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwic2V0dGxlUmVmdW5kLmVtaXQocmVmdW5kKVwiPlxyXG4gICAgICAgICAgICAgICAge3sgJ29yZGVyLnNldHRsZS1yZWZ1bmQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXJcIiAqbmdJZj1cInBheW1lbnQubmV4dFN0YXRlcy5sZW5ndGhcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwicGF5bWVudC5uZXh0U3RhdGVzLmluY2x1ZGVzKCdTZXR0bGVkJylcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0dGxlUGF5bWVudC5lbWl0KHBheW1lbnQpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7ICdvcmRlci5zZXR0bGUtcGF5bWVudCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8dmRyLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idXR0b25cIiB2ZHJEcm9wZG93blRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICA8Y2xyLWljb24gc2hhcGU9XCJlbGxpcHNpcy12ZXJ0aWNhbFwiPjwvY2xyLWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8dmRyLWRyb3Bkb3duLW1lbnUgdmRyUG9zaXRpb249XCJib3R0b20tcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG5leHRTdGF0ZSBvZiBuZXh0T3RoZXJTdGF0ZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmRyRHJvcGRvd25JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0cmFuc2l0aW9uUGF5bWVudFN0YXRlLmVtaXQoeyBwYXltZW50OiBwYXltZW50LCBzdGF0ZTogbmV4dFN0YXRlIH0pXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuZXh0U3RhdGUgIT09ICdDYW5jZWxsZWQnOyBlbHNlIGNhbmNlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwic3RlcC1mb3J3YXJkLTJcIj48L2Nsci1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkZXIudHJhbnNpdGlvbi10by1zdGF0ZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgc3RhdGU6IChuZXh0U3RhdGUgfCBzdGF0ZUkxOG5Ub2tlbiB8IHRyYW5zbGF0ZSkgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2FuY2VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwiZXJyb3Itc3RhbmRhcmRcIiBjbGFzcz1cImlzLWVycm9yXCI+PC9jbHItaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdvcmRlci5jYW5jZWwtcGF5bWVudCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3Zkci1kcm9wZG93bi1tZW51PlxyXG4gICAgICAgIDwvdmRyLWRyb3Bkb3duPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=