studiokit-scaffolding-js 7.0.14-alpha.1 → 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/ActionList.d.ts +2 -2
- package/lib/components/ActionList.js +166 -87
- package/lib/components/AlertDialog.d.ts +3 -3
- package/lib/components/AlertDialog.js +133 -18
- package/lib/components/AlertWithIcon.js +93 -52
- package/lib/components/ConnectedModal.d.ts +1 -2
- package/lib/components/ConnectedModal.js +41 -35
- package/lib/components/Dropdowns/GroupsDropdown.d.ts +4 -4
- package/lib/components/Dropdowns/GroupsDropdown.js +69 -82
- package/lib/components/Dropdowns/ManagedNavDropdown.d.ts +2 -2
- package/lib/components/Dropdowns/ManagedNavDropdown.js +96 -108
- package/lib/components/Dropdowns/UserDropdown.js +109 -70
- package/lib/components/Dropdowns/index.js +27 -11
- package/lib/components/EntityOwnerList.d.ts +3 -3
- package/lib/components/EntityOwnerList.js +52 -60
- package/lib/components/Error.js +107 -27
- package/lib/components/ErrorBoundary.js +133 -94
- package/lib/components/ErrorMessage.d.ts +2 -2
- package/lib/components/ErrorMessage.js +44 -14
- package/lib/components/Forms/DateField.d.ts +2 -2
- package/lib/components/Forms/DateField.js +63 -95
- package/lib/components/Forms/TimeField.d.ts +2 -2
- package/lib/components/Forms/TimeField.js +84 -108
- package/lib/components/Forms/index.js +27 -13
- package/lib/components/Groups/CreateEditCopySaveButtons.d.ts +2 -2
- package/lib/components/Groups/CreateEditCopySaveButtons.js +102 -14
- package/lib/components/Groups/ExternalGroups/Attach.d.ts +6 -7
- package/lib/components/Groups/ExternalGroups/Attach.js +213 -188
- package/lib/components/Groups/ExternalGroups/Table.js +183 -76
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +5 -1
- package/lib/components/Groups/RosterSyncInfo.js +140 -49
- package/lib/components/HOC/AccessibleAppComponent.d.ts +2 -2
- package/lib/components/HOC/AccessibleAppComponent.js +96 -119
- package/lib/components/HOC/ActivityRequiredComponent.d.ts +14 -14
- package/lib/components/HOC/ActivityRequiredComponent.js +72 -86
- package/lib/components/HOC/AsyncComponent.d.ts +9 -9
- package/lib/components/HOC/AsyncComponent.js +53 -129
- package/lib/components/HOC/AuthenticatedComponent.d.ts +4 -4
- package/lib/components/HOC/AuthenticatedComponent.js +59 -96
- package/lib/components/HOC/CollectionComponent.d.ts +12 -12
- package/lib/components/HOC/CollectionComponent.js +161 -161
- package/lib/components/HOC/CollectionFirstItemComponent.d.ts +13 -13
- package/lib/components/HOC/CollectionFirstItemComponent.js +49 -91
- package/lib/components/HOC/CollectionItemComponent.d.ts +9 -9
- package/lib/components/HOC/CollectionItemComponent.js +159 -158
- package/lib/components/HOC/ConnectedModalComponent.d.ts +9 -9
- package/lib/components/HOC/ConnectedModalComponent.js +96 -126
- package/lib/components/HOC/DataDependentComponent.d.ts +3 -55
- package/lib/components/HOC/DataDependentComponent.js +30 -79
- package/lib/components/HOC/EntityComponent.d.ts +13 -13
- package/lib/components/HOC/EntityComponent.js +63 -101
- package/lib/components/HOC/FullscreenModalComponent.d.ts +9 -9
- package/lib/components/HOC/FullscreenModalComponent.js +145 -165
- package/lib/components/HOC/GroupActivityRequiredComponent.d.ts +2 -2
- package/lib/components/HOC/GroupActivityRequiredComponent.js +32 -31
- package/lib/components/HOC/GuidComponent.d.ts +1 -1
- package/lib/components/HOC/GuidComponent.js +25 -64
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.d.ts +28 -29
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +36 -59
- package/lib/components/HOC/ModelErrorRedirectComponent.d.ts +10 -10
- package/lib/components/HOC/ModelErrorRedirectComponent.js +40 -83
- package/lib/components/HOC/SearchPersistorComponent.d.ts +4 -4
- package/lib/components/HOC/SearchPersistorComponent.js +243 -216
- package/lib/components/HOC/UnauthenticatedComponent.d.ts +12 -12
- package/lib/components/HOC/UnauthenticatedComponent.js +37 -82
- package/lib/components/HOC/UserComponent.d.ts +1 -1
- package/lib/components/HOC/UserComponent.js +12 -11
- package/lib/components/Icons/IconAlphaList.js +34 -20
- package/lib/components/Icons/IconExternalUser.js +34 -20
- package/lib/components/Icons/IconImpersonation.js +34 -20
- package/lib/components/Icons/IconStopImpersonating.js +34 -20
- package/lib/components/Icons/IconTable.js +35 -21
- package/lib/components/Icons/IconTableDeleteCol.js +34 -20
- package/lib/components/Icons/IconTableDeleteRow.js +34 -20
- package/lib/components/Icons/IconTableInsertCol.js +34 -20
- package/lib/components/Icons/IconTableInsertRow.js +34 -20
- package/lib/components/Impersonation/Button.d.ts +2 -2
- package/lib/components/Impersonation/Button.js +76 -56
- package/lib/components/Impersonation/Link.d.ts +2 -2
- package/lib/components/Impersonation/Link.js +76 -53
- package/lib/components/Impersonation/UserDetail.d.ts +2 -2
- package/lib/components/Impersonation/UserDetail.js +64 -15
- package/lib/components/Loading.js +27 -21
- package/lib/components/LockDownBrowser/Check.js +194 -107
- package/lib/components/LockDownBrowser/ExitButton.js +27 -14
- package/lib/components/LockDownBrowser/Launch.js +70 -85
- package/lib/components/Lti/Confirm.js +152 -33
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.d.ts +4 -2
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +170 -78
- package/lib/components/Lti/Launch.js +105 -49
- package/lib/components/Lti/LaunchGroup.js +85 -39
- package/lib/components/ManageTable.d.ts +1 -2
- package/lib/components/ManageTable.js +309 -104
- package/lib/components/ManageTableNoDataComponent.js +42 -22
- package/lib/components/NewVersionAlert.d.ts +2 -2
- package/lib/components/NewVersionAlert.js +82 -91
- package/lib/components/NotFound.js +87 -28
- package/lib/components/Notifications.d.ts +4 -4
- package/lib/components/Notifications.js +187 -169
- package/lib/components/PaginationNextButton.js +33 -21
- package/lib/components/PaginationPreviousButton.js +33 -21
- package/lib/components/Quill/CustomToolbar.d.ts +2 -2
- package/lib/components/Quill/CustomToolbar.js +432 -257
- package/lib/components/Quill/Formats/Image.d.ts +10 -25
- package/lib/components/Quill/Formats/Image.js +76 -82
- package/lib/components/Quill/Formats/List.d.ts +6 -3
- package/lib/components/Quill/Formats/List.js +50 -72
- package/lib/components/Quill/Formats/Video.d.ts +2 -1
- package/lib/components/Quill/Formats/Video.js +29 -43
- package/lib/components/Quill/ImageDropModule.d.ts +1 -1
- package/lib/components/Quill/ImageDropModule.js +142 -115
- package/lib/components/Quill/ImageWarning.d.ts +2 -2
- package/lib/components/Quill/ImageWarning.js +45 -32
- package/lib/components/Quill/ImageWithAltTextModal.d.ts +0 -1
- package/lib/components/Quill/ImageWithAltTextModal.js +425 -141
- package/lib/components/Quill/Specs/CustomImageSpec.d.ts +1 -1
- package/lib/components/Quill/Specs/CustomImageSpec.js +37 -45
- package/lib/components/Quill/Specs/CustomVideoSpec.d.ts +1 -1
- package/lib/components/Quill/Specs/CustomVideoSpec.js +27 -36
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.d.ts +2 -1
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +100 -116
- package/lib/components/Quill/TableModule/Blots/TableBlot.js +53 -66
- package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +54 -67
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.d.ts +1 -1
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +225 -241
- package/lib/components/Quill/TableModule/Blots/TableContainer.js +82 -99
- package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +76 -87
- package/lib/components/Quill/TableModule/constants.js +45 -41
- package/lib/components/Quill/TableModule/index.css +25 -25
- package/lib/components/Quill/TableModule/index.d.ts +14 -5
- package/lib/components/Quill/TableModule/index.js +373 -313
- package/lib/components/Quill/TableModule/utils.js +45 -45
- package/lib/components/Quill/accessibilityFix.d.ts +0 -1
- package/lib/components/Quill/accessibilityFix.js +222 -238
- package/lib/components/Quill/index.js +36 -32
- package/lib/components/RefreshIndicator/Bordered.js +48 -32
- package/lib/components/RefreshIndicator/Inline.js +48 -33
- package/lib/components/RefreshIndicator/index.d.ts +2 -2
- package/lib/components/RefreshIndicator/index.js +263 -113
- package/lib/components/SearchControls.js +216 -31
- package/lib/components/SentryRoute.js +10 -23
- package/lib/components/Tables/RoleFilter.d.ts +3 -4
- package/lib/components/Tables/RoleFilter.js +71 -46
- package/lib/components/Tables/TextFilter.d.ts +2 -3
- package/lib/components/Tables/TextFilter.js +62 -20
- package/lib/components/UserRoles/Add.d.ts +3 -3
- package/lib/components/UserRoles/Add.js +199 -161
- package/lib/components/UserRoles/Context.js +8 -6
- package/lib/components/UserRoles/RoleCell.js +181 -100
- package/lib/components/UserRoles/Select.js +168 -54
- package/lib/components/UserRoles/Table.js +221 -102
- package/lib/components/UserRoles/index.d.ts +6 -6
- package/lib/components/UserRoles/index.js +535 -464
- package/lib/config/eslint/index.d.ts +2 -0
- package/lib/config/eslint/index.js +36 -0
- package/lib/config/eslint/lib/order.d.ts +3 -0
- package/lib/config/eslint/lib/order.js +30 -0
- package/lib/config/eslint/lib/prettier.d.ts +3 -0
- package/lib/config/eslint/lib/prettier.js +23 -0
- package/lib/config/eslint/lib/typescript.d.ts +2 -0
- package/lib/config/eslint/lib/typescript.js +98 -0
- package/lib/config/eslint/react.d.ts +2 -0
- package/lib/config/eslint/react.js +30 -0
- package/lib/constants/baseActivity.js +30 -26
- package/lib/constants/baseRole.js +14 -10
- package/lib/constants/configuration.d.ts +1 -1
- package/lib/constants/configuration.js +43 -39
- package/lib/constants/externalProviderType.js +10 -6
- package/lib/constants/fetchErrorData.js +15 -11
- package/lib/constants/index.js +137 -23
- package/lib/constants/lockDownBrowser.js +28 -24
- package/lib/constants/mockData.d.ts +4 -6
- package/lib/constants/mockData.js +383 -324
- package/lib/constants/modelStatus.js +15 -11
- package/lib/constants/notificationType.js +12 -8
- package/lib/constants/operatingSystem.js +12 -8
- package/lib/constants/shard.js +11 -7
- package/lib/constants/table.js +21 -21
- package/lib/constants/tier.js +12 -8
- package/lib/constants/userRole.d.ts +1 -2
- package/lib/constants/userRole.js +15 -17
- package/lib/css/components/_buttons.css +11 -3
- package/lib/css/components/_quill.css +3 -3
- package/lib/css/components/_tables.css +6 -5
- package/lib/css/utils/_display.css +12 -19
- package/lib/css/utils/_general.css +1 -1
- package/lib/css/utils/_text.css +2 -1
- package/lib/css/variables.css +0 -4
- package/lib/endpointMappings.js +197 -193
- package/lib/hooks/useCollection.js +83 -65
- package/lib/hooks/useCollectionConfiguration.d.ts +0 -1
- package/lib/hooks/useCollectionConfiguration.js +179 -82
- package/lib/hooks/useCollectionItem.js +155 -58
- package/lib/hooks/useEventCalback.d.ts +14 -0
- package/lib/hooks/useEventCalback.js +51 -0
- package/lib/hooks/useGuid.js +19 -8
- package/lib/hooks/usePrevious.d.ts +24 -1
- package/lib/hooks/usePrevious.js +82 -12
- package/lib/index.js +156 -36
- package/lib/redux/actionCreator.d.ts +6 -6
- package/lib/redux/actionCreator.js +51 -40
- package/lib/redux/actions/AuthAction.js +44 -31
- package/lib/redux/actions/ModalAction.d.ts +1 -1
- package/lib/redux/actions/ModalAction.js +10 -6
- package/lib/redux/actions/ModelAction.d.ts +1 -1
- package/lib/redux/actions/ModelAction.js +77 -49
- package/lib/redux/actions/NotificationAction.js +10 -6
- package/lib/redux/actions/SearchAction.js +9 -5
- package/lib/redux/actions/index.js +60 -16
- package/lib/redux/configureReducers.d.ts +2 -5
- package/lib/redux/configureReducers.js +61 -72
- package/lib/redux/configureStore.d.ts +2 -2
- package/lib/redux/configureStore.js +83 -115
- package/lib/redux/helpers.js +7 -2
- package/lib/redux/reducers/authReducer.js +50 -44
- package/lib/redux/reducers/index.js +41 -15
- package/lib/redux/reducers/modalsReducer.js +49 -52
- package/lib/redux/reducers/modelsReducer.d.ts +2 -2
- package/lib/redux/reducers/modelsReducer.js +136 -135
- package/lib/redux/reducers/notificationsReducer.js +26 -21
- package/lib/redux/reducers/searchReducer.js +18 -12
- package/lib/redux/sagas/appInsightsSaga.js +24 -62
- package/lib/redux/sagas/authSaga.js +287 -414
- package/lib/redux/sagas/caliperSaga.js +154 -248
- package/lib/redux/sagas/clockOffsetSaga.js +35 -76
- package/lib/redux/sagas/configurationSaga.js +13 -46
- package/lib/redux/sagas/downtimeApiErrorSaga.d.ts +0 -1
- package/lib/redux/sagas/downtimeApiErrorSaga.js +23 -64
- package/lib/redux/sagas/errorSaga.d.ts +0 -1
- package/lib/redux/sagas/errorSaga.js +29 -63
- package/lib/redux/sagas/googleAnalyticsSaga.js +29 -69
- package/lib/redux/sagas/identityProviderSaga.js +24 -69
- package/lib/redux/sagas/initialDataLoadSaga.js +38 -29
- package/lib/redux/sagas/lockDownBrowserErrorSaga.d.ts +0 -1
- package/lib/redux/sagas/lockDownBrowserErrorSaga.js +32 -81
- package/lib/redux/sagas/modelFetchSaga.js +331 -411
- package/lib/redux/sagas/noStoreSaga.d.ts +1 -1
- package/lib/redux/sagas/noStoreSaga.js +68 -101
- package/lib/redux/sagas/postLoginDataSaga.js +42 -74
- package/lib/redux/sagas/postLoginRedirectSaga.js +27 -68
- package/lib/redux/sagas/rootSaga.js +85 -137
- package/lib/redux/sagas/sentrySaga.js +29 -85
- package/lib/redux/sagas/userIdSaga.js +18 -54
- package/lib/services/codeProviderService.js +25 -29
- package/lib/services/dateService.js +12 -10
- package/lib/services/documentService.js +15 -10
- package/lib/services/fetchService.js +110 -144
- package/lib/services/persistenceService.d.ts +4 -4
- package/lib/services/persistenceService.js +45 -43
- package/lib/services/ticketProviderService.js +29 -33
- package/lib/services/tokenPersistenceService.js +13 -9
- package/lib/services/windowService.js +21 -17
- package/lib/startup.d.ts +1 -1
- package/lib/startup.js +115 -118
- package/lib/types/AppConfiguration.js +5 -1
- package/lib/types/Artifact.js +11 -7
- package/lib/types/BaseReduxState.js +5 -1
- package/lib/types/Client.js +5 -1
- package/lib/types/Collection.d.ts +3 -3
- package/lib/types/Collection.js +5 -1
- package/lib/types/Configuration.js +5 -1
- package/lib/types/DeepLinkingResponseRequest.js +5 -1
- package/lib/types/DeletableModel.js +5 -1
- package/lib/types/Event.js +5 -1
- package/lib/types/ExternalGroup.js +5 -1
- package/lib/types/ExternalProvider.js +5 -1
- package/lib/types/ExternalTerm.js +5 -1
- package/lib/types/Group.js +5 -1
- package/lib/types/IdentityProvider.js +5 -1
- package/lib/types/LtiLaunch.js +5 -1
- package/lib/types/NameOnlyEntity.js +5 -1
- package/lib/types/Notification.d.ts +2 -2
- package/lib/types/Notification.js +5 -1
- package/lib/types/OptionalRecord.d.ts +1 -1
- package/lib/types/OptionalRecord.js +5 -1
- package/lib/types/OwnerSchedule.d.ts +3 -1
- package/lib/types/OwnerSchedule.js +5 -1
- package/lib/types/PropertyOfType.d.ts +3 -3
- package/lib/types/PropertyOfType.js +5 -1
- package/lib/types/Quill.js +5 -1
- package/lib/types/RoleDescription.d.ts +0 -1
- package/lib/types/RoleDescription.js +5 -1
- package/lib/types/Search.js +5 -1
- package/lib/types/SimpleLocation.js +5 -1
- package/lib/types/UniTime.js +5 -1
- package/lib/types/User.js +5 -1
- package/lib/types/UserRole.js +5 -1
- package/lib/types/auth/AuthState.js +5 -1
- package/lib/types/auth/CasV1LoginRequestBody.js +5 -1
- package/lib/types/auth/ClientCredentials.js +5 -1
- package/lib/types/auth/CodeProviderService.js +5 -1
- package/lib/types/auth/LocalLoginRequestBody.js +5 -1
- package/lib/types/auth/TicketProviderService.js +5 -1
- package/lib/types/auth/TokenPersistenceService.js +5 -1
- package/lib/types/auth/index.js +82 -18
- package/lib/types/externals.d.js +2 -0
- package/lib/types/index.js +313 -39
- package/lib/types/net/EndpointConfig.js +5 -1
- package/lib/types/net/EndpointMapping.js +5 -1
- package/lib/types/net/EndpointMappings.js +5 -1
- package/lib/types/net/ErrorHandler.d.ts +1 -1
- package/lib/types/net/ErrorHandler.js +5 -1
- package/lib/types/net/FetchConfig.d.ts +1 -1
- package/lib/types/net/FetchConfig.js +5 -1
- package/lib/types/net/FetchErrorData.js +10 -6
- package/lib/types/net/FetchResult.d.ts +2 -2
- package/lib/types/net/FetchResult.js +5 -1
- package/lib/types/net/HTTPMethod.d.ts +1 -1
- package/lib/types/net/HTTPMethod.js +5 -1
- package/lib/types/net/HTTPStatusCode.js +16 -12
- package/lib/types/net/Metadata.js +5 -1
- package/lib/types/net/Model.js +5 -1
- package/lib/types/net/ModelCollection.js +5 -1
- package/lib/types/net/ModelsState.js +5 -1
- package/lib/types/net/OAuthToken.js +5 -1
- package/lib/types/net/OAuthTokenOrNull.d.ts +1 -1
- package/lib/types/net/OAuthTokenOrNull.js +5 -1
- package/lib/types/net/TokenAccessFunction.d.ts +1 -1
- package/lib/types/net/TokenAccessFunction.js +5 -1
- package/lib/types/net/index.js +181 -27
- package/lib/utils/baseActivity.d.ts +2 -2
- package/lib/utils/baseActivity.js +93 -91
- package/lib/utils/baseRole.js +37 -33
- package/lib/utils/collection.js +413 -291
- package/lib/utils/cookies.js +22 -37
- package/lib/utils/date.js +210 -210
- package/lib/utils/dom.js +145 -133
- package/lib/utils/domainIdentifier.js +9 -9
- package/lib/utils/entityUserRole.js +6 -2
- package/lib/utils/error.d.ts +1 -1
- package/lib/utils/error.js +18 -16
- package/lib/utils/events.js +37 -30
- package/lib/utils/externalGroup.js +25 -21
- package/lib/utils/externalProviders.js +8 -4
- package/lib/utils/externalTerms.js +9 -6
- package/lib/utils/fetch.d.ts +1 -1
- package/lib/utils/fetch.js +179 -176
- package/lib/utils/group.js +17 -9
- package/lib/utils/groupDates.d.ts +1 -1
- package/lib/utils/groupDates.js +43 -39
- package/lib/utils/groupRoles.js +28 -28
- package/lib/utils/lockDownBrowser.js +16 -12
- package/lib/utils/logger.js +30 -25
- package/lib/utils/lti.js +10 -5
- package/lib/utils/model.d.ts +2 -2
- package/lib/utils/model.js +35 -44
- package/lib/utils/number.js +13 -16
- package/lib/utils/promise.d.ts +6 -1
- package/lib/utils/promise.js +34 -15
- package/lib/utils/quill.js +60 -71
- package/lib/utils/route.d.ts +2 -2
- package/lib/utils/route.js +61 -60
- package/lib/utils/search.d.ts +1 -1
- package/lib/utils/search.js +78 -85
- package/lib/utils/shard.js +38 -41
- package/lib/utils/sort.d.ts +3 -3
- package/lib/utils/sort.js +62 -58
- package/lib/utils/string.js +14 -10
- package/lib/utils/table.d.ts +3 -3
- package/lib/utils/table.js +36 -33
- package/lib/utils/timezone.js +12 -26
- package/lib/utils/url.d.ts +2 -1
- package/lib/utils/url.js +139 -193
- package/lib/utils/user.js +59 -61
- package/lib/utils/userAgent.js +11 -11
- package/lib/utils/userRole.d.ts +3 -3
- package/lib/utils/userRole.js +46 -44
- package/package.json +90 -73
- package/lib/config/eslint/index.cjs +0 -21
- package/lib/config/eslint/lib/order.cjs +0 -22
- package/lib/config/eslint/lib/prettier.cjs +0 -18
- package/lib/config/eslint/lib/typescript.cjs +0 -86
- package/lib/config/eslint/react.cjs +0 -9
- package/lib/css/utils/_focus.css +0 -4
package/lib/utils/date.js
CHANGED
|
@@ -1,107 +1,114 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getDateMinusTime = void 0;
|
|
8
|
+
exports.getEndOfDay = getEndOfDay;
|
|
9
|
+
exports.getEndOfMinute = getEndOfMinute;
|
|
10
|
+
exports.getFormattedFullDateAndTime = getFormattedFullDateAndTime;
|
|
11
|
+
exports.getFormattedFullDateWithWeek = getFormattedFullDateWithWeek;
|
|
12
|
+
exports.getFormattedNumberedDate = getFormattedNumberedDate;
|
|
13
|
+
exports.getFormattedNumberedDateAndTime = getFormattedNumberedDateAndTime;
|
|
14
|
+
exports.getFormattedNumberedDateAndTimeWithoutYear = getFormattedNumberedDateAndTimeWithoutYear;
|
|
15
|
+
exports.getFormattedNumberedDateForInput = getFormattedNumberedDateForInput;
|
|
16
|
+
exports.getFormattedNumberedDateWithFullYear = getFormattedNumberedDateWithFullYear;
|
|
17
|
+
exports.getFormattedNumberedDateWithoutYear = getFormattedNumberedDateWithoutYear;
|
|
18
|
+
exports.getFormattedNumberedTime = getFormattedNumberedTime;
|
|
19
|
+
exports.getFormattedNumberedTimeWithFullZone = getFormattedNumberedTimeWithFullZone;
|
|
20
|
+
exports.getFormattedNumberedTimeWithoutZone = getFormattedNumberedTimeWithoutZone;
|
|
21
|
+
exports.getFormattedNumberedTimeWithoutZoneOrMeridian = getFormattedNumberedTimeWithoutZoneOrMeridian;
|
|
22
|
+
exports.getFormattedSimplifiedDate = getFormattedSimplifiedDate;
|
|
23
|
+
exports.getFormattedSimplifiedDateWithYearIfNotCurrent = getFormattedSimplifiedDateWithYearIfNotCurrent;
|
|
24
|
+
exports.getFormattedSimplifiedDateWithoutYear = getFormattedSimplifiedDateWithoutYear;
|
|
25
|
+
exports.getFormattedTimeZone = getFormattedTimeZone;
|
|
26
|
+
exports.getFullFormattedTimeZone = getFullFormattedTimeZone;
|
|
27
|
+
exports.isDateInputSupported = exports.getZonedMomentFromUtcInDefaultZone = exports.getZonedMomentFromUtc = exports.getZonedMomentFromLocalDateTime = exports.getServerNowUtc = exports.getOffsetDate = exports.getLocalMomentFromUtc = exports.getLocalDateTimeFromUtc = void 0;
|
|
28
|
+
exports.isDateTimeValid = isDateTimeValid;
|
|
29
|
+
exports.isNowAfterDate = isNowAfterDate;
|
|
30
|
+
exports.isNowBeforeDate = isNowBeforeDate;
|
|
31
|
+
exports.isNowEqualOrAfterDate = isNowEqualOrAfterDate;
|
|
32
|
+
exports.isNowEqualOrBeforeDate = isNowEqualOrBeforeDate;
|
|
33
|
+
exports.setClockOffset = exports.isTimeInputSupported = void 0;
|
|
34
|
+
var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
|
|
35
|
+
var _momentTimezoneUtils = _interopRequireDefault(require("moment-timezone/moment-timezone-utils"));
|
|
36
|
+
var _timezone = require("./timezone");
|
|
10
37
|
/**
|
|
11
38
|
* This value is used by time-sensitive functions in this module and other date/time utils. Any time
|
|
12
39
|
* a new Date object is constructed, it will use this value to adjust the time by this offset (to
|
|
13
40
|
* make it consistent with a known time)
|
|
14
41
|
*/
|
|
15
|
-
|
|
42
|
+
let clockOffset = 0;
|
|
43
|
+
|
|
16
44
|
/**
|
|
17
45
|
* When a GroupAssessment comes in the door, it includes the current UTC datetime. This method is
|
|
18
46
|
* used to update the difference between the (accurate) server time and the browser time
|
|
19
47
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
48
|
+
const setClockOffset = function (offset) {
|
|
49
|
+
clockOffset = offset;
|
|
22
50
|
};
|
|
23
|
-
|
|
51
|
+
|
|
24
52
|
/**
|
|
25
53
|
* Get the current UTC time, calibrated to the API server's clock
|
|
26
54
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
55
|
+
exports.setClockOffset = setClockOffset;
|
|
56
|
+
const getServerNowUtc = function () {
|
|
57
|
+
return new Date(Date.now() + clockOffset);
|
|
29
58
|
};
|
|
30
|
-
|
|
59
|
+
|
|
31
60
|
/**
|
|
32
61
|
* Return the provided date, offset by the clockOffset
|
|
33
62
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
63
|
+
exports.getServerNowUtc = getServerNowUtc;
|
|
64
|
+
const getOffsetDate = date => {
|
|
65
|
+
return new Date(date.getTime() + clockOffset);
|
|
36
66
|
};
|
|
37
67
|
exports.getOffsetDate = getOffsetDate;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
68
|
+
const getZonedMomentFromUtc = function () {
|
|
69
|
+
let dateTimeUtc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getServerNowUtc().toISOString();
|
|
70
|
+
let timeZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _timezone.guessTimeZoneId)();
|
|
71
|
+
return _momentTimezone.default.utc(dateTimeUtc).tz(timeZoneId);
|
|
42
72
|
};
|
|
43
73
|
exports.getZonedMomentFromUtc = getZonedMomentFromUtc;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
74
|
+
const getZonedMomentFromUtcInDefaultZone = function () {
|
|
75
|
+
let dateTimeUtc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getServerNowUtc().toISOString();
|
|
76
|
+
const timeZoneId = (0, _timezone.getDefaultTimeZoneId)();
|
|
77
|
+
return getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
|
|
48
78
|
};
|
|
49
79
|
exports.getZonedMomentFromUtcInDefaultZone = getZonedMomentFromUtcInDefaultZone;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
localMoment.month(),
|
|
56
|
-
localMoment.date(),
|
|
57
|
-
localMoment.hour(),
|
|
58
|
-
localMoment.minute(),
|
|
59
|
-
localMoment.second(),
|
|
60
|
-
localMoment.millisecond()
|
|
61
|
-
], timeZoneId);
|
|
62
|
-
return zonedMoment;
|
|
80
|
+
const getZonedMomentFromLocalDateTime = function (localDateTime) {
|
|
81
|
+
let timeZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _timezone.guessTimeZoneId)();
|
|
82
|
+
const localMoment = (0, _momentTimezone.default)(localDateTime);
|
|
83
|
+
const zonedMoment = _momentTimezone.default.tz([localMoment.year(), localMoment.month(), localMoment.date(), localMoment.hour(), localMoment.minute(), localMoment.second(), localMoment.millisecond()], timeZoneId);
|
|
84
|
+
return zonedMoment;
|
|
63
85
|
};
|
|
64
86
|
exports.getZonedMomentFromLocalDateTime = getZonedMomentFromLocalDateTime;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
zonedMoment.month(),
|
|
72
|
-
zonedMoment.date(),
|
|
73
|
-
zonedMoment.hour(),
|
|
74
|
-
zonedMoment.minute(),
|
|
75
|
-
zonedMoment.second(),
|
|
76
|
-
zonedMoment.millisecond()
|
|
77
|
-
]);
|
|
78
|
-
return localMoment;
|
|
87
|
+
const getLocalMomentFromUtc = function () {
|
|
88
|
+
let dateTimeUtc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getServerNowUtc().toISOString();
|
|
89
|
+
let timeZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _timezone.guessTimeZoneId)();
|
|
90
|
+
const zonedMoment = getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
|
|
91
|
+
const localMoment = (0, _momentTimezone.default)([zonedMoment.year(), zonedMoment.month(), zonedMoment.date(), zonedMoment.hour(), zonedMoment.minute(), zonedMoment.second(), zonedMoment.millisecond()]);
|
|
92
|
+
return localMoment;
|
|
79
93
|
};
|
|
80
94
|
exports.getLocalMomentFromUtc = getLocalMomentFromUtc;
|
|
81
|
-
|
|
82
|
-
|
|
95
|
+
const getLocalDateTimeFromUtc = dateTimeUtc => {
|
|
96
|
+
return getLocalMomentFromUtc(dateTimeUtc).toDate();
|
|
83
97
|
};
|
|
84
98
|
exports.getLocalDateTimeFromUtc = getLocalDateTimeFromUtc;
|
|
85
|
-
|
|
86
|
-
|
|
99
|
+
const getDateMinusTime = dateTime => {
|
|
100
|
+
return new Date(dateTime.getFullYear(), dateTime.getMonth(), dateTime.getDate());
|
|
87
101
|
};
|
|
88
102
|
exports.getDateMinusTime = getDateMinusTime;
|
|
89
103
|
function getEndOfDay(dateTimeUtc) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
.add(1, 'days')
|
|
93
|
-
.subtract(3, 'milliseconds') // must be minus 3 for SQL date
|
|
94
|
-
.toDate();
|
|
104
|
+
return (0, _momentTimezone.default)(dateTimeUtc).startOf('day').add(1, 'days').subtract(3, 'milliseconds') // must be minus 3 for SQL date
|
|
105
|
+
.toDate();
|
|
95
106
|
}
|
|
96
|
-
exports.getEndOfDay = getEndOfDay;
|
|
97
107
|
function getEndOfMinute(dateTimeUtc) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
.add(1, 'minute')
|
|
101
|
-
.subtract(3, 'milliseconds') // must be minus 3 for SQL date
|
|
102
|
-
.toDate();
|
|
108
|
+
return (0, _momentTimezone.default)(dateTimeUtc).startOf('minute').add(1, 'minute').subtract(3, 'milliseconds') // must be minus 3 for SQL date
|
|
109
|
+
.toDate();
|
|
103
110
|
}
|
|
104
|
-
|
|
111
|
+
|
|
105
112
|
/**
|
|
106
113
|
* Is the current time, "now", **after or equal to** the given date.
|
|
107
114
|
*
|
|
@@ -110,16 +117,16 @@ exports.getEndOfMinute = getEndOfMinute;
|
|
|
110
117
|
*
|
|
111
118
|
* @returns Whether or not "now" is **after or equal to** `dateTimeUtc`
|
|
112
119
|
*/
|
|
113
|
-
function isNowEqualOrAfterDate(dateTimeUtc
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
120
|
+
function isNowEqualOrAfterDate(dateTimeUtc) {
|
|
121
|
+
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
122
|
+
if (!dateTimeUtc) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
|
|
126
|
+
const currentMoment = getLocalMomentFromUtc(nowUtc);
|
|
127
|
+
return currentMoment.isSameOrAfter(adjustedDateTimeMoment);
|
|
121
128
|
}
|
|
122
|
-
|
|
129
|
+
|
|
123
130
|
/**
|
|
124
131
|
* Is the current time, "now", **before or equal to** the given date.
|
|
125
132
|
*
|
|
@@ -128,16 +135,16 @@ exports.isNowEqualOrAfterDate = isNowEqualOrAfterDate;
|
|
|
128
135
|
*
|
|
129
136
|
* @returns Whether or not "now" is **before or equal to** `dateTimeUtc`.
|
|
130
137
|
*/
|
|
131
|
-
function isNowEqualOrBeforeDate(dateTimeUtc
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
138
|
+
function isNowEqualOrBeforeDate(dateTimeUtc) {
|
|
139
|
+
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
140
|
+
if (!dateTimeUtc) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
|
|
144
|
+
const currentMoment = getLocalMomentFromUtc(nowUtc);
|
|
145
|
+
return currentMoment.isSameOrBefore(adjustedDateTimeMoment);
|
|
139
146
|
}
|
|
140
|
-
|
|
147
|
+
|
|
141
148
|
/**
|
|
142
149
|
* Is the current time, "now", **after** the given date.
|
|
143
150
|
*
|
|
@@ -146,16 +153,16 @@ exports.isNowEqualOrBeforeDate = isNowEqualOrBeforeDate;
|
|
|
146
153
|
*
|
|
147
154
|
* @returns Whether or not "now" is **after** `dateTimeUtc`.
|
|
148
155
|
*/
|
|
149
|
-
function isNowAfterDate(dateTimeUtc
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
156
|
+
function isNowAfterDate(dateTimeUtc) {
|
|
157
|
+
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
158
|
+
if (!dateTimeUtc) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
|
|
162
|
+
const currentMoment = getLocalMomentFromUtc(nowUtc);
|
|
163
|
+
return currentMoment > adjustedDateTimeMoment;
|
|
157
164
|
}
|
|
158
|
-
|
|
165
|
+
|
|
159
166
|
/**
|
|
160
167
|
* Is the current time, "now", **before** the given date.
|
|
161
168
|
*
|
|
@@ -164,164 +171,162 @@ exports.isNowAfterDate = isNowAfterDate;
|
|
|
164
171
|
*
|
|
165
172
|
* @returns Whether or not "now" is **before** `dateTimeUtc`.
|
|
166
173
|
*/
|
|
167
|
-
function isNowBeforeDate(dateTimeUtc
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
174
|
+
function isNowBeforeDate(dateTimeUtc) {
|
|
175
|
+
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
176
|
+
if (!dateTimeUtc) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
|
|
180
|
+
const currentMoment = getLocalMomentFromUtc(nowUtc);
|
|
181
|
+
return currentMoment < adjustedDateTimeMoment;
|
|
175
182
|
}
|
|
176
|
-
|
|
183
|
+
|
|
177
184
|
/**
|
|
178
185
|
* Returns a date and time string with full date, e.g. `March 5, 2018 @ 4:05 PM EDT`
|
|
179
186
|
* @param dateTimeUtc A UTC date time string
|
|
180
187
|
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
181
188
|
*/
|
|
182
|
-
function getFormattedFullDateAndTime(dateTimeUtc
|
|
183
|
-
|
|
184
|
-
|
|
189
|
+
function getFormattedFullDateAndTime(dateTimeUtc) {
|
|
190
|
+
let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
191
|
+
return applyFormat(dateTimeUtc, `MMMM D, YYYY @ h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
|
|
185
192
|
}
|
|
186
|
-
|
|
193
|
+
|
|
187
194
|
/**
|
|
188
195
|
* Returns a date and time string with day of week and American slash dates, e.g. `Mon, 3/5/2018 @ 4:05 PM EDT`
|
|
189
196
|
* @param dateTimeUtc A UTC date time string
|
|
190
197
|
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
191
198
|
*/
|
|
192
|
-
function getFormattedFullDateWithWeek(dateTimeUtc
|
|
193
|
-
|
|
194
|
-
|
|
199
|
+
function getFormattedFullDateWithWeek(dateTimeUtc) {
|
|
200
|
+
let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
201
|
+
return applyFormat(dateTimeUtc, `ddd, M/D/YYYY @ h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
|
|
195
202
|
}
|
|
196
|
-
|
|
203
|
+
|
|
197
204
|
/**
|
|
198
205
|
* Returns a date and time string with American slash dates, and no leading zeroes, e.g. `3/5/18 4:05 PM EDT`
|
|
199
206
|
* @param dateTimeUtc A UTC date time string
|
|
200
207
|
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
201
208
|
*/
|
|
202
|
-
function getFormattedNumberedDateAndTime(dateTimeUtc
|
|
203
|
-
|
|
204
|
-
|
|
209
|
+
function getFormattedNumberedDateAndTime(dateTimeUtc) {
|
|
210
|
+
let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
211
|
+
return applyFormat(dateTimeUtc, `M/D/YY h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
|
|
205
212
|
}
|
|
206
|
-
|
|
213
|
+
|
|
207
214
|
/**
|
|
208
215
|
* Returns a date and time string with American slash dates, no leading zeroes, and no year, e.g. `3/5 4:05 PM EDT`
|
|
209
216
|
* @param dateTimeUtc A UTC date time string
|
|
210
217
|
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
211
218
|
*/
|
|
212
|
-
function getFormattedNumberedDateAndTimeWithoutYear(dateTimeUtc
|
|
213
|
-
|
|
214
|
-
|
|
219
|
+
function getFormattedNumberedDateAndTimeWithoutYear(dateTimeUtc) {
|
|
220
|
+
let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
221
|
+
return applyFormat(dateTimeUtc, `M/D h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
|
|
215
222
|
}
|
|
216
|
-
|
|
223
|
+
|
|
217
224
|
/**
|
|
218
225
|
* Returns a date string with short month and full year, e.g. `Mar 5, 2018`
|
|
219
226
|
* @param dateTimeUtc A UTC date time string
|
|
220
227
|
*/
|
|
221
228
|
function getFormattedSimplifiedDate(dateTimeUtc) {
|
|
222
|
-
|
|
229
|
+
return applyFormat(dateTimeUtc, 'MMM D, YYYY');
|
|
223
230
|
}
|
|
224
|
-
|
|
231
|
+
|
|
225
232
|
/**
|
|
226
233
|
* Returns a date string with short month and no year, e.g. `Mar 5`
|
|
227
234
|
* @param dateTimeUtc A UTC date time string
|
|
228
235
|
*/
|
|
229
236
|
function getFormattedSimplifiedDateWithoutYear(dateTimeUtc) {
|
|
230
|
-
|
|
237
|
+
return applyFormat(dateTimeUtc, 'MMM D');
|
|
231
238
|
}
|
|
232
|
-
|
|
239
|
+
|
|
233
240
|
/**
|
|
234
241
|
* Returns a date string as either 'MMM D, YYYY' or 'MMM D' if the date's year is the same as the current year
|
|
235
242
|
* @param dateTimeUtc A UTC date time string
|
|
236
243
|
* @param nowUtc (optional) A UTC date time string of "now". Used for testing.
|
|
237
244
|
*/
|
|
238
|
-
function getFormattedSimplifiedDateWithYearIfNotCurrent(dateTimeUtc
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
? getFormattedSimplifiedDateWithoutYear(dateTimeUtc)
|
|
244
|
-
: getFormattedSimplifiedDate(dateTimeUtc);
|
|
245
|
+
function getFormattedSimplifiedDateWithYearIfNotCurrent(dateTimeUtc) {
|
|
246
|
+
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
247
|
+
const nowUtcMoment = (0, _momentTimezone.default)(nowUtc);
|
|
248
|
+
const dateTimeMoment = (0, _momentTimezone.default)(dateTimeUtc);
|
|
249
|
+
return Math.abs(nowUtcMoment.year() - dateTimeMoment.year()) === 0 ? getFormattedSimplifiedDateWithoutYear(dateTimeUtc) : getFormattedSimplifiedDate(dateTimeUtc);
|
|
245
250
|
}
|
|
246
|
-
|
|
251
|
+
|
|
247
252
|
/**
|
|
248
253
|
* Returns a date string with American slash dates, no leading zeroes, and short year, e.g. `3/5/18`
|
|
249
254
|
* @param dateTimeUtc A UTC date time string
|
|
250
255
|
*/
|
|
251
256
|
function getFormattedNumberedDate(dateTimeUtc) {
|
|
252
|
-
|
|
257
|
+
return applyFormat(dateTimeUtc, 'M/D/YY');
|
|
253
258
|
}
|
|
254
|
-
|
|
259
|
+
|
|
255
260
|
/**
|
|
256
261
|
* Returns a date string with American slash dates, no leading zeroes, and full year, e.g. `3/5/2018`
|
|
257
262
|
* @param dateTimeUtc A UTC date time string
|
|
258
263
|
*/
|
|
259
264
|
function getFormattedNumberedDateWithFullYear(dateTimeUtc) {
|
|
260
|
-
|
|
265
|
+
return applyFormat(dateTimeUtc, 'M/D/YYYY');
|
|
261
266
|
}
|
|
262
|
-
|
|
267
|
+
|
|
263
268
|
/**
|
|
264
269
|
* Returns a date string for use in HTML inputs, e.g. `2018-03-05`
|
|
265
270
|
* @param dateTimeUtc A UTC date time string
|
|
266
271
|
*/
|
|
267
272
|
function getFormattedNumberedDateForInput(dateTimeUtc) {
|
|
268
|
-
|
|
273
|
+
return applyFormat(dateTimeUtc, 'YYYY-MM-DD');
|
|
269
274
|
}
|
|
270
|
-
|
|
275
|
+
|
|
271
276
|
/**
|
|
272
277
|
* Returns a date string with American slash dates and no year and no leading zeroes, e.g. `3/5`
|
|
273
278
|
* @param dateTimeUtc A UTC date time string
|
|
274
279
|
*/
|
|
275
280
|
function getFormattedNumberedDateWithoutYear(dateTimeUtc) {
|
|
276
|
-
|
|
281
|
+
return applyFormat(dateTimeUtc, 'M/D');
|
|
277
282
|
}
|
|
278
|
-
|
|
283
|
+
|
|
279
284
|
/**
|
|
280
285
|
* Returns a time string, e.g. `4:05 PM EDT`
|
|
281
286
|
* @param dateTimeUtc A UTC date time string
|
|
282
287
|
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
283
288
|
*/
|
|
284
|
-
function getFormattedNumberedTime(dateTimeUtc
|
|
285
|
-
|
|
286
|
-
|
|
289
|
+
function getFormattedNumberedTime(dateTimeUtc) {
|
|
290
|
+
let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
291
|
+
return applyFormat(dateTimeUtc, `h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
|
|
287
292
|
}
|
|
288
|
-
|
|
293
|
+
|
|
289
294
|
/**
|
|
290
295
|
* Returns a time string with possibly full time zone name, e.g. `4:05 PM EDT` or `4:05 PM CST (Asia/Taipei)`
|
|
291
296
|
* @param dateTimeUtc A UTC date time string
|
|
292
297
|
* @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
|
|
293
298
|
* @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
|
|
294
299
|
*/
|
|
295
|
-
function getFormattedNumberedTimeWithFullZone(dateTimeUtc
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
300
|
+
function getFormattedNumberedTimeWithFullZone(dateTimeUtc) {
|
|
301
|
+
let showEasternZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
302
|
+
let timeZoneId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (0, _timezone.guessTimeZoneId)();
|
|
303
|
+
const zonedMoment = getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
|
|
304
|
+
const time = applyFormat(dateTimeUtc, 'h:mm\u00a0A', timeZoneId);
|
|
305
|
+
const timezoneAbbreviation = zonedMoment.zoneAbbr();
|
|
306
|
+
return (timezoneAbbreviation === 'EDT' || timezoneAbbreviation === 'EST') && !showEasternZoneId ?
|
|
307
|
+
// Don't show the full zone name if in EDT or EST, unless told to
|
|
308
|
+
`${time} ${timezoneAbbreviation}` :
|
|
309
|
+
// If not EDT or EST, show the zone name, replacing underscores with spaces
|
|
310
|
+
// Ex: "Asia/Taipei"
|
|
311
|
+
`${time} ${timezoneAbbreviation} (${timeZoneId.replace('_', ' ')})`;
|
|
307
312
|
}
|
|
308
|
-
|
|
313
|
+
|
|
309
314
|
/**
|
|
310
315
|
* Returns a time string without time zone, e.g. `4:05 PM`
|
|
311
316
|
* @param dateTimeUtc A UTC date time string
|
|
312
317
|
*/
|
|
313
318
|
function getFormattedNumberedTimeWithoutZone(dateTimeUtc) {
|
|
314
|
-
|
|
319
|
+
return applyFormat(dateTimeUtc, 'h:mm\u00a0A');
|
|
315
320
|
}
|
|
316
|
-
|
|
321
|
+
|
|
317
322
|
/**
|
|
318
323
|
* Returns a time string without time zone, in 24 hr time, e.g. `16:05`
|
|
319
324
|
* @param dateTimeUtc A UTC date time string
|
|
320
325
|
*/
|
|
321
326
|
function getFormattedNumberedTimeWithoutZoneOrMeridian(dateTimeUtc) {
|
|
322
|
-
|
|
327
|
+
return applyFormat(dateTimeUtc, 'HH:mm');
|
|
323
328
|
}
|
|
324
|
-
|
|
329
|
+
|
|
325
330
|
/**
|
|
326
331
|
* Returns a full formatted time zone string for the given `timeZoneId`.
|
|
327
332
|
*
|
|
@@ -333,69 +338,64 @@ exports.getFormattedNumberedTimeWithoutZoneOrMeridian = getFormattedNumberedTime
|
|
|
333
338
|
* @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
|
|
334
339
|
* @param nowUtc (optional) The current time, "now", as an ISO date string.
|
|
335
340
|
*/
|
|
336
|
-
function getFullFormattedTimeZone(
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
? // Don't show the zoneId if in Eastern, unless told to
|
|
362
|
-
abbreviationsString
|
|
363
|
-
: // Show the combined abbreviations plus the friendly zoneId
|
|
364
|
-
abbreviationsString + " (" + readableZoneId + ")";
|
|
341
|
+
function getFullFormattedTimeZone() {
|
|
342
|
+
let timeZoneId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _timezone.guessTimeZoneId)();
|
|
343
|
+
let showEasternZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
344
|
+
let nowUtc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : getServerNowUtc().toISOString();
|
|
345
|
+
const zone = _momentTimezone.default.tz.zone(timeZoneId);
|
|
346
|
+
if (!zone) return '';
|
|
347
|
+
const zonedMoment = getZonedMomentFromUtc(nowUtc, timeZoneId);
|
|
348
|
+
// filter the zone data down to just recent years, instead of the default of 1900 to 2038
|
|
349
|
+
const filteredZone = _momentTimezoneUtils.default.tz.filterYears(zone, zonedMoment.year() - 1, zonedMoment.year() + 1);
|
|
350
|
+
// find all unique abbreviations for the zone, combined into a string
|
|
351
|
+
const abbreviations = filteredZone.abbrs
|
|
352
|
+
// filter out non-alpha abbreviations
|
|
353
|
+
.filter(abbr => /[a-zA-Z]+/g.test(abbr)).reduce((uniqueAbbrs, abbr) => {
|
|
354
|
+
if (!uniqueAbbrs.includes(abbr)) {
|
|
355
|
+
uniqueAbbrs.push(abbr);
|
|
356
|
+
}
|
|
357
|
+
return uniqueAbbrs;
|
|
358
|
+
}, []);
|
|
359
|
+
const abbreviationsString = abbreviations.length > 0 ? abbreviations.join('/') : null;
|
|
360
|
+
const readableZoneId = timeZoneId.replace('_', ' ');
|
|
361
|
+
return !abbreviationsString ? readableZoneId : abbreviationsString === 'EST/EDT' && !showEasternZoneId ?
|
|
362
|
+
// Don't show the zoneId if in Eastern, unless told to
|
|
363
|
+
abbreviationsString :
|
|
364
|
+
// Show the combined abbreviations plus the friendly zoneId
|
|
365
|
+
`${abbreviationsString} (${readableZoneId})`;
|
|
365
366
|
}
|
|
366
|
-
|
|
367
|
+
|
|
367
368
|
/**
|
|
368
369
|
* Returns the basic time zone abbreviation for the given date, e.g. `EDT`.
|
|
369
370
|
*
|
|
370
371
|
* @param dateTimeUtc The date to format.
|
|
371
372
|
*/
|
|
372
373
|
function getFormattedTimeZone(dateTimeUtc) {
|
|
373
|
-
|
|
374
|
+
return applyFormat(dateTimeUtc, 'z');
|
|
374
375
|
}
|
|
375
|
-
|
|
376
|
+
|
|
376
377
|
/**
|
|
377
378
|
* Formats a date using the given format. Parses the date as UTC, then converts to the current time zone, then formats.
|
|
378
379
|
* @param {*} dateTimeUtc The date to format. Any valid input for `moment.utc(...)`
|
|
379
380
|
* @param {*} format The format to use
|
|
380
381
|
*/
|
|
381
|
-
function applyFormat(dateTimeUtc, format
|
|
382
|
-
|
|
383
|
-
|
|
382
|
+
function applyFormat(dateTimeUtc, format) {
|
|
383
|
+
let timeZoneId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (0, _timezone.guessTimeZoneId)();
|
|
384
|
+
return getZonedMomentFromUtc(dateTimeUtc, timeZoneId).format(format);
|
|
384
385
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
}
|
|
386
|
+
const isInputTypeSupported = type => {
|
|
387
|
+
try {
|
|
388
|
+
const test = document.createElement('input');
|
|
389
|
+
test.type = type;
|
|
390
|
+
const isSupported = test.type === type;
|
|
391
|
+
return isSupported;
|
|
392
|
+
} catch {
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
395
|
};
|
|
396
|
-
exports.isDateInputSupported = isInputTypeSupported('date');
|
|
397
|
-
exports.isTimeInputSupported = isInputTypeSupported('time');
|
|
396
|
+
const isDateInputSupported = exports.isDateInputSupported = isInputTypeSupported('date');
|
|
397
|
+
const isTimeInputSupported = exports.isTimeInputSupported = isInputTypeSupported('time');
|
|
398
398
|
function isDateTimeValid(dateTime) {
|
|
399
|
-
|
|
399
|
+
return !!dateTime && (0, _momentTimezone.default)(dateTime).isValid();
|
|
400
400
|
}
|
|
401
|
-
exports.isDateTimeValid = isDateTimeValid;
|
|
401
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50VGltZXpvbmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tb21lbnRUaW1lem9uZVV0aWxzIiwiX3RpbWV6b25lIiwiY2xvY2tPZmZzZXQiLCJzZXRDbG9ja09mZnNldCIsIm9mZnNldCIsImV4cG9ydHMiLCJnZXRTZXJ2ZXJOb3dVdGMiLCJEYXRlIiwibm93IiwiZ2V0T2Zmc2V0RGF0ZSIsImRhdGUiLCJnZXRUaW1lIiwiZ2V0Wm9uZWRNb21lbnRGcm9tVXRjIiwiZGF0ZVRpbWVVdGMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJ0b0lTT1N0cmluZyIsInRpbWVab25lSWQiLCJndWVzc1RpbWVab25lSWQiLCJtb21lbnQiLCJ1dGMiLCJ0eiIsImdldFpvbmVkTW9tZW50RnJvbVV0Y0luRGVmYXVsdFpvbmUiLCJnZXREZWZhdWx0VGltZVpvbmVJZCIsImdldFpvbmVkTW9tZW50RnJvbUxvY2FsRGF0ZVRpbWUiLCJsb2NhbERhdGVUaW1lIiwibG9jYWxNb21lbnQiLCJ6b25lZE1vbWVudCIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCIsImdldExvY2FsTW9tZW50RnJvbVV0YyIsImdldExvY2FsRGF0ZVRpbWVGcm9tVXRjIiwidG9EYXRlIiwiZ2V0RGF0ZU1pbnVzVGltZSIsImRhdGVUaW1lIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRFbmRPZkRheSIsInN0YXJ0T2YiLCJhZGQiLCJzdWJ0cmFjdCIsImdldEVuZE9mTWludXRlIiwiaXNOb3dFcXVhbE9yQWZ0ZXJEYXRlIiwibm93VXRjIiwiYWRqdXN0ZWREYXRlVGltZU1vbWVudCIsImN1cnJlbnRNb21lbnQiLCJpc1NhbWVPckFmdGVyIiwiaXNOb3dFcXVhbE9yQmVmb3JlRGF0ZSIsImlzU2FtZU9yQmVmb3JlIiwiaXNOb3dBZnRlckRhdGUiLCJpc05vd0JlZm9yZURhdGUiLCJnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUiLCJ3aXRoVGltZVpvbmUiLCJhcHBseUZvcm1hdCIsImdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGUiLCJnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRoWWVhcklmTm90Q3VycmVudCIsIm5vd1V0Y01vbWVudCIsImRhdGVUaW1lTW9tZW50IiwiTWF0aCIsImFicyIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZSIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZVdpdGhGdWxsWWVhciIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0IiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWUiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWVXaXRoRnVsbFpvbmUiLCJzaG93RWFzdGVyblpvbmVJZCIsInRpbWUiLCJ0aW1lem9uZUFiYnJldmlhdGlvbiIsInpvbmVBYmJyIiwicmVwbGFjZSIsImdldEZvcm1hdHRlZE51bWJlcmVkVGltZVdpdGhvdXRab25lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuIiwiZ2V0RnVsbEZvcm1hdHRlZFRpbWVab25lIiwiem9uZSIsImZpbHRlcmVkWm9uZSIsIm1vbWVudFV0aWxzIiwiZmlsdGVyWWVhcnMiLCJhYmJyZXZpYXRpb25zIiwiYWJicnMiLCJmaWx0ZXIiLCJhYmJyIiwidGVzdCIsInJlZHVjZSIsInVuaXF1ZUFiYnJzIiwiaW5jbHVkZXMiLCJwdXNoIiwiYWJicmV2aWF0aW9uc1N0cmluZyIsImpvaW4iLCJyZWFkYWJsZVpvbmVJZCIsImdldEZvcm1hdHRlZFRpbWVab25lIiwiZm9ybWF0IiwiaXNJbnB1dFR5cGVTdXBwb3J0ZWQiLCJ0eXBlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaXNTdXBwb3J0ZWQiLCJpc0RhdGVJbnB1dFN1cHBvcnRlZCIsImlzVGltZUlucHV0U3VwcG9ydGVkIiwiaXNEYXRlVGltZVZhbGlkIiwiaXNWYWxpZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJ1xuaW1wb3J0IG1vbWVudFV0aWxzIGZyb20gJ21vbWVudC10aW1lem9uZS9tb21lbnQtdGltZXpvbmUtdXRpbHMnXG5pbXBvcnQgeyBnZXREZWZhdWx0VGltZVpvbmVJZCwgZ3Vlc3NUaW1lWm9uZUlkIH0gZnJvbSAnLi90aW1lem9uZSdcblxuLyoqXG4gKiBUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGltZS1zZW5zaXRpdmUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGFuZCBvdGhlciBkYXRlL3RpbWUgdXRpbHMuIEFueSB0aW1lXG4gKiBhIG5ldyBEYXRlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCwgaXQgd2lsbCB1c2UgdGhpcyB2YWx1ZSB0byBhZGp1c3QgdGhlIHRpbWUgYnkgdGhpcyBvZmZzZXQgKHRvXG4gKiBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCBhIGtub3duIHRpbWUpXG4gKi9cbmxldCBjbG9ja09mZnNldCA9IDBcblxuLyoqXG4gKiBXaGVuIGEgR3JvdXBBc3Nlc3NtZW50IGNvbWVzIGluIHRoZSBkb29yLCBpdCBpbmNsdWRlcyB0aGUgY3VycmVudCBVVEMgZGF0ZXRpbWUuIFRoaXMgbWV0aG9kIGlzXG4gKiB1c2VkIHRvIHVwZGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAoYWNjdXJhdGUpIHNlcnZlciB0aW1lIGFuZCB0aGUgYnJvd3NlciB0aW1lXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDbG9ja09mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXQ6IG51bWJlcikge1xuXHRjbG9ja09mZnNldCA9IG9mZnNldFxufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBVVEMgdGltZSwgY2FsaWJyYXRlZCB0byB0aGUgQVBJIHNlcnZlcidzIGNsb2NrXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZXJ2ZXJOb3dVdGMgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgY2xvY2tPZmZzZXQpXG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwcm92aWRlZCBkYXRlLCBvZmZzZXQgYnkgdGhlIGNsb2NrT2Zmc2V0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPZmZzZXREYXRlID0gKGRhdGU6IERhdGUpID0+IHtcblx0cmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpICsgY2xvY2tPZmZzZXQpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGMgPSAoXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcblx0dGltZVpvbmVJZCA9IGd1ZXNzVGltZVpvbmVJZCgpXG4pID0+IHtcblx0cmV0dXJuIG1vbWVudC51dGMoZGF0ZVRpbWVVdGMpLnR6KHRpbWVab25lSWQpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGNJbkRlZmF1bHRab25lID0gKGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkgPT4ge1xuXHRjb25zdCB0aW1lWm9uZUlkID0gZ2V0RGVmYXVsdFRpbWVab25lSWQoKVxuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Wm9uZWRNb21lbnRGcm9tTG9jYWxEYXRlVGltZSA9IChsb2NhbERhdGVUaW1lOiBEYXRlIHwgc3RyaW5nLCB0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKCkpID0+IHtcblx0Y29uc3QgbG9jYWxNb21lbnQgPSBtb21lbnQobG9jYWxEYXRlVGltZSlcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBtb21lbnQudHooXG5cdFx0W1xuXHRcdFx0bG9jYWxNb21lbnQueWVhcigpLFxuXHRcdFx0bG9jYWxNb21lbnQubW9udGgoKSxcblx0XHRcdGxvY2FsTW9tZW50LmRhdGUoKSxcblx0XHRcdGxvY2FsTW9tZW50LmhvdXIoKSxcblx0XHRcdGxvY2FsTW9tZW50Lm1pbnV0ZSgpLFxuXHRcdFx0bG9jYWxNb21lbnQuc2Vjb25kKCksXG5cdFx0XHRsb2NhbE1vbWVudC5taWxsaXNlY29uZCgpXG5cdFx0XSxcblx0XHR0aW1lWm9uZUlkXG5cdClcblx0cmV0dXJuIHpvbmVkTW9tZW50XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbE1vbWVudEZyb21VdGMgPSAoXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcblx0dGltZVpvbmVJZCA9IGd1ZXNzVGltZVpvbmVJZCgpXG4pID0+IHtcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBnZXRab25lZE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMsIHRpbWVab25lSWQpXG5cdGNvbnN0IGxvY2FsTW9tZW50ID0gbW9tZW50KFtcblx0XHR6b25lZE1vbWVudC55ZWFyKCksXG5cdFx0em9uZWRNb21lbnQubW9udGgoKSxcblx0XHR6b25lZE1vbWVudC5kYXRlKCksXG5cdFx0em9uZWRNb21lbnQuaG91cigpLFxuXHRcdHpvbmVkTW9tZW50Lm1pbnV0ZSgpLFxuXHRcdHpvbmVkTW9tZW50LnNlY29uZCgpLFxuXHRcdHpvbmVkTW9tZW50Lm1pbGxpc2Vjb25kKClcblx0XSlcblx0cmV0dXJuIGxvY2FsTW9tZW50XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbERhdGVUaW1lRnJvbVV0YyA9IChkYXRlVGltZVV0Yzogc3RyaW5nKSA9PiB7XG5cdHJldHVybiBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpLnRvRGF0ZSgpXG59XG5cbmV4cG9ydCBjb25zdCBnZXREYXRlTWludXNUaW1lID0gKGRhdGVUaW1lOiBEYXRlKSA9PiB7XG5cdHJldHVybiBuZXcgRGF0ZShkYXRlVGltZS5nZXRGdWxsWWVhcigpLCBkYXRlVGltZS5nZXRNb250aCgpLCBkYXRlVGltZS5nZXREYXRlKCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZkRheShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdFx0LnN0YXJ0T2YoJ2RheScpXG5cdFx0LmFkZCgxLCAnZGF5cycpXG5cdFx0LnN1YnRyYWN0KDMsICdtaWxsaXNlY29uZHMnKSAvLyBtdXN0IGJlIG1pbnVzIDMgZm9yIFNRTCBkYXRlXG5cdFx0LnRvRGF0ZSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZk1pbnV0ZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdFx0LnN0YXJ0T2YoJ21pbnV0ZScpXG5cdFx0LmFkZCgxLCAnbWludXRlJylcblx0XHQuc3VidHJhY3QoMywgJ21pbGxpc2Vjb25kcycpIC8vIG11c3QgYmUgbWludXMgMyBmb3IgU1FMIGRhdGVcblx0XHQudG9EYXRlKClcbn1cblxuLyoqXG4gKiBJcyB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCAqKmFmdGVyIG9yIGVxdWFsIHRvKiogdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGNvbXBhcmUgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxuICogQHBhcmFtIG5vd1V0YyBPcHRpb25hbC4gVGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IFwibm93XCIgaXMgKiphZnRlciBvciBlcXVhbCB0byoqIGBkYXRlVGltZVV0Y2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckFmdGVyRGF0ZShkYXRlVGltZVV0Yz86IHN0cmluZywgbm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkge1xuXHRpZiAoIWRhdGVUaW1lVXRjKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cblx0Y29uc3QgYWRqdXN0ZWREYXRlVGltZU1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0Yylcblx0Y29uc3QgY3VycmVudE1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0Yyhub3dVdGMpXG5cdHJldHVybiBjdXJyZW50TW9tZW50LmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWREYXRlVGltZU1vbWVudClcbn1cblxuLyoqXG4gKiBJcyB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCAqKmJlZm9yZSBvciBlcXVhbCB0byoqIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBjb21wYXJlIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cbiAqIEBwYXJhbSBub3dVdGMgT3B0aW9uYWwuIFRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBcIm5vd1wiIGlzICoqYmVmb3JlIG9yIGVxdWFsIHRvKiogYGRhdGVUaW1lVXRjYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckJlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcblx0aWYgKCFkYXRlVGltZVV0Yykge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxuXHRyZXR1cm4gY3VycmVudE1vbWVudC5pc1NhbWVPckJlZm9yZShhZGp1c3RlZERhdGVUaW1lTW9tZW50KVxufVxuXG4vKipcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYWZ0ZXIqKiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmFmdGVyKiogYGRhdGVUaW1lVXRjYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93QWZ0ZXJEYXRlKGRhdGVUaW1lVXRjPzogc3RyaW5nLCBub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpKSB7XG5cdGlmICghZGF0ZVRpbWVVdGMpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxuXHRjb25zdCBhZGp1c3RlZERhdGVUaW1lTW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjKVxuXHRjb25zdCBjdXJyZW50TW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKG5vd1V0Yylcblx0cmV0dXJuIGN1cnJlbnRNb21lbnQgPiBhZGp1c3RlZERhdGVUaW1lTW9tZW50XG59XG5cbi8qKlxuICogSXMgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgKipiZWZvcmUqKiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmJlZm9yZSoqIGBkYXRlVGltZVV0Y2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vd0JlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcblx0aWYgKCFkYXRlVGltZVV0Yykge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxuXHRyZXR1cm4gY3VycmVudE1vbWVudCA8IGFkanVzdGVkRGF0ZVRpbWVNb21lbnRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgd2l0aCBmdWxsIGRhdGUsIGUuZy4gYE1hcmNoIDUsIDIwMTggQCA0OjA1IFBNIEVEVGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNTU1NIEQsIFlZWVkgQCBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIGRheSBvZiB3ZWVrIGFuZCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgZS5nLiBgTW9uLCAzLzUvMjAxOCBAIDQ6MDUgUE0gRURUYFxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqIEBwYXJhbSB3aXRoVGltZVpvbmUgKG9wdGlvbmFsKSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBkZGQsIE0vRC9ZWVlZIEAgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgd2l0aCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzUvMTggNDowNSBQTSBFRFRgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZShkYXRlVGltZVV0Yzogc3RyaW5nLCB3aXRoVGltZVpvbmUgPSB0cnVlKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgYE0vRC9ZWSBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIG5vIHllYXIsIGUuZy4gYDMvNSA0OjA1IFBNIEVEVGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNL0QgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgZnVsbCB5ZWFyLCBlLmcuIGBNYXIgNSwgMjAxOGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ01NTSBELCBZWVlZJylcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgbm8geWVhciwgZS5nLiBgTWFyIDVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ01NTSBEJylcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgYXMgZWl0aGVyICdNTU0gRCwgWVlZWScgb3IgJ01NTSBEJyBpZiB0aGUgZGF0ZSdzIHllYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgeWVhclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nIG9mIFwibm93XCIuIFVzZWQgZm9yIHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhZZWFySWZOb3RDdXJyZW50KFxuXHRkYXRlVGltZVV0Yzogc3RyaW5nLFxuXHRub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpXG4pIHtcblx0Y29uc3Qgbm93VXRjTW9tZW50ID0gbW9tZW50KG5vd1V0Yylcblx0Y29uc3QgZGF0ZVRpbWVNb21lbnQgPSBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdHJldHVybiBNYXRoLmFicyhub3dVdGNNb21lbnQueWVhcigpIC0gZGF0ZVRpbWVNb21lbnQueWVhcigpKSA9PT0gMFxuXHRcdD8gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yylcblx0XHQ6IGdldEZvcm1hdHRlZFNpbXBsaWZpZWREYXRlKGRhdGVUaW1lVXRjKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIHNob3J0IHllYXIsIGUuZy4gYDMvNS8xOGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNL0QvWVknKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIGZ1bGwgeWVhciwgZS5nLiBgMy81LzIwMThgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aEZ1bGxZZWFyKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnTS9EL1lZWVknKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyBmb3IgdXNlIGluIEhUTUwgaW5wdXRzLCBlLmcuIGAyMDE4LTAzLTA1YFxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0KGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnWVlZWS1NTS1ERCcpXG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIHdpdGggQW1lcmljYW4gc2xhc2ggZGF0ZXMgYW5kIG5vIHllYXIgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNL0QnKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lIHN0cmluZywgZS5nLiBgNDowNSBQTSBFRFRgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCBgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aCBwb3NzaWJseSBmdWxsIHRpbWUgem9uZSBuYW1lLCBlLmcuIGA0OjA1IFBNIEVEVGAgb3IgYDQ6MDUgUE0gQ1NUIChBc2lhL1RhaXBlaSlgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHNob3dFYXN0ZXJuWm9uZUlkIChvcHRpb25hbCkgV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgdGltZVpvbmVJZCBpbiB0aGUgcmVzdWx0IGZvciBFU1QvRURULiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHBhcmFtIHRpbWVab25lSWQgKG9wdGlvbmFsKSBBIHRpbWUgem9uZSBJZC4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lIGlkLCB1c2luZyBgZ3Vlc3NUaW1lWm9uZUlkKClgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aEZ1bGxab25lKFxuXHRkYXRlVGltZVV0Yzogc3RyaW5nLFxuXHRzaG93RWFzdGVyblpvbmVJZCA9IGZhbHNlLFxuXHR0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKClcbikge1xuXHRjb25zdCB6b25lZE1vbWVudCA9IGdldFpvbmVkTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YywgdGltZVpvbmVJZClcblx0Y29uc3QgdGltZSA9IGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnaDptbVxcdTAwYTBBJywgdGltZVpvbmVJZClcblx0Y29uc3QgdGltZXpvbmVBYmJyZXZpYXRpb24gPSB6b25lZE1vbWVudC56b25lQWJicigpXG5cdHJldHVybiAodGltZXpvbmVBYmJyZXZpYXRpb24gPT09ICdFRFQnIHx8IHRpbWV6b25lQWJicmV2aWF0aW9uID09PSAnRVNUJykgJiYgIXNob3dFYXN0ZXJuWm9uZUlkXG5cdFx0PyAvLyBEb24ndCBzaG93IHRoZSBmdWxsIHpvbmUgbmFtZSBpZiBpbiBFRFQgb3IgRVNULCB1bmxlc3MgdG9sZCB0b1xuXHRcdFx0YCR7dGltZX0gJHt0aW1lem9uZUFiYnJldmlhdGlvbn1gXG5cdFx0OiAvLyBJZiBub3QgRURUIG9yIEVTVCwgc2hvdyB0aGUgem9uZSBuYW1lLCByZXBsYWNpbmcgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXNcblx0XHRcdC8vIEV4OiBcIkFzaWEvVGFpcGVpXCJcblx0XHRcdGAke3RpbWV9ICR7dGltZXpvbmVBYmJyZXZpYXRpb259ICgke3RpbWVab25lSWQucmVwbGFjZSgnXycsICcgJyl9KWBcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aG91dCB0aW1lIHpvbmUsIGUuZy4gYDQ6MDUgUE1gXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdoOm1tXFx1MDBhMEEnKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lIHN0cmluZyB3aXRob3V0IHRpbWUgem9uZSwgaW4gMjQgaHIgdGltZSwgZS5nLiBgMTY6MDVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnSEg6bW0nKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdWxsIGZvcm1hdHRlZCB0aW1lIHpvbmUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gYHRpbWVab25lSWRgLlxuICpcbiAqIENvbWJpbmVzIGFsbCBwb3NzaWJsZSBhYmJyZXZpYXRpb25zIGZvciB0aGUgem9uZSBhbmQgdGhlIHRpbWVab25lSWQsIGUuZy4gYEVTVC9FRFRgLCBgUFNUL1BEVCAoQW1lcmljYS9Mb3MgQW5nZWxlcylgIG9yIGBDU1QgKEFzaWEvVGFpcGVpKWBcbiAqXG4gKiBJZiBhYmJyZXZpYXRpb25zIGFyZSBub3QgYWxwaGEgY2hhcmFjdGVycywgZS5nLiBgLTA0YCwgdGhlbiBvbmx5IHRoZSB0aW1lWm9uZUlkIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB0aW1lWm9uZUlkIChvcHRpb25hbCkgQSB0aW1lIHpvbmUgSWQuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSBpZCwgdXNpbmcgYGd1ZXNzVGltZVpvbmVJZCgpYC5cbiAqIEBwYXJhbSBzaG93RWFzdGVyblpvbmVJZCAob3B0aW9uYWwpIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIHRpbWVab25lSWQgaW4gdGhlIHJlc3VsdCBmb3IgRVNUL0VEVC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdWxsRm9ybWF0dGVkVGltZVpvbmUoXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSxcblx0c2hvd0Vhc3Rlcm5ab25lSWQgPSBmYWxzZSxcblx0bm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKVxuKSB7XG5cdGNvbnN0IHpvbmUgPSBtb21lbnQudHouem9uZSh0aW1lWm9uZUlkKVxuXHRpZiAoIXpvbmUpIHJldHVybiAnJ1xuXG5cdGNvbnN0IHpvbmVkTW9tZW50ID0gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKG5vd1V0YywgdGltZVpvbmVJZClcblx0Ly8gZmlsdGVyIHRoZSB6b25lIGRhdGEgZG93biB0byBqdXN0IHJlY2VudCB5ZWFycywgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvZiAxOTAwIHRvIDIwMzhcblx0Y29uc3QgZmlsdGVyZWRab25lID0gbW9tZW50VXRpbHMudHouZmlsdGVyWWVhcnMoem9uZSwgem9uZWRNb21lbnQueWVhcigpIC0gMSwgem9uZWRNb21lbnQueWVhcigpICsgMSlcblx0Ly8gZmluZCBhbGwgdW5pcXVlIGFiYnJldmlhdGlvbnMgZm9yIHRoZSB6b25lLCBjb21iaW5lZCBpbnRvIGEgc3RyaW5nXG5cdGNvbnN0IGFiYnJldmlhdGlvbnMgPSBmaWx0ZXJlZFpvbmUuYWJicnNcblx0XHQvLyBmaWx0ZXIgb3V0IG5vbi1hbHBoYSBhYmJyZXZpYXRpb25zXG5cdFx0LmZpbHRlcihhYmJyID0+IC9bYS16QS1aXSsvZy50ZXN0KGFiYnIpKVxuXHRcdC5yZWR1Y2UoKHVuaXF1ZUFiYnJzOiBzdHJpbmdbXSwgYWJicikgPT4ge1xuXHRcdFx0aWYgKCF1bmlxdWVBYmJycy5pbmNsdWRlcyhhYmJyKSkge1xuXHRcdFx0XHR1bmlxdWVBYmJycy5wdXNoKGFiYnIpXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdW5pcXVlQWJicnNcblx0XHR9LCBbXSlcblx0Y29uc3QgYWJicmV2aWF0aW9uc1N0cmluZyA9IGFiYnJldmlhdGlvbnMubGVuZ3RoID4gMCA/IGFiYnJldmlhdGlvbnMuam9pbignLycpIDogbnVsbFxuXHRjb25zdCByZWFkYWJsZVpvbmVJZCA9IHRpbWVab25lSWQucmVwbGFjZSgnXycsICcgJylcblx0cmV0dXJuICFhYmJyZXZpYXRpb25zU3RyaW5nXG5cdFx0PyByZWFkYWJsZVpvbmVJZFxuXHRcdDogYWJicmV2aWF0aW9uc1N0cmluZyA9PT0gJ0VTVC9FRFQnICYmICFzaG93RWFzdGVyblpvbmVJZFxuXHRcdFx0PyAvLyBEb24ndCBzaG93IHRoZSB6b25lSWQgaWYgaW4gRWFzdGVybiwgdW5sZXNzIHRvbGQgdG9cblx0XHRcdFx0YWJicmV2aWF0aW9uc1N0cmluZ1xuXHRcdFx0OiAvLyBTaG93IHRoZSBjb21iaW5lZCBhYmJyZXZpYXRpb25zIHBsdXMgdGhlIGZyaWVuZGx5IHpvbmVJZFxuXHRcdFx0XHRgJHthYmJyZXZpYXRpb25zU3RyaW5nfSAoJHtyZWFkYWJsZVpvbmVJZH0pYFxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGJhc2ljIHRpbWUgem9uZSBhYmJyZXZpYXRpb24gZm9yIHRoZSBnaXZlbiBkYXRlLCBlLmcuIGBFRFRgLlxuICpcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRUaW1lWm9uZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ3onKVxufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBkYXRlIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXQuIFBhcnNlcyB0aGUgZGF0ZSBhcyBVVEMsIHRoZW4gY29udmVydHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lLCB0aGVuIGZvcm1hdHMuXG4gKiBAcGFyYW0geyp9IGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGZvcm1hdC4gQW55IHZhbGlkIGlucHV0IGZvciBgbW9tZW50LnV0YyguLi4pYFxuICogQHBhcmFtIHsqfSBmb3JtYXQgVGhlIGZvcm1hdCB0byB1c2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGM6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSkge1xuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKS5mb3JtYXQoZm9ybWF0KVxufVxuXG5jb25zdCBpc0lucHV0VHlwZVN1cHBvcnRlZCA9ICh0eXBlOiBzdHJpbmcpID0+IHtcblx0dHJ5IHtcblx0XHRjb25zdCB0ZXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuXHRcdHRlc3QudHlwZSA9IHR5cGVcblx0XHRjb25zdCBpc1N1cHBvcnRlZCA9IHRlc3QudHlwZSA9PT0gdHlwZVxuXHRcdHJldHVybiBpc1N1cHBvcnRlZFxuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG5leHBvcnQgY29uc3QgaXNEYXRlSW5wdXRTdXBwb3J0ZWQgPSBpc0lucHV0VHlwZVN1cHBvcnRlZCgnZGF0ZScpXG5cbmV4cG9ydCBjb25zdCBpc1RpbWVJbnB1dFN1cHBvcnRlZCA9IGlzSW5wdXRUeXBlU3VwcG9ydGVkKCd0aW1lJylcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZVRpbWVWYWxpZChkYXRlVGltZTogc3RyaW5nIHwgRGF0ZSkge1xuXHRyZXR1cm4gISFkYXRlVGltZSAmJiBtb21lbnQoZGF0ZVRpbWUpLmlzVmFsaWQoKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxlQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxvQkFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBRixPQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlHLFdBQVcsR0FBRyxDQUFDOztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1DLGNBQWMsR0FBRyxTQUFBQSxDQUFVQyxNQUFjLEVBQUU7RUFDdkRGLFdBQVcsR0FBR0UsTUFBTTtBQUNyQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUZBQyxPQUFBLENBQUFGLGNBQUEsR0FBQUEsY0FBQTtBQUdPLE1BQU1HLGVBQWUsR0FBRyxTQUFBQSxDQUFBLEVBQVk7RUFDMUMsT0FBTyxJQUFJQyxJQUFJLENBQUNBLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsR0FBR04sV0FBVyxDQUFDO0FBQzFDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBRkFHLE9BQUEsQ0FBQUMsZUFBQSxHQUFBQSxlQUFBO0FBR08sTUFBTUcsYUFBYSxHQUFJQyxJQUFVLElBQUs7RUFDNUMsT0FBTyxJQUFJSCxJQUFJLENBQUNHLElBQUksQ0FBQ0MsT0FBTyxDQUFDLENBQUMsR0FBR1QsV0FBVyxDQUFDO0FBQzlDLENBQUM7QUFBQUcsT0FBQSxDQUFBSSxhQUFBLEdBQUFBLGFBQUE7QUFFTSxNQUFNRyxxQkFBcUIsR0FBRyxTQUFBQSxDQUFBLEVBR2hDO0VBQUEsSUFGSkMsV0FBVyxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBR1IsZUFBZSxDQUFDLENBQUMsQ0FBQ1csV0FBVyxDQUFDLENBQUM7RUFBQSxJQUM3Q0MsVUFBVSxHQUFBSixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFBSyx5QkFBZSxFQUFDLENBQUM7RUFFOUIsT0FBT0MsdUJBQU0sQ0FBQ0MsR0FBRyxDQUFDUixXQUFXLENBQUMsQ0FBQ1MsRUFBRSxDQUFDSixVQUFVLENBQUM7QUFDOUMsQ0FBQztBQUFBYixPQUFBLENBQUFPLHFCQUFBLEdBQUFBLHFCQUFBO0FBRU0sTUFBTVcsa0NBQWtDLEdBQUcsU0FBQUEsQ0FBQSxFQUFtRDtFQUFBLElBQWxEVixXQUFXLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHUixlQUFlLENBQUMsQ0FBQyxDQUFDVyxXQUFXLENBQUMsQ0FBQztFQUMvRixNQUFNQyxVQUFVLEdBQUcsSUFBQU0sOEJBQW9CLEVBQUMsQ0FBQztFQUN6QyxPQUFPWixxQkFBcUIsQ0FBQ0MsV0FBVyxFQUFFSyxVQUFVLENBQUM7QUFDdEQsQ0FBQztBQUFBYixPQUFBLENBQUFrQixrQ0FBQSxHQUFBQSxrQ0FBQTtBQUVNLE1BQU1FLCtCQUErQixHQUFHLFNBQUFBLENBQUNDLGFBQTRCLEVBQXFDO0VBQUEsSUFBbkNSLFVBQVUsR0FBQUosU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsSUFBQUsseUJBQWUsRUFBQyxDQUFDO0VBQzNHLE1BQU1RLFdBQVcsR0FBRyxJQUFBUCx1QkFBTSxFQUFDTSxhQUFhLENBQUM7RUFDekMsTUFBTUUsV0FBVyxHQUFHUix1QkFBTSxDQUFDRSxFQUFFLENBQzVCLENBQ0NLLFdBQVcsQ0FBQ0UsSUFBSSxDQUFDLENBQUMsRUFDbEJGLFdBQVcsQ0FBQ0csS0FBSyxDQUFDLENBQUMsRUFDbkJILFdBQVcsQ0FBQ2pCLElBQUksQ0FBQyxDQUFDLEVBQ2xCaUIsV0FBVyxDQUFDSSxJQUFJLENBQUMsQ0FBQyxFQUNsQkosV0FBVyxDQUFDSyxNQUFNLENBQUMsQ0FBQyxFQUNwQkwsV0FBVyxDQUFDTSxNQUFNLENBQUMsQ0FBQyxFQUNwQk4sV0FBVyxDQUFDTyxXQUFXLENBQUMsQ0FBQyxDQUN6QixFQUNEaEIsVUFDRCxDQUFDO0VBQ0QsT0FBT1UsV0FBVztBQUNuQixDQUFDO0FBQUF2QixPQUFBLENBQUFvQiwrQkFBQSxHQUFBQSwrQkFBQTtBQUVNLE1BQU1VLHFCQUFxQixHQUFHLFNBQUFBLENBQUEsRUFHaEM7RUFBQSxJQUZKdEIsV0FBVyxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBR1IsZUFBZSxDQUFDLENBQUMsQ0FBQ1csV0FBVyxDQUFDLENBQUM7RUFBQSxJQUM3Q0MsVUFBVSxHQUFBSixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFBSyx5QkFBZSxFQUFDLENBQUM7RUFFOUIsTUFBTVMsV0FBVyxHQUFHaEIscUJBQXFCLENBQUNDLFdBQVcsRUFBRUssVUFBVSxDQUFDO0VBQ2xFLE1BQU1TLFdBQVcsR0FBRyxJQUFBUCx1QkFBTSxFQUFDLENBQzFCUSxXQUFXLENBQUNDLElBQUksQ0FBQyxDQUFDLEVBQ2xCRCxXQUFXLENBQUNFLEtBQUssQ0FBQyxDQUFDLEVBQ25CRixXQUFXLENBQUNsQixJQUFJLENBQUMsQ0FBQyxFQUNsQmtCLFdBQVcsQ0FBQ0csSUFBSSxDQUFDLENBQUMsRUFDbEJILFdBQVcsQ0FBQ0ksTUFBTSxDQUFDLENBQUMsRUFDcEJKLFdBQVcsQ0FBQ0ssTUFBTSxDQUFDLENBQUMsRUFDcEJMLFdBQVcsQ0FBQ00sV0FBVyxDQUFDLENBQUMsQ0FDekIsQ0FBQztFQUNGLE9BQU9QLFdBQVc7QUFDbkIsQ0FBQztBQUFBdEIsT0FBQSxDQUFBOEIscUJBQUEsR0FBQUEscUJBQUE7QUFFTSxNQUFNQyx1QkFBdUIsR0FBSXZCLFdBQW1CLElBQUs7RUFDL0QsT0FBT3NCLHFCQUFxQixDQUFDdEIsV0FBVyxDQUFDLENBQUN3QixNQUFNLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBQUFoQyxPQUFBLENBQUErQix1QkFBQSxHQUFBQSx1QkFBQTtBQUVNLE1BQU1FLGdCQUFnQixHQUFJQyxRQUFjLElBQUs7RUFDbkQsT0FBTyxJQUFJaEMsSUFBSSxDQUFDZ0MsUUFBUSxDQUFDQyxXQUFXLENBQUMsQ0FBQyxFQUFFRCxRQUFRLENBQUNFLFFBQVEsQ0FBQyxDQUFDLEVBQUVGLFFBQVEsQ0FBQ0csT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBQUFyQyxPQUFBLENBQUFpQyxnQkFBQSxHQUFBQSxnQkFBQTtBQUVNLFNBQVNLLFdBQVdBLENBQUM5QixXQUFtQixFQUFFO0VBQ2hELE9BQU8sSUFBQU8sdUJBQU0sRUFBQ1AsV0FBVyxDQUFDLENBQ3hCK0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUNkQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUNkQyxRQUFRLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0VBQUEsQ0FDNUJULE1BQU0sQ0FBQyxDQUFDO0FBQ1g7QUFFTyxTQUFTVSxjQUFjQSxDQUFDbEMsV0FBbUIsRUFBRTtFQUNuRCxPQUFPLElBQUFPLHVCQUFNLEVBQUNQLFdBQVcsQ0FBQyxDQUN4QitCLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FDakJDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQ2hCQyxRQUFRLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0VBQUEsQ0FDNUJULE1BQU0sQ0FBQyxDQUFDO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNXLHFCQUFxQkEsQ0FBQ25DLFdBQW9CLEVBQTRDO0VBQUEsSUFBMUNvQyxNQUFNLEdBQUFuQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBR1IsZUFBZSxDQUFDLENBQUMsQ0FBQ1csV0FBVyxDQUFDLENBQUM7RUFDbkcsSUFBSSxDQUFDSixXQUFXLEVBQUU7SUFDakIsT0FBTyxLQUFLO0VBQ2I7RUFDQSxNQUFNcUMsc0JBQXNCLEdBQUdmLHFCQUFxQixDQUFDdEIsV0FBVyxDQUFDO0VBQ2pFLE1BQU1zQyxhQUFhLEdBQUdoQixxQkFBcUIsQ0FBQ2MsTUFBTSxDQUFDO0VBQ25ELE9BQU9FLGFBQWEsQ0FBQ0MsYUFBYSxDQUFDRixzQkFBc0IsQ0FBQztBQUMzRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csc0JBQXNCQSxDQUFDeEMsV0FBb0IsRUFBNEM7RUFBQSxJQUExQ29DLE1BQU0sR0FBQW5DLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHUixlQUFlLENBQUMsQ0FBQyxDQUFDVyxXQUFXLENBQUMsQ0FBQztFQUNwRyxJQUFJLENBQUNKLFdBQVcsRUFBRTtJQUNqQixPQUFPLEtBQUs7RUFDYjtFQUNBLE1BQU1xQyxzQkFBc0IsR0FBR2YscUJBQXFCLENBQUN0QixXQUFXLENBQUM7RUFDakUsTUFBTXNDLGFBQWEsR0FBR2hCLHFCQUFxQixDQUFDYyxNQUFNLENBQUM7RUFDbkQsT0FBT0UsYUFBYSxDQUFDRyxjQUFjLENBQUNKLHNCQUFzQixDQUFDO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSyxjQUFjQSxDQUFDMUMsV0FBb0IsRUFBNEM7RUFBQSxJQUExQ29DLE1BQU0sR0FBQW5DLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHUixlQUFlLENBQUMsQ0FBQyxDQUFDVyxXQUFXLENBQUMsQ0FBQztFQUM1RixJQUFJLENBQUNKLFdBQVcsRUFBRTtJQUNqQixPQUFPLEtBQUs7RUFDYjtFQUNBLE1BQU1xQyxzQkFBc0IsR0FBR2YscUJBQXFCLENBQUN0QixXQUFXLENBQUM7RUFDakUsTUFBTXNDLGFBQWEsR0FBR2hCLHFCQUFxQixDQUFDYyxNQUFNLENBQUM7RUFDbkQsT0FBT0UsYUFBYSxHQUFHRCxzQkFBc0I7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNNLGVBQWVBLENBQUMzQyxXQUFvQixFQUE0QztFQUFBLElBQTFDb0MsTUFBTSxHQUFBbkMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUdSLGVBQWUsQ0FBQyxDQUFDLENBQUNXLFdBQVcsQ0FBQyxDQUFDO0VBQzdGLElBQUksQ0FBQ0osV0FBVyxFQUFFO0lBQ2pCLE9BQU8sS0FBSztFQUNiO0VBQ0EsTUFBTXFDLHNCQUFzQixHQUFHZixxQkFBcUIsQ0FBQ3RCLFdBQVcsQ0FBQztFQUNqRSxNQUFNc0MsYUFBYSxHQUFHaEIscUJBQXFCLENBQUNjLE1BQU0sQ0FBQztFQUNuRCxPQUFPRSxhQUFhLEdBQUdELHNCQUFzQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU08sMkJBQTJCQSxDQUFDNUMsV0FBbUIsRUFBdUI7RUFBQSxJQUFyQjZDLFlBQVksR0FBQTVDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUk7RUFDbkYsT0FBTzZDLFdBQVcsQ0FBQzlDLFdBQVcsRUFBRSw2QkFBNkI2QyxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ3pGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSw0QkFBNEJBLENBQUMvQyxXQUFtQixFQUF1QjtFQUFBLElBQXJCNkMsWUFBWSxHQUFBNUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsSUFBSTtFQUNwRixPQUFPNkMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLDhCQUE4QjZDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7QUFDMUY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLCtCQUErQkEsQ0FBQ2hELFdBQW1CLEVBQXVCO0VBQUEsSUFBckI2QyxZQUFZLEdBQUE1QyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFJO0VBQ3ZGLE9BQU82QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUscUJBQXFCNkMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUNqRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksMENBQTBDQSxDQUFDakQsV0FBbUIsRUFBdUI7RUFBQSxJQUFyQjZDLFlBQVksR0FBQTVDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUk7RUFDbEcsT0FBTzZDLFdBQVcsQ0FBQzlDLFdBQVcsRUFBRSxrQkFBa0I2QyxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQzlFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ssMEJBQTBCQSxDQUFDbEQsV0FBbUIsRUFBRTtFQUMvRCxPQUFPOEMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLGFBQWEsQ0FBQztBQUMvQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNtRCxxQ0FBcUNBLENBQUNuRCxXQUFtQixFQUFFO0VBQzFFLE9BQU84QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsT0FBTyxDQUFDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTb0QsOENBQThDQSxDQUM3RHBELFdBQW1CLEVBRWxCO0VBQUEsSUFERG9DLE1BQU0sR0FBQW5DLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHUixlQUFlLENBQUMsQ0FBQyxDQUFDVyxXQUFXLENBQUMsQ0FBQztFQUV4QyxNQUFNaUQsWUFBWSxHQUFHLElBQUE5Qyx1QkFBTSxFQUFDNkIsTUFBTSxDQUFDO0VBQ25DLE1BQU1rQixjQUFjLEdBQUcsSUFBQS9DLHVCQUFNLEVBQUNQLFdBQVcsQ0FBQztFQUMxQyxPQUFPdUQsSUFBSSxDQUFDQyxHQUFHLENBQUNILFlBQVksQ0FBQ3JDLElBQUksQ0FBQyxDQUFDLEdBQUdzQyxjQUFjLENBQUN0QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUMvRG1DLHFDQUFxQyxDQUFDbkQsV0FBVyxDQUFDLEdBQ2xEa0QsMEJBQTBCLENBQUNsRCxXQUFXLENBQUM7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTeUQsd0JBQXdCQSxDQUFDekQsV0FBbUIsRUFBRTtFQUM3RCxPQUFPOEMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLFFBQVEsQ0FBQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMwRCxvQ0FBb0NBLENBQUMxRCxXQUFtQixFQUFFO0VBQ3pFLE9BQU84QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsVUFBVSxDQUFDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzJELGdDQUFnQ0EsQ0FBQzNELFdBQW1CLEVBQUU7RUFDckUsT0FBTzhDLFdBQVcsQ0FBQzlDLFdBQVcsRUFBRSxZQUFZLENBQUM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTNEQsbUNBQW1DQSxDQUFDNUQsV0FBbUIsRUFBRTtFQUN4RSxPQUFPOEMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLEtBQUssQ0FBQztBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzZELHdCQUF3QkEsQ0FBQzdELFdBQW1CLEVBQXVCO0VBQUEsSUFBckI2QyxZQUFZLEdBQUE1QyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFJO0VBQ2hGLE9BQU82QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsY0FBYzZDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2lCLG9DQUFvQ0EsQ0FDbkQ5RCxXQUFtQixFQUdsQjtFQUFBLElBRkQrRCxpQkFBaUIsR0FBQTlELFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLEtBQUs7RUFBQSxJQUN6QkksVUFBVSxHQUFBSixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFBSyx5QkFBZSxFQUFDLENBQUM7RUFFOUIsTUFBTVMsV0FBVyxHQUFHaEIscUJBQXFCLENBQUNDLFdBQVcsRUFBRUssVUFBVSxDQUFDO0VBQ2xFLE1BQU0yRCxJQUFJLEdBQUdsQixXQUFXLENBQUM5QyxXQUFXLEVBQUUsYUFBYSxFQUFFSyxVQUFVLENBQUM7RUFDaEUsTUFBTTRELG9CQUFvQixHQUFHbEQsV0FBVyxDQUFDbUQsUUFBUSxDQUFDLENBQUM7RUFDbkQsT0FBTyxDQUFDRCxvQkFBb0IsS0FBSyxLQUFLLElBQUlBLG9CQUFvQixLQUFLLEtBQUssS0FBSyxDQUFDRixpQkFBaUI7RUFDNUY7RUFDRCxHQUFHQyxJQUFJLElBQUlDLG9CQUFvQixFQUFFO0VBQ2hDO0VBQ0Q7RUFDQSxHQUFHRCxJQUFJLElBQUlDLG9CQUFvQixLQUFLNUQsVUFBVSxDQUFDOEQsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztBQUN0RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLG1DQUFtQ0EsQ0FBQ3BFLFdBQW1CLEVBQUU7RUFDeEUsT0FBTzhDLFdBQVcsQ0FBQzlDLFdBQVcsRUFBRSxhQUFhLENBQUM7QUFDL0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcUUsNkNBQTZDQSxDQUFDckUsV0FBbUIsRUFBRTtFQUNsRixPQUFPOEMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLE9BQU8sQ0FBQztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3NFLHdCQUF3QkEsQ0FBQSxFQUl0QztFQUFBLElBSERqRSxVQUFVLEdBQUFKLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUFLLHlCQUFlLEVBQUMsQ0FBQztFQUFBLElBQzlCeUQsaUJBQWlCLEdBQUE5RCxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxLQUFLO0VBQUEsSUFDekJtQyxNQUFNLEdBQUFuQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBR1IsZUFBZSxDQUFDLENBQUMsQ0FBQ1csV0FBVyxDQUFDLENBQUM7RUFFeEMsTUFBTW1FLElBQUksR0FBR2hFLHVCQUFNLENBQUNFLEVBQUUsQ0FBQzhELElBQUksQ0FBQ2xFLFVBQVUsQ0FBQztFQUN2QyxJQUFJLENBQUNrRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0VBRXBCLE1BQU14RCxXQUFXLEdBQUdoQixxQkFBcUIsQ0FBQ3FDLE1BQU0sRUFBRS9CLFVBQVUsQ0FBQztFQUM3RDtFQUNBLE1BQU1tRSxZQUFZLEdBQUdDLDRCQUFXLENBQUNoRSxFQUFFLENBQUNpRSxXQUFXLENBQUNILElBQUksRUFBRXhELFdBQVcsQ0FBQ0MsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUVELFdBQVcsQ0FBQ0MsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDckc7RUFDQSxNQUFNMkQsYUFBYSxHQUFHSCxZQUFZLENBQUNJO0VBQ2xDO0VBQUEsQ0FDQ0MsTUFBTSxDQUFDQyxJQUFJLElBQUksWUFBWSxDQUFDQyxJQUFJLENBQUNELElBQUksQ0FBQyxDQUFDLENBQ3ZDRSxNQUFNLENBQUMsQ0FBQ0MsV0FBcUIsRUFBRUgsSUFBSSxLQUFLO0lBQ3hDLElBQUksQ0FBQ0csV0FBVyxDQUFDQyxRQUFRLENBQUNKLElBQUksQ0FBQyxFQUFFO01BQ2hDRyxXQUFXLENBQUNFLElBQUksQ0FBQ0wsSUFBSSxDQUFDO0lBQ3ZCO0lBQ0EsT0FBT0csV0FBVztFQUNuQixDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQ1AsTUFBTUcsbUJBQW1CLEdBQUdULGFBQWEsQ0FBQ3pFLE1BQU0sR0FBRyxDQUFDLEdBQUd5RSxhQUFhLENBQUNVLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJO0VBQ3JGLE1BQU1DLGNBQWMsR0FBR2pGLFVBQVUsQ0FBQzhELE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0VBQ25ELE9BQU8sQ0FBQ2lCLG1CQUFtQixHQUN4QkUsY0FBYyxHQUNkRixtQkFBbUIsS0FBSyxTQUFTLElBQUksQ0FBQ3JCLGlCQUFpQjtFQUN0RDtFQUNEcUIsbUJBQW1CO0VBQ2xCO0VBQ0QsR0FBR0EsbUJBQW1CLEtBQUtFLGNBQWMsR0FBRztBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msb0JBQW9CQSxDQUFDdkYsV0FBbUIsRUFBRTtFQUN6RCxPQUFPOEMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLEdBQUcsQ0FBQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzhDLFdBQVdBLENBQUM5QyxXQUFtQixFQUFFd0YsTUFBYyxFQUFrQztFQUFBLElBQWhDbkYsVUFBVSxHQUFBSixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFBSyx5QkFBZSxFQUFDLENBQUM7RUFDdkYsT0FBT1AscUJBQXFCLENBQUNDLFdBQVcsRUFBRUssVUFBVSxDQUFDLENBQUNtRixNQUFNLENBQUNBLE1BQU0sQ0FBQztBQUNyRTtBQUVBLE1BQU1DLG9CQUFvQixHQUFJQyxJQUFZLElBQUs7RUFDOUMsSUFBSTtJQUNILE1BQU1YLElBQUksR0FBR1ksUUFBUSxDQUFDQyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQzVDYixJQUFJLENBQUNXLElBQUksR0FBR0EsSUFBSTtJQUNoQixNQUFNRyxXQUFXLEdBQUdkLElBQUksQ0FBQ1csSUFBSSxLQUFLQSxJQUFJO0lBQ3RDLE9BQU9HLFdBQVc7RUFDbkIsQ0FBQyxDQUFDLE1BQU07SUFDUCxPQUFPLEtBQUs7RUFDYjtBQUNELENBQUM7QUFFTSxNQUFNQyxvQkFBb0IsR0FBQXRHLE9BQUEsQ0FBQXNHLG9CQUFBLEdBQUdMLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztBQUV6RCxNQUFNTSxvQkFBb0IsR0FBQXZHLE9BQUEsQ0FBQXVHLG9CQUFBLEdBQUdOLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztBQUV6RCxTQUFTTyxlQUFlQSxDQUFDdEUsUUFBdUIsRUFBRTtFQUN4RCxPQUFPLENBQUMsQ0FBQ0EsUUFBUSxJQUFJLElBQUFuQix1QkFBTSxFQUFDbUIsUUFBUSxDQUFDLENBQUN1RSxPQUFPLENBQUMsQ0FBQztBQUNoRCIsImlnbm9yZUxpc3QiOltdfQ==
|