@kaspernj/api-maker 1.0.446 → 1.0.447
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/{.eslintrc.cjs → .eslintrc.js} +4 -0
- package/README.md +35 -0
- package/android/build.gradle +43 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/expo/modules/api_maker/ApiMakerModule.kt +50 -0
- package/android/src/main/java/expo/modules/api_maker/ApiMakerView.kt +30 -0
- package/build/api.js +120 -0
- package/build/attribute-not-loaded-error.js +2 -0
- package/build/base-component.js +5 -0
- package/build/base-error.js +33 -0
- package/build/base-model/attribute.js +25 -0
- package/build/base-model/column.js +11 -0
- package/build/base-model/reflection.js +14 -0
- package/build/base-model/scope.js +11 -0
- package/build/base-model.js +828 -0
- package/build/bootstrap/attribute-row/index.js +105 -0
- package/build/bootstrap/attribute-rows.js +31 -0
- package/build/bootstrap/card.js +138 -0
- package/build/bootstrap/checkbox.js +97 -0
- package/build/bootstrap/checkboxes.js +183 -0
- package/build/bootstrap/index.js +2 -0
- package/build/bootstrap/input.js +128 -0
- package/build/bootstrap/invalid-feedback.js +27 -0
- package/build/bootstrap/paginate.js +150 -0
- package/build/bootstrap/radio-buttons.js +72 -0
- package/build/bootstrap/select.js +88 -0
- package/build/bootstrap/sort-link.js +130 -0
- package/build/cable-connection-pool.js +128 -0
- package/build/cable-subscription-pool.js +207 -0
- package/build/cable-subscription.js +21 -0
- package/build/cache-key-generator.js +81 -0
- package/build/can-can.js +134 -0
- package/build/channels-consumer.js +3 -0
- package/build/collection-loader.js +48 -0
- package/build/collection.js +279 -0
- package/build/command-submit-data.js +81 -0
- package/build/commands-pool.js +195 -0
- package/build/compose.js +9 -0
- package/build/config.js +53 -0
- package/build/custom-error.js +5 -0
- package/build/data-set-to-attributes.js +10 -0
- package/build/deserializer.js +56 -0
- package/build/destroy-error.js +5 -0
- package/build/devise.js +109 -0
- package/build/draggable-sort/controller.js +136 -0
- package/build/draggable-sort/index.js +114 -0
- package/build/draggable-sort/item.js +188 -0
- package/build/error-logger.js +101 -0
- package/build/error-messages.js +13 -0
- package/build/event-connection.js +32 -0
- package/build/event-model-class.js +24 -0
- package/build/events.js +5 -0
- package/build/form.js +83 -0
- package/build/index.js +3 -0
- package/build/inputs/attachment.js +121 -0
- package/build/inputs/auto-submit.js +36 -0
- package/build/inputs/checkbox.js +145 -0
- package/build/inputs/checkboxes.js +111 -0
- package/build/inputs/id-for-component.js +15 -0
- package/build/inputs/input-wrapper.js +18 -0
- package/build/inputs/input.js +230 -0
- package/build/inputs/money.js +179 -0
- package/build/inputs/name-for-component.js +13 -0
- package/build/inputs/select.js +92 -0
- package/build/instance-of-class-name.js +23 -0
- package/build/key-value-store.js +53 -0
- package/build/link.js +68 -0
- package/build/logger.js +30 -0
- package/build/modal.js +37 -0
- package/build/model-class-require.js +13 -0
- package/build/model-events.js +30 -0
- package/build/model-name.js +28 -0
- package/build/model-prop-type.js +101 -0
- package/build/model-recipes-loader.js +32 -0
- package/build/model-recipes-model-loader.js +357 -0
- package/build/models-response-reader.js +40 -0
- package/build/models.js +8 -0
- package/build/money-formatter.js +77 -0
- package/build/not-loaded-error.js +2 -0
- package/build/params.js +60 -0
- package/build/preloaded.js +38 -0
- package/build/resize-observer.js +11 -0
- package/build/result.js +13 -0
- package/build/router/route.js +262 -0
- package/build/router/switch.js +72 -0
- package/build/router.js +57 -0
- package/build/routes-native.js +202 -0
- package/build/routes.js +50 -0
- package/build/run-last.js +35 -0
- package/build/serializer.js +63 -0
- package/build/services.js +20 -0
- package/build/session-status-updater.js +126 -0
- package/build/source-maps-loader.js +171 -0
- package/build/super-admin/config-reader.js +84 -0
- package/build/super-admin/edit-page/edit-attribute-checkbox.js +85 -0
- package/build/super-admin/edit-page/edit-attribute-content.js +54 -0
- package/build/super-admin/edit-page/edit-attribute-input.js +79 -0
- package/build/super-admin/edit-page/edit-attribute.js +76 -0
- package/build/super-admin/edit-page.js +120 -0
- package/build/super-admin/has-edit-config.js +12 -0
- package/build/super-admin/index-page.js +24 -0
- package/build/super-admin/index.js +180 -0
- package/build/super-admin/layout/header/index.js +151 -0
- package/build/super-admin/layout/index.js +109 -0
- package/build/super-admin/layout/menu/index.js +93 -0
- package/build/super-admin/layout/menu/menu-content.js +40 -0
- package/build/super-admin/layout/menu/menu-item.js +83 -0
- package/build/super-admin/layout/no-access.js +25 -0
- package/build/super-admin/model-class-table.js +61 -0
- package/build/super-admin/models.js +8 -0
- package/build/super-admin/show-nav.js +49 -0
- package/build/super-admin/show-page/belongs-to-attribute-row.js +28 -0
- package/build/super-admin/show-page/index.js +141 -0
- package/build/super-admin/show-reflection-actions.js +47 -0
- package/build/super-admin/show-reflection-link.js +46 -0
- package/build/super-admin/show-reflection-page.js +47 -0
- package/build/table/column-content.js +112 -0
- package/build/table/column-identifier.js +18 -0
- package/build/table/column-visible.js +7 -0
- package/build/table/components/column.js +20 -0
- package/build/table/components/flat-list.js +20 -0
- package/build/table/components/header.js +25 -0
- package/build/table/components/row.js +25 -0
- package/build/table/filters/attribute-element.js +43 -0
- package/build/table/filters/filter-form.js +392 -0
- package/build/table/filters/filter.js +89 -0
- package/build/table/filters/index.js +182 -0
- package/build/table/filters/load-search-modal.js +174 -0
- package/build/table/filters/reflection-element.js +36 -0
- package/build/table/filters/save-search-modal.js +86 -0
- package/build/table/filters/scope-element.js +41 -0
- package/build/table/header-column-content.js +67 -0
- package/build/table/header-column.js +144 -0
- package/build/table/header-select.js +104 -0
- package/build/table/model-callback-args.js +10 -0
- package/build/table/model-column.js +87 -0
- package/build/table/model-row.js +179 -0
- package/build/table/select-calculator.js +63 -0
- package/build/table/settings/column-row.js +97 -0
- package/build/table/settings/download-action.js +78 -0
- package/build/table/settings/index.js +92 -0
- package/build/table/table-settings.js +219 -0
- package/build/table/table.js +972 -0
- package/build/table/use-sorting.js +34 -0
- package/build/table/widths.js +75 -0
- package/build/table/worker-plugins-check-all-checkbox.js +125 -0
- package/build/table/worker-plugins-checkbox.js +115 -0
- package/build/translated-attributes.js +10 -0
- package/build/translated-collections.js +11 -0
- package/build/updated-attribute.js +76 -0
- package/build/url-encode.js +15 -0
- package/build/use-breakpoint.js +44 -0
- package/build/use-can-can.js +55 -0
- package/build/use-collection.js +225 -0
- package/build/use-created-event.js +52 -0
- package/build/use-current-user.js +73 -0
- package/build/use-destroyed-event.js +60 -0
- package/build/use-event-emitter.js +13 -0
- package/build/use-event-listener.js +16 -0
- package/build/use-input.js +140 -0
- package/build/use-model-event.js +60 -0
- package/build/use-model.js +169 -0
- package/build/use-resize-observer.js +23 -0
- package/build/use-router.js +102 -0
- package/build/use-screen-layout.js +39 -0
- package/build/use-updated-event.js +60 -0
- package/build/use-validation-errors.js +30 -0
- package/build/utils/card.js +51 -0
- package/build/utils/checkbox.js +48 -0
- package/build/utils/default-style.js +18 -0
- package/build/utils/modal.js +61 -0
- package/build/utils/text.js +18 -0
- package/build/validation-error.js +28 -0
- package/build/validation-errors.js +98 -0
- package/build/with-collection.js +13 -0
- package/build/with-current-user.js +9 -0
- package/build/with-model.js +14 -0
- package/build/with-router.js +21 -0
- package/expo-module.config.json +17 -0
- package/ios/ApiMaker.podspec +29 -0
- package/ios/ApiMakerModule.swift +48 -0
- package/ios/ApiMakerView.swift +38 -0
- package/package.json +35 -15
- package/src/{api.mjs → api.js} +5 -5
- package/src/{base-error.mjs → base-error.js} +1 -1
- package/src/base-model/{attribute.mjs → attribute.js} +1 -1
- package/src/base-model/{reflection.mjs → reflection.js} +1 -1
- package/src/{base-model.mjs → base-model.js} +14 -14
- package/src/bootstrap/attribute-row/index.jsx +2 -2
- package/src/bootstrap/attribute-rows.jsx +1 -1
- package/src/bootstrap/card.jsx +1 -1
- package/src/bootstrap/checkbox.jsx +1 -1
- package/src/bootstrap/checkboxes.jsx +1 -1
- package/src/bootstrap/input.jsx +1 -1
- package/src/bootstrap/paginate.jsx +2 -2
- package/src/bootstrap/sort-link.jsx +3 -3
- package/src/{cable-connection-pool.mjs → cable-connection-pool.js} +3 -3
- package/src/{cable-subscription-pool.mjs → cable-subscription-pool.js} +4 -4
- package/src/{cable-subscription.mjs → cable-subscription.js} +1 -1
- package/src/{can-can.mjs → can-can.js} +1 -1
- package/src/collection-loader.jsx +2 -2
- package/src/{collection.mjs → collection.js} +3 -3
- package/src/{commands-pool.mjs → commands-pool.js} +11 -11
- package/src/{custom-error.mjs → custom-error.js} +1 -1
- package/src/{deserializer.mjs → deserializer.js} +2 -2
- package/src/{destroy-error.mjs → destroy-error.js} +1 -1
- package/src/{devise.mjs → devise.js} +5 -9
- package/src/draggable-sort/index.jsx +3 -3
- package/src/draggable-sort/item.jsx +2 -2
- package/src/{error-logger.mjs → error-logger.js} +1 -1
- package/src/event-connection.jsx +1 -1
- package/src/event-model-class.jsx +1 -1
- package/src/form.jsx +1 -1
- package/src/index.js +3 -0
- package/src/inputs/attachment.jsx +2 -2
- package/src/inputs/checkbox.jsx +7 -6
- package/src/inputs/checkboxes.jsx +1 -1
- package/src/inputs/input-wrapper.jsx +1 -1
- package/src/inputs/input.jsx +8 -7
- package/src/inputs/money.jsx +3 -3
- package/src/inputs/select.jsx +1 -1
- package/src/{key-value-store.mjs → key-value-store.js} +1 -1
- package/src/link.jsx +2 -2
- package/src/modal.jsx +1 -1
- package/src/{model-class-require.mjs → model-class-require.js} +4 -2
- package/src/{model-events.mjs → model-events.js} +1 -1
- package/src/{model-name.mjs → model-name.js} +1 -1
- package/src/{model-recipes-loader.mjs → model-recipes-loader.js} +1 -1
- package/src/{model-recipes-model-loader.mjs → model-recipes-model-loader.js} +2 -2
- package/src/{models-response-reader.mjs → models-response-reader.js} +2 -2
- package/src/models.js +7 -0
- package/src/{models.mjs.erb → models.js.erb} +1 -1
- package/src/{params.mjs → params.js} +2 -2
- package/src/{preloaded.mjs → preloaded.js} +1 -1
- package/src/resize-observer.jsx +1 -1
- package/src/router/route.jsx +1 -1
- package/src/router/switch.jsx +1 -1
- package/src/router.jsx +1 -1
- package/src/{routes-native.mjs → routes-native.js} +1 -1
- package/src/{services.mjs → services.js} +1 -1
- package/src/{session-status-updater.mjs → session-status-updater.js} +3 -3
- package/src/{source-maps-loader.mjs → source-maps-loader.js} +1 -1
- package/src/super-admin/edit-page/edit-attribute-checkbox.jsx +1 -1
- package/src/super-admin/edit-page/edit-attribute-content.jsx +1 -1
- package/src/super-admin/edit-page/edit-attribute-input.jsx +1 -1
- package/src/super-admin/edit-page/edit-attribute.jsx +1 -1
- package/src/super-admin/edit-page.jsx +2 -2
- package/src/super-admin/has-edit-config.js +1 -1
- package/src/super-admin/index-page.jsx +1 -1
- package/src/super-admin/index.jsx +7 -7
- package/src/super-admin/layout/header/index.jsx +2 -2
- package/src/super-admin/layout/index.jsx +3 -3
- package/src/super-admin/layout/menu/index.jsx +3 -3
- package/src/super-admin/layout/menu/menu-content.jsx +2 -2
- package/src/super-admin/layout/menu/{menu-item/index.jsx → menu-item.jsx} +5 -6
- package/src/super-admin/layout/no-access.jsx +2 -2
- package/src/super-admin/model-class-table.jsx +3 -3
- package/src/super-admin/models.js +1 -1
- package/src/super-admin/show-nav.jsx +2 -2
- package/src/super-admin/show-page/belongs-to-attribute-row.jsx +1 -1
- package/src/super-admin/show-page/index.jsx +2 -2
- package/src/super-admin/show-reflection-actions.jsx +1 -1
- package/src/super-admin/show-reflection-link.jsx +1 -1
- package/src/super-admin/show-reflection-page.jsx +1 -1
- package/src/table/column-content.jsx +1 -1
- package/src/table/filters/filter-form.jsx +1 -1
- package/src/table/filters/index.jsx +5 -3
- package/src/table/filters/load-search-modal.jsx +6 -4
- package/src/table/filters/save-search-modal.jsx +4 -4
- package/src/table/header-select.jsx +1 -1
- package/src/table/model-column.jsx +1 -1
- package/src/table/model-row.jsx +2 -2
- package/src/table/{select-calculator.mjs → select-calculator.js} +1 -1
- package/src/table/settings/column-row.jsx +2 -2
- package/src/table/settings/download-action.jsx +3 -3
- package/src/table/settings/index.jsx +3 -3
- package/src/table/table-settings.js +5 -4
- package/src/table/table.jsx +8 -8
- package/src/table/{use-sorting.mjs → use-sorting.js} +1 -1
- package/src/table/worker-plugins-check-all-checkbox.jsx +2 -2
- package/src/table/worker-plugins-checkbox.jsx +2 -2
- package/src/{translated-collections.mjs → translated-collections.js} +1 -1
- package/src/updated-attribute.jsx +1 -1
- package/src/{use-breakpoint.mjs → use-breakpoint.js} +2 -2
- package/src/use-can-can.js +55 -0
- package/src/{use-collection.mjs → use-collection.js} +4 -4
- package/src/{use-created-event.mjs → use-created-event.js} +2 -2
- package/src/{use-current-user.mjs → use-current-user.js} +6 -5
- package/src/{use-destroyed-event.mjs → use-destroyed-event.js} +2 -2
- package/src/{use-input.mjs → use-input.js} +5 -5
- package/src/use-model-event.js +2 -2
- package/src/{use-model.mjs → use-model.js} +4 -4
- package/src/{use-resize-observer.mjs → use-resize-observer.js} +1 -1
- package/src/use-router.jsx +2 -2
- package/src/{use-updated-event.mjs → use-updated-event.js} +2 -2
- package/src/{use-validation-errors.mjs → use-validation-errors.js} +3 -3
- package/src/utils/checkbox.jsx +2 -2
- package/src/{validation-error.mjs → validation-error.js} +1 -1
- package/src/{validation-errors.mjs → validation-errors.js} +1 -1
- package/src/with-current-user.jsx +1 -1
- package/src/with-model.jsx +1 -1
- package/__tests__/base-model.test.mjs +0 -71
- package/__tests__/cable-connection-pool.test.mjs +0 -227
- package/__tests__/cable-subscription-pool.test.mjs +0 -27
- package/__tests__/can-can.test.mjs +0 -34
- package/__tests__/collection.test.mjs +0 -51
- package/__tests__/custom-error.test.mjs +0 -13
- package/__tests__/model-name.test.mjs +0 -34
- package/__tests__/model-prop-type.test.mjs +0 -113
- package/__tests__/params.test.mjs +0 -40
- package/__tests__/routes-native.test.mjs +0 -104
- package/__tests__/routes.test.mjs +0 -47
- package/__tests__/serializer.test.mjs +0 -30
- package/__tests__/support/task.mjs +0 -27
- package/__tests__/support/user.mjs +0 -32
- package/index.js +0 -1
- package/jest.config.js +0 -9
- package/src/event-created.jsx +0 -12
- package/src/event-destroyed.jsx +0 -25
- package/src/event-emitter-listener.jsx +0 -10
- package/src/event-listener.jsx +0 -25
- package/src/event-updated.jsx +0 -27
- package/src/super-admin/layout/menu/menu-item/style.scss +0 -10
- package/src/use-can-can.mjs +0 -48
- package/src/with-can-can.jsx +0 -12
- package/webpack.config.js +0 -15
- /package/src/{attribute-not-loaded-error.mjs → attribute-not-loaded-error.js} +0 -0
- /package/src/base-model/{column.mjs → column.js} +0 -0
- /package/src/base-model/{scope.mjs → scope.js} +0 -0
- /package/src/{cache-key-generator.mjs → cache-key-generator.js} +0 -0
- /package/src/{channels-consumer.mjs → channels-consumer.js} +0 -0
- /package/src/{command-submit-data.mjs → command-submit-data.js} +0 -0
- /package/src/{config.mjs → config.js} +0 -0
- /package/src/{data-set-to-attributes.mjs → data-set-to-attributes.js} +0 -0
- /package/src/draggable-sort/{controller.mjs → controller.js} +0 -0
- /package/src/{error-messages.mjs → error-messages.js} +0 -0
- /package/src/{events.mjs → events.js} +0 -0
- /package/src/inputs/{auto-submit.mjs → auto-submit.js} +0 -0
- /package/src/inputs/{id-for-component.mjs → id-for-component.js} +0 -0
- /package/src/inputs/{name-for-component.mjs → name-for-component.js} +0 -0
- /package/src/{instance-of-class-name.mjs → instance-of-class-name.js} +0 -0
- /package/src/{logger.mjs → logger.js} +0 -0
- /package/src/{model-prop-type.mjs → model-prop-type.js} +0 -0
- /package/src/{money-formatter.mjs → money-formatter.js} +0 -0
- /package/src/{not-loaded-error.mjs → not-loaded-error.js} +0 -0
- /package/src/{result.mjs → result.js} +0 -0
- /package/src/{routes.mjs → routes.js} +0 -0
- /package/src/{run-last.mjs → run-last.js} +0 -0
- /package/src/{serializer.mjs → serializer.js} +0 -0
- /package/src/table/{column-identifier.mjs → column-identifier.js} +0 -0
- /package/src/table/{column-visible.mjs → column-visible.js} +0 -0
- /package/src/table/{model-callback-args.mjs → model-callback-args.js} +0 -0
- /package/src/{translated-collections-data.mjs.erb → translated-collections-data.js.erb} +0 -0
- /package/src/{url-encode.mjs → url-encode.js} +0 -0
- /package/src/{use-event-emitter.mjs → use-event-emitter.js} +0 -0
- /package/src/{use-event-listener.mjs → use-event-listener.js} +0 -0
- /package/src/{use-screen-layout.mjs → use-screen-layout.js} +0 -0
|
@@ -0,0 +1,972 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import { digg, digs } from "diggerize";
|
|
3
|
+
import React, { createContext, useContext, useMemo, useRef } from "react";
|
|
4
|
+
import { Animated, Pressable, View } from "react-native";
|
|
5
|
+
import BaseComponent from "../base-component";
|
|
6
|
+
import Card from "../bootstrap/card";
|
|
7
|
+
import classNames from "classnames";
|
|
8
|
+
import Collection from "../collection";
|
|
9
|
+
import columnVisible from "./column-visible";
|
|
10
|
+
import debounce from "debounce";
|
|
11
|
+
import DraggableSort from "../draggable-sort/index";
|
|
12
|
+
import EventEmitter from "events";
|
|
13
|
+
import Filters from "./filters";
|
|
14
|
+
import FlatList from "./components/flat-list";
|
|
15
|
+
import FontAwesomeIcon from "react-native-vector-icons/FontAwesome";
|
|
16
|
+
import { Form } from "../form";
|
|
17
|
+
import Header from "./components/header";
|
|
18
|
+
import HeaderColumn from "./header-column";
|
|
19
|
+
import HeaderSelect from "./header-select";
|
|
20
|
+
import * as inflection from "inflection";
|
|
21
|
+
import memo from "set-state-compare/src/memo";
|
|
22
|
+
import modelClassRequire from "../model-class-require";
|
|
23
|
+
import ModelRow from "./model-row";
|
|
24
|
+
import Paginate from "../bootstrap/paginate";
|
|
25
|
+
import Params from "../params";
|
|
26
|
+
import PropTypes from "prop-types";
|
|
27
|
+
import Row from "./components/row";
|
|
28
|
+
import selectCalculator from "./select-calculator";
|
|
29
|
+
import Select from "../inputs/select";
|
|
30
|
+
import Settings from "./settings/index";
|
|
31
|
+
import { shapeComponent } from "set-state-compare/src/shape-component";
|
|
32
|
+
import TableSettings from "./table-settings";
|
|
33
|
+
import Text from "../utils/text";
|
|
34
|
+
import uniqunize from "uniqunize";
|
|
35
|
+
import useBreakpoint from "../use-breakpoint";
|
|
36
|
+
import useCollection from "../use-collection";
|
|
37
|
+
import useI18n from "i18n-on-steroids/src/use-i18n";
|
|
38
|
+
import useEventEmitter from "../use-event-emitter";
|
|
39
|
+
import useModelEvent from "../use-model-event";
|
|
40
|
+
import useQueryParams from "on-location-changed/src/use-query-params";
|
|
41
|
+
import Widths from "./widths";
|
|
42
|
+
const paginationOptions = [30, 60, 90, ["All", "all"]];
|
|
43
|
+
const WorkerPluginsCheckAllCheckbox = /*#__PURE__*/React.lazy(() => import("./worker-plugins-check-all-checkbox"));
|
|
44
|
+
const TableContext = /*#__PURE__*/createContext();
|
|
45
|
+
const ListHeaderComponent = memo(shapeComponent(class ListHeaderComponent extends BaseComponent {
|
|
46
|
+
setup() {
|
|
47
|
+
this.useStates({
|
|
48
|
+
lastUpdate: new Date()
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
render() {
|
|
52
|
+
const {
|
|
53
|
+
mdUp
|
|
54
|
+
} = useBreakpoint();
|
|
55
|
+
const tableContextValue = useContext(TableContext);
|
|
56
|
+
const table = tableContextValue.table;
|
|
57
|
+
const {
|
|
58
|
+
collection,
|
|
59
|
+
events,
|
|
60
|
+
queryWithoutPagination,
|
|
61
|
+
t
|
|
62
|
+
} = table.tt;
|
|
63
|
+
const {
|
|
64
|
+
query
|
|
65
|
+
} = digs(collection, "query");
|
|
66
|
+
useEventEmitter(events, "columnVisibilityUpdated", this.tt.onColumnVisibilityUpdated);
|
|
67
|
+
return /*#__PURE__*/React.createElement(Row, {
|
|
68
|
+
dataSet: {
|
|
69
|
+
class: "api-maker/table/header-row"
|
|
70
|
+
},
|
|
71
|
+
style: table.styleForRowHeader()
|
|
72
|
+
}, table.p.workplace && table.s.currentWorkplace && /*#__PURE__*/React.createElement(Header, {
|
|
73
|
+
style: table.styleForHeader({
|
|
74
|
+
style: {
|
|
75
|
+
width: mdUp ? 41 : undefined
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
}, /*#__PURE__*/React.createElement(WorkerPluginsCheckAllCheckbox, {
|
|
79
|
+
currentWorkplace: table.s.currentWorkplace,
|
|
80
|
+
query: queryWithoutPagination,
|
|
81
|
+
style: {
|
|
82
|
+
marginHorizontal: "auto"
|
|
83
|
+
}
|
|
84
|
+
}), !mdUp && /*#__PURE__*/React.createElement(Text, {
|
|
85
|
+
style: {
|
|
86
|
+
marginLeft: 3
|
|
87
|
+
}
|
|
88
|
+
}, t(".select_all_found", {
|
|
89
|
+
defaultValue: "Select all found"
|
|
90
|
+
}))), !mdUp && /*#__PURE__*/React.createElement(Header, {
|
|
91
|
+
style: table.styleForHeader({
|
|
92
|
+
style: {}
|
|
93
|
+
})
|
|
94
|
+
}, /*#__PURE__*/React.createElement(HeaderSelect, {
|
|
95
|
+
preparedColumns: table.s.preparedColumns,
|
|
96
|
+
query: query,
|
|
97
|
+
table: table
|
|
98
|
+
})), mdUp && /*#__PURE__*/React.createElement(React.Fragment, null, table.headersContentFromColumns(), /*#__PURE__*/React.createElement(Header, {
|
|
99
|
+
style: table.styleForHeader({
|
|
100
|
+
style: {},
|
|
101
|
+
type: "actions"
|
|
102
|
+
})
|
|
103
|
+
})));
|
|
104
|
+
}
|
|
105
|
+
onColumnVisibilityUpdated = () => this.setState({
|
|
106
|
+
lastUpdate: new Date()
|
|
107
|
+
});
|
|
108
|
+
}));
|
|
109
|
+
export default memo(shapeComponent(class ApiMakerTable extends BaseComponent {
|
|
110
|
+
static defaultProps = {
|
|
111
|
+
card: true,
|
|
112
|
+
currentUser: null,
|
|
113
|
+
destroyEnabled: true,
|
|
114
|
+
filterCard: true,
|
|
115
|
+
filterSubmitButton: true,
|
|
116
|
+
noRecordsAvailableContent: undefined,
|
|
117
|
+
noRecordsFoundContent: undefined,
|
|
118
|
+
preloads: [],
|
|
119
|
+
select: {},
|
|
120
|
+
styleUI: true,
|
|
121
|
+
workplace: false
|
|
122
|
+
};
|
|
123
|
+
static propTypes = {
|
|
124
|
+
abilities: PropTypes.object,
|
|
125
|
+
actionsContent: PropTypes.func,
|
|
126
|
+
appHistory: PropTypes.object,
|
|
127
|
+
card: PropTypes.bool.isRequired,
|
|
128
|
+
className: PropTypes.string,
|
|
129
|
+
collection: PropTypes.instanceOf(Collection),
|
|
130
|
+
columns: PropTypes.oneOfType([PropTypes.array, PropTypes.func]),
|
|
131
|
+
controls: PropTypes.func,
|
|
132
|
+
currentUser: PropTypes.object,
|
|
133
|
+
defaultDateFormatName: PropTypes.string,
|
|
134
|
+
defaultDateTimeFormatName: PropTypes.string,
|
|
135
|
+
defaultParams: PropTypes.object,
|
|
136
|
+
destroyEnabled: PropTypes.bool.isRequired,
|
|
137
|
+
destroyMessage: PropTypes.string,
|
|
138
|
+
editModelPath: PropTypes.func,
|
|
139
|
+
filterCard: PropTypes.bool.isRequired,
|
|
140
|
+
filterContent: PropTypes.func,
|
|
141
|
+
filterSubmitLabel: PropTypes.node,
|
|
142
|
+
groupBy: PropTypes.array,
|
|
143
|
+
header: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
|
|
144
|
+
identifier: PropTypes.string,
|
|
145
|
+
modelClass: PropTypes.func.isRequired,
|
|
146
|
+
noRecordsAvailableContent: PropTypes.func,
|
|
147
|
+
noRecordsFoundContent: PropTypes.func,
|
|
148
|
+
onModelsLoaded: PropTypes.func,
|
|
149
|
+
paginateContent: PropTypes.func,
|
|
150
|
+
paginationComponent: PropTypes.func,
|
|
151
|
+
preloads: PropTypes.array.isRequired,
|
|
152
|
+
queryMethod: PropTypes.func,
|
|
153
|
+
queryName: PropTypes.string,
|
|
154
|
+
select: PropTypes.object,
|
|
155
|
+
selectColumns: PropTypes.object,
|
|
156
|
+
styles: PropTypes.object,
|
|
157
|
+
styleUI: PropTypes.bool.isRequired,
|
|
158
|
+
viewModelPath: PropTypes.func,
|
|
159
|
+
workplace: PropTypes.bool.isRequired
|
|
160
|
+
};
|
|
161
|
+
draggableSortEvents = new EventEmitter();
|
|
162
|
+
events = new EventEmitter();
|
|
163
|
+
tableSettings = null;
|
|
164
|
+
setup() {
|
|
165
|
+
const {
|
|
166
|
+
t
|
|
167
|
+
} = useI18n({
|
|
168
|
+
namespace: "js.api_maker.table"
|
|
169
|
+
});
|
|
170
|
+
const {
|
|
171
|
+
name: breakpoint,
|
|
172
|
+
mdUp
|
|
173
|
+
} = useBreakpoint();
|
|
174
|
+
const queryParams = useQueryParams();
|
|
175
|
+
this.setInstance({
|
|
176
|
+
breakpoint,
|
|
177
|
+
filterFormRef: useRef(),
|
|
178
|
+
mdUp,
|
|
179
|
+
t
|
|
180
|
+
});
|
|
181
|
+
const collectionKey = digg(this.p.modelClass.modelClassData(), "collectionKey");
|
|
182
|
+
let queryName = this.props.queryName;
|
|
183
|
+
if (!queryName) queryName = collectionKey;
|
|
184
|
+
const querySName = `${queryName}_s`;
|
|
185
|
+
this.useStates({
|
|
186
|
+
columns: () => this.columnsAsArray(),
|
|
187
|
+
currentWorkplace: undefined,
|
|
188
|
+
currentWorkplaceCount: null,
|
|
189
|
+
filterForm: null,
|
|
190
|
+
columnsToShow: null,
|
|
191
|
+
draggedColumn: null,
|
|
192
|
+
identifier: () => this.props.identifier || `${collectionKey}-default`,
|
|
193
|
+
lastUpdate: () => new Date(),
|
|
194
|
+
preload: undefined,
|
|
195
|
+
preparedColumns: undefined,
|
|
196
|
+
queryName,
|
|
197
|
+
queryQName: () => `${queryName}_q`,
|
|
198
|
+
queryPageName: () => `${queryName}_page`,
|
|
199
|
+
querySName,
|
|
200
|
+
resizing: false,
|
|
201
|
+
showFilters: () => Boolean(queryParams[querySName]),
|
|
202
|
+
showSettings: false,
|
|
203
|
+
tableSetting: undefined,
|
|
204
|
+
tableSettingLoaded: false,
|
|
205
|
+
tableSettingFullCacheKey: undefined,
|
|
206
|
+
width: undefined,
|
|
207
|
+
widths: null
|
|
208
|
+
});
|
|
209
|
+
this.tableContextValue = useMemo(() => ({
|
|
210
|
+
cacheKey: this.s.tableSettingFullCacheKey,
|
|
211
|
+
lastUpdate: this.s.lastUpdate,
|
|
212
|
+
resizing: this.s.resizing,
|
|
213
|
+
table: this
|
|
214
|
+
}), [this.s.lastUpdate, this.s.resizing, this.s.tableSettingFullCacheKey]);
|
|
215
|
+
useMemo(() => {
|
|
216
|
+
if (this.props.workplace) {
|
|
217
|
+
this.loadCurrentWorkplace().then(() => {
|
|
218
|
+
this.loadCurrentWorkplaceCount();
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}, [this.p.currentUser?.id()]);
|
|
222
|
+
useMemo(() => {
|
|
223
|
+
if (!this.tt.tableSettings && this.s.width) {
|
|
224
|
+
this.loadTableSetting();
|
|
225
|
+
}
|
|
226
|
+
}, [this.p.currentUser?.id(), this.s.width]);
|
|
227
|
+
useModelEvent(this.s.currentWorkplace, "workplace_links_created", this.tt.onLinksCreated);
|
|
228
|
+
useModelEvent(this.s.currentWorkplace, "workplace_links_destroyed", this.tt.onLinksDestroyed);
|
|
229
|
+
let collectionReady = true;
|
|
230
|
+
let select;
|
|
231
|
+
if (!this.s.preparedColumns) {
|
|
232
|
+
collectionReady = false;
|
|
233
|
+
}
|
|
234
|
+
if (collectionReady) {
|
|
235
|
+
select = selectCalculator({
|
|
236
|
+
table: this
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
this.collection = useCollection({
|
|
240
|
+
abilities: this.abilitiesToLoad(),
|
|
241
|
+
defaultParams: this.props.defaultParams,
|
|
242
|
+
collection: this.props.collection,
|
|
243
|
+
groupBy: this.props.groupBy,
|
|
244
|
+
ifCondition: collectionReady,
|
|
245
|
+
modelClass: this.props.modelClass,
|
|
246
|
+
onModelsLoaded: this.props.onModelsLoaded,
|
|
247
|
+
noRecordsAvailableContent: this.props.noRecordsAvailableContent,
|
|
248
|
+
noRecordsFoundContent: this.props.noRecordsFoundContent,
|
|
249
|
+
pagination: true,
|
|
250
|
+
preloads: this.state.preload,
|
|
251
|
+
queryMethod: this.props.queryMethod,
|
|
252
|
+
queryName,
|
|
253
|
+
select,
|
|
254
|
+
selectColumns: this.props.selectColumns
|
|
255
|
+
});
|
|
256
|
+
this.queryWithoutPagination = useMemo(() => this.collection?.query?.clone()?.except("page"), [this.collection.query]);
|
|
257
|
+
useEventEmitter(this.tt.draggableSortEvents, "onDragStart", this.tt.onDragStart);
|
|
258
|
+
useEventEmitter(this.tt.draggableSortEvents, "onDragEndAnimation", this.tt.onDragEndAnimation);
|
|
259
|
+
useEventEmitter(this.tt.events, "columnVisibilityUpdated", this.tt.onColumnVisibilityUpdated);
|
|
260
|
+
}
|
|
261
|
+
onColumnVisibilityUpdated = () => this.setState({
|
|
262
|
+
columnsToShow: this.getColumnsToShow(this.s.columns),
|
|
263
|
+
lastUpdate: new Date()
|
|
264
|
+
});
|
|
265
|
+
onDragStart = ({
|
|
266
|
+
item
|
|
267
|
+
}) => item.animatedZIndex.setValue(9999);
|
|
268
|
+
onDragEndAnimation = ({
|
|
269
|
+
item
|
|
270
|
+
}) => item.animatedZIndex.setValue(0);
|
|
271
|
+
async loadCurrentWorkplace() {
|
|
272
|
+
const Workplace = modelClassRequire("Workplace");
|
|
273
|
+
const result = await Workplace.current();
|
|
274
|
+
const currentWorkplace = digg(result, "current", 0);
|
|
275
|
+
this.setState({
|
|
276
|
+
currentWorkplace
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
async loadCurrentWorkplaceCount() {
|
|
280
|
+
const WorkplaceLink = modelClassRequire("WorkplaceLink");
|
|
281
|
+
const currentWorkplaceCount = await WorkplaceLink.ransack({
|
|
282
|
+
resource_type_eq: this.p.modelClass.modelClassData().name,
|
|
283
|
+
workplace_id_eq: this.s.currentWorkplace.id()
|
|
284
|
+
}).count();
|
|
285
|
+
this.setState({
|
|
286
|
+
currentWorkplaceCount
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
getColumnsToShow(columns) {
|
|
290
|
+
return columns.filter(({
|
|
291
|
+
column,
|
|
292
|
+
tableSettingColumn
|
|
293
|
+
}) => columnVisible(column, tableSettingColumn)).sort((a, b) => a.tableSettingColumn.position() - b.tableSettingColumn.position());
|
|
294
|
+
}
|
|
295
|
+
async loadTableSetting() {
|
|
296
|
+
this.tableSettings = new TableSettings({
|
|
297
|
+
table: this
|
|
298
|
+
});
|
|
299
|
+
const tableSetting = await this.tableSettings.loadExistingOrCreateTableSettings();
|
|
300
|
+
const {
|
|
301
|
+
columns,
|
|
302
|
+
preload
|
|
303
|
+
} = this.tableSettings.preparedColumns(tableSetting);
|
|
304
|
+
const {
|
|
305
|
+
width
|
|
306
|
+
} = this.s;
|
|
307
|
+
const widths = new Widths({
|
|
308
|
+
columns,
|
|
309
|
+
table: this,
|
|
310
|
+
width
|
|
311
|
+
});
|
|
312
|
+
const columnsToShow = this.getColumnsToShow(columns);
|
|
313
|
+
this.setState({
|
|
314
|
+
columns,
|
|
315
|
+
columnsToShow,
|
|
316
|
+
preparedColumns: columns,
|
|
317
|
+
preload: this.mergedPreloads(preload),
|
|
318
|
+
tableSetting,
|
|
319
|
+
tableSettingLoaded: true,
|
|
320
|
+
tableSettingFullCacheKey: tableSetting.fullCacheKey(),
|
|
321
|
+
widths
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
updateSettingsFullCacheKey = () => this.setState({
|
|
325
|
+
tableSettingFullCacheKey: this.state.tableSetting.fullCacheKey()
|
|
326
|
+
});
|
|
327
|
+
columnsAsArray = () => {
|
|
328
|
+
if (typeof this.props.columns == "function") {
|
|
329
|
+
return this.props.columns();
|
|
330
|
+
}
|
|
331
|
+
return this.props.columns;
|
|
332
|
+
};
|
|
333
|
+
mergedPreloads(preload) {
|
|
334
|
+
const {
|
|
335
|
+
preloads
|
|
336
|
+
} = this.props;
|
|
337
|
+
let mergedPreloads = [];
|
|
338
|
+
if (preloads) mergedPreloads = mergedPreloads.concat(preloads);
|
|
339
|
+
if (preload) mergedPreloads = mergedPreloads.concat(preload);
|
|
340
|
+
return uniqunize(mergedPreloads);
|
|
341
|
+
}
|
|
342
|
+
render() {
|
|
343
|
+
const {
|
|
344
|
+
modelClass,
|
|
345
|
+
noRecordsAvailableContent,
|
|
346
|
+
noRecordsFoundContent
|
|
347
|
+
} = this.p;
|
|
348
|
+
const {
|
|
349
|
+
collection,
|
|
350
|
+
currentUser
|
|
351
|
+
} = this.props;
|
|
352
|
+
const {
|
|
353
|
+
queryName,
|
|
354
|
+
querySName,
|
|
355
|
+
showFilters
|
|
356
|
+
} = this.s;
|
|
357
|
+
const {
|
|
358
|
+
models,
|
|
359
|
+
overallCount,
|
|
360
|
+
qParams,
|
|
361
|
+
query,
|
|
362
|
+
result,
|
|
363
|
+
showNoRecordsAvailableContent,
|
|
364
|
+
showNoRecordsFoundContent
|
|
365
|
+
} = digs(this.collection, "models", "overallCount", "qParams", "query", "result", "showNoRecordsAvailableContent", "showNoRecordsFoundContent");
|
|
366
|
+
if (collection && collection.args.modelClass.modelClassData().name != modelClass.modelClassData().name) {
|
|
367
|
+
throw new Error(`Model class from collection '${collection.args.modelClass.modelClassData().name}' ` + `didn't match model class on table: '${modelClass.modelClassData().name}'`);
|
|
368
|
+
}
|
|
369
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
370
|
+
dataSet: {
|
|
371
|
+
class: this.className()
|
|
372
|
+
},
|
|
373
|
+
onLayout: this.tt.onContainerLayout,
|
|
374
|
+
style: this.props.styles?.container
|
|
375
|
+
}, showNoRecordsAvailableContent && /*#__PURE__*/React.createElement("div", {
|
|
376
|
+
className: "live-table--no-records-available-content"
|
|
377
|
+
}, noRecordsAvailableContent({
|
|
378
|
+
models,
|
|
379
|
+
qParams,
|
|
380
|
+
overallCount
|
|
381
|
+
})), showNoRecordsFoundContent && /*#__PURE__*/React.createElement("div", {
|
|
382
|
+
className: "live-table--no-records-found-content"
|
|
383
|
+
}, noRecordsFoundContent({
|
|
384
|
+
models,
|
|
385
|
+
qParams,
|
|
386
|
+
overallCount
|
|
387
|
+
})), showFilters && /*#__PURE__*/React.createElement(Filters, {
|
|
388
|
+
currentUser: currentUser,
|
|
389
|
+
modelClass: modelClass,
|
|
390
|
+
queryName: queryName,
|
|
391
|
+
querySName: querySName
|
|
392
|
+
}), qParams && query && result && models && !showNoRecordsAvailableContent && !showNoRecordsFoundContent && this.cardOrTable());
|
|
393
|
+
}
|
|
394
|
+
abilitiesToLoad() {
|
|
395
|
+
const abilitiesToLoad = {};
|
|
396
|
+
const {
|
|
397
|
+
abilities,
|
|
398
|
+
modelClass
|
|
399
|
+
} = this.props;
|
|
400
|
+
const ownAbilities = [];
|
|
401
|
+
if (this.props.destroyEnabled) ownAbilities.push("destroy");
|
|
402
|
+
if (this.props.editModelPath) ownAbilities.push("edit");
|
|
403
|
+
if (this.props.viewModelPath) ownAbilities.push("show");
|
|
404
|
+
if (ownAbilities.length > 0) {
|
|
405
|
+
const modelClassName = digg(modelClass.modelClassData(), "name");
|
|
406
|
+
abilitiesToLoad[modelClassName] = ownAbilities;
|
|
407
|
+
}
|
|
408
|
+
if (abilities) {
|
|
409
|
+
for (const modelName in abilities) {
|
|
410
|
+
if (!(modelName in abilitiesToLoad)) {
|
|
411
|
+
abilitiesToLoad[modelName] = [];
|
|
412
|
+
}
|
|
413
|
+
for (const ability of abilities[modelName]) {
|
|
414
|
+
abilitiesToLoad[modelName].push(ability);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return abilitiesToLoad;
|
|
419
|
+
}
|
|
420
|
+
cardOrTable() {
|
|
421
|
+
const {
|
|
422
|
+
abilities,
|
|
423
|
+
actionsContent,
|
|
424
|
+
appHistory,
|
|
425
|
+
card,
|
|
426
|
+
className,
|
|
427
|
+
collection,
|
|
428
|
+
columns,
|
|
429
|
+
controls,
|
|
430
|
+
currentUser,
|
|
431
|
+
defaultDateFormatName,
|
|
432
|
+
defaultDateTimeFormatName,
|
|
433
|
+
defaultParams,
|
|
434
|
+
destroyEnabled,
|
|
435
|
+
destroyMessage,
|
|
436
|
+
editModelPath,
|
|
437
|
+
filterCard,
|
|
438
|
+
filterContent,
|
|
439
|
+
filterSubmitButton,
|
|
440
|
+
filterSubmitLabel,
|
|
441
|
+
groupBy,
|
|
442
|
+
header,
|
|
443
|
+
identifier,
|
|
444
|
+
modelClass,
|
|
445
|
+
noRecordsAvailableContent,
|
|
446
|
+
noRecordsFoundContent,
|
|
447
|
+
onModelsLoaded,
|
|
448
|
+
paginateContent,
|
|
449
|
+
paginationComponent,
|
|
450
|
+
preloads,
|
|
451
|
+
queryMethod,
|
|
452
|
+
queryName,
|
|
453
|
+
select,
|
|
454
|
+
selectColumns,
|
|
455
|
+
styleUI,
|
|
456
|
+
viewModelPath,
|
|
457
|
+
workplace,
|
|
458
|
+
...restProps
|
|
459
|
+
} = this.props;
|
|
460
|
+
const {
|
|
461
|
+
models,
|
|
462
|
+
qParams,
|
|
463
|
+
query,
|
|
464
|
+
result
|
|
465
|
+
} = digs(this.collection, "models", "qParams", "query", "result");
|
|
466
|
+
let headerContent, PaginationComponent;
|
|
467
|
+
if (typeof header == "function") {
|
|
468
|
+
headerContent = header({
|
|
469
|
+
models,
|
|
470
|
+
qParams,
|
|
471
|
+
query,
|
|
472
|
+
result
|
|
473
|
+
});
|
|
474
|
+
} else if (header) {
|
|
475
|
+
headerContent = header;
|
|
476
|
+
} else {
|
|
477
|
+
headerContent = modelClass.modelName().human({
|
|
478
|
+
count: 2
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
if (!paginateContent) {
|
|
482
|
+
if (paginationComponent) {
|
|
483
|
+
PaginationComponent = paginationComponent;
|
|
484
|
+
} else {
|
|
485
|
+
PaginationComponent = Paginate;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
const flatListStyle = {
|
|
489
|
+
overflowX: "auto"
|
|
490
|
+
};
|
|
491
|
+
if (styleUI) {
|
|
492
|
+
flatListStyle.border = "1px solid #dbdbdb";
|
|
493
|
+
flatListStyle.borderRadius = 5;
|
|
494
|
+
}
|
|
495
|
+
const flatList = /*#__PURE__*/React.createElement(TableContext.Provider, {
|
|
496
|
+
value: this.tt.tableContextValue
|
|
497
|
+
}, /*#__PURE__*/React.createElement(FlatList, _extends({
|
|
498
|
+
data: models,
|
|
499
|
+
dataSet: {
|
|
500
|
+
class: classNames("api-maker--table", className),
|
|
501
|
+
cacheKey: this.s.tableSettingFullCacheKey,
|
|
502
|
+
lastUpdate: this.s.lastUpdate
|
|
503
|
+
},
|
|
504
|
+
extraData: this.s.lastUpdate,
|
|
505
|
+
keyExtractor: this.tt.keyExtrator,
|
|
506
|
+
ListHeaderComponent: ListHeaderComponent,
|
|
507
|
+
renderItem: this.tt.renderItem,
|
|
508
|
+
showsHorizontalScrollIndicator: true,
|
|
509
|
+
style: flatListStyle
|
|
510
|
+
}, restProps)));
|
|
511
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, filterContent && filterCard && /*#__PURE__*/React.createElement(Card, {
|
|
512
|
+
className: "live-table--filter-card mb-4"
|
|
513
|
+
}, this.filterForm()), filterContent && !filterCard && this.filterForm(), card && /*#__PURE__*/React.createElement(Card, _extends({
|
|
514
|
+
className: classNames("live-table--table-card", "mb-4", className),
|
|
515
|
+
controls: this.tableControls(),
|
|
516
|
+
header: headerContent,
|
|
517
|
+
footer: this.tableFooter()
|
|
518
|
+
}, restProps), flatList), !card && flatList, result && PaginationComponent && /*#__PURE__*/React.createElement(PaginationComponent, {
|
|
519
|
+
result: result
|
|
520
|
+
}), result && paginateContent && paginateContent({
|
|
521
|
+
result
|
|
522
|
+
}));
|
|
523
|
+
}
|
|
524
|
+
onContainerLayout = e => {
|
|
525
|
+
const {
|
|
526
|
+
width
|
|
527
|
+
} = e.nativeEvent.layout;
|
|
528
|
+
const {
|
|
529
|
+
widths
|
|
530
|
+
} = this.s;
|
|
531
|
+
this.setState({
|
|
532
|
+
width
|
|
533
|
+
});
|
|
534
|
+
if (widths) widths.tableWidth = width;
|
|
535
|
+
};
|
|
536
|
+
onLinksCreated = ({
|
|
537
|
+
args
|
|
538
|
+
}) => {
|
|
539
|
+
const modelClassName = this.p.modelClass.modelClassData().name;
|
|
540
|
+
if (args.created[modelClassName]) {
|
|
541
|
+
const amountCreated = args.created[modelClassName].length;
|
|
542
|
+
this.setState(prevState => ({
|
|
543
|
+
currentWorkplaceCount: prevState.currentWorkplaceCount + amountCreated
|
|
544
|
+
}));
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
onLinksDestroyed = ({
|
|
548
|
+
args
|
|
549
|
+
}) => {
|
|
550
|
+
const modelClassName = this.p.modelClass.modelClassData().name;
|
|
551
|
+
if (args.destroyed[modelClassName]) {
|
|
552
|
+
const amountDestroyed = args.destroyed[modelClassName].length;
|
|
553
|
+
this.setState(prevState => ({
|
|
554
|
+
currentWorkplaceCount: prevState.currentWorkplaceCount - amountDestroyed
|
|
555
|
+
}));
|
|
556
|
+
}
|
|
557
|
+
};
|
|
558
|
+
keyExtrator = model => `${this.s.tableSettingFullCacheKey}-${model.id()}`;
|
|
559
|
+
filterForm = () => {
|
|
560
|
+
const {
|
|
561
|
+
filterFormRef,
|
|
562
|
+
submitFilter,
|
|
563
|
+
submitFilterDebounce
|
|
564
|
+
} = this.tt;
|
|
565
|
+
const {
|
|
566
|
+
filterContent,
|
|
567
|
+
filterSubmitButton
|
|
568
|
+
} = this.p;
|
|
569
|
+
const {
|
|
570
|
+
queryQName
|
|
571
|
+
} = this.s;
|
|
572
|
+
const {
|
|
573
|
+
filterSubmitLabel
|
|
574
|
+
} = this.props;
|
|
575
|
+
const {
|
|
576
|
+
qParams
|
|
577
|
+
} = digs(this.collection, "qParams");
|
|
578
|
+
return /*#__PURE__*/React.createElement(Form, {
|
|
579
|
+
className: "live-table--filter-form",
|
|
580
|
+
formRef: filterFormRef,
|
|
581
|
+
onSubmit: this.tt.onFilterFormSubmit,
|
|
582
|
+
setForm: this.setStates.filterForm
|
|
583
|
+
}, "s" in qParams && /*#__PURE__*/React.createElement("input", {
|
|
584
|
+
name: "s",
|
|
585
|
+
type: "hidden",
|
|
586
|
+
value: qParams.s
|
|
587
|
+
}), filterContent({
|
|
588
|
+
onFilterChanged: submitFilter,
|
|
589
|
+
onFilterChangedWithDelay: submitFilterDebounce,
|
|
590
|
+
qParams,
|
|
591
|
+
queryQName
|
|
592
|
+
}), filterSubmitButton && /*#__PURE__*/React.createElement("input", {
|
|
593
|
+
className: "btn btn-primary live-table--submit-filter-button",
|
|
594
|
+
type: "submit",
|
|
595
|
+
style: {
|
|
596
|
+
marginTop: "8px"
|
|
597
|
+
},
|
|
598
|
+
value: filterSubmitLabel || this.t(".filter", {
|
|
599
|
+
defaultValue: "Filter"
|
|
600
|
+
})
|
|
601
|
+
}));
|
|
602
|
+
};
|
|
603
|
+
onFilterClicked = e => {
|
|
604
|
+
e.preventDefault();
|
|
605
|
+
this.setState({
|
|
606
|
+
showFilters: !this.state.showFilters
|
|
607
|
+
});
|
|
608
|
+
};
|
|
609
|
+
onPerPageChanged = e => {
|
|
610
|
+
const {
|
|
611
|
+
queryName
|
|
612
|
+
} = this.s;
|
|
613
|
+
const newPerPageValue = digg(e, "target", "value");
|
|
614
|
+
const perKey = `${queryName}_per`;
|
|
615
|
+
const paramsChange = {};
|
|
616
|
+
paramsChange[perKey] = newPerPageValue;
|
|
617
|
+
Params.changeParams(paramsChange);
|
|
618
|
+
};
|
|
619
|
+
renderItem = ({
|
|
620
|
+
index,
|
|
621
|
+
item: model
|
|
622
|
+
}) => {
|
|
623
|
+
if (!this.s.tableSettingLoaded) {
|
|
624
|
+
return /*#__PURE__*/React.createElement(View, null, /*#__PURE__*/React.createElement(Text, null, this.t(".loading_dot_dot_dot", {
|
|
625
|
+
defaultValue: "Loading..."
|
|
626
|
+
})));
|
|
627
|
+
}
|
|
628
|
+
return /*#__PURE__*/React.createElement(ModelRow, {
|
|
629
|
+
cacheKey: model.cacheKey(),
|
|
630
|
+
columns: this.s.columnsToShow,
|
|
631
|
+
columnWidths: this.columnWidths(),
|
|
632
|
+
events: this.tt.events,
|
|
633
|
+
index: index,
|
|
634
|
+
key: model.id(),
|
|
635
|
+
model: model,
|
|
636
|
+
table: this,
|
|
637
|
+
tableSettingFullCacheKey: this.s.tableSettingFullCacheKey
|
|
638
|
+
});
|
|
639
|
+
};
|
|
640
|
+
styleForColumn = ({
|
|
641
|
+
column,
|
|
642
|
+
columnIndex,
|
|
643
|
+
even,
|
|
644
|
+
style,
|
|
645
|
+
type
|
|
646
|
+
}) => {
|
|
647
|
+
const {
|
|
648
|
+
styleUI
|
|
649
|
+
} = this.p;
|
|
650
|
+
const defaultStyle = {
|
|
651
|
+
justifyContent: "center",
|
|
652
|
+
padding: 8,
|
|
653
|
+
overflow: "hidden"
|
|
654
|
+
};
|
|
655
|
+
if (styleUI) {
|
|
656
|
+
Object.assign(defaultStyle, {
|
|
657
|
+
backgroundColor: even ? "#f5f5f5" : "#fff"
|
|
658
|
+
});
|
|
659
|
+
}
|
|
660
|
+
if (type == "actions") {
|
|
661
|
+
defaultStyle.flexDirection = "row";
|
|
662
|
+
defaultStyle.alignItems = "center";
|
|
663
|
+
if (this.tt.mdUp) {
|
|
664
|
+
defaultStyle.marginLeft = "auto";
|
|
665
|
+
} else {
|
|
666
|
+
defaultStyle.marginRight = "auto";
|
|
667
|
+
}
|
|
668
|
+
} else if (this.tt.mdUp && styleUI) {
|
|
669
|
+
defaultStyle.borderRight = "1px solid #dbdbdb";
|
|
670
|
+
}
|
|
671
|
+
const actualStyle = Object.assign(defaultStyle, style);
|
|
672
|
+
return actualStyle;
|
|
673
|
+
};
|
|
674
|
+
styleForHeader = ({
|
|
675
|
+
column,
|
|
676
|
+
columnIndex,
|
|
677
|
+
style,
|
|
678
|
+
type
|
|
679
|
+
}) => {
|
|
680
|
+
const {
|
|
681
|
+
mdUp
|
|
682
|
+
} = this.tt;
|
|
683
|
+
const defaultStyle = {
|
|
684
|
+
flexDirection: "row",
|
|
685
|
+
alignItems: "center",
|
|
686
|
+
padding: 8
|
|
687
|
+
};
|
|
688
|
+
if (type != "actions" && mdUp && this.p.styleUI) {
|
|
689
|
+
defaultStyle.borderRight = "1px solid #dbdbdb";
|
|
690
|
+
}
|
|
691
|
+
const actualStyle = Object.assign(defaultStyle, style);
|
|
692
|
+
return actualStyle;
|
|
693
|
+
};
|
|
694
|
+
styleForHeaderText() {
|
|
695
|
+
const actualStyle = {
|
|
696
|
+
fontWeight: "bold"
|
|
697
|
+
};
|
|
698
|
+
return actualStyle;
|
|
699
|
+
}
|
|
700
|
+
styleForRow = ({
|
|
701
|
+
even
|
|
702
|
+
} = {}) => {
|
|
703
|
+
const actualStyle = {
|
|
704
|
+
flex: 1,
|
|
705
|
+
alignItems: "stretch"
|
|
706
|
+
};
|
|
707
|
+
if (even && this.p.styleUI) {
|
|
708
|
+
actualStyle.backgroundColor = "#f5f5f5";
|
|
709
|
+
}
|
|
710
|
+
return actualStyle;
|
|
711
|
+
};
|
|
712
|
+
styleForRowHeader = () => {
|
|
713
|
+
const actualStyle = {
|
|
714
|
+
flex: 1,
|
|
715
|
+
alignItems: "stretch"
|
|
716
|
+
};
|
|
717
|
+
return actualStyle;
|
|
718
|
+
};
|
|
719
|
+
tableControls() {
|
|
720
|
+
const {
|
|
721
|
+
controls
|
|
722
|
+
} = this.props;
|
|
723
|
+
const {
|
|
724
|
+
showSettings
|
|
725
|
+
} = this.s;
|
|
726
|
+
const {
|
|
727
|
+
models,
|
|
728
|
+
qParams,
|
|
729
|
+
query,
|
|
730
|
+
result
|
|
731
|
+
} = digs(this.collection, "models", "qParams", "query", "result");
|
|
732
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
733
|
+
style: {
|
|
734
|
+
flexDirection: "row"
|
|
735
|
+
}
|
|
736
|
+
}, controls && controls({
|
|
737
|
+
models,
|
|
738
|
+
qParams,
|
|
739
|
+
query,
|
|
740
|
+
result
|
|
741
|
+
}), /*#__PURE__*/React.createElement(Pressable, {
|
|
742
|
+
dataSet: {
|
|
743
|
+
class: "filter-button"
|
|
744
|
+
},
|
|
745
|
+
onPress: this.tt.onFilterClicked
|
|
746
|
+
}, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
747
|
+
name: "search",
|
|
748
|
+
size: 20
|
|
749
|
+
})), /*#__PURE__*/React.createElement(View, {
|
|
750
|
+
style: {
|
|
751
|
+
position: "relative"
|
|
752
|
+
}
|
|
753
|
+
}, showSettings && /*#__PURE__*/React.createElement(Settings, {
|
|
754
|
+
onRequestClose: this.tt.onRequestCloseSettings,
|
|
755
|
+
table: this
|
|
756
|
+
}), /*#__PURE__*/React.createElement(Pressable, {
|
|
757
|
+
dataSet: {
|
|
758
|
+
class: "settings-button"
|
|
759
|
+
},
|
|
760
|
+
onPress: this.tt.onSettingsClicked
|
|
761
|
+
}, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
762
|
+
name: "gear",
|
|
763
|
+
size: 20
|
|
764
|
+
}))));
|
|
765
|
+
}
|
|
766
|
+
tableFooter() {
|
|
767
|
+
const {
|
|
768
|
+
result
|
|
769
|
+
} = digs(this.collection, "result");
|
|
770
|
+
const currentPage = result.currentPage();
|
|
771
|
+
const totalCount = result.totalCount();
|
|
772
|
+
const perPage = result.perPage();
|
|
773
|
+
const to = Math.min(currentPage * perPage, totalCount);
|
|
774
|
+
const defaultValue = "Showing %{from} to %{to} out of %{total_count} total.";
|
|
775
|
+
let from = (currentPage - 1) * perPage + 1;
|
|
776
|
+
if (to === 0) from = 0;
|
|
777
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
778
|
+
style: {
|
|
779
|
+
flexDirection: "row",
|
|
780
|
+
justifyContent: "space-between",
|
|
781
|
+
marginTop: 10
|
|
782
|
+
}
|
|
783
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
784
|
+
dataSet: {
|
|
785
|
+
class: "showing-counts"
|
|
786
|
+
},
|
|
787
|
+
style: {
|
|
788
|
+
flexDirection: "row"
|
|
789
|
+
}
|
|
790
|
+
}, /*#__PURE__*/React.createElement(Text, null, this.t(".showing_from_to_out_of_total", {
|
|
791
|
+
defaultValue,
|
|
792
|
+
from,
|
|
793
|
+
to,
|
|
794
|
+
total_count: totalCount
|
|
795
|
+
})), this.p.workplace && this.s.currentWorkplaceCount !== null && /*#__PURE__*/React.createElement(Text, {
|
|
796
|
+
style: {
|
|
797
|
+
marginLeft: 3
|
|
798
|
+
}
|
|
799
|
+
}, this.t(".x_selected", {
|
|
800
|
+
defaultValue: "%{selected} selected.",
|
|
801
|
+
selected: this.s.currentWorkplaceCount
|
|
802
|
+
}))), /*#__PURE__*/React.createElement(View, null, /*#__PURE__*/React.createElement(Select, {
|
|
803
|
+
className: "per-page-select",
|
|
804
|
+
defaultValue: perPage,
|
|
805
|
+
onChange: this.tt.onPerPageChanged,
|
|
806
|
+
options: paginationOptions
|
|
807
|
+
})));
|
|
808
|
+
}
|
|
809
|
+
className() {
|
|
810
|
+
const classNames = ["api-maker--table"];
|
|
811
|
+
if (this.props.className) {
|
|
812
|
+
classNames.push(this.props.className);
|
|
813
|
+
}
|
|
814
|
+
return classNames.join(" ");
|
|
815
|
+
}
|
|
816
|
+
columnProps(column) {
|
|
817
|
+
const props = {};
|
|
818
|
+
if (column.textCenter) {
|
|
819
|
+
props.style ||= {};
|
|
820
|
+
props.style.textAlign = "center";
|
|
821
|
+
}
|
|
822
|
+
if (column.textRight) {
|
|
823
|
+
props.style ||= {};
|
|
824
|
+
props.style.textAlign = "right";
|
|
825
|
+
}
|
|
826
|
+
return props;
|
|
827
|
+
}
|
|
828
|
+
headerProps(column) {
|
|
829
|
+
const props = {};
|
|
830
|
+
if (column.textCenter) {
|
|
831
|
+
props.style ||= {};
|
|
832
|
+
props.style.justifyContent = "center";
|
|
833
|
+
}
|
|
834
|
+
if (column.textRight) {
|
|
835
|
+
props.style ||= {};
|
|
836
|
+
props.style.justifyContent = "end";
|
|
837
|
+
}
|
|
838
|
+
return props;
|
|
839
|
+
}
|
|
840
|
+
columnWidths() {
|
|
841
|
+
const columnWidths = {};
|
|
842
|
+
for (const column of this.s.preparedColumns) {
|
|
843
|
+
columnWidths[column.tableSettingColumn.identifier()] = column.width;
|
|
844
|
+
}
|
|
845
|
+
return columnWidths;
|
|
846
|
+
}
|
|
847
|
+
headersContentFromColumns = () => {
|
|
848
|
+
return /*#__PURE__*/React.createElement(DraggableSort, {
|
|
849
|
+
data: this.s.columnsToShow,
|
|
850
|
+
events: this.tt.draggableSortEvents,
|
|
851
|
+
horizontal: true,
|
|
852
|
+
keyExtractor: this.tt.dragListkeyExtractor,
|
|
853
|
+
onItemMoved: this.tt.onItemMoved,
|
|
854
|
+
onReordered: this.tt.onReordered,
|
|
855
|
+
renderItem: this.tt.dragListRenderItemContent
|
|
856
|
+
});
|
|
857
|
+
};
|
|
858
|
+
dragListCacheKeyExtractor = item => `${item.tableSettingColumn.identifier()}-${this.s.resizing}`;
|
|
859
|
+
dragListkeyExtractor = item => item.tableSettingColumn.identifier();
|
|
860
|
+
onItemMoved = ({
|
|
861
|
+
animationArgs,
|
|
862
|
+
itemIndex,
|
|
863
|
+
x,
|
|
864
|
+
y
|
|
865
|
+
}) => {
|
|
866
|
+
const animatedPosition = digg(this, "s", "columnsToShow", itemIndex, "animatedPosition");
|
|
867
|
+
if (animationArgs) {
|
|
868
|
+
Animated.timing(animatedPosition, animationArgs).start();
|
|
869
|
+
} else {
|
|
870
|
+
animatedPosition.setValue({
|
|
871
|
+
x,
|
|
872
|
+
y
|
|
873
|
+
});
|
|
874
|
+
}
|
|
875
|
+
};
|
|
876
|
+
onReordered = async ({
|
|
877
|
+
fromItem,
|
|
878
|
+
fromPosition,
|
|
879
|
+
toItem,
|
|
880
|
+
toPosition
|
|
881
|
+
}) => {
|
|
882
|
+
if (fromPosition == toPosition) return; // Only do requests and queries if changed
|
|
883
|
+
|
|
884
|
+
const TableSettingColumn = fromItem.tableSettingColumn.constructor;
|
|
885
|
+
const toColumn = await TableSettingColumn.find(toItem.tableSettingColumn.id()); // Need to load latest position because ActsAsList might have changed it
|
|
886
|
+
|
|
887
|
+
await fromItem.tableSettingColumn.update({
|
|
888
|
+
position: toColumn.position()
|
|
889
|
+
});
|
|
890
|
+
};
|
|
891
|
+
dragListRenderItemContent = ({
|
|
892
|
+
isActive,
|
|
893
|
+
item,
|
|
894
|
+
touchProps
|
|
895
|
+
}) => {
|
|
896
|
+
const {
|
|
897
|
+
animatedWidth,
|
|
898
|
+
animatedZIndex,
|
|
899
|
+
column,
|
|
900
|
+
tableSettingColumn
|
|
901
|
+
} = item;
|
|
902
|
+
return /*#__PURE__*/React.createElement(HeaderColumn, {
|
|
903
|
+
active: isActive,
|
|
904
|
+
animatedWidth: animatedWidth,
|
|
905
|
+
animatedZIndex: animatedZIndex,
|
|
906
|
+
column: column,
|
|
907
|
+
key: tableSettingColumn.identifier(),
|
|
908
|
+
resizing: this.s.resizing,
|
|
909
|
+
table: this,
|
|
910
|
+
tableSettingColumn: tableSettingColumn,
|
|
911
|
+
touchProps: touchProps,
|
|
912
|
+
widths: this.s.widths
|
|
913
|
+
});
|
|
914
|
+
};
|
|
915
|
+
headerClassNameForColumn(column) {
|
|
916
|
+
const classNames = [];
|
|
917
|
+
if (column.commonProps && column.commonProps.className) classNames.push(column.commonProps.className);
|
|
918
|
+
if (column.headerProps && column.headerProps.className) classNames.push(column.headerProps.className);
|
|
919
|
+
return classNames;
|
|
920
|
+
}
|
|
921
|
+
headerLabelForColumn(column) {
|
|
922
|
+
const {
|
|
923
|
+
modelClass
|
|
924
|
+
} = this.p;
|
|
925
|
+
if ("label" in column) {
|
|
926
|
+
if (typeof column.label == "function") {
|
|
927
|
+
return column.label();
|
|
928
|
+
} else {
|
|
929
|
+
return column.label;
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
let currentModelClass = modelClass;
|
|
933
|
+
|
|
934
|
+
// Calculate current model class through path
|
|
935
|
+
if (column.path) {
|
|
936
|
+
for (const pathPart of column.path) {
|
|
937
|
+
const relationships = digg(currentModelClass.modelClassData(), "relationships");
|
|
938
|
+
const relationship = relationships.find(relationshipInArray => relationshipInArray.name == inflection.underscore(pathPart));
|
|
939
|
+
currentModelClass = modelClassRequire(digg(relationship, "resource_name"));
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
if (column.attribute) return currentModelClass.humanAttributeName(column.attribute);
|
|
943
|
+
throw new Error("No 'label' or 'attribute' was given");
|
|
944
|
+
}
|
|
945
|
+
onFilterFormSubmit = () => this.submitFilter();
|
|
946
|
+
onRequestCloseSettings = () => this.setState({
|
|
947
|
+
showSettings: false
|
|
948
|
+
});
|
|
949
|
+
onSettingsClicked = e => {
|
|
950
|
+
e.preventDefault();
|
|
951
|
+
this.setState({
|
|
952
|
+
showSettings: !this.s.showSettings
|
|
953
|
+
});
|
|
954
|
+
};
|
|
955
|
+
submitFilter = () => {
|
|
956
|
+
const filterForm = digg(this.tt.filterFormRef, "current");
|
|
957
|
+
const {
|
|
958
|
+
appHistory
|
|
959
|
+
} = this.props;
|
|
960
|
+
const qParams = Params.serializeForm(filterForm);
|
|
961
|
+
const {
|
|
962
|
+
queryQName
|
|
963
|
+
} = this.s;
|
|
964
|
+
const changeParamsParams = {};
|
|
965
|
+
changeParamsParams[queryQName] = JSON.stringify(qParams);
|
|
966
|
+
Params.changeParams(changeParamsParams, {
|
|
967
|
+
appHistory
|
|
968
|
+
});
|
|
969
|
+
};
|
|
970
|
+
submitFilterDebounce = debounce(this.tt.submitFilter);
|
|
971
|
+
}));
|
|
972
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkaWdnIiwiZGlncyIsIlJlYWN0IiwiY3JlYXRlQ29udGV4dCIsInVzZUNvbnRleHQiLCJ1c2VNZW1vIiwidXNlUmVmIiwiQW5pbWF0ZWQiLCJQcmVzc2FibGUiLCJWaWV3IiwiQmFzZUNvbXBvbmVudCIsIkNhcmQiLCJjbGFzc05hbWVzIiwiQ29sbGVjdGlvbiIsImNvbHVtblZpc2libGUiLCJkZWJvdW5jZSIsIkRyYWdnYWJsZVNvcnQiLCJFdmVudEVtaXR0ZXIiLCJGaWx0ZXJzIiwiRmxhdExpc3QiLCJGb250QXdlc29tZUljb24iLCJGb3JtIiwiSGVhZGVyIiwiSGVhZGVyQ29sdW1uIiwiSGVhZGVyU2VsZWN0IiwiaW5mbGVjdGlvbiIsIm1lbW8iLCJtb2RlbENsYXNzUmVxdWlyZSIsIk1vZGVsUm93IiwiUGFnaW5hdGUiLCJQYXJhbXMiLCJQcm9wVHlwZXMiLCJSb3ciLCJzZWxlY3RDYWxjdWxhdG9yIiwiU2VsZWN0IiwiU2V0dGluZ3MiLCJzaGFwZUNvbXBvbmVudCIsIlRhYmxlU2V0dGluZ3MiLCJUZXh0IiwidW5pcXVuaXplIiwidXNlQnJlYWtwb2ludCIsInVzZUNvbGxlY3Rpb24iLCJ1c2VJMThuIiwidXNlRXZlbnRFbWl0dGVyIiwidXNlTW9kZWxFdmVudCIsInVzZVF1ZXJ5UGFyYW1zIiwiV2lkdGhzIiwicGFnaW5hdGlvbk9wdGlvbnMiLCJXb3JrZXJQbHVnaW5zQ2hlY2tBbGxDaGVja2JveCIsImxhenkiLCJUYWJsZUNvbnRleHQiLCJMaXN0SGVhZGVyQ29tcG9uZW50Iiwic2V0dXAiLCJ1c2VTdGF0ZXMiLCJsYXN0VXBkYXRlIiwiRGF0ZSIsInJlbmRlciIsIm1kVXAiLCJ0YWJsZUNvbnRleHRWYWx1ZSIsInRhYmxlIiwiY29sbGVjdGlvbiIsImV2ZW50cyIsInF1ZXJ5V2l0aG91dFBhZ2luYXRpb24iLCJ0IiwidHQiLCJxdWVyeSIsIm9uQ29sdW1uVmlzaWJpbGl0eVVwZGF0ZWQiLCJjcmVhdGVFbGVtZW50IiwiZGF0YVNldCIsImNsYXNzIiwic3R5bGUiLCJzdHlsZUZvclJvd0hlYWRlciIsInAiLCJ3b3JrcGxhY2UiLCJzIiwiY3VycmVudFdvcmtwbGFjZSIsInN0eWxlRm9ySGVhZGVyIiwid2lkdGgiLCJ1bmRlZmluZWQiLCJtYXJnaW5Ib3Jpem9udGFsIiwibWFyZ2luTGVmdCIsImRlZmF1bHRWYWx1ZSIsInByZXBhcmVkQ29sdW1ucyIsIkZyYWdtZW50IiwiaGVhZGVyc0NvbnRlbnRGcm9tQ29sdW1ucyIsInR5cGUiLCJzZXRTdGF0ZSIsIkFwaU1ha2VyVGFibGUiLCJkZWZhdWx0UHJvcHMiLCJjYXJkIiwiY3VycmVudFVzZXIiLCJkZXN0cm95RW5hYmxlZCIsImZpbHRlckNhcmQiLCJmaWx0ZXJTdWJtaXRCdXR0b24iLCJub1JlY29yZHNBdmFpbGFibGVDb250ZW50Iiwibm9SZWNvcmRzRm91bmRDb250ZW50IiwicHJlbG9hZHMiLCJzZWxlY3QiLCJzdHlsZVVJIiwicHJvcFR5cGVzIiwiYWJpbGl0aWVzIiwib2JqZWN0IiwiYWN0aW9uc0NvbnRlbnQiLCJmdW5jIiwiYXBwSGlzdG9yeSIsImJvb2wiLCJpc1JlcXVpcmVkIiwiY2xhc3NOYW1lIiwic3RyaW5nIiwiaW5zdGFuY2VPZiIsImNvbHVtbnMiLCJvbmVPZlR5cGUiLCJhcnJheSIsImNvbnRyb2xzIiwiZGVmYXVsdERhdGVGb3JtYXROYW1lIiwiZGVmYXVsdERhdGVUaW1lRm9ybWF0TmFtZSIsImRlZmF1bHRQYXJhbXMiLCJkZXN0cm95TWVzc2FnZSIsImVkaXRNb2RlbFBhdGgiLCJmaWx0ZXJDb250ZW50IiwiZmlsdGVyU3VibWl0TGFiZWwiLCJub2RlIiwiZ3JvdXBCeSIsImhlYWRlciIsImlkZW50aWZpZXIiLCJtb2RlbENsYXNzIiwib25Nb2RlbHNMb2FkZWQiLCJwYWdpbmF0ZUNvbnRlbnQiLCJwYWdpbmF0aW9uQ29tcG9uZW50IiwicXVlcnlNZXRob2QiLCJxdWVyeU5hbWUiLCJzZWxlY3RDb2x1bW5zIiwic3R5bGVzIiwidmlld01vZGVsUGF0aCIsImRyYWdnYWJsZVNvcnRFdmVudHMiLCJ0YWJsZVNldHRpbmdzIiwibmFtZXNwYWNlIiwibmFtZSIsImJyZWFrcG9pbnQiLCJxdWVyeVBhcmFtcyIsInNldEluc3RhbmNlIiwiZmlsdGVyRm9ybVJlZiIsImNvbGxlY3Rpb25LZXkiLCJtb2RlbENsYXNzRGF0YSIsInByb3BzIiwicXVlcnlTTmFtZSIsImNvbHVtbnNBc0FycmF5IiwiY3VycmVudFdvcmtwbGFjZUNvdW50IiwiZmlsdGVyRm9ybSIsImNvbHVtbnNUb1Nob3ciLCJkcmFnZ2VkQ29sdW1uIiwicHJlbG9hZCIsInF1ZXJ5UU5hbWUiLCJxdWVyeVBhZ2VOYW1lIiwicmVzaXppbmciLCJzaG93RmlsdGVycyIsIkJvb2xlYW4iLCJzaG93U2V0dGluZ3MiLCJ0YWJsZVNldHRpbmciLCJ0YWJsZVNldHRpbmdMb2FkZWQiLCJ0YWJsZVNldHRpbmdGdWxsQ2FjaGVLZXkiLCJ3aWR0aHMiLCJjYWNoZUtleSIsImxvYWRDdXJyZW50V29ya3BsYWNlIiwidGhlbiIsImxvYWRDdXJyZW50V29ya3BsYWNlQ291bnQiLCJpZCIsImxvYWRUYWJsZVNldHRpbmciLCJvbkxpbmtzQ3JlYXRlZCIsIm9uTGlua3NEZXN0cm95ZWQiLCJjb2xsZWN0aW9uUmVhZHkiLCJhYmlsaXRpZXNUb0xvYWQiLCJpZkNvbmRpdGlvbiIsInBhZ2luYXRpb24iLCJzdGF0ZSIsImNsb25lIiwiZXhjZXB0Iiwib25EcmFnU3RhcnQiLCJvbkRyYWdFbmRBbmltYXRpb24iLCJnZXRDb2x1bW5zVG9TaG93IiwiaXRlbSIsImFuaW1hdGVkWkluZGV4Iiwic2V0VmFsdWUiLCJXb3JrcGxhY2UiLCJyZXN1bHQiLCJjdXJyZW50IiwiV29ya3BsYWNlTGluayIsInJhbnNhY2siLCJyZXNvdXJjZV90eXBlX2VxIiwid29ya3BsYWNlX2lkX2VxIiwiY291bnQiLCJmaWx0ZXIiLCJjb2x1bW4iLCJ0YWJsZVNldHRpbmdDb2x1bW4iLCJzb3J0IiwiYSIsImIiLCJwb3NpdGlvbiIsImxvYWRFeGlzdGluZ09yQ3JlYXRlVGFibGVTZXR0aW5ncyIsIm1lcmdlZFByZWxvYWRzIiwiZnVsbENhY2hlS2V5IiwidXBkYXRlU2V0dGluZ3NGdWxsQ2FjaGVLZXkiLCJjb25jYXQiLCJtb2RlbHMiLCJvdmVyYWxsQ291bnQiLCJxUGFyYW1zIiwic2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQiLCJzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50IiwiYXJncyIsIkVycm9yIiwib25MYXlvdXQiLCJvbkNvbnRhaW5lckxheW91dCIsImNvbnRhaW5lciIsImNhcmRPclRhYmxlIiwib3duQWJpbGl0aWVzIiwicHVzaCIsImxlbmd0aCIsIm1vZGVsQ2xhc3NOYW1lIiwibW9kZWxOYW1lIiwiYWJpbGl0eSIsInJlc3RQcm9wcyIsImhlYWRlckNvbnRlbnQiLCJQYWdpbmF0aW9uQ29tcG9uZW50IiwiaHVtYW4iLCJmbGF0TGlzdFN0eWxlIiwib3ZlcmZsb3dYIiwiYm9yZGVyIiwiYm9yZGVyUmFkaXVzIiwiZmxhdExpc3QiLCJQcm92aWRlciIsInZhbHVlIiwiX2V4dGVuZHMiLCJkYXRhIiwiZXh0cmFEYXRhIiwia2V5RXh0cmFjdG9yIiwia2V5RXh0cmF0b3IiLCJyZW5kZXJJdGVtIiwic2hvd3NIb3Jpem9udGFsU2Nyb2xsSW5kaWNhdG9yIiwidGFibGVDb250cm9scyIsImZvb3RlciIsInRhYmxlRm9vdGVyIiwiZSIsIm5hdGl2ZUV2ZW50IiwibGF5b3V0IiwidGFibGVXaWR0aCIsImNyZWF0ZWQiLCJhbW91bnRDcmVhdGVkIiwicHJldlN0YXRlIiwiZGVzdHJveWVkIiwiYW1vdW50RGVzdHJveWVkIiwibW9kZWwiLCJzdWJtaXRGaWx0ZXIiLCJzdWJtaXRGaWx0ZXJEZWJvdW5jZSIsImZvcm1SZWYiLCJvblN1Ym1pdCIsIm9uRmlsdGVyRm9ybVN1Ym1pdCIsInNldEZvcm0iLCJzZXRTdGF0ZXMiLCJvbkZpbHRlckNoYW5nZWQiLCJvbkZpbHRlckNoYW5nZWRXaXRoRGVsYXkiLCJtYXJnaW5Ub3AiLCJvbkZpbHRlckNsaWNrZWQiLCJwcmV2ZW50RGVmYXVsdCIsIm9uUGVyUGFnZUNoYW5nZWQiLCJuZXdQZXJQYWdlVmFsdWUiLCJwZXJLZXkiLCJwYXJhbXNDaGFuZ2UiLCJjaGFuZ2VQYXJhbXMiLCJpbmRleCIsImNvbHVtbldpZHRocyIsImtleSIsInN0eWxlRm9yQ29sdW1uIiwiY29sdW1uSW5kZXgiLCJldmVuIiwiZGVmYXVsdFN0eWxlIiwianVzdGlmeUNvbnRlbnQiLCJwYWRkaW5nIiwib3ZlcmZsb3ciLCJPYmplY3QiLCJhc3NpZ24iLCJiYWNrZ3JvdW5kQ29sb3IiLCJmbGV4RGlyZWN0aW9uIiwiYWxpZ25JdGVtcyIsIm1hcmdpblJpZ2h0IiwiYm9yZGVyUmlnaHQiLCJhY3R1YWxTdHlsZSIsInN0eWxlRm9ySGVhZGVyVGV4dCIsImZvbnRXZWlnaHQiLCJzdHlsZUZvclJvdyIsImZsZXgiLCJvblByZXNzIiwic2l6ZSIsIm9uUmVxdWVzdENsb3NlIiwib25SZXF1ZXN0Q2xvc2VTZXR0aW5ncyIsIm9uU2V0dGluZ3NDbGlja2VkIiwiY3VycmVudFBhZ2UiLCJ0b3RhbENvdW50IiwicGVyUGFnZSIsInRvIiwiTWF0aCIsIm1pbiIsImZyb20iLCJ0b3RhbF9jb3VudCIsInNlbGVjdGVkIiwib25DaGFuZ2UiLCJvcHRpb25zIiwiam9pbiIsImNvbHVtblByb3BzIiwidGV4dENlbnRlciIsInRleHRBbGlnbiIsInRleHRSaWdodCIsImhlYWRlclByb3BzIiwiaG9yaXpvbnRhbCIsImRyYWdMaXN0a2V5RXh0cmFjdG9yIiwib25JdGVtTW92ZWQiLCJvblJlb3JkZXJlZCIsImRyYWdMaXN0UmVuZGVySXRlbUNvbnRlbnQiLCJkcmFnTGlzdENhY2hlS2V5RXh0cmFjdG9yIiwiYW5pbWF0aW9uQXJncyIsIml0ZW1JbmRleCIsIngiLCJ5IiwiYW5pbWF0ZWRQb3NpdGlvbiIsInRpbWluZyIsInN0YXJ0IiwiZnJvbUl0ZW0iLCJmcm9tUG9zaXRpb24iLCJ0b0l0ZW0iLCJ0b1Bvc2l0aW9uIiwiVGFibGVTZXR0aW5nQ29sdW1uIiwiY29uc3RydWN0b3IiLCJ0b0NvbHVtbiIsImZpbmQiLCJ1cGRhdGUiLCJpc0FjdGl2ZSIsInRvdWNoUHJvcHMiLCJhbmltYXRlZFdpZHRoIiwiYWN0aXZlIiwiaGVhZGVyQ2xhc3NOYW1lRm9yQ29sdW1uIiwiY29tbW9uUHJvcHMiLCJoZWFkZXJMYWJlbEZvckNvbHVtbiIsImxhYmVsIiwiY3VycmVudE1vZGVsQ2xhc3MiLCJwYXRoIiwicGF0aFBhcnQiLCJyZWxhdGlvbnNoaXBzIiwicmVsYXRpb25zaGlwIiwicmVsYXRpb25zaGlwSW5BcnJheSIsInVuZGVyc2NvcmUiLCJhdHRyaWJ1dGUiLCJodW1hbkF0dHJpYnV0ZU5hbWUiLCJzZXJpYWxpemVGb3JtIiwiY2hhbmdlUGFyYW1zUGFyYW1zIiwiSlNPTiIsInN0cmluZ2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWJsZS90YWJsZS5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWdnLCBkaWdzfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBSZWFjdCwge2NyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7QW5pbWF0ZWQsIFByZXNzYWJsZSwgVmlld30gZnJvbSBcInJlYWN0LW5hdGl2ZVwiXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tIFwiLi4vYmFzZS1jb21wb25lbnRcIlxuaW1wb3J0IENhcmQgZnJvbSBcIi4uL2Jvb3RzdHJhcC9jYXJkXCJcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCJcbmltcG9ydCBDb2xsZWN0aW9uIGZyb20gXCIuLi9jb2xsZWN0aW9uXCJcbmltcG9ydCBjb2x1bW5WaXNpYmxlIGZyb20gXCIuL2NvbHVtbi12aXNpYmxlXCJcbmltcG9ydCBkZWJvdW5jZSBmcm9tIFwiZGVib3VuY2VcIlxuaW1wb3J0IERyYWdnYWJsZVNvcnQgZnJvbSBcIi4uL2RyYWdnYWJsZS1zb3J0L2luZGV4XCJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcImV2ZW50c1wiXG5pbXBvcnQgRmlsdGVycyBmcm9tIFwiLi9maWx0ZXJzXCJcbmltcG9ydCBGbGF0TGlzdCBmcm9tIFwiLi9jb21wb25lbnRzL2ZsYXQtbGlzdFwiXG5pbXBvcnQgRm9udEF3ZXNvbWVJY29uIGZyb20gXCJyZWFjdC1uYXRpdmUtdmVjdG9yLWljb25zL0ZvbnRBd2Vzb21lXCJcbmltcG9ydCB7Rm9ybX0gZnJvbSBcIi4uL2Zvcm1cIlxuaW1wb3J0IEhlYWRlciBmcm9tIFwiLi9jb21wb25lbnRzL2hlYWRlclwiXG5pbXBvcnQgSGVhZGVyQ29sdW1uIGZyb20gXCIuL2hlYWRlci1jb2x1bW5cIlxuaW1wb3J0IEhlYWRlclNlbGVjdCBmcm9tIFwiLi9oZWFkZXItc2VsZWN0XCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IG1lbW8gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlL3NyYy9tZW1vXCJcbmltcG9ydCBtb2RlbENsYXNzUmVxdWlyZSBmcm9tIFwiLi4vbW9kZWwtY2xhc3MtcmVxdWlyZVwiXG5pbXBvcnQgTW9kZWxSb3cgZnJvbSBcIi4vbW9kZWwtcm93XCJcbmltcG9ydCBQYWdpbmF0ZSBmcm9tIFwiLi4vYm9vdHN0cmFwL3BhZ2luYXRlXCJcbmltcG9ydCBQYXJhbXMgZnJvbSBcIi4uL3BhcmFtc1wiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBSb3cgZnJvbSBcIi4vY29tcG9uZW50cy9yb3dcIlxuaW1wb3J0IHNlbGVjdENhbGN1bGF0b3IgZnJvbSBcIi4vc2VsZWN0LWNhbGN1bGF0b3JcIlxuaW1wb3J0IFNlbGVjdCBmcm9tIFwiLi4vaW5wdXRzL3NlbGVjdFwiXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MvaW5kZXhcIlxuaW1wb3J0IHtzaGFwZUNvbXBvbmVudH0gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlL3NyYy9zaGFwZS1jb21wb25lbnRcIlxuaW1wb3J0IFRhYmxlU2V0dGluZ3MgZnJvbSBcIi4vdGFibGUtc2V0dGluZ3NcIlxuaW1wb3J0IFRleHQgZnJvbSBcIi4uL3V0aWxzL3RleHRcIlxuaW1wb3J0IHVuaXF1bml6ZSBmcm9tIFwidW5pcXVuaXplXCJcbmltcG9ydCB1c2VCcmVha3BvaW50IGZyb20gXCIuLi91c2UtYnJlYWtwb2ludFwiXG5pbXBvcnQgdXNlQ29sbGVjdGlvbiBmcm9tIFwiLi4vdXNlLWNvbGxlY3Rpb25cIlxuaW1wb3J0IHVzZUkxOG4gZnJvbSBcImkxOG4tb24tc3Rlcm9pZHMvc3JjL3VzZS1pMThuXCJcbmltcG9ydCB1c2VFdmVudEVtaXR0ZXIgZnJvbSBcIi4uL3VzZS1ldmVudC1lbWl0dGVyXCJcbmltcG9ydCB1c2VNb2RlbEV2ZW50IGZyb20gXCIuLi91c2UtbW9kZWwtZXZlbnRcIlxuaW1wb3J0IHVzZVF1ZXJ5UGFyYW1zIGZyb20gXCJvbi1sb2NhdGlvbi1jaGFuZ2VkL3NyYy91c2UtcXVlcnktcGFyYW1zXCJcbmltcG9ydCBXaWR0aHMgZnJvbSBcIi4vd2lkdGhzXCJcblxuY29uc3QgcGFnaW5hdGlvbk9wdGlvbnMgPSBbMzAsIDYwLCA5MCwgW1wiQWxsXCIsIFwiYWxsXCJdXVxuY29uc3QgV29ya2VyUGx1Z2luc0NoZWNrQWxsQ2hlY2tib3ggPSBSZWFjdC5sYXp5KCgpID0+IGltcG9ydChcIi4vd29ya2VyLXBsdWdpbnMtY2hlY2stYWxsLWNoZWNrYm94XCIpKVxuY29uc3QgVGFibGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpXG5cbmNvbnN0IExpc3RIZWFkZXJDb21wb25lbnQgPSBtZW1vKHNoYXBlQ29tcG9uZW50KGNsYXNzIExpc3RIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgc2V0dXAoKSB7XG4gICAgdGhpcy51c2VTdGF0ZXMoe1xuICAgICAgbGFzdFVwZGF0ZTogbmV3IERhdGUoKVxuICAgIH0pXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge21kVXB9ID0gdXNlQnJlYWtwb2ludCgpXG4gICAgY29uc3QgdGFibGVDb250ZXh0VmFsdWUgPSB1c2VDb250ZXh0KFRhYmxlQ29udGV4dClcbiAgICBjb25zdCB0YWJsZSA9IHRhYmxlQ29udGV4dFZhbHVlLnRhYmxlXG4gICAgY29uc3Qge2NvbGxlY3Rpb24sIGV2ZW50cywgcXVlcnlXaXRob3V0UGFnaW5hdGlvbiwgdH0gPSB0YWJsZS50dFxuICAgIGNvbnN0IHtxdWVyeX0gPSBkaWdzKGNvbGxlY3Rpb24sIFwicXVlcnlcIilcblxuICAgIHVzZUV2ZW50RW1pdHRlcihldmVudHMsIFwiY29sdW1uVmlzaWJpbGl0eVVwZGF0ZWRcIiwgdGhpcy50dC5vbkNvbHVtblZpc2liaWxpdHlVcGRhdGVkKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxSb3cgZGF0YVNldD17e2NsYXNzOiBcImFwaS1tYWtlci90YWJsZS9oZWFkZXItcm93XCJ9fSBzdHlsZT17dGFibGUuc3R5bGVGb3JSb3dIZWFkZXIoKX0+XG4gICAgICAgIHt0YWJsZS5wLndvcmtwbGFjZSAmJiB0YWJsZS5zLmN1cnJlbnRXb3JrcGxhY2UgJiZcbiAgICAgICAgICA8SGVhZGVyIHN0eWxlPXt0YWJsZS5zdHlsZUZvckhlYWRlcih7c3R5bGU6IHt3aWR0aDogbWRVcCA/IDQxIDogdW5kZWZpbmVkfX0pfT5cbiAgICAgICAgICAgIDxXb3JrZXJQbHVnaW5zQ2hlY2tBbGxDaGVja2JveFxuICAgICAgICAgICAgICBjdXJyZW50V29ya3BsYWNlPXt0YWJsZS5zLmN1cnJlbnRXb3JrcGxhY2V9XG4gICAgICAgICAgICAgIHF1ZXJ5PXtxdWVyeVdpdGhvdXRQYWdpbmF0aW9ufVxuICAgICAgICAgICAgICBzdHlsZT17e21hcmdpbkhvcml6b250YWw6IFwiYXV0b1wifX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7IW1kVXAgJiZcbiAgICAgICAgICAgICAgPFRleHQgc3R5bGU9e3ttYXJnaW5MZWZ0OiAzfX0+XG4gICAgICAgICAgICAgICAge3QoXCIuc2VsZWN0X2FsbF9mb3VuZFwiLCB7ZGVmYXVsdFZhbHVlOiBcIlNlbGVjdCBhbGwgZm91bmRcIn0pfVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9IZWFkZXI+XG4gICAgICAgIH1cbiAgICAgICAgeyFtZFVwICYmXG4gICAgICAgICAgPEhlYWRlciBzdHlsZT17dGFibGUuc3R5bGVGb3JIZWFkZXIoe3N0eWxlOiB7fX0pfT5cbiAgICAgICAgICAgIDxIZWFkZXJTZWxlY3QgcHJlcGFyZWRDb2x1bW5zPXt0YWJsZS5zLnByZXBhcmVkQ29sdW1uc30gcXVlcnk9e3F1ZXJ5fSB0YWJsZT17dGFibGV9IC8+XG4gICAgICAgICAgPC9IZWFkZXI+XG4gICAgICAgIH1cbiAgICAgICAge21kVXAgJiZcbiAgICAgICAgICA8PlxuICAgICAgICAgICAge3RhYmxlLmhlYWRlcnNDb250ZW50RnJvbUNvbHVtbnMoKX1cbiAgICAgICAgICAgIDxIZWFkZXIgc3R5bGU9e3RhYmxlLnN0eWxlRm9ySGVhZGVyKHtzdHlsZToge30sIHR5cGU6IFwiYWN0aW9uc1wifSl9IC8+XG4gICAgICAgICAgPC8+XG4gICAgICAgIH1cbiAgICAgIDwvUm93PlxuICAgIClcbiAgfVxuXG4gIG9uQ29sdW1uVmlzaWJpbGl0eVVwZGF0ZWQgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHtsYXN0VXBkYXRlOiBuZXcgRGF0ZSgpfSlcbn0pKVxuXG5leHBvcnQgZGVmYXVsdCBtZW1vKHNoYXBlQ29tcG9uZW50KGNsYXNzIEFwaU1ha2VyVGFibGUgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBjYXJkOiB0cnVlLFxuICAgIGN1cnJlbnRVc2VyOiBudWxsLFxuICAgIGRlc3Ryb3lFbmFibGVkOiB0cnVlLFxuICAgIGZpbHRlckNhcmQ6IHRydWUsXG4gICAgZmlsdGVyU3VibWl0QnV0dG9uOiB0cnVlLFxuICAgIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHVuZGVmaW5lZCxcbiAgICBub1JlY29yZHNGb3VuZENvbnRlbnQ6IHVuZGVmaW5lZCxcbiAgICBwcmVsb2FkczogW10sXG4gICAgc2VsZWN0OiB7fSxcbiAgICBzdHlsZVVJOiB0cnVlLFxuICAgIHdvcmtwbGFjZTogZmFsc2VcbiAgfVxuXG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgYWJpbGl0aWVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGFjdGlvbnNDb250ZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBhcHBIaXN0b3J5OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNhcmQ6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvbGxlY3Rpb246IFByb3BUeXBlcy5pbnN0YW5jZU9mKENvbGxlY3Rpb24pLFxuICAgIGNvbHVtbnM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBjb250cm9sczogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY3VycmVudFVzZXI6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGVmYXVsdERhdGVGb3JtYXROYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGRlZmF1bHREYXRlVGltZUZvcm1hdE5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgZGVmYXVsdFBhcmFtczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkZXN0cm95RW5hYmxlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICBkZXN0cm95TWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBlZGl0TW9kZWxQYXRoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBmaWx0ZXJDYXJkOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIGZpbHRlckNvbnRlbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIGZpbHRlclN1Ym1pdExhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgICBncm91cEJ5OiBQcm9wVHlwZXMuYXJyYXksXG4gICAgaGVhZGVyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLnN0cmluZ10pLFxuICAgIGlkZW50aWZpZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgbW9kZWxDbGFzczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBub1JlY29yZHNBdmFpbGFibGVDb250ZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgICBub1JlY29yZHNGb3VuZENvbnRlbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uTW9kZWxzTG9hZGVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBwYWdpbmF0ZUNvbnRlbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIHBhZ2luYXRpb25Db21wb25lbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIHByZWxvYWRzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICBxdWVyeU1ldGhvZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgcXVlcnlOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHNlbGVjdDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBzZWxlY3RDb2x1bW5zOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHN0eWxlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBzdHlsZVVJOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgIHZpZXdNb2RlbFBhdGg6IFByb3BUeXBlcy5mdW5jLFxuICAgIHdvcmtwbGFjZTogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZFxuICB9XG5cbiAgZHJhZ2dhYmxlU29ydEV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgdGFibGVTZXR0aW5ncyA9IG51bGxcblxuICBzZXR1cCgpIHtcbiAgICBjb25zdCB7dH0gPSB1c2VJMThuKHtuYW1lc3BhY2U6IFwianMuYXBpX21ha2VyLnRhYmxlXCJ9KVxuICAgIGNvbnN0IHtuYW1lOiBicmVha3BvaW50LCBtZFVwfSA9IHVzZUJyZWFrcG9pbnQoKVxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdXNlUXVlcnlQYXJhbXMoKVxuXG4gICAgdGhpcy5zZXRJbnN0YW5jZSh7XG4gICAgICBicmVha3BvaW50LFxuICAgICAgZmlsdGVyRm9ybVJlZjogdXNlUmVmKCksXG4gICAgICBtZFVwLFxuICAgICAgdFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0aW9uS2V5ID0gZGlnZyh0aGlzLnAubW9kZWxDbGFzcy5tb2RlbENsYXNzRGF0YSgpLCBcImNvbGxlY3Rpb25LZXlcIilcbiAgICBsZXQgcXVlcnlOYW1lID0gdGhpcy5wcm9wcy5xdWVyeU5hbWVcblxuICAgIGlmICghcXVlcnlOYW1lKSBxdWVyeU5hbWUgPSBjb2xsZWN0aW9uS2V5XG5cbiAgICBjb25zdCBxdWVyeVNOYW1lID0gYCR7cXVlcnlOYW1lfV9zYFxuXG4gICAgdGhpcy51c2VTdGF0ZXMoe1xuICAgICAgY29sdW1uczogKCkgPT4gdGhpcy5jb2x1bW5zQXNBcnJheSgpLFxuICAgICAgY3VycmVudFdvcmtwbGFjZTogdW5kZWZpbmVkLFxuICAgICAgY3VycmVudFdvcmtwbGFjZUNvdW50OiBudWxsLFxuICAgICAgZmlsdGVyRm9ybTogbnVsbCxcbiAgICAgIGNvbHVtbnNUb1Nob3c6IG51bGwsXG4gICAgICBkcmFnZ2VkQ29sdW1uOiBudWxsLFxuICAgICAgaWRlbnRpZmllcjogKCkgPT4gdGhpcy5wcm9wcy5pZGVudGlmaWVyIHx8IGAke2NvbGxlY3Rpb25LZXl9LWRlZmF1bHRgLFxuICAgICAgbGFzdFVwZGF0ZTogKCkgPT4gbmV3IERhdGUoKSxcbiAgICAgIHByZWxvYWQ6IHVuZGVmaW5lZCxcbiAgICAgIHByZXBhcmVkQ29sdW1uczogdW5kZWZpbmVkLFxuICAgICAgcXVlcnlOYW1lLFxuICAgICAgcXVlcnlRTmFtZTogKCkgPT4gYCR7cXVlcnlOYW1lfV9xYCxcbiAgICAgIHF1ZXJ5UGFnZU5hbWU6ICgpID0+IGAke3F1ZXJ5TmFtZX1fcGFnZWAsXG4gICAgICBxdWVyeVNOYW1lLFxuICAgICAgcmVzaXppbmc6IGZhbHNlLFxuICAgICAgc2hvd0ZpbHRlcnM6ICgpID0+IEJvb2xlYW4ocXVlcnlQYXJhbXNbcXVlcnlTTmFtZV0pLFxuICAgICAgc2hvd1NldHRpbmdzOiBmYWxzZSxcbiAgICAgIHRhYmxlU2V0dGluZzogdW5kZWZpbmVkLFxuICAgICAgdGFibGVTZXR0aW5nTG9hZGVkOiBmYWxzZSxcbiAgICAgIHRhYmxlU2V0dGluZ0Z1bGxDYWNoZUtleTogdW5kZWZpbmVkLFxuICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgIHdpZHRoczogbnVsbFxuICAgIH0pXG5cbiAgICB0aGlzLnRhYmxlQ29udGV4dFZhbHVlID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIGNhY2hlS2V5OiB0aGlzLnMudGFibGVTZXR0aW5nRnVsbENhY2hlS2V5LFxuICAgICAgICBsYXN0VXBkYXRlOiB0aGlzLnMubGFzdFVwZGF0ZSxcbiAgICAgICAgcmVzaXppbmc6IHRoaXMucy5yZXNpemluZyxcbiAgICAgICAgdGFibGU6IHRoaXNcbiAgICAgIH0pLFxuICAgICAgW3RoaXMucy5sYXN0VXBkYXRlLCB0aGlzLnMucmVzaXppbmcsIHRoaXMucy50YWJsZVNldHRpbmdGdWxsQ2FjaGVLZXldXG4gICAgKVxuXG4gICAgdXNlTWVtbygoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy53b3JrcGxhY2UpIHtcbiAgICAgICAgdGhpcy5sb2FkQ3VycmVudFdvcmtwbGFjZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEN1cnJlbnRXb3JrcGxhY2VDb3VudCgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSwgW3RoaXMucC5jdXJyZW50VXNlcj8uaWQoKV0pXG5cbiAgICB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy50dC50YWJsZVNldHRpbmdzICYmIHRoaXMucy53aWR0aCkge1xuICAgICAgICB0aGlzLmxvYWRUYWJsZVNldHRpbmcoKVxuICAgICAgfVxuICAgIH0sIFt0aGlzLnAuY3VycmVudFVzZXI/LmlkKCksIHRoaXMucy53aWR0aF0pXG5cbiAgICB1c2VNb2RlbEV2ZW50KHRoaXMucy5jdXJyZW50V29ya3BsYWNlLCBcIndvcmtwbGFjZV9saW5rc19jcmVhdGVkXCIsIHRoaXMudHQub25MaW5rc0NyZWF0ZWQpXG4gICAgdXNlTW9kZWxFdmVudCh0aGlzLnMuY3VycmVudFdvcmtwbGFjZSwgXCJ3b3JrcGxhY2VfbGlua3NfZGVzdHJveWVkXCIsIHRoaXMudHQub25MaW5rc0Rlc3Ryb3llZClcblxuICAgIGxldCBjb2xsZWN0aW9uUmVhZHkgPSB0cnVlXG4gICAgbGV0IHNlbGVjdFxuXG4gICAgaWYgKCF0aGlzLnMucHJlcGFyZWRDb2x1bW5zKSB7XG4gICAgICBjb2xsZWN0aW9uUmVhZHkgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjb2xsZWN0aW9uUmVhZHkpIHtcbiAgICAgIHNlbGVjdCA9IHNlbGVjdENhbGN1bGF0b3Ioe3RhYmxlOiB0aGlzfSlcbiAgICB9XG5cbiAgICB0aGlzLmNvbGxlY3Rpb24gPSB1c2VDb2xsZWN0aW9uKHtcbiAgICAgIGFiaWxpdGllczogdGhpcy5hYmlsaXRpZXNUb0xvYWQoKSxcbiAgICAgIGRlZmF1bHRQYXJhbXM6IHRoaXMucHJvcHMuZGVmYXVsdFBhcmFtcyxcbiAgICAgIGNvbGxlY3Rpb246IHRoaXMucHJvcHMuY29sbGVjdGlvbixcbiAgICAgIGdyb3VwQnk6IHRoaXMucHJvcHMuZ3JvdXBCeSxcbiAgICAgIGlmQ29uZGl0aW9uOiBjb2xsZWN0aW9uUmVhZHksXG4gICAgICBtb2RlbENsYXNzOiB0aGlzLnByb3BzLm1vZGVsQ2xhc3MsXG4gICAgICBvbk1vZGVsc0xvYWRlZDogdGhpcy5wcm9wcy5vbk1vZGVsc0xvYWRlZCxcbiAgICAgIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHRoaXMucHJvcHMubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCxcbiAgICAgIG5vUmVjb3Jkc0ZvdW5kQ29udGVudDogdGhpcy5wcm9wcy5ub1JlY29yZHNGb3VuZENvbnRlbnQsXG4gICAgICBwYWdpbmF0aW9uOiB0cnVlLFxuICAgICAgcHJlbG9hZHM6IHRoaXMuc3RhdGUucHJlbG9hZCxcbiAgICAgIHF1ZXJ5TWV0aG9kOiB0aGlzLnByb3BzLnF1ZXJ5TWV0aG9kLFxuICAgICAgcXVlcnlOYW1lLFxuICAgICAgc2VsZWN0LFxuICAgICAgc2VsZWN0Q29sdW1uczogdGhpcy5wcm9wcy5zZWxlY3RDb2x1bW5zXG4gICAgfSlcbiAgICB0aGlzLnF1ZXJ5V2l0aG91dFBhZ2luYXRpb24gPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gdGhpcy5jb2xsZWN0aW9uPy5xdWVyeT8uY2xvbmUoKT8uZXhjZXB0KFwicGFnZVwiKSxcbiAgICAgIFt0aGlzLmNvbGxlY3Rpb24ucXVlcnldXG4gICAgKVxuXG4gICAgdXNlRXZlbnRFbWl0dGVyKHRoaXMudHQuZHJhZ2dhYmxlU29ydEV2ZW50cywgXCJvbkRyYWdTdGFydFwiLCB0aGlzLnR0Lm9uRHJhZ1N0YXJ0KVxuICAgIHVzZUV2ZW50RW1pdHRlcih0aGlzLnR0LmRyYWdnYWJsZVNvcnRFdmVudHMsIFwib25EcmFnRW5kQW5pbWF0aW9uXCIsIHRoaXMudHQub25EcmFnRW5kQW5pbWF0aW9uKVxuICAgIHVzZUV2ZW50RW1pdHRlcih0aGlzLnR0LmV2ZW50cywgXCJjb2x1bW5WaXNpYmlsaXR5VXBkYXRlZFwiLCB0aGlzLnR0Lm9uQ29sdW1uVmlzaWJpbGl0eVVwZGF0ZWQpXG4gIH1cblxuICBvbkNvbHVtblZpc2liaWxpdHlVcGRhdGVkID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7Y29sdW1uc1RvU2hvdzogdGhpcy5nZXRDb2x1bW5zVG9TaG93KHRoaXMucy5jb2x1bW5zKSwgbGFzdFVwZGF0ZTogbmV3IERhdGUoKX0pXG4gIG9uRHJhZ1N0YXJ0ID0gKHtpdGVtfSkgPT4gaXRlbS5hbmltYXRlZFpJbmRleC5zZXRWYWx1ZSg5OTk5KVxuICBvbkRyYWdFbmRBbmltYXRpb24gPSAoe2l0ZW19KSA9PiBpdGVtLmFuaW1hdGVkWkluZGV4LnNldFZhbHVlKDApXG5cbiAgYXN5bmMgbG9hZEN1cnJlbnRXb3JrcGxhY2UoKSB7XG4gICAgY29uc3QgV29ya3BsYWNlID0gbW9kZWxDbGFzc1JlcXVpcmUoXCJXb3JrcGxhY2VcIilcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBXb3JrcGxhY2UuY3VycmVudCgpXG4gICAgY29uc3QgY3VycmVudFdvcmtwbGFjZSA9IGRpZ2cocmVzdWx0LCBcImN1cnJlbnRcIiwgMClcblxuICAgIHRoaXMuc2V0U3RhdGUoe2N1cnJlbnRXb3JrcGxhY2V9KVxuICB9XG5cbiAgYXN5bmMgbG9hZEN1cnJlbnRXb3JrcGxhY2VDb3VudCgpIHtcbiAgICBjb25zdCBXb3JrcGxhY2VMaW5rID0gbW9kZWxDbGFzc1JlcXVpcmUoXCJXb3JrcGxhY2VMaW5rXCIpXG4gICAgY29uc3QgY3VycmVudFdvcmtwbGFjZUNvdW50ID0gYXdhaXQgV29ya3BsYWNlTGlua1xuICAgICAgLnJhbnNhY2soe1xuICAgICAgICByZXNvdXJjZV90eXBlX2VxOiB0aGlzLnAubW9kZWxDbGFzcy5tb2RlbENsYXNzRGF0YSgpLm5hbWUsXG4gICAgICAgIHdvcmtwbGFjZV9pZF9lcTogdGhpcy5zLmN1cnJlbnRXb3JrcGxhY2UuaWQoKVxuICAgICAgfSlcbiAgICAgIC5jb3VudCgpXG5cbiAgICB0aGlzLnNldFN0YXRlKHtjdXJyZW50V29ya3BsYWNlQ291bnR9KVxuICB9XG5cbiAgZ2V0Q29sdW1uc1RvU2hvdyhjb2x1bW5zKSB7XG4gICAgcmV0dXJuIGNvbHVtbnNcbiAgICAgIC5maWx0ZXIoKHtjb2x1bW4sIHRhYmxlU2V0dGluZ0NvbHVtbn0pID0+IGNvbHVtblZpc2libGUoY29sdW1uLCB0YWJsZVNldHRpbmdDb2x1bW4pKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEudGFibGVTZXR0aW5nQ29sdW1uLnBvc2l0aW9uKCkgLSBiLnRhYmxlU2V0dGluZ0NvbHVtbi5wb3NpdGlvbigpKVxuICB9XG5cbiAgYXN5bmMgbG9hZFRhYmxlU2V0dGluZygpIHtcbiAgICB0aGlzLnRhYmxlU2V0dGluZ3MgPSBuZXcgVGFibGVTZXR0aW5ncyh7dGFibGU6IHRoaXN9KVxuXG4gICAgY29uc3QgdGFibGVTZXR0aW5nID0gYXdhaXQgdGhpcy50YWJsZVNldHRpbmdzLmxvYWRFeGlzdGluZ09yQ3JlYXRlVGFibGVTZXR0aW5ncygpXG4gICAgY29uc3Qge2NvbHVtbnMsIHByZWxvYWR9ID0gdGhpcy50YWJsZVNldHRpbmdzLnByZXBhcmVkQ29sdW1ucyh0YWJsZVNldHRpbmcpXG4gICAgY29uc3Qge3dpZHRofSA9IHRoaXMuc1xuICAgIGNvbnN0IHdpZHRocyA9IG5ldyBXaWR0aHMoe2NvbHVtbnMsIHRhYmxlOiB0aGlzLCB3aWR0aH0pXG4gICAgY29uc3QgY29sdW1uc1RvU2hvdyA9IHRoaXMuZ2V0Q29sdW1uc1RvU2hvdyhjb2x1bW5zKVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjb2x1bW5zLFxuICAgICAgY29sdW1uc1RvU2hvdyxcbiAgICAgIHByZXBhcmVkQ29sdW1uczogY29sdW1ucyxcbiAgICAgIHByZWxvYWQ6IHRoaXMubWVyZ2VkUHJlbG9hZHMocHJlbG9hZCksXG4gICAgICB0YWJsZVNldHRpbmcsXG4gICAgICB0YWJsZVNldHRpbmdMb2FkZWQ6IHRydWUsXG4gICAgICB0YWJsZVNldHRpbmdGdWxsQ2FjaGVLZXk6IHRhYmxlU2V0dGluZy5mdWxsQ2FjaGVLZXkoKSxcbiAgICAgIHdpZHRoc1xuICAgIH0pXG4gIH1cblxuICB1cGRhdGVTZXR0aW5nc0Z1bGxDYWNoZUtleSA9ICgpID0+IHRoaXMuc2V0U3RhdGUoe3RhYmxlU2V0dGluZ0Z1bGxDYWNoZUtleTogdGhpcy5zdGF0ZS50YWJsZVNldHRpbmcuZnVsbENhY2hlS2V5KCl9KVxuXG4gIGNvbHVtbnNBc0FycmF5ID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5jb2x1bW5zID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY29sdW1ucygpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY29sdW1uc1xuICB9XG5cbiAgbWVyZ2VkUHJlbG9hZHMocHJlbG9hZCkge1xuICAgIGNvbnN0IHtwcmVsb2Fkc30gPSB0aGlzLnByb3BzXG4gICAgbGV0IG1lcmdlZFByZWxvYWRzID0gW11cblxuICAgIGlmIChwcmVsb2FkcykgbWVyZ2VkUHJlbG9hZHMgPSBtZXJnZWRQcmVsb2Fkcy5jb25jYXQocHJlbG9hZHMpXG4gICAgaWYgKHByZWxvYWQpIG1lcmdlZFByZWxvYWRzID0gbWVyZ2VkUHJlbG9hZHMuY29uY2F0KHByZWxvYWQpXG5cbiAgICByZXR1cm4gdW5pcXVuaXplKG1lcmdlZFByZWxvYWRzKVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7bW9kZWxDbGFzcywgbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCwgbm9SZWNvcmRzRm91bmRDb250ZW50fSA9IHRoaXMucFxuICAgIGNvbnN0IHtjb2xsZWN0aW9uLCBjdXJyZW50VXNlcn0gPSB0aGlzLnByb3BzXG4gICAgY29uc3Qge3F1ZXJ5TmFtZSwgcXVlcnlTTmFtZSwgc2hvd0ZpbHRlcnN9ID0gdGhpcy5zXG4gICAgY29uc3Qge1xuICAgICAgbW9kZWxzLFxuICAgICAgb3ZlcmFsbENvdW50LFxuICAgICAgcVBhcmFtcyxcbiAgICAgIHF1ZXJ5LFxuICAgICAgcmVzdWx0LFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQsXG4gICAgICBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50XG4gICAgfSA9IGRpZ3MoXG4gICAgICB0aGlzLmNvbGxlY3Rpb24sXG4gICAgICBcIm1vZGVsc1wiLFxuICAgICAgXCJvdmVyYWxsQ291bnRcIixcbiAgICAgIFwicVBhcmFtc1wiLFxuICAgICAgXCJxdWVyeVwiLFxuICAgICAgXCJyZXN1bHRcIixcbiAgICAgIFwic2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnRcIixcbiAgICAgIFwic2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudFwiXG4gICAgKVxuXG4gICAgaWYgKGNvbGxlY3Rpb24gJiYgY29sbGVjdGlvbi5hcmdzLm1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lICE9IG1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNb2RlbCBjbGFzcyBmcm9tIGNvbGxlY3Rpb24gJyR7Y29sbGVjdGlvbi5hcmdzLm1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lfScgYCArXG4gICAgICAgIGBkaWRuJ3QgbWF0Y2ggbW9kZWwgY2xhc3Mgb24gdGFibGU6ICcke21vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lfSdgXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3IGRhdGFTZXQ9e3tjbGFzczogdGhpcy5jbGFzc05hbWUoKX19IG9uTGF5b3V0PXt0aGlzLnR0Lm9uQ29udGFpbmVyTGF5b3V0fSBzdHlsZT17dGhpcy5wcm9wcy5zdHlsZXM/LmNvbnRhaW5lcn0+XG4gICAgICAgIHtzaG93Tm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCAmJlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGl2ZS10YWJsZS0tbm8tcmVjb3Jkcy1hdmFpbGFibGUtY29udGVudFwiPlxuICAgICAgICAgICAge25vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQoe21vZGVscywgcVBhcmFtcywgb3ZlcmFsbENvdW50fSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAge3Nob3dOb1JlY29yZHNGb3VuZENvbnRlbnQgJiZcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxpdmUtdGFibGUtLW5vLXJlY29yZHMtZm91bmQtY29udGVudFwiPlxuICAgICAgICAgICAge25vUmVjb3Jkc0ZvdW5kQ29udGVudCh7bW9kZWxzLCBxUGFyYW1zLCBvdmVyYWxsQ291bnR9KX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7c2hvd0ZpbHRlcnMgJiZcbiAgICAgICAgICA8RmlsdGVycyBjdXJyZW50VXNlcj17Y3VycmVudFVzZXJ9IG1vZGVsQ2xhc3M9e21vZGVsQ2xhc3N9IHF1ZXJ5TmFtZT17cXVlcnlOYW1lfSBxdWVyeVNOYW1lPXtxdWVyeVNOYW1lfSAvPlxuICAgICAgICB9XG4gICAgICAgIHtxUGFyYW1zICYmIHF1ZXJ5ICYmIHJlc3VsdCAmJiBtb2RlbHMgJiYgIXNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50ICYmICFzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50ICYmXG4gICAgICAgICAgdGhpcy5jYXJkT3JUYWJsZSgpXG4gICAgICAgIH1cbiAgICAgIDwvVmlldz5cbiAgICApXG4gIH1cblxuICBhYmlsaXRpZXNUb0xvYWQgKCkge1xuICAgIGNvbnN0IGFiaWxpdGllc1RvTG9hZCA9IHt9XG4gICAgY29uc3Qge2FiaWxpdGllcywgbW9kZWxDbGFzc30gPSB0aGlzLnByb3BzXG4gICAgY29uc3Qgb3duQWJpbGl0aWVzID0gW11cblxuICAgIGlmICh0aGlzLnByb3BzLmRlc3Ryb3lFbmFibGVkKSBvd25BYmlsaXRpZXMucHVzaChcImRlc3Ryb3lcIilcbiAgICBpZiAodGhpcy5wcm9wcy5lZGl0TW9kZWxQYXRoKSBvd25BYmlsaXRpZXMucHVzaChcImVkaXRcIilcbiAgICBpZiAodGhpcy5wcm9wcy52aWV3TW9kZWxQYXRoKSBvd25BYmlsaXRpZXMucHVzaChcInNob3dcIilcblxuICAgIGlmIChvd25BYmlsaXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbW9kZWxDbGFzc05hbWUgPSBkaWdnKG1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG5cbiAgICAgIGFiaWxpdGllc1RvTG9hZFttb2RlbENsYXNzTmFtZV0gPSBvd25BYmlsaXRpZXNcbiAgICB9XG5cbiAgICBpZiAoYWJpbGl0aWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsTmFtZSBpbiBhYmlsaXRpZXMpIHtcbiAgICAgICAgaWYgKCEobW9kZWxOYW1lIGluIGFiaWxpdGllc1RvTG9hZCkpIHtcbiAgICAgICAgICBhYmlsaXRpZXNUb0xvYWRbbW9kZWxOYW1lXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGFiaWxpdHkgb2YgYWJpbGl0aWVzW21vZGVsTmFtZV0pIHtcbiAgICAgICAgICBhYmlsaXRpZXNUb0xvYWRbbW9kZWxOYW1lXS5wdXNoKGFiaWxpdHkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWJpbGl0aWVzVG9Mb2FkXG4gIH1cblxuICBjYXJkT3JUYWJsZSAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYWJpbGl0aWVzLFxuICAgICAgYWN0aW9uc0NvbnRlbnQsXG4gICAgICBhcHBIaXN0b3J5LFxuICAgICAgY2FyZCxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICBjb2x1bW5zLFxuICAgICAgY29udHJvbHMsXG4gICAgICBjdXJyZW50VXNlcixcbiAgICAgIGRlZmF1bHREYXRlRm9ybWF0TmFtZSxcbiAgICAgIGRlZmF1bHREYXRlVGltZUZvcm1hdE5hbWUsXG4gICAgICBkZWZhdWx0UGFyYW1zLFxuICAgICAgZGVzdHJveUVuYWJsZWQsXG4gICAgICBkZXN0cm95TWVzc2FnZSxcbiAgICAgIGVkaXRNb2RlbFBhdGgsXG4gICAgICBmaWx0ZXJDYXJkLFxuICAgICAgZmlsdGVyQ29udGVudCxcbiAgICAgIGZpbHRlclN1Ym1pdEJ1dHRvbixcbiAgICAgIGZpbHRlclN1Ym1pdExhYmVsLFxuICAgICAgZ3JvdXBCeSxcbiAgICAgIGhlYWRlcixcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCxcbiAgICAgIG5vUmVjb3Jkc0ZvdW5kQ29udGVudCxcbiAgICAgIG9uTW9kZWxzTG9hZGVkLFxuICAgICAgcGFnaW5hdGVDb250ZW50LFxuICAgICAgcGFnaW5hdGlvbkNvbXBvbmVudCxcbiAgICAgIHByZWxvYWRzLFxuICAgICAgcXVlcnlNZXRob2QsXG4gICAgICBxdWVyeU5hbWUsXG4gICAgICBzZWxlY3QsXG4gICAgICBzZWxlY3RDb2x1bW5zLFxuICAgICAgc3R5bGVVSSxcbiAgICAgIHZpZXdNb2RlbFBhdGgsXG4gICAgICB3b3JrcGxhY2UsXG4gICAgICAuLi5yZXN0UHJvcHNcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHttb2RlbHMsIHFQYXJhbXMsIHF1ZXJ5LCByZXN1bHR9ID0gZGlncyh0aGlzLmNvbGxlY3Rpb24sIFwibW9kZWxzXCIsIFwicVBhcmFtc1wiLCBcInF1ZXJ5XCIsIFwicmVzdWx0XCIpXG5cbiAgICBsZXQgaGVhZGVyQ29udGVudCwgUGFnaW5hdGlvbkNvbXBvbmVudFxuXG4gICAgaWYgKHR5cGVvZiBoZWFkZXIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBoZWFkZXJDb250ZW50ID0gaGVhZGVyKHttb2RlbHMsIHFQYXJhbXMsIHF1ZXJ5LCByZXN1bHR9KVxuICAgIH0gZWxzZSBpZiAoaGVhZGVyKSB7XG4gICAgICBoZWFkZXJDb250ZW50ID0gaGVhZGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlckNvbnRlbnQgPSBtb2RlbENsYXNzLm1vZGVsTmFtZSgpLmh1bWFuKHtjb3VudDogMn0pXG4gICAgfVxuXG4gICAgaWYgKCFwYWdpbmF0ZUNvbnRlbnQpIHtcbiAgICAgIGlmIChwYWdpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgIFBhZ2luYXRpb25Db21wb25lbnQgPSBwYWdpbmF0aW9uQ29tcG9uZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBQYWdpbmF0aW9uQ29tcG9uZW50ID0gUGFnaW5hdGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmbGF0TGlzdFN0eWxlID0ge1xuICAgICAgb3ZlcmZsb3dYOiBcImF1dG9cIlxuICAgIH1cblxuICAgIGlmIChzdHlsZVVJKSB7XG4gICAgICBmbGF0TGlzdFN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkICNkYmRiZGJcIlxuICAgICAgZmxhdExpc3RTdHlsZS5ib3JkZXJSYWRpdXMgPSA1XG4gICAgfVxuXG4gICAgY29uc3QgZmxhdExpc3QgPSAoXG4gICAgICA8VGFibGVDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt0aGlzLnR0LnRhYmxlQ29udGV4dFZhbHVlfT5cbiAgICAgICAgPEZsYXRMaXN0XG4gICAgICAgICAgZGF0YT17bW9kZWxzfVxuICAgICAgICAgIGRhdGFTZXQ9e3tcbiAgICAgICAgICAgIGNsYXNzOiBjbGFzc05hbWVzKFwiYXBpLW1ha2VyLS10YWJsZVwiLCBjbGFzc05hbWUpLFxuICAgICAgICAgICAgY2FjaGVLZXk6IHRoaXMucy50YWJsZVNldHRpbmdGdWxsQ2FjaGVLZXksXG4gICAgICAgICAgICBsYXN0VXBkYXRlOiB0aGlzLnMubGFzdFVwZGF0ZVxuICAgICAgICAgIH19XG4gICAgICAgICAgZXh0cmFEYXRhPXt0aGlzLnMubGFzdFVwZGF0ZX1cbiAgICAgICAgICBrZXlFeHRyYWN0b3I9e3RoaXMudHQua2V5RXh0cmF0b3J9XG4gICAgICAgICAgTGlzdEhlYWRlckNvbXBvbmVudD17TGlzdEhlYWRlckNvbXBvbmVudH1cbiAgICAgICAgICByZW5kZXJJdGVtPXt0aGlzLnR0LnJlbmRlckl0ZW19XG4gICAgICAgICAgc2hvd3NIb3Jpem9udGFsU2Nyb2xsSW5kaWNhdG9yXG4gICAgICAgICAgc3R5bGU9e2ZsYXRMaXN0U3R5bGV9XG4gICAgICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgICAgLz5cbiAgICAgIDwvVGFibGVDb250ZXh0LlByb3ZpZGVyPlxuICAgIClcblxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICB7ZmlsdGVyQ29udGVudCAmJiBmaWx0ZXJDYXJkICYmXG4gICAgICAgICAgPENhcmQgY2xhc3NOYW1lPVwibGl2ZS10YWJsZS0tZmlsdGVyLWNhcmQgbWItNFwiPlxuICAgICAgICAgICAge3RoaXMuZmlsdGVyRm9ybSgpfVxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgfVxuICAgICAgICB7ZmlsdGVyQ29udGVudCAmJiAhZmlsdGVyQ2FyZCAmJlxuICAgICAgICAgIHRoaXMuZmlsdGVyRm9ybSgpXG4gICAgICAgIH1cbiAgICAgICAge2NhcmQgJiZcbiAgICAgICAgICA8Q2FyZFxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFwibGl2ZS10YWJsZS0tdGFibGUtY2FyZFwiLCBcIm1iLTRcIiwgY2xhc3NOYW1lKX1cbiAgICAgICAgICAgIGNvbnRyb2xzPXt0aGlzLnRhYmxlQ29udHJvbHMoKX1cbiAgICAgICAgICAgIGhlYWRlcj17aGVhZGVyQ29udGVudH1cbiAgICAgICAgICAgIGZvb3Rlcj17dGhpcy50YWJsZUZvb3RlcigpfVxuICAgICAgICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZmxhdExpc3R9XG4gICAgICAgICAgPC9DYXJkPlxuICAgICAgICB9XG4gICAgICAgIHshY2FyZCAmJiBmbGF0TGlzdH1cbiAgICAgICAge3Jlc3VsdCAmJiBQYWdpbmF0aW9uQ29tcG9uZW50ICYmXG4gICAgICAgICAgPFBhZ2luYXRpb25Db21wb25lbnQgcmVzdWx0PXtyZXN1bHR9IC8+XG4gICAgICAgIH1cbiAgICAgICAge3Jlc3VsdCAmJiBwYWdpbmF0ZUNvbnRlbnQgJiZcbiAgICAgICAgICBwYWdpbmF0ZUNvbnRlbnQoe3Jlc3VsdH0pXG4gICAgICAgIH1cbiAgICAgIDwvPlxuICAgIClcbiAgfVxuXG4gIG9uQ29udGFpbmVyTGF5b3V0ID0gKGUpID0+IHtcbiAgICBjb25zdCB7d2lkdGh9ID0gZS5uYXRpdmVFdmVudC5sYXlvdXRcbiAgICBjb25zdCB7d2lkdGhzfSA9IHRoaXMuc1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7d2lkdGh9KVxuICAgIGlmICh3aWR0aHMpIHdpZHRocy50YWJsZVdpZHRoID0gd2lkdGhcbiAgfVxuXG4gIG9uTGlua3NDcmVhdGVkID0gKHthcmdzfSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3NOYW1lID0gdGhpcy5wLm1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lXG5cbiAgICBpZiAoYXJncy5jcmVhdGVkW21vZGVsQ2xhc3NOYW1lXSkge1xuICAgICAgY29uc3QgYW1vdW50Q3JlYXRlZCA9IGFyZ3MuY3JlYXRlZFttb2RlbENsYXNzTmFtZV0ubGVuZ3RoXG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgY3VycmVudFdvcmtwbGFjZUNvdW50OiBwcmV2U3RhdGUuY3VycmVudFdvcmtwbGFjZUNvdW50ICsgYW1vdW50Q3JlYXRlZFxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgb25MaW5rc0Rlc3Ryb3llZCA9ICh7YXJnc30pID0+IHtcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IHRoaXMucC5tb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCkubmFtZVxuXG4gICAgaWYgKGFyZ3MuZGVzdHJveWVkW21vZGVsQ2xhc3NOYW1lXSkge1xuICAgICAgY29uc3QgYW1vdW50RGVzdHJveWVkID0gYXJncy5kZXN0cm95ZWRbbW9kZWxDbGFzc05hbWVdLmxlbmd0aFxuXG4gICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgIGN1cnJlbnRXb3JrcGxhY2VDb3VudDogcHJldlN0YXRlLmN1cnJlbnRXb3JrcGxhY2VDb3VudCAtIGFtb3VudERlc3Ryb3llZFxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAga2V5RXh0cmF0b3IgPSAobW9kZWwpID0+IGAke3RoaXMucy50YWJsZVNldHRpbmdGdWxsQ2FjaGVLZXl9LSR7bW9kZWwuaWQoKX1gXG5cbiAgZmlsdGVyRm9ybSA9ICgpID0+IHtcbiAgICBjb25zdCB7ZmlsdGVyRm9ybVJlZiwgc3VibWl0RmlsdGVyLCBzdWJtaXRGaWx0ZXJEZWJvdW5jZX0gPSB0aGlzLnR0XG4gICAgY29uc3Qge2ZpbHRlckNvbnRlbnQsIGZpbHRlclN1Ym1pdEJ1dHRvbn0gPSB0aGlzLnBcbiAgICBjb25zdCB7cXVlcnlRTmFtZX0gPSB0aGlzLnNcbiAgICBjb25zdCB7ZmlsdGVyU3VibWl0TGFiZWx9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHtxUGFyYW1zfSA9IGRpZ3ModGhpcy5jb2xsZWN0aW9uLCBcInFQYXJhbXNcIilcblxuICAgIHJldHVybiAoXG4gICAgICA8Rm9ybSBjbGFzc05hbWU9XCJsaXZlLXRhYmxlLS1maWx0ZXItZm9ybVwiIGZvcm1SZWY9e2ZpbHRlckZvcm1SZWZ9IG9uU3VibWl0PXt0aGlzLnR0Lm9uRmlsdGVyRm9ybVN1Ym1pdH0gc2V0Rm9ybT17dGhpcy5zZXRTdGF0ZXMuZmlsdGVyRm9ybX0+XG4gICAgICAgIHtcInNcIiBpbiBxUGFyYW1zICYmXG4gICAgICAgICAgPGlucHV0IG5hbWU9XCJzXCIgdHlwZT1cImhpZGRlblwiIHZhbHVlPXtxUGFyYW1zLnN9IC8+XG4gICAgICAgIH1cbiAgICAgICAge2ZpbHRlckNvbnRlbnQoe1xuICAgICAgICAgIG9uRmlsdGVyQ2hhbmdlZDogc3VibWl0RmlsdGVyLFxuICAgICAgICAgIG9uRmlsdGVyQ2hhbmdlZFdpdGhEZWxheTogc3VibWl0RmlsdGVyRGVib3VuY2UsXG4gICAgICAgICAgcVBhcmFtcyxcbiAgICAgICAgICBxdWVyeVFOYW1lXG4gICAgICAgIH0pfVxuICAgICAgICB7ZmlsdGVyU3VibWl0QnV0dG9uICYmXG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJidG4gYnRuLXByaW1hcnkgbGl2ZS10YWJsZS0tc3VibWl0LWZpbHRlci1idXR0b25cIlxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBzdHlsZT17e21hcmdpblRvcDogXCI4cHhcIn19XG4gICAgICAgICAgICB2YWx1ZT17ZmlsdGVyU3VibWl0TGFiZWwgfHwgdGhpcy50KFwiLmZpbHRlclwiLCB7ZGVmYXVsdFZhbHVlOiBcIkZpbHRlclwifSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgPC9Gb3JtPlxuICAgIClcbiAgfVxuXG4gIG9uRmlsdGVyQ2xpY2tlZCA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgdGhpcy5zZXRTdGF0ZSh7c2hvd0ZpbHRlcnM6ICF0aGlzLnN0YXRlLnNob3dGaWx0ZXJzfSlcbiAgfVxuXG4gIG9uUGVyUGFnZUNoYW5nZWQgPSAoZSkgPT4ge1xuICAgIGNvbnN0IHtxdWVyeU5hbWV9ID0gdGhpcy5zXG4gICAgY29uc3QgbmV3UGVyUGFnZVZhbHVlID0gZGlnZyhlLCBcInRhcmdldFwiLCBcInZhbHVlXCIpXG4gICAgY29uc3QgcGVyS2V5ID0gYCR7cXVlcnlOYW1lfV9wZXJgXG4gICAgY29uc3QgcGFyYW1zQ2hhbmdlID0ge31cblxuICAgIHBhcmFtc0NoYW5nZVtwZXJLZXldID0gbmV3UGVyUGFnZVZhbHVlXG5cbiAgICBQYXJhbXMuY2hhbmdlUGFyYW1zKHBhcmFtc0NoYW5nZSlcbiAgfVxuXG4gIHJlbmRlckl0ZW0gPSAoe2luZGV4LCBpdGVtOiBtb2RlbH0pID0+IHtcbiAgICBpZiAoIXRoaXMucy50YWJsZVNldHRpbmdMb2FkZWQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxWaWV3PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAge3RoaXMudChcIi5sb2FkaW5nX2RvdF9kb3RfZG90XCIsIHtkZWZhdWx0VmFsdWU6IFwiTG9hZGluZy4uLlwifSl9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L1ZpZXc+XG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxNb2RlbFJvd1xuICAgICAgICBjYWNoZUtleT17bW9kZWwuY2FjaGVLZXkoKX1cbiAgICAgICAgY29sdW1ucz17dGhpcy5zLmNvbHVtbnNUb1Nob3d9XG4gICAgICAgIGNvbHVtbldpZHRocz17dGhpcy5jb2x1bW5XaWR0aHMoKX1cbiAgICAgICAgZXZlbnRzPXt0aGlzLnR0LmV2ZW50c31cbiAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICBrZXk9e21vZGVsLmlkKCl9XG4gICAgICAgIG1vZGVsPXttb2RlbH1cbiAgICAgICAgdGFibGU9e3RoaXN9XG4gICAgICAgIHRhYmxlU2V0dGluZ0Z1bGxDYWNoZUtleT17dGhpcy5zLnRhYmxlU2V0dGluZ0Z1bGxDYWNoZUtleX1cbiAgICAgIC8+XG4gICAgKVxuICB9XG5cbiAgc3R5bGVGb3JDb2x1bW4gPSAoe2NvbHVtbiwgY29sdW1uSW5kZXgsIGV2ZW4sIHN0eWxlLCB0eXBlfSkgPT4ge1xuICAgIGNvbnN0IHtzdHlsZVVJfSA9IHRoaXMucFxuICAgIGNvbnN0IGRlZmF1bHRTdHlsZSA9IHtcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgcGFkZGluZzogOCxcbiAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgfVxuXG4gICAgaWYgKHN0eWxlVUkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZGVmYXVsdFN0eWxlLCB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogZXZlbiA/IFwiI2Y1ZjVmNVwiIDogXCIjZmZmXCJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT0gXCJhY3Rpb25zXCIpIHtcbiAgICAgIGRlZmF1bHRTdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJyb3dcIlxuICAgICAgZGVmYXVsdFN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiXG5cbiAgICAgIGlmICh0aGlzLnR0Lm1kVXApIHtcbiAgICAgICAgZGVmYXVsdFN0eWxlLm1hcmdpbkxlZnQgPSBcImF1dG9cIlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFN0eWxlLm1hcmdpblJpZ2h0ID0gXCJhdXRvXCJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMudHQubWRVcCAmJiBzdHlsZVVJKSB7XG4gICAgICBkZWZhdWx0U3R5bGUuYm9yZGVyUmlnaHQgPSBcIjFweCBzb2xpZCAjZGJkYmRiXCJcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxTdHlsZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBkZWZhdWx0U3R5bGUsXG4gICAgICBzdHlsZVxuICAgIClcblxuICAgIHJldHVybiBhY3R1YWxTdHlsZVxuICB9XG5cbiAgc3R5bGVGb3JIZWFkZXIgPSAoe2NvbHVtbiwgY29sdW1uSW5kZXgsIHN0eWxlLCB0eXBlfSkgPT4ge1xuICAgIGNvbnN0IHttZFVwfSA9IHRoaXMudHRcbiAgICBjb25zdCBkZWZhdWx0U3R5bGUgPSB7XG4gICAgICBmbGV4RGlyZWN0aW9uOiBcInJvd1wiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIHBhZGRpbmc6IDhcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPSBcImFjdGlvbnNcIiAmJiBtZFVwICYmIHRoaXMucC5zdHlsZVVJKSB7XG4gICAgICBkZWZhdWx0U3R5bGUuYm9yZGVyUmlnaHQgPSBcIjFweCBzb2xpZCAjZGJkYmRiXCJcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxTdHlsZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBkZWZhdWx0U3R5bGUsXG4gICAgICBzdHlsZVxuICAgIClcblxuICAgIHJldHVybiBhY3R1YWxTdHlsZVxuICB9XG5cbiAgc3R5bGVGb3JIZWFkZXJUZXh0KCkge1xuICAgIGNvbnN0IGFjdHVhbFN0eWxlID0ge2ZvbnRXZWlnaHQ6IFwiYm9sZFwifVxuXG4gICAgcmV0dXJuIGFjdHVhbFN0eWxlXG4gIH1cblxuICBzdHlsZUZvclJvdyA9ICh7ZXZlbn0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IGFjdHVhbFN0eWxlID0ge1xuICAgICAgZmxleDogMSxcbiAgICAgIGFsaWduSXRlbXM6IFwic3RyZXRjaFwiXG4gICAgfVxuXG4gICAgaWYgKGV2ZW4gJiYgdGhpcy5wLnN0eWxlVUkpIHtcbiAgICAgIGFjdHVhbFN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiI2Y1ZjVmNVwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdHVhbFN0eWxlXG4gIH1cblxuICBzdHlsZUZvclJvd0hlYWRlciA9ICgpID0+IHtcbiAgICBjb25zdCBhY3R1YWxTdHlsZSA9IHtcbiAgICAgIGZsZXg6IDEsXG4gICAgICBhbGlnbkl0ZW1zOiBcInN0cmV0Y2hcIlxuICAgIH1cblxuICAgIHJldHVybiBhY3R1YWxTdHlsZVxuICB9XG5cbiAgdGFibGVDb250cm9scygpIHtcbiAgICBjb25zdCB7Y29udHJvbHN9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHtzaG93U2V0dGluZ3N9ID0gdGhpcy5zXG4gICAgY29uc3Qge21vZGVscywgcVBhcmFtcywgcXVlcnksIHJlc3VsdH0gPSBkaWdzKHRoaXMuY29sbGVjdGlvbiwgXCJtb2RlbHNcIiwgXCJxUGFyYW1zXCIsIFwicXVlcnlcIiwgXCJyZXN1bHRcIilcblxuICAgIHJldHVybiAoXG4gICAgICA8VmlldyBzdHlsZT17e2ZsZXhEaXJlY3Rpb246IFwicm93XCJ9fT5cbiAgICAgICAge2NvbnRyb2xzICYmIGNvbnRyb2xzKHttb2RlbHMsIHFQYXJhbXMsIHF1ZXJ5LCByZXN1bHR9KX1cbiAgICAgICAgPFByZXNzYWJsZSBkYXRhU2V0PXt7Y2xhc3M6IFwiZmlsdGVyLWJ1dHRvblwifX0gb25QcmVzcz17dGhpcy50dC5vbkZpbHRlckNsaWNrZWR9PlxuICAgICAgICAgIDxGb250QXdlc29tZUljb24gbmFtZT1cInNlYXJjaFwiIHNpemU9ezIwfSAvPlxuICAgICAgICA8L1ByZXNzYWJsZT5cbiAgICAgICAgPFZpZXcgc3R5bGU9e3twb3NpdGlvbjogXCJyZWxhdGl2ZVwifX0+XG4gICAgICAgICAge3Nob3dTZXR0aW5ncyAmJlxuICAgICAgICAgICAgPFNldHRpbmdzIG9uUmVxdWVzdENsb3NlPXt0aGlzLnR0Lm9uUmVxdWVzdENsb3NlU2V0dGluZ3N9IHRhYmxlPXt0aGlzfSAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8UHJlc3NhYmxlIGRhdGFTZXQ9e3tjbGFzczogXCJzZXR0aW5ncy1idXR0b25cIn19IG9uUHJlc3M9e3RoaXMudHQub25TZXR0aW5nc0NsaWNrZWR9PlxuICAgICAgICAgICAgPEZvbnRBd2Vzb21lSWNvbiBuYW1lPVwiZ2VhclwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgIDwvUHJlc3NhYmxlPlxuICAgICAgICA8L1ZpZXc+XG4gICAgICA8L1ZpZXc+XG4gICAgKVxuICB9XG5cbiAgdGFibGVGb290ZXIoKSB7XG4gICAgY29uc3Qge3Jlc3VsdH0gPSBkaWdzKHRoaXMuY29sbGVjdGlvbiwgXCJyZXN1bHRcIilcbiAgICBjb25zdCBjdXJyZW50UGFnZSA9IHJlc3VsdC5jdXJyZW50UGFnZSgpXG4gICAgY29uc3QgdG90YWxDb3VudCA9IHJlc3VsdC50b3RhbENvdW50KClcbiAgICBjb25zdCBwZXJQYWdlID0gcmVzdWx0LnBlclBhZ2UoKVxuICAgIGNvbnN0IHRvID0gTWF0aC5taW4oY3VycmVudFBhZ2UgKiBwZXJQYWdlLCB0b3RhbENvdW50KVxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IFwiU2hvd2luZyAle2Zyb219IHRvICV7dG99IG91dCBvZiAle3RvdGFsX2NvdW50fSB0b3RhbC5cIlxuICAgIGxldCBmcm9tID0gKChjdXJyZW50UGFnZSAtIDEpICogcGVyUGFnZSkgKyAxXG5cbiAgICBpZiAodG8gPT09IDApIGZyb20gPSAwXG5cbiAgICByZXR1cm4gKFxuICAgICAgPFZpZXcgc3R5bGU9e3tmbGV4RGlyZWN0aW9uOiBcInJvd1wiLCBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsIG1hcmdpblRvcDogMTB9fT5cbiAgICAgICAgPFZpZXcgZGF0YVNldD17e2NsYXNzOiBcInNob3dpbmctY291bnRzXCJ9fSBzdHlsZT17e2ZsZXhEaXJlY3Rpb246IFwicm93XCJ9fT5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIHt0aGlzLnQoXCIuc2hvd2luZ19mcm9tX3RvX291dF9vZl90b3RhbFwiLCB7ZGVmYXVsdFZhbHVlLCBmcm9tLCB0bywgdG90YWxfY291bnQ6IHRvdGFsQ291bnR9KX1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAge3RoaXMucC53b3JrcGxhY2UgJiYgdGhpcy5zLmN1cnJlbnRXb3JrcGxhY2VDb3VudCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgPFRleHQgc3R5bGU9e3ttYXJnaW5MZWZ0OiAzfX0+XG4gICAgICAgICAgICAgIHt0aGlzLnQoXCIueF9zZWxlY3RlZFwiLCB7ZGVmYXVsdFZhbHVlOiBcIiV7c2VsZWN0ZWR9IHNlbGVjdGVkLlwiLCBzZWxlY3RlZDogdGhpcy5zLmN1cnJlbnRXb3JrcGxhY2VDb3VudH0pfVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9WaWV3PlxuICAgICAgICA8Vmlldz5cbiAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJwZXItcGFnZS1zZWxlY3RcIlxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlPXtwZXJQYWdlfVxuICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMudHQub25QZXJQYWdlQ2hhbmdlZH1cbiAgICAgICAgICAgIG9wdGlvbnM9e3BhZ2luYXRpb25PcHRpb25zfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvVmlldz5cbiAgICAgIDwvVmlldz5cbiAgICApXG4gIH1cblxuICBjbGFzc05hbWUoKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IFtcImFwaS1tYWtlci0tdGFibGVcIl1cblxuICAgIGlmICh0aGlzLnByb3BzLmNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKHRoaXMucHJvcHMuY2xhc3NOYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBjbGFzc05hbWVzLmpvaW4oXCIgXCIpXG4gIH1cblxuICBjb2x1bW5Qcm9wcyhjb2x1bW4pIHtcbiAgICBjb25zdCBwcm9wcyA9IHt9XG5cbiAgICBpZiAoY29sdW1uLnRleHRDZW50ZXIpIHtcbiAgICAgIHByb3BzLnN0eWxlIHx8PSB7fVxuICAgICAgcHJvcHMuc3R5bGUudGV4dEFsaWduID0gXCJjZW50ZXJcIlxuICAgIH1cblxuICAgIGlmIChjb2x1bW4udGV4dFJpZ2h0KSB7XG4gICAgICBwcm9wcy5zdHlsZSB8fD0ge31cbiAgICAgIHByb3BzLnN0eWxlLnRleHRBbGlnbiA9IFwicmlnaHRcIlxuICAgIH1cblxuICAgIHJldHVybiBwcm9wc1xuICB9XG5cbiAgaGVhZGVyUHJvcHMoY29sdW1uKSB7XG4gICAgY29uc3QgcHJvcHMgPSB7fVxuXG4gICAgaWYgKGNvbHVtbi50ZXh0Q2VudGVyKSB7XG4gICAgICBwcm9wcy5zdHlsZSB8fD0ge31cbiAgICAgIHByb3BzLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJjZW50ZXJcIlxuICAgIH1cblxuICAgIGlmIChjb2x1bW4udGV4dFJpZ2h0KSB7XG4gICAgICBwcm9wcy5zdHlsZSB8fD0ge31cbiAgICAgIHByb3BzLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJlbmRcIlxuICAgIH1cblxuICAgIHJldHVybiBwcm9wc1xuICB9XG5cbiAgY29sdW1uV2lkdGhzKCkge1xuICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLnMucHJlcGFyZWRDb2x1bW5zKSB7XG4gICAgICBjb2x1bW5XaWR0aHNbY29sdW1uLnRhYmxlU2V0dGluZ0NvbHVtbi5pZGVudGlmaWVyKCldID0gY29sdW1uLndpZHRoXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbldpZHRoc1xuICB9XG5cbiAgaGVhZGVyc0NvbnRlbnRGcm9tQ29sdW1ucyA9ICgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPERyYWdnYWJsZVNvcnRcbiAgICAgICAgZGF0YT17dGhpcy5zLmNvbHVtbnNUb1Nob3d9XG4gICAgICAgIGV2ZW50cz17dGhpcy50dC5kcmFnZ2FibGVTb3J0RXZlbnRzfVxuICAgICAgICBob3Jpem9udGFsXG4gICAgICAgIGtleUV4dHJhY3Rvcj17dGhpcy50dC5kcmFnTGlzdGtleUV4dHJhY3Rvcn1cbiAgICAgICAgb25JdGVtTW92ZWQ9e3RoaXMudHQub25JdGVtTW92ZWR9XG4gICAgICAgIG9uUmVvcmRlcmVkPXt0aGlzLnR0Lm9uUmVvcmRlcmVkfVxuICAgICAgICByZW5kZXJJdGVtPXt0aGlzLnR0LmRyYWdMaXN0UmVuZGVySXRlbUNvbnRlbnR9XG4gICAgICAvPlxuICAgIClcbiAgfVxuXG4gIGRyYWdMaXN0Q2FjaGVLZXlFeHRyYWN0b3IgPSAoaXRlbSkgPT4gYCR7aXRlbS50YWJsZVNldHRpbmdDb2x1bW4uaWRlbnRpZmllcigpfS0ke3RoaXMucy5yZXNpemluZ31gXG4gIGRyYWdMaXN0a2V5RXh0cmFjdG9yID0gKGl0ZW0pID0+IGl0ZW0udGFibGVTZXR0aW5nQ29sdW1uLmlkZW50aWZpZXIoKVxuXG4gIG9uSXRlbU1vdmVkID0gKHthbmltYXRpb25BcmdzLCBpdGVtSW5kZXgsIHgsIHl9KSA9PiB7XG4gICAgY29uc3QgYW5pbWF0ZWRQb3NpdGlvbiA9IGRpZ2codGhpcywgXCJzXCIsIFwiY29sdW1uc1RvU2hvd1wiLCBpdGVtSW5kZXgsIFwiYW5pbWF0ZWRQb3NpdGlvblwiKVxuXG4gICAgaWYgKGFuaW1hdGlvbkFyZ3MpIHtcbiAgICAgIEFuaW1hdGVkLnRpbWluZyhhbmltYXRlZFBvc2l0aW9uLCBhbmltYXRpb25BcmdzKS5zdGFydCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFuaW1hdGVkUG9zaXRpb24uc2V0VmFsdWUoe3gsIHl9KVxuICAgIH1cbiAgfVxuXG4gIG9uUmVvcmRlcmVkID0gYXN5bmMgKHtmcm9tSXRlbSwgZnJvbVBvc2l0aW9uLCB0b0l0ZW0sIHRvUG9zaXRpb259KSA9PiB7XG4gICAgaWYgKGZyb21Qb3NpdGlvbiA9PSB0b1Bvc2l0aW9uKSByZXR1cm4gLy8gT25seSBkbyByZXF1ZXN0cyBhbmQgcXVlcmllcyBpZiBjaGFuZ2VkXG5cbiAgICBjb25zdCBUYWJsZVNldHRpbmdDb2x1bW4gPSBmcm9tSXRlbS50YWJsZVNldHRpbmdDb2x1bW4uY29uc3RydWN0b3JcbiAgICBjb25zdCB0b0NvbHVtbiA9IGF3YWl0IFRhYmxlU2V0dGluZ0NvbHVtbi5maW5kKHRvSXRlbS50YWJsZVNldHRpbmdDb2x1bW4uaWQoKSkgLy8gTmVlZCB0byBsb2FkIGxhdGVzdCBwb3NpdGlvbiBiZWNhdXNlIEFjdHNBc0xpc3QgbWlnaHQgaGF2ZSBjaGFuZ2VkIGl0XG5cbiAgICBhd2FpdCBmcm9tSXRlbS50YWJsZVNldHRpbmdDb2x1bW4udXBkYXRlKHtwb3NpdGlvbjogdG9Db2x1bW4ucG9zaXRpb24oKX0pXG4gIH1cblxuICBkcmFnTGlzdFJlbmRlckl0ZW1Db250ZW50ID0gKHtpc0FjdGl2ZSwgaXRlbSwgdG91Y2hQcm9wc30pID0+IHtcbiAgICBjb25zdCB7YW5pbWF0ZWRXaWR0aCwgYW5pbWF0ZWRaSW5kZXgsIGNvbHVtbiwgdGFibGVTZXR0aW5nQ29sdW1ufSA9IGl0ZW1cblxuICAgIHJldHVybiAoXG4gICAgICA8SGVhZGVyQ29sdW1uXG4gICAgICAgIGFjdGl2ZT17aXNBY3RpdmV9XG4gICAgICAgIGFuaW1hdGVkV2lkdGg9e2FuaW1hdGVkV2lkdGh9XG4gICAgICAgIGFuaW1hdGVkWkluZGV4PXthbmltYXRlZFpJbmRleH1cbiAgICAgICAgY29sdW1uPXtjb2x1bW59XG4gICAgICAgIGtleT17dGFibGVTZXR0aW5nQ29sdW1uLmlkZW50aWZpZXIoKX1cbiAgICAgICAgcmVzaXppbmc9e3RoaXMucy5yZXNpemluZ31cbiAgICAgICAgdGFibGU9e3RoaXN9XG4gICAgICAgIHRhYmxlU2V0dGluZ0NvbHVtbj17dGFibGVTZXR0aW5nQ29sdW1ufVxuICAgICAgICB0b3VjaFByb3BzPXt0b3VjaFByb3BzfVxuICAgICAgICB3aWR0aHM9e3RoaXMucy53aWR0aHN9XG4gICAgICAvPlxuICAgIClcbiAgfVxuXG4gIGhlYWRlckNsYXNzTmFtZUZvckNvbHVtbihjb2x1bW4pIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gW11cblxuICAgIGlmIChjb2x1bW4uY29tbW9uUHJvcHMgJiYgY29sdW1uLmNvbW1vblByb3BzLmNsYXNzTmFtZSkgY2xhc3NOYW1lcy5wdXNoKGNvbHVtbi5jb21tb25Qcm9wcy5jbGFzc05hbWUpXG4gICAgaWYgKGNvbHVtbi5oZWFkZXJQcm9wcyAmJiBjb2x1bW4uaGVhZGVyUHJvcHMuY2xhc3NOYW1lKSBjbGFzc05hbWVzLnB1c2goY29sdW1uLmhlYWRlclByb3BzLmNsYXNzTmFtZSlcblxuICAgIHJldHVybiBjbGFzc05hbWVzXG4gIH1cblxuICBoZWFkZXJMYWJlbEZvckNvbHVtbihjb2x1bW4pIHtcbiAgICBjb25zdCB7bW9kZWxDbGFzc30gPSB0aGlzLnBcblxuICAgIGlmIChcImxhYmVsXCIgaW4gY29sdW1uKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbi5sYWJlbCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5sYWJlbCgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29sdW1uLmxhYmVsXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuXG4gICAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgbW9kZWwgY2xhc3MgdGhyb3VnaCBwYXRoXG4gICAgaWYgKGNvbHVtbi5wYXRoKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhdGhQYXJ0IG9mIGNvbHVtbi5wYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKGN1cnJlbnRNb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmVsYXRpb25zaGlwc1wiKVxuICAgICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBzLmZpbmQoKHJlbGF0aW9uc2hpcEluQXJyYXkpID0+IHJlbGF0aW9uc2hpcEluQXJyYXkubmFtZSA9PSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGF0aFBhcnQpKVxuXG4gICAgICAgIGN1cnJlbnRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1JlcXVpcmUoZGlnZyhyZWxhdGlvbnNoaXAsIFwicmVzb3VyY2VfbmFtZVwiKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29sdW1uLmF0dHJpYnV0ZSkgcmV0dXJuIGN1cnJlbnRNb2RlbENsYXNzLmh1bWFuQXR0cmlidXRlTmFtZShjb2x1bW4uYXR0cmlidXRlKVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gJ2xhYmVsJyBvciAnYXR0cmlidXRlJyB3YXMgZ2l2ZW5cIilcbiAgfVxuXG4gIG9uRmlsdGVyRm9ybVN1Ym1pdCA9ICgpID0+IHRoaXMuc3VibWl0RmlsdGVyKClcbiAgb25SZXF1ZXN0Q2xvc2VTZXR0aW5ncyA9ICgpID0+IHRoaXMuc2V0U3RhdGUoe3Nob3dTZXR0aW5nczogZmFsc2V9KVxuXG4gIG9uU2V0dGluZ3NDbGlja2VkID0gKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcblxuICAgIHRoaXMuc2V0U3RhdGUoe3Nob3dTZXR0aW5nczogIXRoaXMucy5zaG93U2V0dGluZ3N9KVxuICB9XG5cbiAgc3VibWl0RmlsdGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IGZpbHRlckZvcm0gPSBkaWdnKHRoaXMudHQuZmlsdGVyRm9ybVJlZiwgXCJjdXJyZW50XCIpXG4gICAgY29uc3Qge2FwcEhpc3Rvcnl9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHFQYXJhbXMgPSBQYXJhbXMuc2VyaWFsaXplRm9ybShmaWx0ZXJGb3JtKVxuICAgIGNvbnN0IHtxdWVyeVFOYW1lfSA9IHRoaXMuc1xuICAgIGNvbnN0IGNoYW5nZVBhcmFtc1BhcmFtcyA9IHt9XG5cbiAgICBjaGFuZ2VQYXJhbXNQYXJhbXNbcXVlcnlRTmFtZV0gPSBKU09OLnN0cmluZ2lmeShxUGFyYW1zKVxuXG4gICAgUGFyYW1zLmNoYW5nZVBhcmFtcyhjaGFuZ2VQYXJhbXNQYXJhbXMsIHthcHBIaXN0b3J5fSlcbiAgfVxuXG4gIHN1Ym1pdEZpbHRlckRlYm91bmNlID0gZGVib3VuY2UodGhpcy50dC5zdWJtaXRGaWx0ZXIpXG59KSlcbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVFBLElBQUksRUFBRUMsSUFBSSxRQUFPLFdBQVc7QUFDcEMsT0FBT0MsS0FBSyxJQUFHQyxhQUFhLEVBQUVDLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLFFBQU8sT0FBTztBQUN2RSxTQUFRQyxRQUFRLEVBQUVDLFNBQVMsRUFBRUMsSUFBSSxRQUFPLGNBQWM7QUFDdEQsT0FBT0MsYUFBYSxNQUFNLG1CQUFtQjtBQUM3QyxPQUFPQyxJQUFJLE1BQU0sbUJBQW1CO0FBQ3BDLE9BQU9DLFVBQVUsTUFBTSxZQUFZO0FBQ25DLE9BQU9DLFVBQVUsTUFBTSxlQUFlO0FBQ3RDLE9BQU9DLGFBQWEsTUFBTSxrQkFBa0I7QUFDNUMsT0FBT0MsUUFBUSxNQUFNLFVBQVU7QUFDL0IsT0FBT0MsYUFBYSxNQUFNLHlCQUF5QjtBQUNuRCxPQUFPQyxZQUFZLE1BQU0sUUFBUTtBQUNqQyxPQUFPQyxPQUFPLE1BQU0sV0FBVztBQUMvQixPQUFPQyxRQUFRLE1BQU0sd0JBQXdCO0FBQzdDLE9BQU9DLGVBQWUsTUFBTSx1Q0FBdUM7QUFDbkUsU0FBUUMsSUFBSSxRQUFPLFNBQVM7QUFDNUIsT0FBT0MsTUFBTSxNQUFNLHFCQUFxQjtBQUN4QyxPQUFPQyxZQUFZLE1BQU0saUJBQWlCO0FBQzFDLE9BQU9DLFlBQVksTUFBTSxpQkFBaUI7QUFDMUMsT0FBTyxLQUFLQyxVQUFVLE1BQU0sWUFBWTtBQUN4QyxPQUFPQyxJQUFJLE1BQU0sNEJBQTRCO0FBQzdDLE9BQU9DLGlCQUFpQixNQUFNLHdCQUF3QjtBQUN0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
|