@microsoft/windows-admin-center-sdk 4.123.0 → 4.232.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular/assets/strings/cs-CZ/strings.json +1 -1
- package/angular/assets/strings/de-DE/strings.json +1 -1
- package/angular/assets/strings/es-ES/strings.json +1 -1
- package/angular/assets/strings/fr-FR/strings.json +1 -1
- package/angular/assets/strings/hu-HU/strings.json +1 -1
- package/angular/assets/strings/id-ID/strings.json +1 -1
- package/angular/assets/strings/it-IT/strings.json +1 -1
- package/angular/assets/strings/ja-JP/strings.json +1 -1
- package/angular/assets/strings/ko-KR/strings.json +1 -1
- package/angular/assets/strings/nl-NL/strings.json +1 -1
- package/angular/assets/strings/pl-PL/strings.json +1 -1
- package/angular/assets/strings/pt-BR/strings.json +1 -1
- package/angular/assets/strings/pt-PT/strings.json +1 -1
- package/angular/assets/strings/ru-RU/strings.json +1 -1
- package/angular/assets/strings/strings.json +1 -1
- package/angular/assets/strings/sv-SE/strings.json +1 -1
- package/angular/assets/strings/tr-TR/strings.json +1 -1
- package/angular/assets/strings/zh-CN/strings.json +1 -1
- package/angular/assets/strings/zh-TW/strings.json +1 -1
- package/angular/esm2020/src/controls/accordion/accordion-panel/accordion-panel.component.mjs +36 -12
- package/angular/esm2020/src/controls/actions/containers/action-container.component.mjs +2 -3
- package/angular/esm2020/src/controls/alert-bar/alert-bar.component.mjs +2 -2
- package/angular/esm2020/src/controls/breadcrumb-header/breadcrumb-header.component.mjs +1 -1
- package/angular/esm2020/src/controls/common/base.component.mjs +1 -1
- package/angular/esm2020/src/controls/common/spacer-base.component.mjs +25 -1
- package/angular/esm2020/src/controls/context-menu/context-menu.component.mjs +2 -3
- package/angular/esm2020/src/controls/data-table/data-table.component.mjs +7 -7
- package/angular/esm2020/src/controls/dialog/base-dialog.component.mjs +2 -4
- package/angular/esm2020/src/controls/dialog/confirmation-list-dialog/confirmation-list-dialog.component.mjs +2 -2
- package/angular/esm2020/src/controls/dropdown/dropdown.component.mjs +1 -4
- package/angular/esm2020/src/controls/form/form-field/array/array-form-field-accessibility-manager.service.mjs +59 -0
- package/angular/esm2020/src/controls/form/form-field/array/array-form-field.component.mjs +24 -35
- package/angular/esm2020/src/controls/form/form-field/clock/clock-form-field.component.mjs +10 -7
- package/angular/esm2020/src/controls/form/form-field/form-field-accessibility-manager-base.service.mjs +105 -0
- package/angular/esm2020/src/controls/form/form-field/form-field.component.mjs +1 -1
- package/angular/esm2020/src/controls/form/form-field/list/list-form-field-accessibility-manager.service.mjs +38 -0
- package/angular/esm2020/src/controls/form/form-field/list/list-form-field.component.mjs +56 -38
- package/angular/esm2020/src/controls/form/form-field/number/number-form-field.component.mjs +22 -4
- package/angular/esm2020/src/controls/form/form-field/ordered-list/ordered-list-form-field-accessibility-manager.service.mjs +54 -0
- package/angular/esm2020/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.mjs +67 -67
- package/angular/esm2020/src/controls/form/form-field/radio-group/classic/radio-group-form-field.component.mjs +5 -5
- package/angular/esm2020/src/controls/form/forms.module.mjs +19 -2
- package/angular/esm2020/src/controls/icon/icon-text/icon-text.component.mjs +6 -6
- package/angular/esm2020/src/controls/icon/layered-icon/status/status-icon.component.mjs +1 -1
- package/angular/esm2020/src/controls/layout/editable-layout.component.mjs +2 -3
- package/angular/esm2020/src/controls/node-credentials-form/node-credentials-form.component.mjs +2 -2
- package/angular/esm2020/src/controls/page-alert-bar/page-alert-bar.component.mjs +4 -4
- package/angular/esm2020/src/controls/property-grid/property-grid.component.mjs +33 -13
- package/angular/esm2020/src/controls/schema/tabbed-form-loader.component.mjs +2 -2
- package/angular/esm2020/src/controls/settings/common-settings/common-settings.component.mjs +5 -5
- package/angular/esm2020/src/controls/settings/settings-form.directive.mjs +3 -7
- package/angular/esm2020/src/controls/settings/settings-form.service.mjs +2 -4
- package/angular/esm2020/src/controls/snap-in-extension/snap-in-extension.component.mjs +1 -1
- package/angular/esm2020/src/controls/split-view/split-view.component.mjs +2 -2
- package/angular/esm2020/src/controls/wizard/models/wizard-step-snap-in-output.mjs +1 -1
- package/angular/esm2020/src/controls/wizard-lite/wizard-navigation-button/wizard-navigation-button.component.mjs +3 -3
- package/angular/esm2020/src/data/extension-broker/snap-in-listener.mjs +80 -0
- package/angular/esm2020/src/data/index.mjs +2 -1
- package/angular/esm2020/src/directives/router/router-link.directive.mjs +2 -2
- package/angular/esm2020/src/directives/svg/svg.directive.mjs +2 -3
- package/angular/esm2020/src/generated/strings.mjs +1 -1
- package/angular/esm2020/src/service/navigation.service.mjs +3 -8
- package/angular/esm2020/src/service/user-alive.service.mjs +2 -4
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.mjs +665 -239
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.mjs.map +1 -1
- package/angular/fesm2020/microsoft-windows-admin-center-sdk-angular.mjs +636 -237
- package/angular/fesm2020/microsoft-windows-admin-center-sdk-angular.mjs.map +1 -1
- package/angular/package.json +1 -1
- package/angular/src/controls/accordion/accordion-panel/accordion-panel.component.d.ts +13 -4
- package/angular/src/controls/common/spacer-base.component.d.ts +11 -2
- package/angular/src/controls/form/form-field/array/array-form-field-accessibility-manager.service.d.ts +38 -0
- package/angular/src/controls/form/form-field/array/array-form-field.component.d.ts +3 -1
- package/angular/src/controls/form/form-field/form-field-accessibility-manager-base.service.d.ts +37 -0
- package/angular/src/controls/form/form-field/list/list-form-field-accessibility-manager.service.d.ts +25 -0
- package/angular/src/controls/form/form-field/list/list-form-field.component.d.ts +12 -2
- package/angular/src/controls/form/form-field/number/number-form-field.component.d.ts +8 -0
- package/angular/src/controls/form/form-field/ordered-list/ordered-list-form-field-accessibility-manager.service.d.ts +37 -0
- package/angular/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.d.ts +12 -8
- package/angular/src/controls/icon/icon-text/icon-text.component.d.ts +1 -1
- package/angular/src/controls/property-grid/property-grid.component.d.ts +2 -0
- package/angular/src/controls/wizard/models/wizard-step-snap-in-output.d.ts +1 -1
- package/{core → angular/src}/data/extension-broker/snap-in-listener.d.ts +49 -46
- package/angular/src/data/index.d.ts +1 -0
- package/angular/src/directives/svg/svg.directive.d.ts +1 -2
- package/angular/src/generated/strings.d.ts +12 -0
- package/core/async/cancellation.js +312 -0
- package/core/async/index.js +312 -0
- package/core/async/progress.js +312 -0
- package/core/azure/azure-constants.d.ts +2 -2
- package/core/azure/azure-constants.d.ts.map +1 -1
- package/core/azure/azure-constants.js +322 -3
- package/core/azure/azure-constants.js.map +1 -1
- package/core/azure/azure-logging.js +312 -0
- package/core/azure/azure-manager.js +312 -0
- package/core/azure/models/aadAppConfig-data.js +312 -0
- package/core/azure/models/azureArcStatusEnum.js +312 -0
- package/core/azure/models/azureTokenResult-data.js +312 -0
- package/core/azure/resources/deployment-operation-request-body.js +312 -0
- package/core/azure/resources/deployment-operation-response.js +312 -0
- package/core/azure/resources/location-data.js +315 -0
- package/core/azure/resources/resource-group-data.js +312 -0
- package/core/azure/resources/subscription-data.js +312 -0
- package/core/base/data-store/browser-storage-data-store.js +315 -0
- package/core/base/data-store/cached-data-store.js +312 -0
- package/core/base/data-store/data-store.js +312 -0
- package/core/base/data-store/local-data-store.js +312 -0
- package/core/base/data-store/memory-data-store.js +312 -0
- package/core/base/data-store/session-data-store.js +312 -0
- package/core/base/date/date-like.js +312 -0
- package/core/base/date/date-range.js +312 -0
- package/core/base/date/date-time.js +312 -0
- package/core/base/date/date-type.js +312 -0
- package/core/base/date/time-unit.js +312 -0
- package/core/base/decorators/base.js +312 -0
- package/core/base/decorators/debounce.decorators.js +312 -0
- package/core/base/decorators/delay.decorator.js +315 -0
- package/core/base/decorators/yield.decorator.js +312 -0
- package/core/base/environment.js +312 -0
- package/core/base/json.js +312 -0
- package/core/base/msft-sme.mock.js +316 -0
- package/core/base/polyfills/array.js +315 -0
- package/core/base/polyfills/string.js +312 -0
- package/core/base/rxjs-lifetime-manager.js +312 -0
- package/core/base/utilities.js +312 -0
- package/core/base/versioned-object.js +312 -0
- package/core/data/accessibility-manager.js +312 -0
- package/core/data/active-directory/active-directory.js +312 -0
- package/core/data/active-directory/models/account-info.js +312 -0
- package/core/data/active-directory/models/active-directory-search-options.js +312 -0
- package/core/data/active-directory/models/search-type.js +312 -0
- package/core/data/animation.js +312 -0
- package/core/data/app-context.js +312 -0
- package/core/data/asset-manager.js +315 -0
- package/core/data/base64-array-buffer.js +312 -0
- package/core/data/batch-connection.js +312 -0
- package/core/data/cim-connection.js +312 -0
- package/core/data/cim-stream.js +312 -0
- package/core/data/cim.js +312 -0
- package/core/data/column-picker.js +312 -0
- package/core/data/cookie.js +312 -0
- package/core/data/core-environment.js +315 -0
- package/core/data/crypto.js +312 -0
- package/core/data/deployment-share.js +312 -0
- package/core/data/disposable.js +312 -0
- package/core/data/electron.js +315 -0
- package/core/data/error-extended.js +312 -0
- package/core/data/extension-broker/dialog-listener.js +312 -0
- package/core/data/extension-broker/extension-broker.js +312 -0
- package/core/data/extension-broker/extension-listener.js +312 -0
- package/core/data/extension-broker/model/extension-broker-request-payload.js +312 -0
- package/core/data/extension-broker/model/extension-broker-response-error.js +312 -0
- package/core/data/extension-broker/model/extension-broker-response-payload.js +312 -0
- package/core/data/extension-broker/model/extension-entries.js +315 -0
- package/core/data/extension-broker/model/extension-instance.js +315 -0
- package/core/data/extension-broker/model/extension-rect.js +312 -0
- package/core/data/extension-broker/model/extension-search-options.js +312 -0
- package/core/data/extension-broker/service-listener.js +312 -0
- package/core/data/extension-broker/worker-listener.js +312 -0
- package/core/data/extension-broker/worker-set.js +312 -0
- package/core/data/file-transfer.js +312 -0
- package/core/data/gateway-connection.js +312 -0
- package/core/data/gateway-status.js +312 -0
- package/core/data/gateway-url-builder.js +312 -0
- package/core/data/gateway-url-translator.d.ts +1 -0
- package/core/data/gateway-url-translator.d.ts.map +1 -1
- package/core/data/gateway-url-translator.js +337 -6
- package/core/data/gateway-url-translator.js.map +1 -1
- package/core/data/gateway-urls.js +312 -0
- package/core/data/globalization.js +315 -0
- package/core/data/http-constants.js +315 -0
- package/core/data/http.js +312 -0
- package/core/data/jobs/jobs-manager.js +312 -0
- package/core/data/jobs/models/job-credentials.js +312 -0
- package/core/data/jobs/models/job-node.js +312 -0
- package/core/data/jobs/models/job-paginated-response.js +315 -0
- package/core/data/jobs/models/job-pagination-options.js +315 -0
- package/core/data/jobs/models/job.js +312 -0
- package/core/data/jobs/models/node-job.js +312 -0
- package/core/data/jobs/models/powershell-job.js +312 -0
- package/core/data/language.js +315 -0
- package/core/data/lifetime-data.js +312 -0
- package/core/data/localization-manager.js +312 -0
- package/core/data/native-q.js +312 -0
- package/core/data/net.d.ts.map +1 -1
- package/core/data/net.js +313 -1
- package/core/data/net.js.map +1 -1
- package/core/data/node-connection.d.ts.map +1 -1
- package/core/data/node-connection.js +312 -2
- package/core/data/node-connection.js.map +1 -1
- package/core/data/node-extension-install.js +312 -0
- package/core/data/powershell-alternate.js +312 -0
- package/core/data/powershell-batch.js +312 -0
- package/core/data/powershell-connection.js +312 -0
- package/core/data/powershell-crypto.js +312 -0
- package/core/data/powershell-stream.js +312 -0
- package/core/data/powershell.js +312 -0
- package/core/data/query-cache.js +312 -0
- package/core/data/resource-cache.js +312 -0
- package/core/data/schedule-reboot.js +312 -0
- package/core/data/settings-manager.js +312 -0
- package/core/data/settings-manger.mock.js +312 -0
- package/core/data/sme-extension.js +312 -0
- package/core/data/ssh-stream.js +312 -0
- package/core/data/units.js +312 -0
- package/core/data/uri-builder.js +315 -0
- package/core/data/wdac-operations.js +312 -0
- package/core/data/websocket-stream.js +312 -0
- package/core/diagnostics/error-monitor.js +312 -0
- package/core/diagnostics/log-level.js +312 -0
- package/core/diagnostics/log-record.js +312 -0
- package/core/diagnostics/logging-constants.js +312 -0
- package/core/diagnostics/logging.js +312 -0
- package/core/diagnostics/logging.mock.js +312 -0
- package/core/diagnostics/sme-web-telemetry-models.js +312 -0
- package/core/diagnostics/sme-web-telemetry.d.ts +1 -2
- package/core/diagnostics/sme-web-telemetry.d.ts.map +1 -1
- package/core/diagnostics/sme-web-telemetry.js +336 -15
- package/core/diagnostics/sme-web-telemetry.js.map +1 -1
- package/core/diagnostics/telemetry-control-type.js +312 -0
- package/core/diagnostics/telemetry-options.js +312 -0
- package/core/diagnostics/telemetry-record.js +312 -0
- package/core/dom/dom.js +312 -0
- package/core/frame/frame-connection.js +312 -0
- package/core/frame/frame-connection.mock.js +312 -0
- package/core/frame/shell-navigation-connection.js +312 -0
- package/core/generated/powershell-scripts.d.ts.map +1 -1
- package/core/generated/powershell-scripts.js +313 -1
- package/core/generated/powershell-scripts.js.map +1 -1
- package/core/generated/strings.js +312 -0
- package/core/host/host-core-manager.js +312 -0
- package/core/host/host-core-message-type.js +312 -0
- package/core/host/host-core-messages.js +312 -0
- package/core/index.d.ts +0 -1
- package/core/index.d.ts.map +1 -1
- package/core/index.js +312 -1
- package/core/index.js.map +1 -1
- package/core/manifest/environment-modules.js +312 -0
- package/core/manifest/manifest-loader.js +312 -0
- package/core/notification/client-notification-instance.js +312 -0
- package/core/notification/client-notification.js +312 -0
- package/core/notification/notification-connection.js +312 -0
- package/core/notification/notification-link-type.js +312 -0
- package/core/notification/notification-manager.js +312 -0
- package/core/notification/notification-message.js +312 -0
- package/core/notification/notification-state.js +312 -0
- package/core/notification/notification.js +312 -0
- package/core/notification/powershell-notification.js +312 -0
- package/core/notification/socket-signalr.js +312 -0
- package/core/notification/work-item-connection.js +312 -0
- package/core/notification/work-item-manager.js +312 -0
- package/core/notification/work-item-request.js +312 -0
- package/core/performance/performance-profile-data-type.js +312 -0
- package/core/performance/performance-profile-data.js +312 -0
- package/core/performance/performance-profile-database.js +312 -0
- package/core/performance/performance-profile-record.js +312 -0
- package/core/performance/performance-profile.d.ts.map +1 -1
- package/core/performance/performance-profile.js +321 -9
- package/core/performance/performance-profile.js.map +1 -1
- package/core/performance/performance-tracker.js +312 -0
- package/core/polyfills.js +312 -0
- package/core/resources/scripts/public/crypto/Get-DecryptedDataFromNode.ps1 +216 -0
- package/core/resources/scripts/public/crypto/Get-EncryptionJWKOnNode.ps1 +216 -0
- package/core/resources/scripts/public/inventory/Get-CimWin32LogicalDisk.ps1 +218 -0
- package/core/resources/scripts/public/inventory/Get-CimWin32NetworkAdapter.ps1 +216 -0
- package/core/resources/scripts/public/inventory/Get-CimWin32PhysicalMemory.ps1 +216 -0
- package/core/resources/scripts/public/inventory/Get-CimWin32Processor.ps1 +216 -0
- package/core/resources/scripts/public/inventory/Get-ClusterInventory.ps1 +216 -0
- package/core/resources/scripts/public/inventory/Get-ClusterNodes.ps1 +216 -0
- package/core/resources/scripts/public/inventory/Get-ServerInventory.ps1 +246 -8
- package/core/rpc/alive/rpc-alive-client.js +312 -0
- package/core/rpc/alive/rpc-alive-handler.js +312 -0
- package/core/rpc/alive/rpc-alive-model.js +315 -0
- package/core/rpc/alive/rpc-alive-subject-server.js +312 -0
- package/core/rpc/alive/rpc-observable-alive-client.js +312 -0
- package/core/rpc/alive/rpc-observable-alive-model.js +312 -0
- package/core/rpc/alive/rpc-observable-alive-server.js +312 -0
- package/core/rpc/azure/rpc-azure-model.js +312 -0
- package/core/rpc/azure/rpc-azure-request-client.js +312 -0
- package/core/rpc/azure/rpc-azure-request-handler.js +312 -0
- package/core/rpc/azure/rpc-azure-request-subject-server.js +312 -0
- package/core/rpc/azure/rpc-azure-response-client.js +312 -0
- package/core/rpc/azure/rpc-azure-response-handler.js +315 -0
- package/core/rpc/credssp/rpc-credssp-model.js +312 -0
- package/core/rpc/credssp/rpc-credssp-request-client.js +312 -0
- package/core/rpc/credssp/rpc-credssp-request-handler.js +315 -0
- package/core/rpc/credssp/rpc-credssp-request-subject-server.js +312 -0
- package/core/rpc/credssp/rpc-credssp-response-client.js +312 -0
- package/core/rpc/credssp/rpc-credssp-response-handler.js +315 -0
- package/core/rpc/dialog/rpc-dialog-client.js +312 -0
- package/core/rpc/dialog/rpc-dialog-handler.js +312 -0
- package/core/rpc/dialog/rpc-dialog-model.js +312 -0
- package/core/rpc/dialog/rpc-dialog-subject-server.js +315 -0
- package/core/rpc/electron/rpc-electron-model.js +312 -0
- package/core/rpc/electron/rpc-electron-request-client.js +312 -0
- package/core/rpc/electron/rpc-electron-request-handler.js +312 -0
- package/core/rpc/electron/rpc-electron-request-subject-server.js +312 -0
- package/core/rpc/electron/rpc-electron-response-client.js +312 -0
- package/core/rpc/electron/rpc-electron-response-handler.js +312 -0
- package/core/rpc/elevate/rpc-observable-elevate-client.js +312 -0
- package/core/rpc/elevate/rpc-observable-elevate-model.js +312 -0
- package/core/rpc/elevate/rpc-observable-elevate-server.js +312 -0
- package/core/rpc/error-monitor/rpc-observable-error-monitor-client.js +312 -0
- package/core/rpc/error-monitor/rpc-observable-error-monitor-model.js +315 -0
- package/core/rpc/error-monitor/rpc-observable-error-monitor-server.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-model.js +315 -0
- package/core/rpc/extension-broker/rpc-extension-broker-module-request-subject-server.js +315 -0
- package/core/rpc/extension-broker/rpc-extension-broker-request-client.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-request-handler.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-request-subject-server.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-response-client.js +312 -0
- package/core/rpc/extension-broker/rpc-extension-broker-response-handler.js +312 -0
- package/core/rpc/extension-data/rpc-observable-extension-data-client.js +312 -0
- package/core/rpc/extension-data/rpc-observable-extension-data-model.js +312 -0
- package/core/rpc/extension-data/rpc-observable-extension-data-server.js +312 -0
- package/core/rpc/forward/rpc-forward-auto-client.js +312 -0
- package/core/rpc/forward/rpc-forward-down-client.js +315 -0
- package/core/rpc/forward/rpc-forward-down-handler.js +312 -0
- package/core/rpc/forward/rpc-forward-model.js +312 -0
- package/core/rpc/forward/rpc-forward-up-client.js +312 -0
- package/core/rpc/forward/rpc-forward-up-handler.js +312 -0
- package/core/rpc/forward/rpc-forward-up-subject-server.js +312 -0
- package/core/rpc/log/rpc-log-client.js +312 -0
- package/core/rpc/log/rpc-log-handler.js +312 -0
- package/core/rpc/log/rpc-log-model.js +312 -0
- package/core/rpc/log/rpc-log-subject-server.js +312 -0
- package/core/rpc/notification/rpc-notification-client.js +312 -0
- package/core/rpc/notification/rpc-notification-handler.js +312 -0
- package/core/rpc/notification/rpc-notification-model.js +312 -0
- package/core/rpc/notification/rpc-notification-subject-server.js +312 -0
- package/core/rpc/overlay/rpc-overlay-close-client.js +312 -0
- package/core/rpc/overlay/rpc-overlay-close-handler.js +312 -0
- package/core/rpc/overlay/rpc-overlay-model.js +312 -0
- package/core/rpc/overlay/rpc-overlay-open-client.js +315 -0
- package/core/rpc/overlay/rpc-overlay-open-handler.js +312 -0
- package/core/rpc/overlay/rpc-overlay-open-subject-server.js +312 -0
- package/core/rpc/performance/rpc-observable-performance-client.js +312 -0
- package/core/rpc/performance/rpc-observable-performance-config-client.js +312 -0
- package/core/rpc/performance/rpc-observable-performance-config-server.js +312 -0
- package/core/rpc/performance/rpc-observable-performance-model.js +312 -0
- package/core/rpc/performance/rpc-observable-performance-server.js +312 -0
- package/core/rpc/report/rpc-report-client.js +312 -0
- package/core/rpc/report/rpc-report-handler.js +312 -0
- package/core/rpc/report/rpc-report-model.js +312 -0
- package/core/rpc/report/rpc-report-subject-server.js +315 -0
- package/core/rpc/rpc-base.js +312 -0
- package/core/rpc/rpc-channel.js +312 -0
- package/core/rpc/rpc-forwarder.js +312 -0
- package/core/rpc/rpc-inbound-client.js +312 -0
- package/core/rpc/rpc-inbound.js +312 -0
- package/core/rpc/rpc-manager.js +312 -0
- package/core/rpc/rpc-module-subject-server.js +315 -0
- package/core/rpc/rpc-observable-client.js +312 -0
- package/core/rpc/rpc-observable-request.js +312 -0
- package/core/rpc/rpc-observable-result.js +312 -0
- package/core/rpc/rpc-observable-server.js +312 -0
- package/core/rpc/rpc-outbound-client.js +312 -0
- package/core/rpc/rpc-outbound.js +312 -0
- package/core/rpc/rpc-subject-server.js +312 -0
- package/core/rpc/rpc.js +312 -0
- package/core/rpc/seek/rpc-seek-client.js +312 -0
- package/core/rpc/seek/rpc-seek-handler.js +315 -0
- package/core/rpc/seek/rpc-seek-model.js +312 -0
- package/core/rpc/settings/rpc-settings-client.js +315 -0
- package/core/rpc/settings/rpc-settings-handler.js +312 -0
- package/core/rpc/settings/rpc-settings-model.js +312 -0
- package/core/rpc/settings/rpc-settings-subject-server.js +312 -0
- package/core/rpc/shell-navigate/rpc-shell-navigate-client.js +312 -0
- package/core/rpc/shell-navigate/rpc-shell-navigate-handler.js +312 -0
- package/core/rpc/shell-navigate/rpc-shell-navigate-model.js +312 -0
- package/core/rpc/shell-navigate/rpc-shell-navigate-subject-server.js +312 -0
- package/core/rpc/sme-extension/rpc-sme-extension-model.js +315 -0
- package/core/rpc/sme-extension/rpc-sme-extension-request-client.js +312 -0
- package/core/rpc/sme-extension/rpc-sme-extension-request-handler.js +312 -0
- package/core/rpc/sme-extension/rpc-sme-extension-request-subject-server.js +312 -0
- package/core/rpc/sme-extension/rpc-sme-extension-response-client.js +312 -0
- package/core/rpc/sme-extension/rpc-sme-extension-response-handler.js +312 -0
- package/core/rpc/telemetry/rpc-telemetry-client.js +312 -0
- package/core/rpc/telemetry/rpc-telemetry-handler.js +315 -0
- package/core/rpc/telemetry/rpc-telemetry-model.js +312 -0
- package/core/rpc/telemetry/rpc-telemetry-subject-server.js +312 -0
- package/core/rpc/update-data/rpc-update-data-client.js +312 -0
- package/core/rpc/update-data/rpc-update-data-handler.js +312 -0
- package/core/rpc/update-data/rpc-update-data-model.js +312 -0
- package/core/rpc/update-data/rpc-update-data-subject-server.js +312 -0
- package/core/rpc/update-theme/rpc-observable-update-theme-client.js +312 -0
- package/core/rpc/update-theme/rpc-observable-update-theme-model.js +312 -0
- package/core/rpc/update-theme/rpc-observable-update-theme-server.js +312 -0
- package/core/rpc/work-item/rpc-work-item-client.js +312 -0
- package/core/rpc/work-item/rpc-work-item-handler.js +312 -0
- package/core/rpc/work-item/rpc-work-item-model.js +312 -0
- package/core/rpc/work-item/rpc-work-item-subject-server.js +312 -0
- package/core/rpc/work-item-find/rpc-work-item-find-client.js +312 -0
- package/core/rpc/work-item-find/rpc-work-item-find-handler.js +312 -0
- package/core/rpc/work-item-find/rpc-work-item-find-model.js +312 -0
- package/core/rpc/work-item-find/rpc-work-item-find-subject-server.js +312 -0
- package/core/security/active-connection.js +312 -0
- package/core/security/authorization-manager.js +312 -0
- package/core/security/connection-manager-settings/common-connection-settings.js +315 -0
- package/core/security/connection-manager-settings/connection-settings.js +312 -0
- package/core/security/connection-manager.js +312 -0
- package/core/security/connection-stream.js +312 -0
- package/core/security/connection.js +312 -0
- package/core/security/credssp-manager.js +312 -0
- package/core/security/sign-on-manager.js +312 -0
- package/core/security/tag-manager.js +312 -0
- package/core/security/tool-condition-validator.js +312 -0
- package/core/security/tool-connection-query.js +312 -0
- package/core/security/user-principal.js +312 -0
- package/core/shared/cluster-inventory/cluster-inventory-cache.js +312 -0
- package/core/shared/cluster-inventory/cluster-inventory.js +312 -0
- package/core/shared/cluster-inventory/cluster-node-inventory.js +312 -0
- package/core/shared/gateway-inventory/gateway-inventory-cache.js +312 -0
- package/core/shared/gateway-inventory/gateway-inventory-detail-cache.js +312 -0
- package/core/shared/gateway-inventory/gateway-inventory-detail.js +312 -0
- package/core/shared/gateway-inventory/gateway-inventory.js +312 -0
- package/core/shared/inventory-query-caches.js +312 -0
- package/core/shared/server-inventory/server-inventory-cache.js +312 -0
- package/core/shared/server-inventory/server-inventory-detail-cache.js +312 -0
- package/core/shared/server-inventory/server-inventory-detail.js +315 -0
- package/core/shared/server-inventory/server-inventory.js +312 -0
- package/core/shared/shared-cache.js +312 -0
- package/core/shared/tool-inventory/tool-inventory-cache.js +312 -0
- package/core/shared/tool-inventory/tool-inventory.js +312 -0
- package/core/special.js +315 -0
- package/core/test-utilities/accessibility-tester.js +312 -0
- package/core/test-utilities/console.mock.js +312 -0
- package/core/test-utilities/jasmine-axe-matcher.js +312 -0
- package/core/test-utilities/wait-async.js +312 -0
- package/core/test.js +312 -0
- package/core/testing.js +312 -0
- package/core/workflow/persistent-local-storage.js +312 -0
- package/core/workflow/persistent-work-item-apply-state.js +316 -0
- package/core/workflow/persistent-work-item-state.js +312 -0
- package/core/workflow/persistent-work-item.js +315 -0
- package/core/workflow/persistent-workflow-builder.js +312 -0
- package/core/workflow/persistent-workflow-context.js +312 -0
- package/core/workflow/persistent-workflow-runner.js +312 -0
- package/core/workflow/persistent-workflow-snapshot.js +312 -0
- package/core/workflow/persistent-workflow-store.js +312 -0
- package/core/workflow/persistent-workflow.js +312 -0
- package/package.json +11 -9
- package/styles/css/main-v2.css +1 -1
- package/styles/fonts/SegoeUI/Bold/SegoeUIBold-5.27.woff +0 -0
- package/styles/fonts/SegoeUI/Light/SegoeUILight-5.27.woff +0 -0
- package/styles/fonts/SegoeUI/Normal/SegoeUI-5.27.woff +0 -0
- package/styles/fonts/SegoeUI/SemiBold/SegoeUISemiBold-5.27.woff +0 -0
- package/styles/fonts/SegoeUI/SemiLight/SegoeUISemiLight-5.27.woff +0 -0
- package/styles/fonts/ServMDL2/ServMDL2-4.66.woff +0 -0
- package/tools/build/webpack/index-html.transform.js +312 -0
- package/tools/build/webpack/shell.index-html.transform.js +312 -0
- package/tools/build/webpack/shell.webpack.config.js +312 -0
- package/tools/build/webpack/webpack.config.js +312 -0
- package/tools/code-formatter/.eslintrc.base.json +3 -1
- package/tools/code-formatter/lint.d.ts.map +1 -1
- package/tools/code-formatter/lint.js +319 -1
- package/tools/code-formatter/lint.js.map +1 -1
- package/tools/code-formatter/utilities.d.ts +7 -0
- package/tools/code-formatter/utilities.d.ts.map +1 -0
- package/tools/code-formatter/utilities.js +395 -0
- package/tools/code-formatter/utilities.js.map +1 -0
- package/tools/gulp-doc-generator/index.js +312 -0
- package/tools/gulp-manifest-resource/index.js +312 -0
- package/tools/gulp-manifest-validator/index.js +312 -0
- package/tools/gulp-merge-json-in-folders/index.js +312 -0
- package/tools/gulp-merge-json-in-folders/json-merge.js +312 -0
- package/tools/gulp-ps-cim/index.js +315 -0
- package/tools/gulp-ps-code/index.d.ts.map +1 -1
- package/tools/gulp-ps-code/index.js +323 -2
- package/tools/gulp-ps-code/index.js.map +1 -1
- package/tools/gulp-ps-code/ps-code-convert.js +312 -0
- package/tools/gulp-ps-manifest/index.js +312 -0
- package/tools/gulp-ps-module/index.d.ts.map +1 -1
- package/tools/gulp-ps-module/index.js +327 -3
- package/tools/gulp-ps-module/index.js.map +1 -1
- package/tools/gulp-ps-resjson/index.js +315 -0
- package/tools/gulp-resjson/index.js +315 -0
- package/tools/gulp-resjson/resjson-convert.js +312 -0
- package/tools/gulp-schema-form/index.js +312 -0
- package/tools/gulp-svg-code/index.js +312 -0
- package/tools/gulp-svg-code/svg-code-convert.js +312 -0
- package/tools/gulp-update-notes-resource/index.d.ts.map +1 -1
- package/tools/gulp-update-notes-resource/index.js +316 -4
- package/tools/gulp-update-notes-resource/index.js.map +1 -1
- package/tools/module-template/.eslintrc.json +3 -0
- package/tools/module-template/build/increment-package-version.ps1 +216 -0
- package/tools/module-template/build/push-incremented-version.ps1 +216 -1
- package/tools/module-template/build/update-powershell-code.ps1 +216 -0
- package/tools/module-template/gulpfile.ts/common/clean.ts +2 -0
- package/tools/module-template/gulpfile.ts/common/pack.ts +17 -5
- package/tools/module-template/gulpfile.ts/common/powershell.ts +40 -2
- package/tools/module-template/gulpfile.ts/common/utilities.ts +1 -0
- package/tools/pack-nuget/index.d.ts.map +1 -1
- package/tools/pack-nuget/index.js +321 -3
- package/tools/pack-nuget/index.js.map +1 -1
- package/tools/scripts/Invoke-PesterTest.ps1 +216 -0
- package/tools/scripts/New-ExtensionPackage.ps1 +373 -6
- package/tools/scripts/Search-NonAsciiText.ps1 +216 -0
- package/tools/scripts/package-information/README.md +3 -0
- package/tools/scripts/package-information/ms-logo.png +0 -0
- package/tools/test-runner/index.js +312 -0
- package/tools/utilities/index.js +312 -0
- package/tools/wac-cli/src/angular15/configs/angular-json-config.js +312 -0
- package/tools/wac-cli/src/angular15/configs/ci-build-yml-config.js +315 -0
- package/tools/wac-cli/src/angular15/configs/config.js +312 -0
- package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.d.ts +9 -0
- package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.d.ts.map +1 -0
- package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.js +328 -0
- package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.js.map +1 -0
- package/tools/wac-cli/src/angular15/configs/git-ignore-config.js +312 -0
- package/tools/wac-cli/src/angular15/configs/jasmine-test-config.js +315 -0
- package/tools/wac-cli/src/angular15/configs/package-json-config.js +312 -0
- package/tools/wac-cli/src/angular15/configs/replace-config.js +315 -0
- package/tools/wac-cli/src/angular15/configs/tsconfig-config.js +312 -0
- package/tools/wac-cli/src/angular15/configs/ui-test-automation-lagacy-config.js +312 -0
- package/tools/wac-cli/src/angular15/main.d.ts +19 -3
- package/tools/wac-cli/src/angular15/main.d.ts.map +1 -1
- package/tools/wac-cli/src/angular15/main.js +353 -7
- package/tools/wac-cli/src/angular15/main.js.map +1 -1
- package/tools/wac-cli/src/angular15/upgrader/angular-json-upgrader.js +316 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/ajax-response-updater.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/css-syntax-error-updater.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/declare-override-updater.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/error-updater-angular15.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/form-control-updater.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/iif-updater-util.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/load-children-callback-updater.js +315 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/log-parser.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/observable-throw-updater.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/parameter-count-violation-updater.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/string-replace-updater.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/audit/subjuct-next-updater-util.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/ci-build-yml-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.d.ts +18 -0
- package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.d.ts.map +1 -0
- package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.js +361 -0
- package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.js.map +1 -0
- package/tools/wac-cli/src/angular15/upgrader/file-replacement-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/git-ignore-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/jasmine-test-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/package-json-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/remove-upgrader.js +315 -0
- package/tools/wac-cli/src/angular15/upgrader/replace-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/tsconfig-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/ui-test-automation-legacy-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/upgrader/version-json-upgrader.js +312 -0
- package/tools/wac-cli/src/angular15/utils/add-item.js +312 -0
- package/tools/wac-cli/src/angular15/utils/command-runner.js +312 -0
- package/tools/wac-cli/src/angular15/utils/file-comparison.js +315 -0
- package/tools/wac-cli/src/angular15/utils/file-replacement.js +312 -0
- package/tools/wac-cli/src/angular15/utils/file-writer.js +312 -0
- package/tools/wac-cli/src/angular15/utils/logger.js +312 -0
- package/tools/wac-cli/src/angular15/utils/main-debugger.js +312 -0
- package/tools/wac-cli/src/angular15/utils/relative-path.js +312 -0
- package/tools/wac-cli/src/angular15/utils/remove-item.js +312 -0
- package/tools/wac-cli/src/angular15/utils/space-generator.js +312 -0
- package/tools/wac-cli/src/angular15/utils/update-shell-references.js +316 -0
- package/tools/wac-cli/src/common.js +312 -0
- package/tools/wac-cli/src/create/main.js +312 -0
- package/tools/wac-cli/src/eslint/main.js +312 -0
- package/tools/wac-cli/src/index.js +312 -0
- package/tools/wac-cli/src/upgrade/error-updater.js +312 -0
- package/tools/wac-cli/src/upgrade/error-updaters/component-selector-updater.js +315 -0
- package/tools/wac-cli/src/upgrade/error-updaters/only-arrow-functions-updater.js +315 -0
- package/tools/wac-cli/src/upgrade/error-updaters/updater-lookup.js +312 -0
- package/tools/wac-cli/src/upgrade/file-updater.js +312 -0
- package/tools/wac-cli/src/upgrade/get-files.js +312 -0
- package/tools/wac-cli/src/upgrade/main.js +312 -0
- package/tools/wac-cli/src/upgrade/models/error-result.js +312 -0
- package/tools/wac-cli/src/upgrade/models/updater-interface.js +312 -0
- package/tools/wac-cli/src/upgrade/package-updater.js +312 -0
- package/tools/wac-cli/templates/wac-template/src/favicon.ico +0 -0
- package/tools/wac-cli/templates/wac-template/src/karma.conf.js +312 -0
- package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Error.ps1 +216 -0
- package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Exception.ps1 +216 -0
- package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Process.ps1 +216 -1
- package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Service.ps1 +216 -1
- package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-WinRmState.ps1 +216 -1
- package/core/data/extension-broker/snap-in-listener.d.ts.map +0 -1
- package/core/data/extension-broker/snap-in-listener.js +0 -73
- package/core/data/extension-broker/snap-in-listener.js.map +0 -1
- package/microsoft-windows-admin-center-sdk-4.123.0.tgz +0 -0
|
@@ -9,8 +9,9 @@ import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom';
|
|
|
9
9
|
import { DateLikeFormFieldComponent } from '../date-like/date-like-form-field.component';
|
|
10
10
|
import * as i0 from "@angular/core";
|
|
11
11
|
import * as i1 from "@angular/common";
|
|
12
|
-
import * as i2 from "
|
|
13
|
-
import * as i3 from "../../
|
|
12
|
+
import * as i2 from "../../../tooltip/tooltip.directive";
|
|
13
|
+
import * as i3 from "../../validation-alert/validation-alert.component";
|
|
14
|
+
import * as i4 from "../../form-field-layout/form-field-layout.component";
|
|
14
15
|
const _c0 = ["type", "clock"];
|
|
15
16
|
function ClockFormFieldComponent_button_6_Template(rf, ctx) { if (rf & 1) {
|
|
16
17
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
@@ -85,8 +86,10 @@ function ClockFormFieldComponent_div_12_Template(rf, ctx) { if (rf & 1) {
|
|
|
85
86
|
} if (rf & 2) {
|
|
86
87
|
const ctx_r3 = i0.ɵɵnextContext();
|
|
87
88
|
i0.ɵɵadvance(1);
|
|
89
|
+
i0.ɵɵproperty("title", ctx_r3.strings.MsftSmeShell.Angular.Common.apply);
|
|
88
90
|
i0.ɵɵattribute("aria-label", ctx_r3.strings.MsftSmeShell.Angular.Common.apply);
|
|
89
91
|
i0.ɵɵadvance(2);
|
|
92
|
+
i0.ɵɵproperty("title", ctx_r3.strings.MsftSmeShell.Angular.Common.clear);
|
|
90
93
|
i0.ɵɵattribute("aria-label", ctx_r3.strings.MsftSmeShell.Angular.Common.clear);
|
|
91
94
|
} }
|
|
92
95
|
function ClockFormFieldComponent_sme_validation_alert_13_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -649,7 +652,7 @@ export class ClockFormFieldComponent extends DateLikeFormFieldComponent {
|
|
|
649
652
|
}
|
|
650
653
|
}
|
|
651
654
|
/** @nocollapse */ ClockFormFieldComponent.ɵfac = function ClockFormFieldComponent_Factory(t) { return new (t || ClockFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector)); };
|
|
652
|
-
/** @nocollapse */ ClockFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: ClockFormFieldComponent, selectors: [["sme-form-field", "type", "clock"]], inputs: { showConfirmation: "showConfirmation" }, outputs: { accepted: "accepted", cleared: "cleared" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c0, decls: 14, vars: 9, consts: [["role", "region", 3, "formField"], [1, "sme-clock", "sme-focus-zone", "sme-form-field-editor"], [1, "sme-clock-main-content"], [1, "sme-clock-column", "sme-clock-column-hours", 3, "wheel", "scroll"], [1, "sme-clock-column-header"], ["type", "button", 3, "sme-selected", "tabindex", "click", "keydown", 4, "ngFor", "ngForOf"], [1, "sme-clock-column", "sme-clock-column-minutes", 3, "wheel", "scroll"], ["class", "sme-clock-column sme-clock-column-meridiem", 3, "wheel", "scroll", 4, "ngIf"], ["class", "sme-clock-confirmation", 4, "ngIf"], [3, "alert", 4, "ngIf"], ["type", "button", 3, "tabindex", "click", "keydown"], [1, "sme-clock-column", "sme-clock-column-meridiem", 3, "wheel", "scroll"], ["type", "button", 3, "class", "sme-selected", "tabindex", "click", "keydown", 4, "ngFor", "ngForOf"], [1, "sme-clock-confirmation"], ["type", "button", "tabindex", "0", 3, "click"], [1, "sme-icon", "sme-icon-size-xxs", "sme-icon-accept"], [1, "sme-icon", "sme-icon-size-xxs", "sme-icon-clear"], [3, "alert"]], template: function ClockFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
|
|
655
|
+
/** @nocollapse */ ClockFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: ClockFormFieldComponent, selectors: [["sme-form-field", "type", "clock"]], inputs: { showConfirmation: "showConfirmation" }, outputs: { accepted: "accepted", cleared: "cleared" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c0, decls: 14, vars: 9, consts: [["role", "region", 3, "formField"], [1, "sme-clock", "sme-focus-zone", "sme-form-field-editor"], [1, "sme-clock-main-content"], [1, "sme-clock-column", "sme-clock-column-hours", 3, "wheel", "scroll"], [1, "sme-clock-column-header"], ["type", "button", 3, "sme-selected", "tabindex", "click", "keydown", 4, "ngFor", "ngForOf"], [1, "sme-clock-column", "sme-clock-column-minutes", 3, "wheel", "scroll"], ["class", "sme-clock-column sme-clock-column-meridiem", 3, "wheel", "scroll", 4, "ngIf"], ["class", "sme-clock-confirmation", 4, "ngIf"], [3, "alert", 4, "ngIf"], ["type", "button", 3, "tabindex", "click", "keydown"], [1, "sme-clock-column", "sme-clock-column-meridiem", 3, "wheel", "scroll"], ["type", "button", 3, "class", "sme-selected", "tabindex", "click", "keydown", 4, "ngFor", "ngForOf"], [1, "sme-clock-confirmation"], ["type", "button", "tabindex", "0", 3, "title", "click"], [1, "sme-icon", "sme-icon-size-xxs", "sme-icon-accept"], [1, "sme-icon", "sme-icon-size-xxs", "sme-icon-clear"], [3, "alert"]], template: function ClockFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
|
|
653
656
|
i0.ɵɵelementStart(0, "sme-form-field-layout", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3);
|
|
654
657
|
i0.ɵɵlistener("wheel", function ClockFormFieldComponent_Template_div_wheel_3_listener($event) { return ctx.onHourWheel($event); })("scroll", function ClockFormFieldComponent_Template_div_scroll_3_listener($event) { return ctx.onColumnScroll($event); });
|
|
655
658
|
i0.ɵɵelementStart(4, "div", 4);
|
|
@@ -666,7 +669,7 @@ export class ClockFormFieldComponent extends DateLikeFormFieldComponent {
|
|
|
666
669
|
i0.ɵɵelementEnd();
|
|
667
670
|
i0.ɵɵtemplate(11, ClockFormFieldComponent_div_11_Template, 4, 2, "div", 7);
|
|
668
671
|
i0.ɵɵelementEnd();
|
|
669
|
-
i0.ɵɵtemplate(12, ClockFormFieldComponent_div_12_Template, 5,
|
|
672
|
+
i0.ɵɵtemplate(12, ClockFormFieldComponent_div_12_Template, 5, 4, "div", 8);
|
|
670
673
|
i0.ɵɵelementEnd();
|
|
671
674
|
i0.ɵɵtemplate(13, ClockFormFieldComponent_sme_validation_alert_13_Template, 1, 1, "sme-validation-alert", 9);
|
|
672
675
|
i0.ɵɵelementEnd();
|
|
@@ -687,7 +690,7 @@ export class ClockFormFieldComponent extends DateLikeFormFieldComponent {
|
|
|
687
690
|
i0.ɵɵproperty("ngIf", ctx.showConfirmation);
|
|
688
691
|
i0.ɵɵadvance(1);
|
|
689
692
|
i0.ɵɵproperty("ngIf", !ctx.compact);
|
|
690
|
-
} }, dependencies: [i1.NgForOf, i1.NgIf, i2.
|
|
693
|
+
} }, dependencies: [i1.NgForOf, i1.NgIf, i2.TooltipDirective, i3.ValidationAlertComponent, i4.FormFieldLayoutComponent], encapsulation: 2 });
|
|
691
694
|
__decorate([
|
|
692
695
|
Debounce(10),
|
|
693
696
|
__metadata("design:type", Function),
|
|
@@ -702,7 +705,7 @@ __decorate([
|
|
|
702
705
|
], ClockFormFieldComponent.prototype, "focusOnHostElement", null);
|
|
703
706
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClockFormFieldComponent, [{
|
|
704
707
|
type: Component,
|
|
705
|
-
args: [{ selector: 'sme-form-field[type="clock"]', template: "<sme-form-field-layout [formField]=\"this\" role=\"region\" [attr.aria-label]=\"ariaLabel\">\r\n <div class=\"sme-clock sme-focus-zone sme-form-field-editor \">\r\n <div class=\"sme-clock-main-content\">\r\n <div class=\"sme-clock-column sme-clock-column-hours\" (wheel)=\"onHourWheel($event)\"\r\n (scroll)=\"onColumnScroll($event)\">\r\n <div class=\"sme-clock-column-header\">{{this.strings.MsftSmeShell.Angular.Clock.Headings.hour}}</div>\r\n <button type=\"button\" *ngFor=\"let hour of hours\" [class.sme-selected]=\"hour.isSelected\" [tabindex]=\"hour.isSelected ? 0 : -1\"\r\n (click)=\"onHourClicked($event, hour)\" (keydown)=\"onHourKeydown($event)\" [attr.aria-label]=\"strings.MsftSmeShell.Angular.Clock.Headings.hour + hour.display\">{{hour.display}}</button>\r\n </div>\r\n <div class=\"sme-clock-column sme-clock-column-minutes\" (wheel)=\"onMinuteWheel($event)\"\r\n (scroll)=\"onColumnScroll($event)\">\r\n <div class=\"sme-clock-column-header\">{{this.strings.MsftSmeShell.Angular.Clock.Headings.minute}}</div>\r\n <button type=\"button\" *ngFor=\"let minute of minutes\" [class.sme-selected]=\"minute.isSelected\"\r\n [tabindex]=\"minute.isSelected ? 0 : -1\" (click)=\"onMinuteClicked($event, minute)\"\r\n (keydown)=\"onMinuteKeydown($event)\" [attr.aria-label]=\"strings.MsftSmeShell.Angular.Clock.Headings.minute + minute.display\">{{minute.display}}</button>\r\n </div>\r\n <div *ngIf=\"!!viewportMeridiem\" class=\"sme-clock-column sme-clock-column-meridiem\"\r\n (wheel)=\"onMeridiemWheel($event)\" (scroll)=\"onColumnScroll($event)\">\r\n <div class=\"sme-clock-column-header\">{{this.strings.MsftSmeShell.Angular.Clock.Headings.meridiem}}</div>\r\n <button type=\"button\" *ngFor=\"let meridiem of meridiems\" class=\"sme-clock-meridiem-{{meridiem.value}}\"\r\n [class.sme-selected]=\"meridiem.isSelected\" [tabindex]=\"meridiem.isSelected ? 0 : -1\"\r\n (click)=\"onMeridiemClicked($event, meridiem.value)\"\r\n (keydown)=\"onMeridiemKeydown($event)\">{{meridiem.display}}</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"showConfirmation\" class=\"sme-clock-confirmation\">\r\n <button type=\"button\" [attr.aria-label]=\"this.strings.MsftSmeShell.Angular.Common.apply\" tabindex=\"0\"\r\n
|
|
708
|
+
args: [{ selector: 'sme-form-field[type="clock"]', template: "<sme-form-field-layout [formField]=\"this\" role=\"region\" [attr.aria-label]=\"ariaLabel\">\r\n <div class=\"sme-clock sme-focus-zone sme-form-field-editor \">\r\n <div class=\"sme-clock-main-content\">\r\n <div class=\"sme-clock-column sme-clock-column-hours\" (wheel)=\"onHourWheel($event)\"\r\n (scroll)=\"onColumnScroll($event)\">\r\n <div class=\"sme-clock-column-header\">{{this.strings.MsftSmeShell.Angular.Clock.Headings.hour}}</div>\r\n <button type=\"button\" *ngFor=\"let hour of hours\" [class.sme-selected]=\"hour.isSelected\" [tabindex]=\"hour.isSelected ? 0 : -1\"\r\n (click)=\"onHourClicked($event, hour)\" (keydown)=\"onHourKeydown($event)\" [attr.aria-label]=\"strings.MsftSmeShell.Angular.Clock.Headings.hour + hour.display\">{{hour.display}}</button>\r\n </div>\r\n <div class=\"sme-clock-column sme-clock-column-minutes\" (wheel)=\"onMinuteWheel($event)\"\r\n (scroll)=\"onColumnScroll($event)\">\r\n <div class=\"sme-clock-column-header\">{{this.strings.MsftSmeShell.Angular.Clock.Headings.minute}}</div>\r\n <button type=\"button\" *ngFor=\"let minute of minutes\" [class.sme-selected]=\"minute.isSelected\"\r\n [tabindex]=\"minute.isSelected ? 0 : -1\" (click)=\"onMinuteClicked($event, minute)\"\r\n (keydown)=\"onMinuteKeydown($event)\" [attr.aria-label]=\"strings.MsftSmeShell.Angular.Clock.Headings.minute + minute.display\">{{minute.display}}</button>\r\n </div>\r\n <div *ngIf=\"!!viewportMeridiem\" class=\"sme-clock-column sme-clock-column-meridiem\"\r\n (wheel)=\"onMeridiemWheel($event)\" (scroll)=\"onColumnScroll($event)\">\r\n <div class=\"sme-clock-column-header\">{{this.strings.MsftSmeShell.Angular.Clock.Headings.meridiem}}</div>\r\n <button type=\"button\" *ngFor=\"let meridiem of meridiems\" class=\"sme-clock-meridiem-{{meridiem.value}}\"\r\n [class.sme-selected]=\"meridiem.isSelected\" [tabindex]=\"meridiem.isSelected ? 0 : -1\"\r\n (click)=\"onMeridiemClicked($event, meridiem.value)\"\r\n (keydown)=\"onMeridiemKeydown($event)\">{{meridiem.display}}</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"showConfirmation\" class=\"sme-clock-confirmation\">\r\n <button type=\"button\" [title]=\"this.strings.MsftSmeShell.Angular.Common.apply\"\r\n [attr.aria-label]=\"this.strings.MsftSmeShell.Angular.Common.apply\" tabindex=\"0\"\r\n (click)=\"onAcceptClicked($event)\">\r\n <span class=\"sme-icon sme-icon-size-xxs sme-icon-accept\"></span>\r\n </button>\r\n <button type=\"button\" [title]=\"this.strings.MsftSmeShell.Angular.Common.clear\"\r\n [attr.aria-label]=\"this.strings.MsftSmeShell.Angular.Common.clear\" tabindex=\"0\"\r\n (click)=\"cleared.emit($event)\">\r\n <span class=\"sme-icon sme-icon-size-xxs sme-icon-clear\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n <sme-validation-alert *ngIf=\"!compact\" [alert]=\"alert\"></sme-validation-alert>\r\n</sme-form-field-layout>\r\n" }]
|
|
706
709
|
}], function () { return [{ type: i0.Injector }]; }, { showConfirmation: [{
|
|
707
710
|
type: Input
|
|
708
711
|
}], accepted: [{
|
|
@@ -710,4 +713,4 @@ __decorate([
|
|
|
710
713
|
}], cleared: [{
|
|
711
714
|
type: Output
|
|
712
715
|
}], handleWheelSpin: [], focusOnHostElement: [] }); })();
|
|
713
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2stZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvY2xvY2svY2xvY2stZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvY2xvY2svY2xvY2stZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDakcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUM1RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFdkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7Ozs7Ozs7O0lDSGpGLGtDQUNvSztJQUE1Six3T0FBUyxlQUFBLHFDQUEyQixDQUFBLElBQUMsb0tBQVksZUFBQSw0QkFBcUIsQ0FBQSxJQUFqQztJQUF1SCxZQUFnQjtJQUFBLGlCQUFTOzs7O0lBRDVJLGtEQUFzQztJQUFDLHNEQUFxQztJQUM3Qyx1R0FBbUY7SUFBQyxlQUFnQjtJQUFoQixxQ0FBZ0I7Ozs7SUFLcEwsa0NBRW9JO0lBRHBGLDZPQUFTLGVBQUEsMENBQStCLENBQUEsSUFBQyx1S0FDdEUsZUFBQSwrQkFBdUIsQ0FBQSxJQUQrQztJQUMyQyxZQUFrQjtJQUFBLGlCQUFTOzs7O0lBRjFHLG9EQUF3QztJQUNyRix3REFBdUM7SUFDSCwyR0FBdUY7SUFBQyxlQUFrQjtJQUFsQix1Q0FBa0I7Ozs7SUFLdEosa0NBRzhDO0lBRHRDLHVQQUFTLGVBQUEscURBQXlDLENBQUEsSUFBQyw4S0FDeEMsZUFBQSxpQ0FBeUIsQ0FBQSxJQURlO0lBQ2IsWUFBb0I7SUFBQSxpQkFBUzs7O0lBSGxCLHdFQUE2QztJQUM5Rix1REFBMEM7SUFBQywyREFBeUM7SUFFOUMsZUFBb0I7SUFBcEIsMENBQW9COzs7O0lBTnBFLCtCQUN5RTtJQUFwRSwwS0FBUyxlQUFBLCtCQUF1QixDQUFBLElBQUMsK0pBQVcsZUFBQSw4QkFBc0IsQ0FBQSxJQUFqQztJQUNwQyw4QkFBcUM7SUFBQSxZQUE2RDtJQUFBLGlCQUFNO0lBQ3hHLHNGQUcyRTtJQUM3RSxpQkFBTTs7O0lBTGlDLGVBQTZEO0lBQTdELGlGQUE2RDtJQUN2RCxlQUFZO0lBQVosMENBQVk7Ozs7SUFNM0QsK0JBQTZELGlCQUFBO0lBRW5ELDZLQUFTLGVBQUEsK0JBQXVCLENBQUEsSUFBQztJQUN2QywyQkFBZ0U7SUFDbEUsaUJBQVM7SUFDVCxrQ0FDdUM7SUFBL0IsNktBQVMsZUFBQSw0QkFBb0IsQ0FBQSxJQUFDO0lBQ3BDLDJCQUErRDtJQUNqRSxpQkFBUyxFQUFBOzs7SUFQYSxlQUFrRTtJQUFsRSw4RUFBa0U7SUFJbEUsZUFBa0U7SUFBbEUsOEVBQWtFOzs7SUFNNUYsMkNBQThFOzs7SUFBdkMsb0NBQWU7O0FEbkJ4RCxNQUFNLENBQU4sSUFBWSxRQUdYO0FBSEQsV0FBWSxRQUFRO0lBQ2hCLHFCQUFTLENBQUE7SUFDVCxxQkFBUyxDQUFBO0FBQ2IsQ0FBQyxFQUhXLFFBQVEsS0FBUixRQUFRLFFBR25CO0FBZUQ7O0dBRUc7QUFLSCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsMEJBQTBCO0lBNEhuRTs7O09BR0c7SUFDSCxZQUFZLFFBQWtCO1FBQzFCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQWhIcEI7O1dBRUc7UUFDSyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBU2pCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUNmLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzlCLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBb0Q5Qzs7V0FFRztRQUNLLGFBQVEsR0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1FBRXREOztXQUVHO1FBQ0ssZUFBVSxHQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFPeEQ7O1dBRUc7UUFDSyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQTZCekIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0UsQ0FBQztJQXBJRDs7T0FFRztJQUNLLE1BQU0sS0FBSyxlQUFlO1FBQzlCLHFEQUFxRDtRQUNyRCxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVksUUFBUTtRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFNRDs7T0FFRztJQUNILElBQWMsYUFBYTtRQUN2QixPQUFPLHlCQUF5QixDQUFDO0lBQ3JDLENBQUM7SUFZRDs7T0FFRztJQUNILElBQVksWUFBWTtRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdkYsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBWSxjQUFjO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3JFLENBQUM7SUFzQkQ7O09BRUc7SUFDSCxJQUFXLGdCQUFnQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsaUNBQWlDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRyxDQUFDO0lBMkJELElBQVksZUFBZTtRQUN2Qix5RkFBeUY7UUFDekYsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFFSCxJQUFXLFNBQVM7UUFDaEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4RjtRQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBY0Q7O09BRUc7SUFDSSxRQUFRO1FBQ1gsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksa0JBQWtCLENBQUMsS0FBZTtRQUNyQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYSxDQUFDLEtBQWlCLEVBQUUsSUFBZTtRQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDdkUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsS0FBb0I7UUFDckMsUUFBUSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ25CLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUFDLE1BQU07YUFBRTtZQUNwRixLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQUMsTUFBTTthQUFFO1lBQ2pGLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUFDLE9BQU87YUFBRTtZQUMxRCxPQUFPLENBQUMsQ0FBQztnQkFBRSxPQUFPO2FBQUU7U0FDdkI7UUFDRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FBQyxLQUFpQjtRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFGLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYyxDQUFDLEtBQVk7UUFDOUIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0I7UUFDbkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssT0FBTyxDQUFDLElBQVk7UUFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNwQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxLQUFpQixFQUFFLE1BQWlCO1FBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZSxDQUFDLEtBQW9CO1FBQ3ZDLFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNuQixLQUFLLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFBQyxNQUFNO2FBQUU7WUFDdEYsS0FBSyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUFDLE1BQU07YUFBRTtZQUNuRixLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFBQyxPQUFPO2FBQUU7WUFDMUQsT0FBTyxDQUFDLENBQUM7Z0JBQUUsT0FBTzthQUFFO1NBQ3ZCO1FBQ0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsS0FBaUI7UUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLGtCQUFrQjtRQUNyQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYztRQUNqQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNLLFNBQVMsQ0FBQyxNQUFjO1FBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDcEMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsS0FBSztRQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNyRCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsUUFBa0I7UUFDckQsSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUMxQixPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7U0FDcEI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUIsQ0FBQyxLQUFpQixFQUFFLFFBQWtCO1FBQzFELElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0IsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUIsQ0FBQyxLQUFvQjtRQUN6QyxRQUFRLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDbkIsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3JCLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU07YUFDVDtZQUNELEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUFDLE9BQU87YUFBRTtZQUMxRCxPQUFPLENBQUMsQ0FBQztnQkFBRSxPQUFPO2FBQUU7U0FDdkI7UUFDRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxLQUFpQjtRQUNwQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWMsQ0FBQyxRQUFtQjtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN2QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ1gsUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDL0U7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FBQyxRQUFrQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN2QixPQUFPO1NBQ1Y7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3BDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxLQUFZO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25JLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNLLHlCQUF5QixDQUFDLEtBQVcsRUFBRSxXQUFvQjtRQUMvRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2SCxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sY0FBYyxDQUFDLEtBQUs7UUFDMUIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztTQUNuQztRQUNELElBQUksS0FBSyxFQUFFO1lBQ1AsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDOUI7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sUUFBUSxDQUFDLENBQWM7UUFDN0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBRUssZUFBZSxDQUFDLEtBQWlCLEVBQUUsTUFBbUIsRUFBRSxHQUFXLEVBQUUsWUFBa0M7UUFDM0csTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELFlBQVksQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWTtRQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYTtRQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZTtRQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYSxDQUFDLFdBQW1CO1FBQ3JDLE1BQU0sT0FBTyxHQUE4QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEcsSUFBSSxPQUFPLEVBQUU7WUFDVCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUQsSUFBSSxZQUFZLEVBQUU7Z0JBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQUU7U0FDOUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLO1FBQ1IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUVLLGtCQUFrQjtRQUN0QixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNqRixJQUFJLFlBQVksRUFBRTtZQUNkLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN4QjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNsQixPQUFPO1NBQ1Y7UUFDRCw4RUFBOEU7UUFDOUUsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FDOUI7WUFDSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNuRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUN0RCxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRTtTQUM1RCxFQUNELE1BQU0sQ0FBQyxFQUFFO1lBQ0wsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixNQUFNLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9HLE9BQU8sUUFBUSxDQUFDLGFBQWEsS0FBSyxPQUFPLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFFUCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN2QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUNoRDtRQUNELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQzFFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDMUUsSUFBSSxvQkFBb0IsQ0FBQztRQUN6QixJQUFJLGdCQUFnQixDQUFDO1FBQ3JCLElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztZQUMvQixnQkFBZ0IsR0FBRyxPQUFPLENBQUM7U0FDOUI7YUFBTTtZQUNILG9CQUFvQixHQUFHLE9BQU8sQ0FBQztZQUMvQixnQkFBZ0IsR0FBRyxPQUFPLENBQUM7U0FDOUI7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2I7Z0JBQ0ksT0FBTyxFQUFFLG9CQUFvQjtnQkFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUMzQixVQUFVLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7YUFDNUQ7WUFDRDtnQkFDSSxPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixLQUFLLEVBQUUsV0FBVztnQkFDbEIsVUFBVSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7YUFDbkQ7U0FDSixDQUFDO1FBRUYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN4RyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDaEMsV0FBVyxFQUNYLElBQUksQ0FBQyxRQUFRLEVBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLEVBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCLHNDQUFzQztZQUN0QyxJQUFJLFlBQVksR0FBVyxJQUFJLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDdEIsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO29CQUNaLFlBQVksR0FBRyxJQUFJLENBQUM7aUJBQ3ZCO2FBQ0o7WUFDRCxNQUFNLEtBQUssR0FBYztnQkFDckIsT0FBTyxFQUFFLFlBQVk7Z0JBQ3JCLEtBQUssRUFBRSxJQUFJO2dCQUNYLFVBQVUsRUFBRSxJQUFJLEtBQUssWUFBWTthQUNwQyxDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFFUCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDckgsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ2xDLGFBQWEsRUFDYixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUNsQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsY0FBYyxDQUNuRCxFQUNELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUN4QixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDYixzQ0FBc0M7WUFDdEMsT0FBTyxFQUFFLElBQUksTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLEtBQUssRUFBRSxNQUFNO1lBQ2IsVUFBVSxFQUFFLE1BQU0sS0FBSyxJQUFJLENBQUMsY0FBYztTQUM3QyxDQUFDLENBQUMsQ0FBQztRQUVKLElBQUksYUFBYSxFQUFFO1lBQ2YsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRTtnQkFDOUIsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxZQUFZLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxRQUFRO1FBQzdDLE1BQU0sU0FBUyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDdEMsSUFBSSxTQUFTLElBQUksUUFBUSxFQUFFO1lBQ3ZCLE9BQU8sU0FBUyxHQUFHLFFBQVEsQ0FBQztTQUMvQjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsUUFBUTtRQUNqRCxNQUFNLFNBQVMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtZQUNmLE9BQU8sUUFBUSxHQUFHLFNBQVMsQ0FBQztTQUMvQjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLFlBQW9CLEVBQUUsR0FBVyxFQUFFLGlCQUF5QixFQUFFLFNBQWtCO1FBQ3ZHLHFHQUFxRztRQUNyRyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEUsWUFBWSxHQUFHLENBQUMsQ0FBQztTQUNwQjtRQUNELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLGVBQWUsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDbkIsTUFBTSxRQUFRLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN6RCxJQUFJLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzFCLHVDQUF1QztZQUN2QyxVQUFVLEdBQUcsaUJBQWlCLENBQUM7U0FDbEM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3ZDLG9CQUFvQjtZQUNwQixVQUFVLEdBQUcsU0FBUyxDQUFDO1NBQzFCO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQVMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0RSxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7Z0JBQ2xCLE9BQU8sWUFBWSxDQUFDO2FBQ3ZCO2lCQUFNLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRTtnQkFDdkIsTUFBTSxLQUFLLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQzthQUMxRDtpQkFBTTtnQkFDSCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO2dCQUM3QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQzthQUN0RDtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQzs7aUhBdm1CUSx1QkFBdUI7eUdBQXZCLHVCQUF1QjtRQzFDcEMsZ0RBQXNGLGFBQUEsYUFBQSxhQUFBO1FBRzNCLHVHQUFTLHVCQUFtQixJQUFDLDRGQUNuRSwwQkFBc0IsSUFENkM7UUFFaEYsOEJBQXFDO1FBQUEsWUFBeUQ7UUFBQSxpQkFBTTtRQUNwRyw4RUFDNkw7UUFDL0wsaUJBQU07UUFDTiw4QkFDdUM7UUFEZ0IsdUdBQVMseUJBQXFCLElBQUMsNEZBQ3ZFLDBCQUFzQixJQURpRDtRQUVwRiw4QkFBcUM7UUFBQSxZQUEyRDtRQUFBLGlCQUFNO1FBQ3RHLGdGQUUrSjtRQUNqSyxpQkFBTTtRQUNOLDBFQU9NO1FBQ1IsaUJBQU07UUFDTiwwRUFTTTtRQUNSLGlCQUFNO1FBQ04sNEdBQThFO1FBQ2hGLGlCQUF3Qjs7UUFyQ0QsK0JBQWtCO1FBQWUsMkNBQTZCO1FBS3hDLGVBQXlEO1FBQXpELDBFQUF5RDtRQUN2RCxlQUFRO1FBQVIsbUNBQVE7UUFLVixlQUEyRDtRQUEzRCw0RUFBMkQ7UUFDdkQsZUFBVTtRQUFWLHFDQUFVO1FBSS9DLGVBQXdCO1FBQXhCLDZDQUF3QjtRQVMxQixlQUFzQjtRQUF0QiwyQ0FBc0I7UUFXUCxlQUFjO1FBQWQsbUNBQWM7O0FEcVpuQztJQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7O3FDQUNrQixVQUFVOzs4REFPeEM7QUE2Q0Q7SUFBQyxLQUFLLEVBQUU7Ozs7aUVBTVA7dUZBMWNRLHVCQUF1QjtjQUpuQyxTQUFTOzJCQUNJLDhCQUE4QjsyREFnQ2pDLGdCQUFnQjtrQkFEdEIsS0FBSztZQUVXLFFBQVE7a0JBQXhCLE1BQU07WUFDVSxPQUFPO2tCQUF2QixNQUFNO1lBaVhDLGVBQWUsTUFxRGYsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVUeXBlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RhdGUvZGF0ZS10eXBlJztcclxuaW1wb3J0IHsgRGVib3VuY2UgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGVjb3JhdG9ycy9kZWJvdW5jZS5kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgWWllbGQgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGVjb3JhdG9ycy95aWVsZC5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBLZXlDb2RlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2FjY2Vzc2liaWxpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IEdsb2JhbGl6YXRpb24gfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvZ2xvYmFsaXphdGlvbic7XHJcbmltcG9ydCB7IERvbSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZG9tL2RvbSc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25BbGVydHMgfSBmcm9tICcuLi8uLi92YWxpZGF0aW9uLWFsZXJ0L3ZhbGlkYXRpb24tYWxlcnQnO1xyXG5pbXBvcnQgeyBEYXRlTGlrZUZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtbGlrZS9kYXRlLWxpa2UtZm9ybS1maWVsZC5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUaW1lQmxvY2sge1xyXG4gICAgZGlzcGxheTogc3RyaW5nO1xyXG4gICAgdmFsdWU6IG51bWJlcjtcclxuICAgIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIE1lcmlkaWVtIHtcclxuICAgIEFNID0gJ2FtJyxcclxuICAgIFBNID0gJ3BtJ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBOdWxsYWJsZU1lcmlkaWVtID0gbnVsbCB8IE1lcmlkaWVtO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZXJpZGllbUJsb2NrIHtcclxuICAgIGRpc3BsYXk6IHN0cmluZztcclxuICAgIHZhbHVlOiBNZXJpZGllbTtcclxuICAgIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3BpbiB7XHJcbiAgICB2YWx1ZTogbnVtYmVyO1xyXG4gICAgcGl2b3Q6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENsb2NrIEZvcm0gRmllbGQgQ29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWZvcm0tZmllbGRbdHlwZT1cImNsb2NrXCJdJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jbG9jay1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2xvY2tGb3JtRmllbGRDb21wb25lbnQgZXh0ZW5kcyBEYXRlTGlrZUZvcm1GaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgQ29uc3QgZ2V0dGVyIGZvciBUaGUgdmlzaWJsZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIGNsb2NrIGNvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0IHZpc2libGVSb3dDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIC8vIENoYW5nZSB0aGlzIHRvIGNoYW5nZSBob3cgbWFueSByb3dzIHNob3cgaW4gdGhlIFVYXHJcbiAgICAgICAgcmV0dXJuIDc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIG1heGltdW0gbnVtYmVyIG9mIGhvdXJzIGRlcGVuZGluZyBvZiB0aGUgaG91ciBmb3JtYXRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgbWF4SG91cnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlMTJIb3VyRm9ybWF0ID8gMTIgOiAyNDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWludXRlcyBpbiBhbiBob3VyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbWF4TWludXRlcyA9IDYwO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ0Nsb2NrRm9ybUZpZWxkQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dDb25maXJtYXRpb24gPSBmYWxzZTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgYWNjZXB0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBzZWxlY3RlZCB0aW1lIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2aWV3cG9ydFRpbWU6IERhdGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzZWxlY3RlZCBob3Vyc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldCB2aWV3cG9ydEhvdXIoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52aWV3cG9ydFRpbWUgPyB0aGlzLmdldFBhcnNlZEhvdXIodGhpcy52aWV3cG9ydFRpbWUuZ2V0SG91cnMoKSkgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgc2VsZWN0ZWQgbWludXRlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldCB2aWV3cG9ydE1pbnV0ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdwb3J0VGltZSA/IHRoaXMudmlld3BvcnRUaW1lLmdldE1pbnV0ZXMoKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGxpc3Qgb2YgaG91cnMgaW4gdGhlIGNsb2NrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBob3VyczogVGltZUJsb2NrW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGxpc3Qgb2YgbWludXRlcyBpbiB0aGUgY2xvY2tcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1pbnV0ZXM6IFRpbWVCbG9ja1tdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIG1pbnV0ZXMgaW4gdGhlIGNsb2NrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtZXJpZGllbXM6IE1lcmlkaWVtQmxvY2tbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbml0aWFsIG1lcmlkaWFuIHNob3VsZCByZW1haW4gYXQgdGhlIHRvcFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRpYWxNZXJpZGllbTogTWVyaWRpZW07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIG1lcmlkaWVtIG9mIHRoZSBjdXJyZW50IHRpbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB2aWV3cG9ydE1lcmlkaWVtKCk6IE51bGxhYmxlTWVyaWRpZW0ge1xyXG4gICAgICAgIGlmICghdGhpcy51c2UxMkhvdXJGb3JtYXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIDAwIHRvIDExIGlzIGFtLCAxMiB0byAyMyBpcyBwbVxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdwb3J0VGltZSA/IHRoaXMudmlld3BvcnRUaW1lLmdldEhvdXJzKCkgPj0gMTIgPyBNZXJpZGllbS5QTSA6IE1lcmlkaWVtLkFNIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEN1cnJlbnQgc3B1biBob3VyIGFuZCB0aGUgcGl2b3QgcG9pbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzcGluSG91cjogU3BpbiA9IHsgdmFsdWU6IG51bGwsIHBpdm90OiBudWxsIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdXJyZW50IHNwdW4gbWludXRlIGFuZCB0aGUgcGl2b3QgcG9pbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzcGluTWludXRlOiBTcGluID0geyB2YWx1ZTogbnVsbCwgcGl2b3Q6IG51bGwgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGluZGljYXRlcyBpZiBhIHZhbHVlIGNoYW5nZSBpcyBleHBlY3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxvY2FsZURhdGVGb3JtYXQ6IEludGwuRGF0ZVRpbWVGb3JtYXQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbnN3ZXJzLCBpcyB1c2VyIGN1cnJlbnRseSBzY3JvbGxpbmcgZG93bj9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc1Njcm9sbERvd24gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGluZGljYXRlcyBpZiBhIHZhbHVlIGNoYW5nZSBpcyBleHBlY3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxvY2FsZURhdGVGb3JtYXRPcHRpb25zOiBJbnRsLlJlc29sdmVkRGF0ZVRpbWVGb3JtYXRPcHRpb25zO1xyXG5cclxuICAgIHByaXZhdGUgZ2V0IHVzZTEySG91ckZvcm1hdCgpOiBib29sZWFuIHtcclxuICAgICAgICAvLyB0aGlzIGlzIGxlZnQgbnVsbCBpbiBzb21lIDEyIGhvdXIgZm9ybWF0IGxvY2FsZXMgaW4gY2hyb21lLCBleHBsaWNpdGx5IGNoZWNrIGZvciBmYWxzZVxyXG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGVGb3JtYXRPcHRpb25zLmhvdXIxMiAhPT0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHdvcmthcm91bmQgdG8gaGF2ZSBTY3JlZW4gcmVhZGVyIGtub3cgdGhpcyBpcyBhIHJlcXVpcmVkIFwiaW5wdXRcIiBmaWVsZC5cclxuICAgICAqL1xyXG5cclxuICAgIHB1YmxpYyBnZXQgYXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5DbG9jay5BcmlhTGFiZWwuUmVxdWlyZWQuZm9ybWF0KHRoaXMubGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBAc2VlIENsb2NrRm9ybUZpZWxkQ29tcG9uZW50IGNsYXNzLlxyXG4gICAgICogQHBhcmFtIGluamVjdG9yIFRoZSBhbmd1bGFyIGluamVjdGlvbiBzZXJ2aWNlLiByZXF1aXJlZCBieSBAc2VlIFNtZUluamVjdGFibGVCYXNlIGRlY29yYXRvciBpbiB0aGUgQHNlZSBCYXNlQ29tcG9uZW50IGNsYXNzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLmhvdXJzID0gW107XHJcbiAgICAgICAgdGhpcy5taW51dGVzID0gW107XHJcbiAgICAgICAgdGhpcy5sb2NhbGVEYXRlRm9ybWF0ID0gSW50bC5EYXRlVGltZUZvcm1hdChHbG9iYWxpemF0aW9uLmxvY2FsZUlkKTtcclxuICAgICAgICB0aGlzLmxvY2FsZURhdGVGb3JtYXRPcHRpb25zID0gdGhpcy5sb2NhbGVEYXRlRm9ybWF0LnJlc29sdmVkT3B0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5ndWxhciBPbkluaXQgaW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIC8vIERlZmF1bHQgdGltZSBvbiBjbG9jayBpcyB0aGUgY3VycmVudCB0aW1lXHJcbiAgICAgICAgdGhpcy52aWV3cG9ydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUaW1lQ29sdW1ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIGlmIGEgZ2l2ZW4gZGF5IGlzIHNlbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc01lcmlkaWVtU2VsZWN0ZWQodmFsdWU6IE1lcmlkaWVtKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld3BvcnRNZXJpZGllbSA9PT0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgd2hlbiBhbiBob3VyIGlzIGNsaWNrZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSG91ckNsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGhvdXI6IFRpbWVCbG9jaykge1xyXG4gICAgICAgIHRoaXMuc2V0SG91cih0aGlzLmNvbnZlcnRUbzI0SG91cnMoaG91ci52YWx1ZSwgdGhpcy52aWV3cG9ydE1lcmlkaWVtKSk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9jY3VycyB3aGVuIGEga2V5IGlzIHByZXNzZWQgZG93biBvbiBhIGhvdXIgYmxvY2tcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSG91cktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlVwQXJyb3c6IHsgdGhpcy5pc1Njcm9sbERvd24gPSBmYWxzZTsgdGhpcy5nb1RvUHJldmlvdXNIb3VyKCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5Eb3duQXJyb3c6IHsgdGhpcy5pc1Njcm9sbERvd24gPSB0cnVlOyB0aGlzLmdvVG9OZXh0SG91cigpOyBicmVhazsgfVxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRW50ZXI6IHsgdGhpcy5mb2N1c09uSG9zdEVsZW1lbnQoKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHsgcmV0dXJuOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgd2hlbiB0aGUgbW91c2Ugd2hlZWwgaXMgbW92ZWQgb24gdGhlIGhvdXIgY29sdW1uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkhvdXJXaGVlbChldmVudDogV2hlZWxFdmVudCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlV2hlZWxTcGluKGV2ZW50LCB0aGlzLmhvdXJzLCB0aGlzLm1heEhvdXJzLCBob3VyID0+IHsgdGhpcy5zcGluSG91ciA9IGhvdXI7IH0pO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgd2hlbiBhbnkgY29sdW1uIGlzIHNjcm9sbGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbHVtblNjcm9sbChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VsZWN0ZWQgdGhlIHByZXZpb3VzIGhvdXIgYmxvY2sgZnJvbSB0aGUgY3VycmVudCBvbmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9QcmV2aW91c0hvdXIoKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNIb3VyID0gdGhpcy5nZXRQcmV2aW91c1ZhbHVlKHRoaXMudmlld3BvcnRIb3VyLCAxLCB0aGlzLm1heEhvdXJzKTtcclxuICAgICAgICB0aGlzLnNldEhvdXIodGhpcy5jb252ZXJ0VG8yNEhvdXJzKHByZXZpb3VzSG91ciwgdGhpcy52aWV3cG9ydE1lcmlkaWVtKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY3RlZCB0aGUgbmV4dCBob3VyIGJsb2NrIGZyb20gdGhlIGN1cnJlbnQgb25lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnb1RvTmV4dEhvdXIoKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dEhvdXIgPSB0aGlzLmdldE5leHRWYWx1ZSh0aGlzLnZpZXdwb3J0SG91ciwgMSwgdGhpcy5tYXhIb3Vycyk7XHJcbiAgICAgICAgdGhpcy5zZXRIb3VyKHRoaXMuY29udmVydFRvMjRIb3VycyhuZXh0SG91ciwgdGhpcy52aWV3cG9ydE1lcmlkaWVtKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBob3VyIGZyb20gYSB0aW1lIGJsb2NrXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0SG91cihob3VyOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZVRpbWUgPSB0aGlzLnZpZXdwb3J0VGltZTtcclxuICAgICAgICB2YWx1ZVRpbWUuc2V0SG91cnMoaG91cik7XHJcbiAgICAgICAgdGhpcy5zcGluSG91ciA9IHsgdmFsdWU6IG51bGwsIHBpdm90OiBudWxsIH07XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZU9yVmlld1BvcnRUaW1lKHZhbHVlVGltZSwgdGhpcy5zaG93Q29uZmlybWF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9jY3VycyB3aGVuIGFuIG1pbnV0ZSBpcyBjbGlja2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbk1pbnV0ZUNsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIG1pbnV0ZTogVGltZUJsb2NrKSB7XHJcbiAgICAgICAgdGhpcy5zZXRNaW51dGUobWludXRlLnZhbHVlKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBkb3duIG9uIGEgbWludXRlIGJsb2NrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbk1pbnV0ZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlVwQXJyb3c6IHsgdGhpcy5pc1Njcm9sbERvd24gPSBmYWxzZTsgdGhpcy5nb1RvUHJldmlvdXNNaW51dGUoKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkRvd25BcnJvdzogeyB0aGlzLmlzU2Nyb2xsRG93biA9IHRydWU7IHRoaXMuZ29Ub05leHRNaW51dGUoKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVudGVyOiB7IHRoaXMuZm9jdXNPbkhvc3RFbGVtZW50KCk7IHJldHVybjsgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OiB7IHJldHVybjsgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIHdoZW4gdGhlIG1vdXNlIHdoZWVsIGlzIG1vdmVkIG9uIHRoZSBtaW51dGUgY29sdW1uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbk1pbnV0ZVdoZWVsKGV2ZW50OiBXaGVlbEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVXaGVlbFNwaW4oZXZlbnQsIHRoaXMubWludXRlcywgdGhpcy5tYXhNaW51dGVzLCBtaW51dGUgPT4geyB0aGlzLnNwaW5NaW51dGUgPSBtaW51dGU7IH0pO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY3RlZCB0aGUgcHJldmlvdXMgbWludXRlIGJsb2NrIGZyb20gdGhlIGN1cnJlbnQgb25lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnb1RvUHJldmlvdXNNaW51dGUoKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNNaW51dGUgPSB0aGlzLmdldFByZXZpb3VzVmFsdWUodGhpcy52aWV3cG9ydE1pbnV0ZSwgMSwgdGhpcy5tYXhNaW51dGVzKTtcclxuICAgICAgICB0aGlzLnNldE1pbnV0ZShwcmV2aW91c01pbnV0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY3RlZCB0aGUgbmV4dCBtaW51dGUgYmxvY2sgZnJvbSB0aGUgY3VycmVudCBvbmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9OZXh0TWludXRlKCkge1xyXG4gICAgICAgIGNvbnN0IG5leHRNaW51dGUgPSB0aGlzLmdldE5leHRWYWx1ZSh0aGlzLnZpZXdwb3J0TWludXRlLCAxLCB0aGlzLm1heE1pbnV0ZXMpO1xyXG4gICAgICAgIHRoaXMuc2V0TWludXRlKG5leHRNaW51dGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWludXRlIGZyb20gYSB0aW1lIGJsb2NrXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0TWludXRlKG1pbnV0ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVUaW1lID0gdGhpcy52aWV3cG9ydFRpbWU7XHJcbiAgICAgICAgdmFsdWVUaW1lLnNldE1pbnV0ZXMobWludXRlKTtcclxuICAgICAgICB0aGlzLnNwaW5NaW51dGUgPSB7IHZhbHVlOiBudWxsLCBwaXZvdDogbnVsbCB9O1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWVPclZpZXdQb3J0VGltZSh2YWx1ZVRpbWUsIHRoaXMuc2hvd0NvbmZpcm1hdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZSBhbiBob3VyIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBmb3JtYXRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQYXJzZWRIb3VyKHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlMTJIb3VyRm9ybWF0ID8gdmFsdWUgJSAxMiA6IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydCBhIDEyIGhvdXIgc3lzdGVtIHZhbHVlIHRvIHR3ZW50eSBmb3VyIGhvdXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb252ZXJ0VG8yNEhvdXJzKGhvdXI6IG51bWJlciwgbWVyaWRpZW06IE1lcmlkaWVtKSB7XHJcbiAgICAgICAgaWYgKG1lcmlkaWVtID09PSBNZXJpZGllbS5QTSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaG91cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9jY3VycyB3aGVuIGFuIG1lcmlkaWVtIGlzIGNsaWNrZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uTWVyaWRpZW1DbGlja2VkKGV2ZW50OiBNb3VzZUV2ZW50LCBtZXJpZGllbTogTWVyaWRpZW0pIHtcclxuICAgICAgICB0aGlzLnNldE1lcmlkaWVtKG1lcmlkaWVtKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBkb3duIG9uIGEgbWVyaWRpZW0gYmxvY2tcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uTWVyaWRpZW1LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5VcEFycm93OlxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRG93bkFycm93OiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU1lcmlkaWVtKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRW50ZXI6IHsgdGhpcy5mb2N1c09uSG9zdEVsZW1lbnQoKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHsgcmV0dXJuOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgd2hlbiB0aGUgbW91c2Ugd2hlZWwgaXMgbW92ZWQgb24gdGhlIG1lcmlkaWVtIGNvbHVtblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25NZXJpZGllbVdoZWVsKGV2ZW50OiBXaGVlbEV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRvZ2dsZXMgdGhlIG1lcmlkaWVtIGJldHdlZW4gQU0gYW5kIFBNLiBOby1PcCBpZiBtZXJpZGllbSBpcyBub3QgdmFsaWQgaW4gdGhlIGN1cnJlbnQgbG9jYWxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2dnbGVNZXJpZGllbShtZXJpZGllbT86IE1lcmlkaWVtKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZTEySG91ckZvcm1hdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWVyaWRpZW0pIHtcclxuICAgICAgICAgICAgbWVyaWRpZW0gPSB0aGlzLmlzTWVyaWRpZW1TZWxlY3RlZChNZXJpZGllbS5BTSkgPyBNZXJpZGllbS5QTSA6IE1lcmlkaWVtLkFNO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldE1lcmlkaWVtKG1lcmlkaWVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG1lcmlkaWVtIHRvIGVpdGhlciBBTSBvciBQTS4gTm8tT3AgaWYgbWVyaWRpZW0gaXMgbm90IHZhbGlkIGluIHRoZSBjdXJyZW50IGxvY2FsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0TWVyaWRpZW0obWVyaWRpZW06IE1lcmlkaWVtKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZTEySG91ckZvcm1hdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZhbHVlVGltZSA9IHRoaXMudmlld3BvcnRUaW1lO1xyXG4gICAgICAgIHZhbHVlVGltZS5zZXRIb3Vycyh0aGlzLmNvbnZlcnRUbzI0SG91cnModGhpcy52aWV3cG9ydEhvdXIsIG1lcmlkaWVtKSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZU9yVmlld1BvcnRUaW1lKHZhbHVlVGltZSwgdGhpcy5zaG93Q29uZmlybWF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIGFjY2VwdCBidXR0b24gaXMgY2xpY2tlZCB0byBjb21taXQgY2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25BY2NlcHRDbGlja2VkKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBEYXRlVHlwZS5jb252ZXJ0KHRoaXMudmlld3BvcnRUaW1lLCBNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuZGF0ZVR5cGUpID8gdGhpcy5kZXRlY3RlZERhdGVUeXBlIDogdGhpcy5kYXRlVHlwZSk7XHJcbiAgICAgICAgdGhpcy5hY2NlcHRlZC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgZWl0aGVyIHRoZSBmb3JtIHZhbHVlIG9yIHRoZSB2aWV3cG9ydCB2YWx1ZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdmFsdWUgc2hvdWxkIGJlIHBlcnNpc3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVZhbHVlT3JWaWV3UG9ydFRpbWUodmFsdWU6IERhdGUsIHNldFZpZXdQb3J0OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCFzZXRWaWV3UG9ydCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gRGF0ZVR5cGUuY29udmVydCh2YWx1ZSwgTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLmRhdGVUeXBlKSA/IHRoaXMuZGV0ZWN0ZWREYXRlVHlwZSA6IHRoaXMuZGF0ZVR5cGUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlld3BvcnRUaW1lID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRpbWVDb2x1bW5zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgZXZlcnkgdGltZSB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgY2hhbmdlcywgaW4gdGhlIFVJIG9yIHByb2dyYW1tYXRpY2FsbHkuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKHZhbHVlKSB7XHJcbiAgICAgICAgc3VwZXIub25WYWx1ZUNoYW5nZWQodmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQXNEYXRlID0gRGF0ZVR5cGUuY29udmVydCh2YWx1ZSwgRGF0ZVR5cGUuRGF0ZSk7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRUaW1lID0gdmFsdWVBc0RhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlVGltZUNvbHVtbnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyB2YWxpZGF0aW9uIHRoYXQgaXMgaW50ZXJuYWwgdG8gdGhpcyBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0gYyBUaGUgZm9ybSBjb250cm9sIGF0dGFjaGVkIHRvIHRoaXMgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRlKGM6IEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkFsZXJ0cyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVBc1RpbWUoYykgfHwgc3VwZXIudmFsaWRhdGUoYyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIHRoZSB3aGVlbCBzcGluIG9uIGNvbHVtbnMuIE5vIHZhbHVlIHNlbGVjdGlvbiBpcyBtYWRlIG1pbWlja2luZyB0aGUgYmVoYXZpb3IgaW4gQ2hyb21pdW0gRWRnZVxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoMTApXHJcbiAgICBwcml2YXRlIGhhbmRsZVdoZWVsU3BpbihldmVudDogV2hlZWxFdmVudCwgY29sdW1uOiBUaW1lQmxvY2tbXSwgbWF4OiBudW1iZXIsIHNldFNwaW5WYWx1ZTogKHNwaW46IFNwaW4pID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpc1Njcm9sbFVwID0gZXZlbnQuZGVsdGFZIDwgMDtcclxuICAgICAgICBjb25zdCBuZXdTcGluVmFsdWUgPSBpc1Njcm9sbFVwID9cclxuICAgICAgICAgICAgdGhpcy5nZXROZXh0VmFsdWUoY29sdW1uW2NvbHVtbi5sZW5ndGggLSAxXS52YWx1ZSwgMSwgbWF4KSA6XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJldmlvdXNWYWx1ZShjb2x1bW5bMF0udmFsdWUsIDEsIG1heCk7XHJcbiAgICAgICAgc2V0U3BpblZhbHVlKHsgdmFsdWU6IG5ld1NwaW5WYWx1ZSwgcGl2b3Q6IGlzU2Nyb2xsVXAgPyBjb2x1bW4ubGVuZ3RoIC0gMSA6IDAgfSk7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRpbWVDb2x1bW5zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIHRoZSBmb2N1cyB0byBhIHRoZSBob3VycyBjb2x1bW5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmb2N1c09uSG91cnMoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c09uQ29sdW1uKCcuc21lLWNsb2NrLWNvbHVtbi1ob3VycycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgZm9jdXMgdG8gYSB0aGUgbWludXRlcyBjb2x1bW5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmb2N1c09uTWludXRlKCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNPbkNvbHVtbignLnNtZS1jbG9jay1jb2x1bW4tbWludXRlcycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgZm9jdXMgdG8gYSB0aGUgbWVyaWRpZW0gY29sdW1uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZm9jdXNPbk1lcmlkaWVtKCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNPbkNvbHVtbignLnNtZS1jbG9jay1jb2x1bW4tbWVyaWRpZW0nKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGxpZXMgdGhlIGZvY3VzIHRvIGEgY29sdW1uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZm9jdXNPbkNvbHVtbihjb2x1bW5DbGFzczogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gKDxIVE1MRWxlbWVudD50aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoY29sdW1uQ2xhc3MpO1xyXG4gICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzRWxlbWVudCA9IERvbS5nZXRGaXJzdEZvY3VzYWJsZURlc2NlbmRlbnQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChmb2N1c0VsZW1lbnQpIHsgZm9jdXNFbGVtZW50LmZvY3VzKCk7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIHRoZSBmb2N1cyB0byB0aGUgY3VycmVudCBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvY3VzT25Ib3VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgZm9jdXMgdG8gdGhlIGhvc3QgZWxlbWVudCB3aGVuIHRoZSBjbG9jayByZXRyYWN0c1xyXG4gICAgICovXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSBmb2N1c09uSG9zdEVsZW1lbnQoKSB7XHJcbiAgICAgICAgY29uc3QgZm9jdXNFbGVtZW50ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgaWYgKGZvY3VzRWxlbWVudCkge1xyXG4gICAgICAgICAgICBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIGN1cnJlbnQgdmlld1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlVGltZUNvbHVtbnMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdwb3J0VGltZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhvdXJzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMubWludXRlcyA9IFtdO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNoZWNrIGlmIGZvY3VzIGV4aXN0cyBpbiBvdXIgY29udHJvbCBzbyB3ZSBjYW4gcmVzdG9yZSBpdCB3aGVuIHdlIGFyZSBkb25lLlxyXG4gICAgICAgIGNvbnN0IGNvbHVtblRvRm9jdXMgPSBNc2Z0U21lLmZpbmQoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgIHsgbmFtZTogJ2hvdXJzJywgZm9jdXM6ICgpID0+IHRoaXMuZm9jdXNPbkhvdXJzKCkgfSxcclxuICAgICAgICAgICAgICAgIHsgbmFtZTogJ21pbnV0ZXMnLCBmb2N1czogKCkgPT4gdGhpcy5mb2N1c09uTWludXRlKCkgfSxcclxuICAgICAgICAgICAgICAgIHsgbmFtZTogJ21lcmlkaWVtJywgZm9jdXM6ICgpID0+IHRoaXMuZm9jdXNPbk1lcmlkaWVtKCkgfVxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGAuc21lLWNsb2NrLWNvbHVtbi0ke2NvbHVtbi5uYW1lfSAuc21lLXNlbGVjdGVkYCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWxlbWVudDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsTWVyaWRpZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsTWVyaWRpZW0gPSB0aGlzLnZpZXdwb3J0TWVyaWRpZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFsdE1lcmlkaWVtID0gTWVyaWRpZW0uQU0gPT09IHRoaXMuaW5pdGlhbE1lcmlkaWVtID8gTWVyaWRpZW0uUE0gOiBNZXJpZGllbS5BTTtcclxuICAgICAgICBjb25zdCBhbUxhYmVsID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNsb2NrLk1lcmlkaWVtLkFNLmxhYmVsO1xyXG4gICAgICAgIGNvbnN0IHBtTGFiZWwgPSB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQ2xvY2suTWVyaWRpZW0uUE0ubGFiZWw7XHJcbiAgICAgICAgbGV0IGluaXRpYWxNZXJpZGllbUxhYmVsO1xyXG4gICAgICAgIGxldCBhbHRNZXJpZGllbUxhYmVsO1xyXG4gICAgICAgIGlmIChNZXJpZGllbS5BTSA9PT0gdGhpcy5pbml0aWFsTWVyaWRpZW0pIHtcclxuICAgICAgICAgICAgaW5pdGlhbE1lcmlkaWVtTGFiZWwgPSBhbUxhYmVsO1xyXG4gICAgICAgICAgICBhbHRNZXJpZGllbUxhYmVsID0gcG1MYWJlbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbml0aWFsTWVyaWRpZW1MYWJlbCA9IHBtTGFiZWw7XHJcbiAgICAgICAgICAgIGFsdE1lcmlkaWVtTGFiZWwgPSBhbUxhYmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lcmlkaWVtcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheTogaW5pdGlhbE1lcmlkaWVtTGFiZWwsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5pbml0aWFsTWVyaWRpZW0sXHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiB0aGlzLmlzTWVyaWRpZW1TZWxlY3RlZCh0aGlzLmluaXRpYWxNZXJpZGllbSlcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYWx0TWVyaWRpZW1MYWJlbCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBhbHRNZXJpZGllbSxcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHRoaXMuaXNNZXJpZGllbVNlbGVjdGVkKGFsdE1lcmlkaWVtKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRIb3VyID0gdGhpcy52aWV3cG9ydEhvdXI7XHJcbiAgICAgICAgY29uc3QgY3VycmVudEhvdXIgPSBNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuc3BpbkhvdXIudmFsdWUpID8gc2VsZWN0ZWRIb3VyIDogdGhpcy5zcGluSG91ci52YWx1ZTtcclxuICAgICAgICB0aGlzLmhvdXJzID0gdGhpcy5nZW5lcmF0ZVRpbWVXaW5kb3coXHJcbiAgICAgICAgICAgIGN1cnJlbnRIb3VyLFxyXG4gICAgICAgICAgICB0aGlzLm1heEhvdXJzLFxyXG4gICAgICAgICAgICB0aGlzLmhvdXJzLmZpbmRJbmRleCgoaG91cikgPT4gaG91ci52YWx1ZSA9PT0gc2VsZWN0ZWRIb3VyKSxcclxuICAgICAgICAgICAgdGhpcy5zcGluSG91ci5waXZvdCkubWFwKGhvdXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gZGlzcGxheSB2YWx1ZSBpcyBwYWRkZWQgdG8gMiBkaWdpdHNcclxuICAgICAgICAgICAgICAgIGxldCBkaXNwbGF5VmFsdWU6IHN0cmluZyA9IGAwJHtob3VyfWAuc2xpY2UoLTIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlMTJIb3VyRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvdXIgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlID0gJzEyJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBibG9jazogVGltZUJsb2NrID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGRpc3BsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaG91cixcclxuICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBob3VyID09PSBzZWxlY3RlZEhvdXJcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50TWludXRlID0gTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLnNwaW5NaW51dGUudmFsdWUpID8gdGhpcy52aWV3cG9ydE1pbnV0ZSA6IHRoaXMuc3Bpbk1pbnV0ZS52YWx1ZTtcclxuICAgICAgICB0aGlzLm1pbnV0ZXMgPSB0aGlzLmdlbmVyYXRlVGltZVdpbmRvdyhcclxuICAgICAgICAgICAgY3VycmVudE1pbnV0ZSxcclxuICAgICAgICAgICAgdGhpcy5tYXhNaW51dGVzLFxyXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgKG1pbnV0ZSkgPT4gbWludXRlLnZhbHVlID09PSB0aGlzLnZpZXdwb3J0TWludXRlXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRoaXMuc3Bpbk1pbnV0ZS5waXZvdFxyXG4gICAgICAgICkubWFwKG1pbnV0ZSA9PiAoe1xyXG4gICAgICAgICAgICAvLyBkaXNwbGF5IHZhbHVlIGlzIHBhZGRlZCB0byAyIGRpZ2l0c1xyXG4gICAgICAgICAgICBkaXNwbGF5OiBgMCR7bWludXRlfWAuc2xpY2UoLTIpLFxyXG4gICAgICAgICAgICB2YWx1ZTogbWludXRlLFxyXG4gICAgICAgICAgICBpc1NlbGVjdGVkOiBtaW51dGUgPT09IHRoaXMudmlld3BvcnRNaW51dGVcclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5Ub0ZvY3VzKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29sdW1uVG9Gb2N1cy5mb2N1cygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHZhbHVlIGFmdGVyIGEgZ2l2ZW4gc3RlcCBpbiBhIGN5Y2xlXHJcbiAgICAgKiBAcGFyYW0gY3VycmVudFZhbHVlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIGN5Y2xlXHJcbiAgICAgKiBAcGFyYW0gc3RlcCB2YWx1ZSBvZiBzdGVwcyB0byBtb3ZlXHJcbiAgICAgKiBAcGFyYW0gbWF4VmFsdWUgbWF4IHZhbHVlIGluIHRoZSBjeWNsZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldE5leHRWYWx1ZShjdXJyZW50VmFsdWUsIHN0ZXAsIG1heFZhbHVlKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gY3VycmVudFZhbHVlICsgc3RlcDtcclxuICAgICAgICBpZiAobmV4dFZhbHVlID49IG1heFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXh0VmFsdWUgJSBtYXhWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5leHRWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlIGFmdGVyIGEgZ2l2ZW4gc3RlcCBpbiBhIGN5Y2xlXHJcbiAgICAgKiBAcGFyYW0gY3VycmVudFZhbHVlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIGN5Y2xlXHJcbiAgICAgKiBAcGFyYW0gc3RlcCB2YWx1ZSBvZiBzdGVwcyB0byBtb3ZlXHJcbiAgICAgKiBAcGFyYW0gbWF4VmFsdWUgbWF4IHZhbHVlIGluIHRoZSBjeWNsZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFByZXZpb3VzVmFsdWUoY3VycmVudFZhbHVlLCBzdGVwLCBtYXhWYWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IGN1cnJlbnRWYWx1ZSAtIHN0ZXA7XHJcbiAgICAgICAgaWYgKHByZXZWYWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1heFZhbHVlICsgcHJldlZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJldlZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGEgc2VyaWVzIG9mIG51bWJlcnMgcmVwcmVzZW50aW5nIGEgY3ljbGljIHdpbmRvdyBpbiB0aW1lIGdpdmVuIGEgY2VudGVyIChjdXJyZW50IHZhbHVlKSBhbmQgbWF4IHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVUaW1lV2luZG93KGN1cnJlbnRWYWx1ZTogbnVtYmVyLCBtYXg6IG51bWJlciwgY3VycmVudFZhbHVlSW5kZXg6IG51bWJlciwgc3BpblBpdm90PzogbnVtYmVyKTogbnVtYmVyW10ge1xyXG4gICAgICAgIC8vIGdlbmVyYXRlIHdpbmRvdyBiYXNlZCBvbiAwIGlmIHZhbHVlIGlzIGludmFsaWQgKG9jY3VycyB3aGVuIGZvcm0gZmllbGQgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQpXHJcbiAgICAgICAgaWYgKGlzTmFOKGN1cnJlbnRWYWx1ZSkgfHwgTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChjdXJyZW50VmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZpc2libGVSb3dzID0gQ2xvY2tGb3JtRmllbGRDb21wb25lbnQudmlzaWJsZVJvd0NvdW50O1xyXG4gICAgICAgIGNvbnN0IG1pbkluZGV4ID0gMDtcclxuICAgICAgICBjb25zdCBtYXhJbmRleCA9IHZpc2libGVSb3dzIC0gMTtcclxuICAgICAgICBsZXQgcGl2b3RQb2ludCA9IHRoaXMuaXNTY3JvbGxEb3duID8gbWF4SW5kZXggOiBtaW5JbmRleDtcclxuICAgICAgICBpZiAoY3VycmVudFZhbHVlSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIGN1cnJlbnQgdmFsdWUgc3RpbGwgaW4gdGhlIHdpbmRvd1xyXG4gICAgICAgICAgICBwaXZvdFBvaW50ID0gY3VycmVudFZhbHVlSW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQoc3BpblBpdm90KSkge1xyXG4gICAgICAgICAgICAvLyBpZiB3aGVlbCBzcGlubmluZ1xyXG4gICAgICAgICAgICBwaXZvdFBvaW50ID0gc3BpblBpdm90O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGltZVdpbmRvdyA9IG5ldyBBcnJheTxudW1iZXI+KHZpc2libGVSb3dzKS5maWxsKG51bGwpLm1hcCgoXywgaSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaSA9PT0gcGl2b3RQb2ludCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgcGl2b3RQb2ludCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RlcHMgPSBwaXZvdFBvaW50IC0gaTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFByZXZpb3VzVmFsdWUoY3VycmVudFZhbHVlLCBzdGVwcywgbWF4KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBzID0gaSAtIHBpdm90UG9pbnQ7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROZXh0VmFsdWUoY3VycmVudFZhbHVlLCBzdGVwcywgbWF4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aW1lV2luZG93O1xyXG4gICAgfVxyXG59XHJcbiIsIjxzbWUtZm9ybS1maWVsZC1sYXlvdXQgW2Zvcm1GaWVsZF09XCJ0aGlzXCIgcm9sZT1cInJlZ2lvblwiIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS1jbG9jayBzbWUtZm9jdXMtem9uZSBzbWUtZm9ybS1maWVsZC1lZGl0b3IgXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLWNsb2NrLW1haW4tY29udGVudFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLWNsb2NrLWNvbHVtbiBzbWUtY2xvY2stY29sdW1uLWhvdXJzXCIgKHdoZWVsKT1cIm9uSG91cldoZWVsKCRldmVudClcIlxyXG4gICAgICAgICAgIChzY3JvbGwpPVwib25Db2x1bW5TY3JvbGwoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtY2xvY2stY29sdW1uLWhlYWRlclwiPnt7dGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNsb2NrLkhlYWRpbmdzLmhvdXJ9fTwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0Zvcj1cImxldCBob3VyIG9mIGhvdXJzXCIgW2NsYXNzLnNtZS1zZWxlY3RlZF09XCJob3VyLmlzU2VsZWN0ZWRcIiBbdGFiaW5kZXhdPVwiaG91ci5pc1NlbGVjdGVkID8gMCA6IC0xXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkhvdXJDbGlja2VkKCRldmVudCwgaG91cilcIiAoa2V5ZG93bik9XCJvbkhvdXJLZXlkb3duKCRldmVudClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQ2xvY2suSGVhZGluZ3MuaG91ciArIGhvdXIuZGlzcGxheVwiPnt7aG91ci5kaXNwbGF5fX08L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtY2xvY2stY29sdW1uIHNtZS1jbG9jay1jb2x1bW4tbWludXRlc1wiICh3aGVlbCk9XCJvbk1pbnV0ZVdoZWVsKCRldmVudClcIlxyXG4gICAgICAgICAgIChzY3JvbGwpPVwib25Db2x1bW5TY3JvbGwoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtY2xvY2stY29sdW1uLWhlYWRlclwiPnt7dGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNsb2NrLkhlYWRpbmdzLm1pbnV0ZX19PC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nRm9yPVwibGV0IG1pbnV0ZSBvZiBtaW51dGVzXCIgW2NsYXNzLnNtZS1zZWxlY3RlZF09XCJtaW51dGUuaXNTZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwibWludXRlLmlzU2VsZWN0ZWQgPyAwIDogLTFcIiAoY2xpY2spPVwib25NaW51dGVDbGlja2VkKCRldmVudCwgbWludXRlKVwiXHJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk1pbnV0ZUtleWRvd24oJGV2ZW50KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwic3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5DbG9jay5IZWFkaW5ncy5taW51dGUgKyBtaW51dGUuZGlzcGxheVwiPnt7bWludXRlLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cIiEhdmlld3BvcnRNZXJpZGllbVwiIGNsYXNzPVwic21lLWNsb2NrLWNvbHVtbiBzbWUtY2xvY2stY29sdW1uLW1lcmlkaWVtXCJcclxuICAgICAgICAgICAod2hlZWwpPVwib25NZXJpZGllbVdoZWVsKCRldmVudClcIiAoc2Nyb2xsKT1cIm9uQ29sdW1uU2Nyb2xsKCRldmVudClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic21lLWNsb2NrLWNvbHVtbi1oZWFkZXJcIj57e3RoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5DbG9jay5IZWFkaW5ncy5tZXJpZGllbX19PC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nRm9yPVwibGV0IG1lcmlkaWVtIG9mIG1lcmlkaWVtc1wiIGNsYXNzPVwic21lLWNsb2NrLW1lcmlkaWVtLXt7bWVyaWRpZW0udmFsdWV9fVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc21lLXNlbGVjdGVkXT1cIm1lcmlkaWVtLmlzU2VsZWN0ZWRcIiBbdGFiaW5kZXhdPVwibWVyaWRpZW0uaXNTZWxlY3RlZCA/IDAgOiAtMVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25NZXJpZGllbUNsaWNrZWQoJGV2ZW50LCBtZXJpZGllbS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25NZXJpZGllbUtleWRvd24oJGV2ZW50KVwiPnt7bWVyaWRpZW0uZGlzcGxheX19PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0NvbmZpcm1hdGlvblwiIGNsYXNzPVwic21lLWNsb2NrLWNvbmZpcm1hdGlvblwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Db21tb24uYXBwbHlcIiB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkFjY2VwdENsaWNrZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2l6ZS14eHMgc21lLWljb24tYWNjZXB0XCI+PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQ29tbW9uLmNsZWFyXCIgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJlZC5lbWl0KCRldmVudClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNpemUteHhzIHNtZS1pY29uLWNsZWFyXCI+PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxzbWUtdmFsaWRhdGlvbi1hbGVydCAqbmdJZj1cIiFjb21wYWN0XCIgW2FsZXJ0XT1cImFsZXJ0XCI+PC9zbWUtdmFsaWRhdGlvbi1hbGVydD5cclxuPC9zbWUtZm9ybS1maWVsZC1sYXlvdXQ+XHJcbiJdfQ==
|
|
716
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2stZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvY2xvY2svY2xvY2stZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvY2xvY2svY2xvY2stZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDakcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUM1RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFdkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7Ozs7Ozs7OztJQ0hqRixrQ0FDb0s7SUFBNUosd09BQVMsZUFBQSxxQ0FBMkIsQ0FBQSxJQUFDLG9LQUFZLGVBQUEsNEJBQXFCLENBQUEsSUFBakM7SUFBdUgsWUFBZ0I7SUFBQSxpQkFBUzs7OztJQUQ1SSxrREFBc0M7SUFBQyxzREFBcUM7SUFDN0MsdUdBQW1GO0lBQUMsZUFBZ0I7SUFBaEIscUNBQWdCOzs7O0lBS3BMLGtDQUVvSTtJQURwRiw2T0FBUyxl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QXNGLGFBQUEsYUFBQSxhQUFBO1FBRzNCLHVHQUFTLHVCQUFtQixJQUFDLDRGQUNuRSwwQkFBc0IsSUFENkM7UUFFaEYsOEJBQXFDO1FBQUEsWUFBeUQ7UUFBQSxpQkFBTTtRQUNwRyw4RUFDNkw7UUFDL0wsaUJBQU07UUFDTiw4QkFDdUM7UUFEZ0IsdUdBQVMseUJBQXFCLElBQUMsNEZBQ3ZFLDBCQUFzQixJQURpRDtRQUVwRiw4QkFBcUM7UUFBQSxZQUEyRDtRQUFBLGlCQUFNO1FBQ3RHLGdGQUUrSjtRQUNqSyxpQkFBTTtRQUNOLDBFQU9NO1FBQ1IsaUJBQU07UUFDTiwwRUFXTTtRQUNSLGlCQUFNO1FBQ04sNEdBQThFO1FBQ2hGLGlCQUF3Qjs7UUF2Q0QsK0JBQWtCO1FBQWUsMkNBQTZCO1FBS3hDLGVBQXlEO1FBQXpELDBFQUF5RDtRQUN2RCxlQUFRO1FBQVIsbUNBQVE7UUFLVixlQUEyRDtRQUEzRCw0RUFBMkQ7UUFDdkQsZUFBVTtRQUFWLHFDQUFVO1FBSS9DLGVBQXdCO1FBQXhCLDZDQUF3QjtRQVMxQixlQUFzQjtRQUF0QiwyQ0FBc0I7UUFhUCxlQUFjO1FBQWQsbUNBQWM7O0FEbVpuQztJQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7O3FDQUNrQixVQUFVOzs4REFPeEM7QUE2Q0Q7SUFBQyxLQUFLLEVBQUU7Ozs7aUVBTVA7dUZBMWNRLHVCQUF1QjtjQUpuQyxTQUFTOzJCQUNJLDhCQUE4QjsyREFnQ2pDLGdCQUFnQjtrQkFEdEIsS0FBSztZQUVXLFFBQVE7a0JBQXhCLE1BQU07WUFDVSxPQUFPO2tCQUF2QixNQUFNO1lBaVhDLGVBQWUsTUFxRGYsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVUeXBlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RhdGUvZGF0ZS10eXBlJztcclxuaW1wb3J0IHsgRGVib3VuY2UgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGVjb3JhdG9ycy9kZWJvdW5jZS5kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgWWllbGQgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2Jhc2UvZGVjb3JhdG9ycy95aWVsZC5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBLZXlDb2RlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2FjY2Vzc2liaWxpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IEdsb2JhbGl6YXRpb24gfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvZ2xvYmFsaXphdGlvbic7XHJcbmltcG9ydCB7IERvbSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZG9tL2RvbSc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25BbGVydHMgfSBmcm9tICcuLi8uLi92YWxpZGF0aW9uLWFsZXJ0L3ZhbGlkYXRpb24tYWxlcnQnO1xyXG5pbXBvcnQgeyBEYXRlTGlrZUZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtbGlrZS9kYXRlLWxpa2UtZm9ybS1maWVsZC5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUaW1lQmxvY2sge1xyXG4gICAgZGlzcGxheTogc3RyaW5nO1xyXG4gICAgdmFsdWU6IG51bWJlcjtcclxuICAgIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIE1lcmlkaWVtIHtcclxuICAgIEFNID0gJ2FtJyxcclxuICAgIFBNID0gJ3BtJ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBOdWxsYWJsZU1lcmlkaWVtID0gbnVsbCB8IE1lcmlkaWVtO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZXJpZGllbUJsb2NrIHtcclxuICAgIGRpc3BsYXk6IHN0cmluZztcclxuICAgIHZhbHVlOiBNZXJpZGllbTtcclxuICAgIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3BpbiB7XHJcbiAgICB2YWx1ZTogbnVtYmVyO1xyXG4gICAgcGl2b3Q6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENsb2NrIEZvcm0gRmllbGQgQ29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWZvcm0tZmllbGRbdHlwZT1cImNsb2NrXCJdJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jbG9jay1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2xvY2tGb3JtRmllbGRDb21wb25lbnQgZXh0ZW5kcyBEYXRlTGlrZUZvcm1GaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgQ29uc3QgZ2V0dGVyIGZvciBUaGUgdmlzaWJsZSBudW1iZXIgb2Ygcm93cyBmb3IgdGhlIGNsb2NrIGNvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0IHZpc2libGVSb3dDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIC8vIENoYW5nZSB0aGlzIHRvIGNoYW5nZSBob3cgbWFueSByb3dzIHNob3cgaW4gdGhlIFVYXHJcbiAgICAgICAgcmV0dXJuIDc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIG1heGltdW0gbnVtYmVyIG9mIGhvdXJzIGRlcGVuZGluZyBvZiB0aGUgaG91ciBmb3JtYXRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgbWF4SG91cnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlMTJIb3VyRm9ybWF0ID8gMTIgOiAyNDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWludXRlcyBpbiBhbiBob3VyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbWF4TWludXRlcyA9IDYwO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ0Nsb2NrRm9ybUZpZWxkQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dDb25maXJtYXRpb24gPSBmYWxzZTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgYWNjZXB0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBzZWxlY3RlZCB0aW1lIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2aWV3cG9ydFRpbWU6IERhdGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzZWxlY3RlZCBob3Vyc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldCB2aWV3cG9ydEhvdXIoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52aWV3cG9ydFRpbWUgPyB0aGlzLmdldFBhcnNlZEhvdXIodGhpcy52aWV3cG9ydFRpbWUuZ2V0SG91cnMoKSkgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgc2VsZWN0ZWQgbWludXRlc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldCB2aWV3cG9ydE1pbnV0ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdwb3J0VGltZSA/IHRoaXMudmlld3BvcnRUaW1lLmdldE1pbnV0ZXMoKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGxpc3Qgb2YgaG91cnMgaW4gdGhlIGNsb2NrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBob3VyczogVGltZUJsb2NrW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGxpc3Qgb2YgbWludXRlcyBpbiB0aGUgY2xvY2tcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1pbnV0ZXM6IFRpbWVCbG9ja1tdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIG1pbnV0ZXMgaW4gdGhlIGNsb2NrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtZXJpZGllbXM6IE1lcmlkaWVtQmxvY2tbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbml0aWFsIG1lcmlkaWFuIHNob3VsZCByZW1haW4gYXQgdGhlIHRvcFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRpYWxNZXJpZGllbTogTWVyaWRpZW07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBpbmRpY2F0ZXMgdGhlIG1lcmlkaWVtIG9mIHRoZSBjdXJyZW50IHRpbWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB2aWV3cG9ydE1lcmlkaWVtKCk6IE51bGxhYmxlTWVyaWRpZW0ge1xyXG4gICAgICAgIGlmICghdGhpcy51c2UxMkhvdXJGb3JtYXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIDAwIHRvIDExIGlzIGFtLCAxMiB0byAyMyBpcyBwbVxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdwb3J0VGltZSA/IHRoaXMudmlld3BvcnRUaW1lLmdldEhvdXJzKCkgPj0gMTIgPyBNZXJpZGllbS5QTSA6IE1lcmlkaWVtLkFNIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEN1cnJlbnQgc3B1biBob3VyIGFuZCB0aGUgcGl2b3QgcG9pbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzcGluSG91cjogU3BpbiA9IHsgdmFsdWU6IG51bGwsIHBpdm90OiBudWxsIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdXJyZW50IHNwdW4gbWludXRlIGFuZCB0aGUgcGl2b3QgcG9pbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzcGluTWludXRlOiBTcGluID0geyB2YWx1ZTogbnVsbCwgcGl2b3Q6IG51bGwgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGluZGljYXRlcyBpZiBhIHZhbHVlIGNoYW5nZSBpcyBleHBlY3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxvY2FsZURhdGVGb3JtYXQ6IEludGwuRGF0ZVRpbWVGb3JtYXQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbnN3ZXJzLCBpcyB1c2VyIGN1cnJlbnRseSBzY3JvbGxpbmcgZG93bj9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc1Njcm9sbERvd24gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGluZGljYXRlcyBpZiBhIHZhbHVlIGNoYW5nZSBpcyBleHBlY3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxvY2FsZURhdGVGb3JtYXRPcHRpb25zOiBJbnRsLlJlc29sdmVkRGF0ZVRpbWVGb3JtYXRPcHRpb25zO1xyXG5cclxuICAgIHByaXZhdGUgZ2V0IHVzZTEySG91ckZvcm1hdCgpOiBib29sZWFuIHtcclxuICAgICAgICAvLyB0aGlzIGlzIGxlZnQgbnVsbCBpbiBzb21lIDEyIGhvdXIgZm9ybWF0IGxvY2FsZXMgaW4gY2hyb21lLCBleHBsaWNpdGx5IGNoZWNrIGZvciBmYWxzZVxyXG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGVGb3JtYXRPcHRpb25zLmhvdXIxMiAhPT0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHdvcmthcm91bmQgdG8gaGF2ZSBTY3JlZW4gcmVhZGVyIGtub3cgdGhpcyBpcyBhIHJlcXVpcmVkIFwiaW5wdXRcIiBmaWVsZC5cclxuICAgICAqL1xyXG5cclxuICAgIHB1YmxpYyBnZXQgYXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5DbG9jay5BcmlhTGFiZWwuUmVxdWlyZWQuZm9ybWF0KHRoaXMubGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBAc2VlIENsb2NrRm9ybUZpZWxkQ29tcG9uZW50IGNsYXNzLlxyXG4gICAgICogQHBhcmFtIGluamVjdG9yIFRoZSBhbmd1bGFyIGluamVjdGlvbiBzZXJ2aWNlLiByZXF1aXJlZCBieSBAc2VlIFNtZUluamVjdGFibGVCYXNlIGRlY29yYXRvciBpbiB0aGUgQHNlZSBCYXNlQ29tcG9uZW50IGNsYXNzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLmhvdXJzID0gW107XHJcbiAgICAgICAgdGhpcy5taW51dGVzID0gW107XHJcbiAgICAgICAgdGhpcy5sb2NhbGVEYXRlRm9ybWF0ID0gSW50bC5EYXRlVGltZUZvcm1hdChHbG9iYWxpemF0aW9uLmxvY2FsZUlkKTtcclxuICAgICAgICB0aGlzLmxvY2FsZURhdGVGb3JtYXRPcHRpb25zID0gdGhpcy5sb2NhbGVEYXRlRm9ybWF0LnJlc29sdmVkT3B0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5ndWxhciBPbkluaXQgaW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIC8vIERlZmF1bHQgdGltZSBvbiBjbG9jayBpcyB0aGUgY3VycmVudCB0aW1lXHJcbiAgICAgICAgdGhpcy52aWV3cG9ydFRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUaW1lQ29sdW1ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIGlmIGEgZ2l2ZW4gZGF5IGlzIHNlbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc01lcmlkaWVtU2VsZWN0ZWQodmFsdWU6IE1lcmlkaWVtKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld3BvcnRNZXJpZGllbSA9PT0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgd2hlbiBhbiBob3VyIGlzIGNsaWNrZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSG91ckNsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGhvdXI6IFRpbWVCbG9jaykge1xyXG4gICAgICAgIHRoaXMuc2V0SG91cih0aGlzLmNvbnZlcnRUbzI0SG91cnMoaG91ci52YWx1ZSwgdGhpcy52aWV3cG9ydE1lcmlkaWVtKSk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9jY3VycyB3aGVuIGEga2V5IGlzIHByZXNzZWQgZG93biBvbiBhIGhvdXIgYmxvY2tcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSG91cktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlVwQXJyb3c6IHsgdGhpcy5pc1Njcm9sbERvd24gPSBmYWxzZTsgdGhpcy5nb1RvUHJldmlvdXNIb3VyKCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5Eb3duQXJyb3c6IHsgdGhpcy5pc1Njcm9sbERvd24gPSB0cnVlOyB0aGlzLmdvVG9OZXh0SG91cigpOyBicmVhazsgfVxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRW50ZXI6IHsgdGhpcy5mb2N1c09uSG9zdEVsZW1lbnQoKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHsgcmV0dXJuOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgd2hlbiB0aGUgbW91c2Ugd2hlZWwgaXMgbW92ZWQgb24gdGhlIGhvdXIgY29sdW1uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkhvdXJXaGVlbChldmVudDogV2hlZWxFdmVudCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlV2hlZWxTcGluKGV2ZW50LCB0aGlzLmhvdXJzLCB0aGlzLm1heEhvdXJzLCBob3VyID0+IHsgdGhpcy5zcGluSG91ciA9IGhvdXI7IH0pO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgd2hlbiBhbnkgY29sdW1uIGlzIHNjcm9sbGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbHVtblNjcm9sbChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VsZWN0ZWQgdGhlIHByZXZpb3VzIGhvdXIgYmxvY2sgZnJvbSB0aGUgY3VycmVudCBvbmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9QcmV2aW91c0hvdXIoKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNIb3VyID0gdGhpcy5nZXRQcmV2aW91c1ZhbHVlKHRoaXMudmlld3BvcnRIb3VyLCAxLCB0aGlzLm1heEhvdXJzKTtcclxuICAgICAgICB0aGlzLnNldEhvdXIodGhpcy5jb252ZXJ0VG8yNEhvdXJzKHByZXZpb3VzSG91ciwgdGhpcy52aWV3cG9ydE1lcmlkaWVtKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY3RlZCB0aGUgbmV4dCBob3VyIGJsb2NrIGZyb20gdGhlIGN1cnJlbnQgb25lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnb1RvTmV4dEhvdXIoKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dEhvdXIgPSB0aGlzLmdldE5leHRWYWx1ZSh0aGlzLnZpZXdwb3J0SG91ciwgMSwgdGhpcy5tYXhIb3Vycyk7XHJcbiAgICAgICAgdGhpcy5zZXRIb3VyKHRoaXMuY29udmVydFRvMjRIb3VycyhuZXh0SG91ciwgdGhpcy52aWV3cG9ydE1lcmlkaWVtKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBob3VyIGZyb20gYSB0aW1lIGJsb2NrXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0SG91cihob3VyOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZVRpbWUgPSB0aGlzLnZpZXdwb3J0VGltZTtcclxuICAgICAgICB2YWx1ZVRpbWUuc2V0SG91cnMoaG91cik7XHJcbiAgICAgICAgdGhpcy5zcGluSG91ciA9IHsgdmFsdWU6IG51bGwsIHBpdm90OiBudWxsIH07XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZU9yVmlld1BvcnRUaW1lKHZhbHVlVGltZSwgdGhpcy5zaG93Q29uZmlybWF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9jY3VycyB3aGVuIGFuIG1pbnV0ZSBpcyBjbGlja2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbk1pbnV0ZUNsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIG1pbnV0ZTogVGltZUJsb2NrKSB7XHJcbiAgICAgICAgdGhpcy5zZXRNaW51dGUobWludXRlLnZhbHVlKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBkb3duIG9uIGEgbWludXRlIGJsb2NrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbk1pbnV0ZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlVwQXJyb3c6IHsgdGhpcy5pc1Njcm9sbERvd24gPSBmYWxzZTsgdGhpcy5nb1RvUHJldmlvdXNNaW51dGUoKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkRvd25BcnJvdzogeyB0aGlzLmlzU2Nyb2xsRG93biA9IHRydWU7IHRoaXMuZ29Ub05leHRNaW51dGUoKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkVudGVyOiB7IHRoaXMuZm9jdXNPbkhvc3RFbGVtZW50KCk7IHJldHVybjsgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OiB7IHJldHVybjsgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIHdoZW4gdGhlIG1vdXNlIHdoZWVsIGlzIG1vdmVkIG9uIHRoZSBtaW51dGUgY29sdW1uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbk1pbnV0ZVdoZWVsKGV2ZW50OiBXaGVlbEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVXaGVlbFNwaW4oZXZlbnQsIHRoaXMubWludXRlcywgdGhpcy5tYXhNaW51dGVzLCBtaW51dGUgPT4geyB0aGlzLnNwaW5NaW51dGUgPSBtaW51dGU7IH0pO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY3RlZCB0aGUgcHJldmlvdXMgbWludXRlIGJsb2NrIGZyb20gdGhlIGN1cnJlbnQgb25lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnb1RvUHJldmlvdXNNaW51dGUoKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNNaW51dGUgPSB0aGlzLmdldFByZXZpb3VzVmFsdWUodGhpcy52aWV3cG9ydE1pbnV0ZSwgMSwgdGhpcy5tYXhNaW51dGVzKTtcclxuICAgICAgICB0aGlzLnNldE1pbnV0ZShwcmV2aW91c01pbnV0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY3RlZCB0aGUgbmV4dCBtaW51dGUgYmxvY2sgZnJvbSB0aGUgY3VycmVudCBvbmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9OZXh0TWludXRlKCkge1xyXG4gICAgICAgIGNvbnN0IG5leHRNaW51dGUgPSB0aGlzLmdldE5leHRWYWx1ZSh0aGlzLnZpZXdwb3J0TWludXRlLCAxLCB0aGlzLm1heE1pbnV0ZXMpO1xyXG4gICAgICAgIHRoaXMuc2V0TWludXRlKG5leHRNaW51dGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWludXRlIGZyb20gYSB0aW1lIGJsb2NrXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0TWludXRlKG1pbnV0ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVUaW1lID0gdGhpcy52aWV3cG9ydFRpbWU7XHJcbiAgICAgICAgdmFsdWVUaW1lLnNldE1pbnV0ZXMobWludXRlKTtcclxuICAgICAgICB0aGlzLnNwaW5NaW51dGUgPSB7IHZhbHVlOiBudWxsLCBwaXZvdDogbnVsbCB9O1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWVPclZpZXdQb3J0VGltZSh2YWx1ZVRpbWUsIHRoaXMuc2hvd0NvbmZpcm1hdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZSBhbiBob3VyIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBmb3JtYXRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQYXJzZWRIb3VyKHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlMTJIb3VyRm9ybWF0ID8gdmFsdWUgJSAxMiA6IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydCBhIDEyIGhvdXIgc3lzdGVtIHZhbHVlIHRvIHR3ZW50eSBmb3VyIGhvdXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb252ZXJ0VG8yNEhvdXJzKGhvdXI6IG51bWJlciwgbWVyaWRpZW06IE1lcmlkaWVtKSB7XHJcbiAgICAgICAgaWYgKG1lcmlkaWVtID09PSBNZXJpZGllbS5QTSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaG91cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9jY3VycyB3aGVuIGFuIG1lcmlkaWVtIGlzIGNsaWNrZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uTWVyaWRpZW1DbGlja2VkKGV2ZW50OiBNb3VzZUV2ZW50LCBtZXJpZGllbTogTWVyaWRpZW0pIHtcclxuICAgICAgICB0aGlzLnNldE1lcmlkaWVtKG1lcmlkaWVtKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2NjdXJzIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBkb3duIG9uIGEgbWVyaWRpZW0gYmxvY2tcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uTWVyaWRpZW1LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5VcEFycm93OlxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRG93bkFycm93OiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU1lcmlkaWVtKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRW50ZXI6IHsgdGhpcy5mb2N1c09uSG9zdEVsZW1lbnQoKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHsgcmV0dXJuOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgd2hlbiB0aGUgbW91c2Ugd2hlZWwgaXMgbW92ZWQgb24gdGhlIG1lcmlkaWVtIGNvbHVtblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25NZXJpZGllbVdoZWVsKGV2ZW50OiBXaGVlbEV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRvZ2dsZXMgdGhlIG1lcmlkaWVtIGJldHdlZW4gQU0gYW5kIFBNLiBOby1PcCBpZiBtZXJpZGllbSBpcyBub3QgdmFsaWQgaW4gdGhlIGN1cnJlbnQgbG9jYWxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2dnbGVNZXJpZGllbShtZXJpZGllbT86IE1lcmlkaWVtKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZTEySG91ckZvcm1hdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWVyaWRpZW0pIHtcclxuICAgICAgICAgICAgbWVyaWRpZW0gPSB0aGlzLmlzTWVyaWRpZW1TZWxlY3RlZChNZXJpZGllbS5BTSkgPyBNZXJpZGllbS5QTSA6IE1lcmlkaWVtLkFNO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldE1lcmlkaWVtKG1lcmlkaWVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG1lcmlkaWVtIHRvIGVpdGhlciBBTSBvciBQTS4gTm8tT3AgaWYgbWVyaWRpZW0gaXMgbm90IHZhbGlkIGluIHRoZSBjdXJyZW50IGxvY2FsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0TWVyaWRpZW0obWVyaWRpZW06IE1lcmlkaWVtKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZTEySG91ckZvcm1hdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZhbHVlVGltZSA9IHRoaXMudmlld3BvcnRUaW1lO1xyXG4gICAgICAgIHZhbHVlVGltZS5zZXRIb3Vycyh0aGlzLmNvbnZlcnRUbzI0SG91cnModGhpcy52aWV3cG9ydEhvdXIsIG1lcmlkaWVtKSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZU9yVmlld1BvcnRUaW1lKHZhbHVlVGltZSwgdGhpcy5zaG93Q29uZmlybWF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIGFjY2VwdCBidXR0b24gaXMgY2xpY2tlZCB0byBjb21taXQgY2hhbmdlc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25BY2NlcHRDbGlja2VkKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBEYXRlVHlwZS5jb252ZXJ0KHRoaXMudmlld3BvcnRUaW1lLCBNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuZGF0ZVR5cGUpID8gdGhpcy5kZXRlY3RlZERhdGVUeXBlIDogdGhpcy5kYXRlVHlwZSk7XHJcbiAgICAgICAgdGhpcy5hY2NlcHRlZC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgZWl0aGVyIHRoZSBmb3JtIHZhbHVlIG9yIHRoZSB2aWV3cG9ydCB2YWx1ZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdmFsdWUgc2hvdWxkIGJlIHBlcnNpc3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVZhbHVlT3JWaWV3UG9ydFRpbWUodmFsdWU6IERhdGUsIHNldFZpZXdQb3J0OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCFzZXRWaWV3UG9ydCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gRGF0ZVR5cGUuY29udmVydCh2YWx1ZSwgTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLmRhdGVUeXBlKSA/IHRoaXMuZGV0ZWN0ZWREYXRlVHlwZSA6IHRoaXMuZGF0ZVR5cGUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlld3BvcnRUaW1lID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRpbWVDb2x1bW5zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgZXZlcnkgdGltZSB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgY2hhbmdlcywgaW4gdGhlIFVJIG9yIHByb2dyYW1tYXRpY2FsbHkuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKHZhbHVlKSB7XHJcbiAgICAgICAgc3VwZXIub25WYWx1ZUNoYW5nZWQodmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQXNEYXRlID0gRGF0ZVR5cGUuY29udmVydCh2YWx1ZSwgRGF0ZVR5cGUuRGF0ZSk7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRUaW1lID0gdmFsdWVBc0RhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlVGltZUNvbHVtbnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyB2YWxpZGF0aW9uIHRoYXQgaXMgaW50ZXJuYWwgdG8gdGhpcyBjb250cm9sXHJcbiAgICAgKiBAcGFyYW0gYyBUaGUgZm9ybSBjb250cm9sIGF0dGFjaGVkIHRvIHRoaXMgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRlKGM6IEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkFsZXJ0cyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVBc1RpbWUoYykgfHwgc3VwZXIudmFsaWRhdGUoYyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIHRoZSB3aGVlbCBzcGluIG9uIGNvbHVtbnMuIE5vIHZhbHVlIHNlbGVjdGlvbiBpcyBtYWRlIG1pbWlja2luZyB0aGUgYmVoYXZpb3IgaW4gQ2hyb21pdW0gRWRnZVxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoMTApXHJcbiAgICBwcml2YXRlIGhhbmRsZVdoZWVsU3BpbihldmVudDogV2hlZWxFdmVudCwgY29sdW1uOiBUaW1lQmxvY2tbXSwgbWF4OiBudW1iZXIsIHNldFNwaW5WYWx1ZTogKHNwaW46IFNwaW4pID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpc1Njcm9sbFVwID0gZXZlbnQuZGVsdGFZIDwgMDtcclxuICAgICAgICBjb25zdCBuZXdTcGluVmFsdWUgPSBpc1Njcm9sbFVwID9cclxuICAgICAgICAgICAgdGhpcy5nZXROZXh0VmFsdWUoY29sdW1uW2NvbHVtbi5sZW5ndGggLSAxXS52YWx1ZSwgMSwgbWF4KSA6XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJldmlvdXNWYWx1ZShjb2x1bW5bMF0udmFsdWUsIDEsIG1heCk7XHJcbiAgICAgICAgc2V0U3BpblZhbHVlKHsgdmFsdWU6IG5ld1NwaW5WYWx1ZSwgcGl2b3Q6IGlzU2Nyb2xsVXAgPyBjb2x1bW4ubGVuZ3RoIC0gMSA6IDAgfSk7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRpbWVDb2x1bW5zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIHRoZSBmb2N1cyB0byBhIHRoZSBob3VycyBjb2x1bW5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmb2N1c09uSG91cnMoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c09uQ29sdW1uKCcuc21lLWNsb2NrLWNvbHVtbi1ob3VycycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgZm9jdXMgdG8gYSB0aGUgbWludXRlcyBjb2x1bW5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmb2N1c09uTWludXRlKCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNPbkNvbHVtbignLnNtZS1jbG9jay1jb2x1bW4tbWludXRlcycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgZm9jdXMgdG8gYSB0aGUgbWVyaWRpZW0gY29sdW1uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZm9jdXNPbk1lcmlkaWVtKCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNPbkNvbHVtbignLnNtZS1jbG9jay1jb2x1bW4tbWVyaWRpZW0nKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGxpZXMgdGhlIGZvY3VzIHRvIGEgY29sdW1uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZm9jdXNPbkNvbHVtbihjb2x1bW5DbGFzczogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gKDxIVE1MRWxlbWVudD50aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoY29sdW1uQ2xhc3MpO1xyXG4gICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzRWxlbWVudCA9IERvbS5nZXRGaXJzdEZvY3VzYWJsZURlc2NlbmRlbnQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChmb2N1c0VsZW1lbnQpIHsgZm9jdXNFbGVtZW50LmZvY3VzKCk7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIHRoZSBmb2N1cyB0byB0aGUgY3VycmVudCBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvY3VzT25Ib3VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgZm9jdXMgdG8gdGhlIGhvc3QgZWxlbWVudCB3aGVuIHRoZSBjbG9jayByZXRyYWN0c1xyXG4gICAgICovXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSBmb2N1c09uSG9zdEVsZW1lbnQoKSB7XHJcbiAgICAgICAgY29uc3QgZm9jdXNFbGVtZW50ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgaWYgKGZvY3VzRWxlbWVudCkge1xyXG4gICAgICAgICAgICBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIGN1cnJlbnQgdmlld1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlVGltZUNvbHVtbnMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdwb3J0VGltZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhvdXJzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMubWludXRlcyA9IFtdO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNoZWNrIGlmIGZvY3VzIGV4aXN0cyBpbiBvdXIgY29udHJvbCBzbyB3ZSBjYW4gcmVzdG9yZSBpdCB3aGVuIHdlIGFyZSBkb25lLlxyXG4gICAgICAgIGNvbnN0IGNvbHVtblRvRm9jdXMgPSBNc2Z0U21lLmZpbmQoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgIHsgbmFtZTogJ2hvdXJzJywgZm9jdXM6ICgpID0+IHRoaXMuZm9jdXNPbkhvdXJzKCkgfSxcclxuICAgICAgICAgICAgICAgIHsgbmFtZTogJ21pbnV0ZXMnLCBmb2N1czogKCkgPT4gdGhpcy5mb2N1c09uTWludXRlKCkgfSxcclxuICAgICAgICAgICAgICAgIHsgbmFtZTogJ21lcmlkaWVtJywgZm9jdXM6ICgpID0+IHRoaXMuZm9jdXNPbk1lcmlkaWVtKCkgfVxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGAuc21lLWNsb2NrLWNvbHVtbi0ke2NvbHVtbi5uYW1lfSAuc21lLXNlbGVjdGVkYCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWxlbWVudDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsTWVyaWRpZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsTWVyaWRpZW0gPSB0aGlzLnZpZXdwb3J0TWVyaWRpZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFsdE1lcmlkaWVtID0gTWVyaWRpZW0uQU0gPT09IHRoaXMuaW5pdGlhbE1lcmlkaWVtID8gTWVyaWRpZW0uUE0gOiBNZXJpZGllbS5BTTtcclxuICAgICAgICBjb25zdCBhbUxhYmVsID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNsb2NrLk1lcmlkaWVtLkFNLmxhYmVsO1xyXG4gICAgICAgIGNvbnN0IHBtTGFiZWwgPSB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQ2xvY2suTWVyaWRpZW0uUE0ubGFiZWw7XHJcbiAgICAgICAgbGV0IGluaXRpYWxNZXJpZGllbUxhYmVsO1xyXG4gICAgICAgIGxldCBhbHRNZXJpZGllbUxhYmVsO1xyXG4gICAgICAgIGlmIChNZXJpZGllbS5BTSA9PT0gdGhpcy5pbml0aWFsTWVyaWRpZW0pIHtcclxuICAgICAgICAgICAgaW5pdGlhbE1lcmlkaWVtTGFiZWwgPSBhbUxhYmVsO1xyXG4gICAgICAgICAgICBhbHRNZXJpZGllbUxhYmVsID0gcG1MYWJlbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbml0aWFsTWVyaWRpZW1MYWJlbCA9IHBtTGFiZWw7XHJcbiAgICAgICAgICAgIGFsdE1lcmlkaWVtTGFiZWwgPSBhbUxhYmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lcmlkaWVtcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheTogaW5pdGlhbE1lcmlkaWVtTGFiZWwsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5pbml0aWFsTWVyaWRpZW0sXHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiB0aGlzLmlzTWVyaWRpZW1TZWxlY3RlZCh0aGlzLmluaXRpYWxNZXJpZGllbSlcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYWx0TWVyaWRpZW1MYWJlbCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBhbHRNZXJpZGllbSxcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHRoaXMuaXNNZXJpZGllbVNlbGVjdGVkKGFsdE1lcmlkaWVtKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRIb3VyID0gdGhpcy52aWV3cG9ydEhvdXI7XHJcbiAgICAgICAgY29uc3QgY3VycmVudEhvdXIgPSBNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuc3BpbkhvdXIudmFsdWUpID8gc2VsZWN0ZWRIb3VyIDogdGhpcy5zcGluSG91ci52YWx1ZTtcclxuICAgICAgICB0aGlzLmhvdXJzID0gdGhpcy5nZW5lcmF0ZVRpbWVXaW5kb3coXHJcbiAgICAgICAgICAgIGN1cnJlbnRIb3VyLFxyXG4gICAgICAgICAgICB0aGlzLm1heEhvdXJzLFxyXG4gICAgICAgICAgICB0aGlzLmhvdXJzLmZpbmRJbmRleCgoaG91cikgPT4gaG91ci52YWx1ZSA9PT0gc2VsZWN0ZWRIb3VyKSxcclxuICAgICAgICAgICAgdGhpcy5zcGluSG91ci5waXZvdCkubWFwKGhvdXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gZGlzcGxheSB2YWx1ZSBpcyBwYWRkZWQgdG8gMiBkaWdpdHNcclxuICAgICAgICAgICAgICAgIGxldCBkaXNwbGF5VmFsdWU6IHN0cmluZyA9IGAwJHtob3VyfWAuc2xpY2UoLTIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlMTJIb3VyRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvdXIgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlID0gJzEyJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBibG9jazogVGltZUJsb2NrID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGRpc3BsYXlWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaG91cixcclxuICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBob3VyID09PSBzZWxlY3RlZEhvdXJcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50TWludXRlID0gTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLnNwaW5NaW51dGUudmFsdWUpID8gdGhpcy52aWV3cG9ydE1pbnV0ZSA6IHRoaXMuc3Bpbk1pbnV0ZS52YWx1ZTtcclxuICAgICAgICB0aGlzLm1pbnV0ZXMgPSB0aGlzLmdlbmVyYXRlVGltZVdpbmRvdyhcclxuICAgICAgICAgICAgY3VycmVudE1pbnV0ZSxcclxuICAgICAgICAgICAgdGhpcy5tYXhNaW51dGVzLFxyXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgKG1pbnV0ZSkgPT4gbWludXRlLnZhbHVlID09PSB0aGlzLnZpZXdwb3J0TWludXRlXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRoaXMuc3Bpbk1pbnV0ZS5waXZvdFxyXG4gICAgICAgICkubWFwKG1pbnV0ZSA9PiAoe1xyXG4gICAgICAgICAgICAvLyBkaXNwbGF5IHZhbHVlIGlzIHBhZGRlZCB0byAyIGRpZ2l0c1xyXG4gICAgICAgICAgICBkaXNwbGF5OiBgMCR7bWludXRlfWAuc2xpY2UoLTIpLFxyXG4gICAgICAgICAgICB2YWx1ZTogbWludXRlLFxyXG4gICAgICAgICAgICBpc1NlbGVjdGVkOiBtaW51dGUgPT09IHRoaXMudmlld3BvcnRNaW51dGVcclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5Ub0ZvY3VzKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29sdW1uVG9Gb2N1cy5mb2N1cygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHZhbHVlIGFmdGVyIGEgZ2l2ZW4gc3RlcCBpbiBhIGN5Y2xlXHJcbiAgICAgKiBAcGFyYW0gY3VycmVudFZhbHVlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIGN5Y2xlXHJcbiAgICAgKiBAcGFyYW0gc3RlcCB2YWx1ZSBvZiBzdGVwcyB0byBtb3ZlXHJcbiAgICAgKiBAcGFyYW0gbWF4VmFsdWUgbWF4IHZhbHVlIGluIHRoZSBjeWNsZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldE5leHRWYWx1ZShjdXJyZW50VmFsdWUsIHN0ZXAsIG1heFZhbHVlKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gY3VycmVudFZhbHVlICsgc3RlcDtcclxuICAgICAgICBpZiAobmV4dFZhbHVlID49IG1heFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXh0VmFsdWUgJSBtYXhWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5leHRWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlIGFmdGVyIGEgZ2l2ZW4gc3RlcCBpbiBhIGN5Y2xlXHJcbiAgICAgKiBAcGFyYW0gY3VycmVudFZhbHVlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIGN5Y2xlXHJcbiAgICAgKiBAcGFyYW0gc3RlcCB2YWx1ZSBvZiBzdGVwcyB0byBtb3ZlXHJcbiAgICAgKiBAcGFyYW0gbWF4VmFsdWUgbWF4IHZhbHVlIGluIHRoZSBjeWNsZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFByZXZpb3VzVmFsdWUoY3VycmVudFZhbHVlLCBzdGVwLCBtYXhWYWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IGN1cnJlbnRWYWx1ZSAtIHN0ZXA7XHJcbiAgICAgICAgaWYgKHByZXZWYWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1heFZhbHVlICsgcHJldlZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJldlZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGEgc2VyaWVzIG9mIG51bWJlcnMgcmVwcmVzZW50aW5nIGEgY3ljbGljIHdpbmRvdyBpbiB0aW1lIGdpdmVuIGEgY2VudGVyIChjdXJyZW50IHZhbHVlKSBhbmQgbWF4IHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVUaW1lV2luZG93KGN1cnJlbnRWYWx1ZTogbnVtYmVyLCBtYXg6IG51bWJlciwgY3VycmVudFZhbHVlSW5kZXg6IG51bWJlciwgc3BpblBpdm90PzogbnVtYmVyKTogbnVtYmVyW10ge1xyXG4gICAgICAgIC8vIGdlbmVyYXRlIHdpbmRvdyBiYXNlZCBvbiAwIGlmIHZhbHVlIGlzIGludmFsaWQgKG9jY3VycyB3aGVuIGZvcm0gZmllbGQgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQpXHJcbiAgICAgICAgaWYgKGlzTmFOKGN1cnJlbnRWYWx1ZSkgfHwgTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChjdXJyZW50VmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZpc2libGVSb3dzID0gQ2xvY2tGb3JtRmllbGRDb21wb25lbnQudmlzaWJsZVJvd0NvdW50O1xyXG4gICAgICAgIGNvbnN0IG1pbkluZGV4ID0gMDtcclxuICAgICAgICBjb25zdCBtYXhJbmRleCA9IHZpc2libGVSb3dzIC0gMTtcclxuICAgICAgICBsZXQgcGl2b3RQb2ludCA9IHRoaXMuaXNTY3JvbGxEb3duID8gbWF4SW5kZXggOiBtaW5JbmRleDtcclxuICAgICAgICBpZiAoY3VycmVudFZhbHVlSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIGN1cnJlbnQgdmFsdWUgc3RpbGwgaW4gdGhlIHdpbmRvd1xyXG4gICAgICAgICAgICBwaXZvdFBvaW50ID0gY3VycmVudFZhbHVlSW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQoc3BpblBpdm90KSkge1xyXG4gICAgICAgICAgICAvLyBpZiB3aGVlbCBzcGlubmluZ1xyXG4gICAgICAgICAgICBwaXZvdFBvaW50ID0gc3BpblBpdm90O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGltZVdpbmRvdyA9IG5ldyBBcnJheTxudW1iZXI+KHZpc2libGVSb3dzKS5maWxsKG51bGwpLm1hcCgoXywgaSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaSA9PT0gcGl2b3RQb2ludCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgcGl2b3RQb2ludCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RlcHMgPSBwaXZvdFBvaW50IC0gaTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFByZXZpb3VzVmFsdWUoY3VycmVudFZhbHVlLCBzdGVwcywgbWF4KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBzID0gaSAtIHBpdm90UG9pbnQ7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROZXh0VmFsdWUoY3VycmVudFZhbHVlLCBzdGVwcywgbWF4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aW1lV2luZG93O1xyXG4gICAgfVxyXG59XHJcbiIsIjxzbWUtZm9ybS1maWVsZC1sYXlvdXQgW2Zvcm1GaWVsZF09XCJ0aGlzXCIgcm9sZT1cInJlZ2lvblwiIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS1jbG9jayBzbWUtZm9jdXMtem9uZSBzbWUtZm9ybS1maWVsZC1lZGl0b3IgXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLWNsb2NrLW1haW4tY29udGVudFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLWNsb2NrLWNvbHVtbiBzbWUtY2xvY2stY29sdW1uLWhvdXJzXCIgKHdoZWVsKT1cIm9uSG91cldoZWVsKCRldmVudClcIlxyXG4gICAgICAgICAgIChzY3JvbGwpPVwib25Db2x1bW5TY3JvbGwoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtY2xvY2stY29sdW1uLWhlYWRlclwiPnt7dGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNsb2NrLkhlYWRpbmdzLmhvdXJ9fTwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0Zvcj1cImxldCBob3VyIG9mIGhvdXJzXCIgW2NsYXNzLnNtZS1zZWxlY3RlZF09XCJob3VyLmlzU2VsZWN0ZWRcIiBbdGFiaW5kZXhdPVwiaG91ci5pc1NlbGVjdGVkID8gMCA6IC0xXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkhvdXJDbGlja2VkKCRldmVudCwgaG91cilcIiAoa2V5ZG93bik9XCJvbkhvdXJLZXlkb3duKCRldmVudClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQ2xvY2suSGVhZGluZ3MuaG91ciArIGhvdXIuZGlzcGxheVwiPnt7aG91ci5kaXNwbGF5fX08L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtY2xvY2stY29sdW1uIHNtZS1jbG9jay1jb2x1bW4tbWludXRlc1wiICh3aGVlbCk9XCJvbk1pbnV0ZVdoZWVsKCRldmVudClcIlxyXG4gICAgICAgICAgIChzY3JvbGwpPVwib25Db2x1bW5TY3JvbGwoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtY2xvY2stY29sdW1uLWhlYWRlclwiPnt7dGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNsb2NrLkhlYWRpbmdzLm1pbnV0ZX19PC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nRm9yPVwibGV0IG1pbnV0ZSBvZiBtaW51dGVzXCIgW2NsYXNzLnNtZS1zZWxlY3RlZF09XCJtaW51dGUuaXNTZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwibWludXRlLmlzU2VsZWN0ZWQgPyAwIDogLTFcIiAoY2xpY2spPVwib25NaW51dGVDbGlja2VkKCRldmVudCwgbWludXRlKVwiXHJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk1pbnV0ZUtleWRvd24oJGV2ZW50KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwic3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5DbG9jay5IZWFkaW5ncy5taW51dGUgKyBtaW51dGUuZGlzcGxheVwiPnt7bWludXRlLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cIiEhdmlld3BvcnRNZXJpZGllbVwiIGNsYXNzPVwic21lLWNsb2NrLWNvbHVtbiBzbWUtY2xvY2stY29sdW1uLW1lcmlkaWVtXCJcclxuICAgICAgICAgICAod2hlZWwpPVwib25NZXJpZGllbVdoZWVsKCRldmVudClcIiAoc2Nyb2xsKT1cIm9uQ29sdW1uU2Nyb2xsKCRldmVudClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic21lLWNsb2NrLWNvbHVtbi1oZWFkZXJcIj57e3RoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5DbG9jay5IZWFkaW5ncy5tZXJpZGllbX19PC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nRm9yPVwibGV0IG1lcmlkaWVtIG9mIG1lcmlkaWVtc1wiIGNsYXNzPVwic21lLWNsb2NrLW1lcmlkaWVtLXt7bWVyaWRpZW0udmFsdWV9fVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc21lLXNlbGVjdGVkXT1cIm1lcmlkaWVtLmlzU2VsZWN0ZWRcIiBbdGFiaW5kZXhdPVwibWVyaWRpZW0uaXNTZWxlY3RlZCA/IDAgOiAtMVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25NZXJpZGllbUNsaWNrZWQoJGV2ZW50LCBtZXJpZGllbS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25NZXJpZGllbUtleWRvd24oJGV2ZW50KVwiPnt7bWVyaWRpZW0uZGlzcGxheX19PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0NvbmZpcm1hdGlvblwiIGNsYXNzPVwic21lLWNsb2NrLWNvbmZpcm1hdGlvblwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbdGl0bGVdPVwidGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNvbW1vbi5hcHBseVwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQ29tbW9uLmFwcGx5XCIgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAoY2xpY2spPVwib25BY2NlcHRDbGlja2VkKCRldmVudClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNpemUteHhzIHNtZS1pY29uLWFjY2VwdFwiPjwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFt0aXRsZV09XCJ0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQ29tbW9uLmNsZWFyXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Db21tb24uY2xlYXJcIiB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgIChjbGljayk9XCJjbGVhcmVkLmVtaXQoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2l6ZS14eHMgc21lLWljb24tY2xlYXJcIj48L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPHNtZS12YWxpZGF0aW9uLWFsZXJ0ICpuZ0lmPVwiIWNvbXBhY3RcIiBbYWxlcnRdPVwiYWxlcnRcIj48L3NtZS12YWxpZGF0aW9uLWFsZXJ0PlxyXG48L3NtZS1mb3JtLWZpZWxkLWxheW91dD5cclxuIl19
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { ElementRef, Injectable } from '@angular/core';
|
|
3
|
+
import { Debounce } from '@microsoft/windows-admin-center-sdk/core/index';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* A re-usable form field accessibility manager.
|
|
7
|
+
*/
|
|
8
|
+
export class FormFieldAccessibilityManagerBaseService {
|
|
9
|
+
/**
|
|
10
|
+
* The focus handler on delete/add if the form field is a list.
|
|
11
|
+
* @param value The value for the list form field.
|
|
12
|
+
* @param addButton The component reference for the add button.
|
|
13
|
+
* @param hostElement The host element reference.
|
|
14
|
+
* @param isDelete Determine if the action is delete.
|
|
15
|
+
* @returns void
|
|
16
|
+
*/
|
|
17
|
+
listFormFieldFocusHandlerOnKeyboardAction(value, addButton, hostElement, isDelete = true) {
|
|
18
|
+
// If there are no items in the list, focus on the add button.
|
|
19
|
+
if (!value || !value.length) {
|
|
20
|
+
this.deferredFocusOnAddButton(addButton);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// Otherwise focus on the either the first input fields when it is delete or the last input field when it is add.
|
|
24
|
+
this.deferredFocusOnInputFields(hostElement, value, isDelete);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The focus handler on delete/add if the form field is a list. And the list is built with a specific selector.
|
|
28
|
+
* @param value The value for the list form field.
|
|
29
|
+
* @param addButton The component reference for the add button.
|
|
30
|
+
* @param hostElement The host element reference.
|
|
31
|
+
* @param selector The selector for the input fields.
|
|
32
|
+
* @returns void
|
|
33
|
+
*/
|
|
34
|
+
listFormFieldFocusHandlerOnKeyboardActionBySelector(value, addButton, hostElement, selector) {
|
|
35
|
+
// If there are no items in the list, focus on the add button.
|
|
36
|
+
if (!value || !value.length) {
|
|
37
|
+
this.deferredFocusOnAddButton(addButton);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Otherwise focus on the either the first input fields when it is delete or the last input field when it is add.
|
|
41
|
+
this.deferredFocusOnTargetBySelector(value, hostElement, selector);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* It handles the focus on the input field by index if value is type of any[].
|
|
45
|
+
* @param hostElement the host form field element.
|
|
46
|
+
* @param index the index of the input field to focus on.
|
|
47
|
+
* @returns void.
|
|
48
|
+
*/
|
|
49
|
+
focusOnInputByIndex(hostElement, index) {
|
|
50
|
+
const inputs = hostElement.nativeElement.querySelectorAll('input');
|
|
51
|
+
if (index < 0 || index >= inputs.length) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
inputs[index].focus();
|
|
55
|
+
}
|
|
56
|
+
deferredFocusOnTargetBySelector(value, hostElement, selector) {
|
|
57
|
+
if (!value || !value.length) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const targets = hostElement.nativeElement.querySelectorAll(selector);
|
|
61
|
+
if (!targets || !targets.length) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
targets[0].focus();
|
|
65
|
+
}
|
|
66
|
+
deferredFocusOnAddButton(addButton) {
|
|
67
|
+
if (!addButton) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
addButton.nativeElement.focus();
|
|
71
|
+
}
|
|
72
|
+
deferredFocusOnInputFields(hostElement, value, isDelete = true) {
|
|
73
|
+
if (!value || !value.length) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.focusOnInputByIndex(hostElement, isDelete ? 0 : value.length - 1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** @nocollapse */ FormFieldAccessibilityManagerBaseService.ɵfac = function FormFieldAccessibilityManagerBaseService_Factory(t) { return new (t || FormFieldAccessibilityManagerBaseService)(); };
|
|
80
|
+
/** @nocollapse */ FormFieldAccessibilityManagerBaseService.ɵprov = /** @pureOrBreakMyCode */ i0.ɵɵdefineInjectable({ token: FormFieldAccessibilityManagerBaseService, factory: FormFieldAccessibilityManagerBaseService.ɵfac, providedIn: 'root' });
|
|
81
|
+
__decorate([
|
|
82
|
+
Debounce(),
|
|
83
|
+
__metadata("design:type", Function),
|
|
84
|
+
__metadata("design:paramtypes", [Array, ElementRef, String]),
|
|
85
|
+
__metadata("design:returntype", void 0)
|
|
86
|
+
], FormFieldAccessibilityManagerBaseService.prototype, "deferredFocusOnTargetBySelector", null);
|
|
87
|
+
__decorate([
|
|
88
|
+
Debounce(),
|
|
89
|
+
__metadata("design:type", Function),
|
|
90
|
+
__metadata("design:paramtypes", [ElementRef]),
|
|
91
|
+
__metadata("design:returntype", void 0)
|
|
92
|
+
], FormFieldAccessibilityManagerBaseService.prototype, "deferredFocusOnAddButton", null);
|
|
93
|
+
__decorate([
|
|
94
|
+
Debounce(),
|
|
95
|
+
__metadata("design:type", Function),
|
|
96
|
+
__metadata("design:paramtypes", [ElementRef, Array, Object]),
|
|
97
|
+
__metadata("design:returntype", void 0)
|
|
98
|
+
], FormFieldAccessibilityManagerBaseService.prototype, "deferredFocusOnInputFields", null);
|
|
99
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormFieldAccessibilityManagerBaseService, [{
|
|
100
|
+
type: Injectable,
|
|
101
|
+
args: [{
|
|
102
|
+
providedIn: 'root'
|
|
103
|
+
}]
|
|
104
|
+
}], null, { deferredFocusOnTargetBySelector: [], deferredFocusOnAddButton: [], deferredFocusOnInputFields: [] }); })();
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZC1hY2Nlc3NpYmlsaXR5LW1hbmFnZXItYmFzZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZm9ybS9mb3JtLWZpZWxkL2Zvcm0tZmllbGQtYWNjZXNzaWJpbGl0eS1tYW5hZ2VyLWJhc2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOztBQUUxRTs7R0FFRztBQUlILE1BQU0sT0FBTyx3Q0FBd0M7SUFDakQ7Ozs7Ozs7T0FPRztJQUNJLHlDQUF5QyxDQUFDLEtBQWUsRUFBRSxTQUFpQyxFQUFFLFdBQXVCLEVBQUUsUUFBUSxHQUFHLElBQUk7UUFDekksOERBQThEO1FBQzlELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ3pCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QyxPQUFPO1NBQ1Y7UUFFRCxpSEFBaUg7UUFDakgsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxtREFBbUQsQ0FBQyxLQUFlLEVBQUUsU0FBaUMsRUFBRSxXQUF1QixFQUFFLFFBQWdCO1FBQ3BKLDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUN6QixJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekMsT0FBTztTQUNWO1FBRUQsaUhBQWlIO1FBQ2pILElBQUksQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLG1CQUFtQixDQUFDLFdBQXVCLEVBQUUsS0FBYTtRQUM3RCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25FLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNyQyxPQUFPO1NBQ1Y7UUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUdNLCtCQUErQixDQUFDLEtBQWUsRUFBRSxXQUF1QixFQUFFLFFBQWdCO1FBQzdGLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ3pCLE9BQU87U0FDVjtRQUVELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDN0IsT0FBTztTQUNWO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFHUyx3QkFBd0IsQ0FBQyxTQUFpQztRQUNoRSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ1osT0FBTztTQUNWO1FBRUQsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBR1MsMEJBQTBCLENBQUMsV0FBdUIsRUFBRSxLQUFlLEVBQUUsUUFBUSxHQUFHLElBQUk7UUFDMUYsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDekIsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDOzttSkFwRlEsd0NBQXdDOzZIQUF4Qyx3Q0FBd0MsV0FBeEMsd0NBQXdDLG1CQUZ2QyxNQUFNO0FBd0RoQjtJQUFDLFFBQVEsRUFBRTs7NENBQzBELFVBQVU7OytGQVc5RTtBQUVEO0lBQUMsUUFBUSxFQUFFOztxQ0FDbUMsVUFBVTs7d0ZBTXZEO0FBRUQ7SUFBQyxRQUFRLEVBQUU7O3FDQUN1QyxVQUFVOzswRkFNM0Q7dUZBcEZRLHdDQUF3QztjQUhwRCxVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7Z0JBd0RVLCtCQUErQixNQWM1Qix3QkFBd0IsTUFTeEIsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvaW5kZXgnO1xyXG5cclxuLyoqXHJcbiAqIEEgcmUtdXNhYmxlIGZvcm0gZmllbGQgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyLlxyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUZpZWxkQWNjZXNzaWJpbGl0eU1hbmFnZXJCYXNlU2VydmljZSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmb2N1cyBoYW5kbGVyIG9uIGRlbGV0ZS9hZGQgaWYgdGhlIGZvcm0gZmllbGQgaXMgYSBsaXN0LlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBmb3IgdGhlIGxpc3QgZm9ybSBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBhZGRCdXR0b24gVGhlIGNvbXBvbmVudCByZWZlcmVuY2UgZm9yIHRoZSBhZGQgYnV0dG9uLlxyXG4gICAgICogQHBhcmFtIGhvc3RFbGVtZW50IFRoZSBob3N0IGVsZW1lbnQgcmVmZXJlbmNlLlxyXG4gICAgICogQHBhcmFtIGlzRGVsZXRlIERldGVybWluZSBpZiB0aGUgYWN0aW9uIGlzIGRlbGV0ZS5cclxuICAgICAqIEByZXR1cm5zIHZvaWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxpc3RGb3JtRmllbGRGb2N1c0hhbmRsZXJPbktleWJvYXJkQWN0aW9uKHZhbHVlOiBzdHJpbmdbXSwgYWRkQnV0dG9uOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkLCBob3N0RWxlbWVudDogRWxlbWVudFJlZiwgaXNEZWxldGUgPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zIGluIHRoZSBsaXN0LCBmb2N1cyBvbiB0aGUgYWRkIGJ1dHRvbi5cclxuICAgICAgICBpZiAoIXZhbHVlIHx8ICF2YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWZlcnJlZEZvY3VzT25BZGRCdXR0b24oYWRkQnV0dG9uKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gT3RoZXJ3aXNlIGZvY3VzIG9uIHRoZSBlaXRoZXIgdGhlIGZpcnN0IGlucHV0IGZpZWxkcyB3aGVuIGl0IGlzIGRlbGV0ZSBvciB0aGUgbGFzdCBpbnB1dCBmaWVsZCB3aGVuIGl0IGlzIGFkZC5cclxuICAgICAgICB0aGlzLmRlZmVycmVkRm9jdXNPbklucHV0RmllbGRzKGhvc3RFbGVtZW50LCB2YWx1ZSwgaXNEZWxldGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZvY3VzIGhhbmRsZXIgb24gZGVsZXRlL2FkZCBpZiB0aGUgZm9ybSBmaWVsZCBpcyBhIGxpc3QuIEFuZCB0aGUgbGlzdCBpcyBidWlsdCB3aXRoIGEgc3BlY2lmaWMgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgbGlzdCBmb3JtIGZpZWxkLlxyXG4gICAgICogQHBhcmFtIGFkZEJ1dHRvbiBUaGUgY29tcG9uZW50IHJlZmVyZW5jZSBmb3IgdGhlIGFkZCBidXR0b24uXHJcbiAgICAgKiBAcGFyYW0gaG9zdEVsZW1lbnQgVGhlIGhvc3QgZWxlbWVudCByZWZlcmVuY2UuXHJcbiAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIGZvciB0aGUgaW5wdXQgZmllbGRzLlxyXG4gICAgICogQHJldHVybnMgdm9pZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGlzdEZvcm1GaWVsZEZvY3VzSGFuZGxlck9uS2V5Ym9hcmRBY3Rpb25CeVNlbGVjdG9yKHZhbHVlOiBzdHJpbmdbXSwgYWRkQnV0dG9uOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkLCBob3N0RWxlbWVudDogRWxlbWVudFJlZiwgc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcyBpbiB0aGUgbGlzdCwgZm9jdXMgb24gdGhlIGFkZCBidXR0b24uXHJcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVmZXJyZWRGb2N1c09uQWRkQnV0dG9uKGFkZEJ1dHRvbik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE90aGVyd2lzZSBmb2N1cyBvbiB0aGUgZWl0aGVyIHRoZSBmaXJzdCBpbnB1dCBmaWVsZHMgd2hlbiBpdCBpcyBkZWxldGUgb3IgdGhlIGxhc3QgaW5wdXQgZmllbGQgd2hlbiBpdCBpcyBhZGQuXHJcbiAgICAgICAgdGhpcy5kZWZlcnJlZEZvY3VzT25UYXJnZXRCeVNlbGVjdG9yKHZhbHVlLCBob3N0RWxlbWVudCwgc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgZm9jdXMgb24gdGhlIGlucHV0IGZpZWxkIGJ5IGluZGV4IGlmIHZhbHVlIGlzIHR5cGUgb2YgYW55W10uXHJcbiAgICAgKiBAcGFyYW0gaG9zdEVsZW1lbnQgdGhlIGhvc3QgZm9ybSBmaWVsZCBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaW5wdXQgZmllbGQgdG8gZm9jdXMgb24uXHJcbiAgICAgKiBAcmV0dXJucyB2b2lkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZm9jdXNPbklucHV0QnlJbmRleChob3N0RWxlbWVudDogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlucHV0cyA9IGhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKTtcclxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGlucHV0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW5wdXRzW2luZGV4XS5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwdWJsaWMgZGVmZXJyZWRGb2N1c09uVGFyZ2V0QnlTZWxlY3Rvcih2YWx1ZTogc3RyaW5nW10sIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmLCBzZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xyXG4gICAgICAgIGlmICghdGFyZ2V0cyB8fCAhdGFyZ2V0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGFyZ2V0c1swXS5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwcm90ZWN0ZWQgZGVmZXJyZWRGb2N1c09uQWRkQnV0dG9uKGFkZEJ1dHRvbjogRWxlbWVudFJlZiB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICghYWRkQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFkZEJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQERlYm91bmNlKClcclxuICAgIHByb3RlY3RlZCBkZWZlcnJlZEZvY3VzT25JbnB1dEZpZWxkcyhob3N0RWxlbWVudDogRWxlbWVudFJlZiwgdmFsdWU6IHN0cmluZ1tdLCBpc0RlbGV0ZSA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXZhbHVlIHx8ICF2YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb2N1c09uSW5wdXRCeUluZGV4KGhvc3RFbGVtZW50LCBpc0RlbGV0ZSA/IDAgOiB2YWx1ZS5sZW5ndGggLSAxKTtcclxuICAgIH1cclxufVxyXG4iXX0=
|