@airtable/blocks 1.9.0 → 1.10.0-experimental-48096ae-20211116
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/CHANGELOG.md +10 -1
- package/dist/cjs/color_utils.js +2 -1
- package/dist/cjs/colors.js +2 -1
- package/dist/cjs/error_utils.js +19 -1
- package/dist/cjs/event_tracker.js +2 -1
- package/dist/cjs/global_config.js +2 -1
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/injected/airtable_interface.js +2 -1
- package/dist/cjs/models/abstract_model.js +2 -1
- package/dist/cjs/models/abstract_model_with_async_data.js +2 -1
- package/dist/cjs/models/base.js +4 -2
- package/dist/cjs/models/create_aggregators.js +2 -1
- package/dist/cjs/models/cursor.js +4 -1
- package/dist/cjs/models/field.js +5 -14
- package/dist/cjs/models/grouped_record_query_result.js +7 -15
- package/dist/cjs/models/linked_records_query_result.js +77 -28
- package/dist/cjs/models/models.js +2 -1
- package/dist/cjs/models/mutation_constants.js +2 -1
- package/dist/cjs/models/mutations.js +20 -163
- package/dist/cjs/models/object_pool.js +2 -1
- package/dist/cjs/models/query_manager.js +328 -0
- package/dist/cjs/models/record.js +310 -56
- package/dist/cjs/models/record_coloring.js +2 -1
- package/dist/cjs/models/record_query_result.js +6 -2
- package/dist/cjs/models/record_store.js +556 -766
- package/dist/cjs/models/session.js +2 -1
- package/dist/cjs/models/table.js +10 -8
- package/dist/cjs/models/table_or_view_query_result.js +482 -415
- package/dist/cjs/models/view.js +2 -1
- package/dist/cjs/models/view_data_store.js +245 -296
- package/dist/cjs/models/view_metadata_query_result.js +2 -1
- package/dist/cjs/perform_record_action.js +2 -1
- package/dist/cjs/private_utils.js +42 -1
- package/dist/cjs/sdk.js +13 -2
- package/dist/cjs/settings_button.js +2 -1
- package/dist/cjs/stats/block_stats.js +2 -1
- package/dist/cjs/testing/abstract_mock_airtable_interface.js +57 -11
- package/dist/cjs/types/aggregators.js +2 -1
- package/dist/cjs/types/airtable_interface.js +2 -1
- package/dist/cjs/types/attachment.js +2 -1
- package/dist/cjs/types/backend_fetch_types.js +2 -1
- package/dist/cjs/types/base.js +2 -1
- package/dist/cjs/types/block.js +2 -1
- package/dist/cjs/types/block_query_spec.js +86 -0
- package/dist/cjs/types/collaborator.js +2 -1
- package/dist/cjs/types/cursor.js +2 -1
- package/dist/cjs/types/field.js +2 -1
- package/dist/cjs/types/global_config.js +2 -1
- package/dist/cjs/types/mutations.js +2 -1
- package/dist/cjs/types/permission_levels.js +2 -1
- package/dist/cjs/types/record.js +2 -1
- package/dist/cjs/types/record_action_data.js +2 -1
- package/dist/cjs/types/stat.js +2 -1
- package/dist/cjs/types/table.js +2 -1
- package/dist/cjs/types/undo_redo.js +2 -1
- package/dist/cjs/types/view.js +2 -1
- package/dist/cjs/types/viewport.js +2 -1
- package/dist/cjs/ui/base_provider.js +2 -1
- package/dist/cjs/ui/baymax_utils.js +2 -1
- package/dist/cjs/ui/block_wrapper.js +2 -1
- package/dist/cjs/ui/box.js +2 -1
- package/dist/cjs/ui/button.js +2 -1
- package/dist/cjs/ui/cell_renderer.js +2 -1
- package/dist/cjs/ui/choice_token.js +2 -1
- package/dist/cjs/ui/collaborator_token.js +2 -1
- package/dist/cjs/ui/color_palette.js +2 -1
- package/dist/cjs/ui/color_palette_synced.js +2 -1
- package/dist/cjs/ui/confirmation_dialog.js +2 -1
- package/dist/cjs/ui/control_sizes.js +2 -1
- package/dist/cjs/ui/create_detect_element_resize.js +2 -1
- package/dist/cjs/ui/css_helpers.js +2 -1
- package/dist/cjs/ui/dialog.js +2 -1
- package/dist/cjs/ui/dialog_close_button.js +2 -1
- package/dist/cjs/ui/expand_record.js +2 -1
- package/dist/cjs/ui/expand_record_list.js +2 -1
- package/dist/cjs/ui/expand_record_picker_async.js +2 -1
- package/dist/cjs/ui/field_icon.js +2 -1
- package/dist/cjs/ui/field_picker.js +2 -1
- package/dist/cjs/ui/field_picker_synced.js +2 -1
- package/dist/cjs/ui/form_field.js +2 -1
- package/dist/cjs/ui/geometry/geometry.js +2 -1
- package/dist/cjs/ui/geometry/point.js +2 -1
- package/dist/cjs/ui/geometry/rect.js +2 -1
- package/dist/cjs/ui/geometry/size.js +2 -1
- package/dist/cjs/ui/global_alert.js +2 -1
- package/dist/cjs/ui/global_config_synced_component_helpers.js +2 -1
- package/dist/cjs/ui/heading.js +2 -1
- package/dist/cjs/ui/icon.js +2 -1
- package/dist/cjs/ui/icon_config.js +6 -3
- package/dist/cjs/ui/initialize_block.js +2 -1
- package/dist/cjs/ui/input.js +2 -1
- package/dist/cjs/ui/input_synced.js +2 -1
- package/dist/cjs/ui/key_codes.js +2 -1
- package/dist/cjs/ui/label.js +2 -1
- package/dist/cjs/ui/link.js +2 -1
- package/dist/cjs/ui/loader.js +2 -1
- package/dist/cjs/ui/modal.js +2 -1
- package/dist/cjs/ui/model_picker_select.js +2 -1
- package/dist/cjs/ui/popover.js +2 -1
- package/dist/cjs/ui/progress_bar.js +2 -1
- package/dist/cjs/ui/record_card.js +2 -1
- package/dist/cjs/ui/record_card_list.js +2 -1
- package/dist/cjs/ui/remote_utils.js +2 -1
- package/dist/cjs/ui/sdk_context.js +2 -1
- package/dist/cjs/ui/select.js +2 -1
- package/dist/cjs/ui/select_and_select_buttons_helpers.js +2 -1
- package/dist/cjs/ui/select_buttons.js +2 -1
- package/dist/cjs/ui/select_buttons_synced.js +2 -1
- package/dist/cjs/ui/select_synced.js +2 -1
- package/dist/cjs/ui/switch.js +2 -1
- package/dist/cjs/ui/switch_synced.js +2 -1
- package/dist/cjs/ui/synced.js +2 -1
- package/dist/cjs/ui/system/all_styles_set.js +2 -1
- package/dist/cjs/ui/system/appearance/appearance_set.js +2 -1
- package/dist/cjs/ui/system/appearance/background_color.js +2 -1
- package/dist/cjs/ui/system/appearance/border.js +2 -1
- package/dist/cjs/ui/system/appearance/border_radius.js +2 -1
- package/dist/cjs/ui/system/appearance/box_shadow.js +2 -1
- package/dist/cjs/ui/system/appearance/opacity.js +2 -1
- package/dist/cjs/ui/system/dimensions/dimensions_set.js +2 -1
- package/dist/cjs/ui/system/dimensions/height.js +2 -1
- package/dist/cjs/ui/system/dimensions/max_height.js +2 -1
- package/dist/cjs/ui/system/dimensions/max_width.js +2 -1
- package/dist/cjs/ui/system/dimensions/min_height.js +2 -1
- package/dist/cjs/ui/system/dimensions/min_width.js +2 -1
- package/dist/cjs/ui/system/dimensions/width.js +2 -1
- package/dist/cjs/ui/system/display.js +2 -1
- package/dist/cjs/ui/system/flex_container/align_content.js +2 -1
- package/dist/cjs/ui/system/flex_container/align_items.js +2 -1
- package/dist/cjs/ui/system/flex_container/flex_container_set.js +2 -1
- package/dist/cjs/ui/system/flex_container/flex_direction.js +2 -1
- package/dist/cjs/ui/system/flex_container/flex_wrap.js +2 -1
- package/dist/cjs/ui/system/flex_container/justify_content.js +2 -1
- package/dist/cjs/ui/system/flex_container/justify_items.js +2 -1
- package/dist/cjs/ui/system/flex_item/align_self.js +2 -1
- package/dist/cjs/ui/system/flex_item/flex.js +2 -1
- package/dist/cjs/ui/system/flex_item/flex_basis.js +2 -1
- package/dist/cjs/ui/system/flex_item/flex_grow.js +2 -1
- package/dist/cjs/ui/system/flex_item/flex_item_set.js +2 -1
- package/dist/cjs/ui/system/flex_item/flex_shrink.js +2 -1
- package/dist/cjs/ui/system/flex_item/justify_self.js +2 -1
- package/dist/cjs/ui/system/flex_item/order.js +2 -1
- package/dist/cjs/ui/system/index.js +2 -1
- package/dist/cjs/ui/system/overflow.js +2 -1
- package/dist/cjs/ui/system/position/bottom.js +2 -1
- package/dist/cjs/ui/system/position/left.js +2 -1
- package/dist/cjs/ui/system/position/position.js +2 -1
- package/dist/cjs/ui/system/position/position_set.js +2 -1
- package/dist/cjs/ui/system/position/right.js +2 -1
- package/dist/cjs/ui/system/position/top.js +2 -1
- package/dist/cjs/ui/system/position/z_index.js +2 -1
- package/dist/cjs/ui/system/spacing/margin.js +2 -1
- package/dist/cjs/ui/system/spacing/padding.js +2 -1
- package/dist/cjs/ui/system/spacing/spacing_set.js +2 -1
- package/dist/cjs/ui/system/typography/font_family.js +2 -1
- package/dist/cjs/ui/system/typography/font_size.js +2 -1
- package/dist/cjs/ui/system/typography/font_style.js +2 -1
- package/dist/cjs/ui/system/typography/font_weight.js +2 -1
- package/dist/cjs/ui/system/typography/letter_spacing.js +2 -1
- package/dist/cjs/ui/system/typography/line_height.js +2 -1
- package/dist/cjs/ui/system/typography/text_align.js +2 -1
- package/dist/cjs/ui/system/typography/text_color.js +2 -1
- package/dist/cjs/ui/system/typography/text_decoration.js +2 -1
- package/dist/cjs/ui/system/typography/text_transform.js +2 -1
- package/dist/cjs/ui/system/typography/typography_set.js +2 -1
- package/dist/cjs/ui/system/utils/create_responsive_prop_type.js +2 -1
- package/dist/cjs/ui/system/utils/create_style_prop_types.js +2 -1
- package/dist/cjs/ui/system/utils/csstype.js +2 -1
- package/dist/cjs/ui/system/utils/ensure_numbers_are_within_scale.js +2 -1
- package/dist/cjs/ui/system/utils/get_style_props_for_responsive_prop.js +2 -1
- package/dist/cjs/ui/system/utils/types.js +2 -1
- package/dist/cjs/ui/table_picker.js +2 -1
- package/dist/cjs/ui/table_picker_synced.js +2 -1
- package/dist/cjs/ui/text.js +2 -1
- package/dist/cjs/ui/text_button.js +2 -1
- package/dist/cjs/ui/theme/default_theme/button_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/control_sizes.js +2 -1
- package/dist/cjs/ui/theme/default_theme/heading_styles.js +2 -1
- package/dist/cjs/ui/theme/default_theme/index.js +2 -1
- package/dist/cjs/ui/theme/default_theme/input_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/link_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/select_buttons_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/select_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/switch_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/text_button_variants.js +2 -1
- package/dist/cjs/ui/theme/default_theme/text_styles.js +2 -1
- package/dist/cjs/ui/theme/default_theme/tokens.js +2 -1
- package/dist/cjs/ui/theme/theme_context.js +2 -1
- package/dist/cjs/ui/theme/use_theme.js +2 -1
- package/dist/cjs/ui/tooltip.js +2 -1
- package/dist/cjs/ui/types/aria_props.js +2 -1
- package/dist/cjs/ui/types/data_attributes_prop.js +2 -1
- package/dist/cjs/ui/types/tooltip_anchor_props.js +2 -1
- package/dist/cjs/ui/ui.js +2 -1
- package/dist/cjs/ui/unstable_standalone_ui.js +2 -1
- package/dist/cjs/ui/use_array_identity.js +2 -1
- package/dist/cjs/ui/use_base.js +2 -1
- package/dist/cjs/ui/use_cursor.js +2 -1
- package/dist/cjs/ui/use_form_field.js +2 -1
- package/dist/cjs/ui/use_global_config.js +3 -2
- package/dist/cjs/ui/use_loadable.js +2 -1
- package/dist/cjs/ui/use_record_action_data.js +2 -1
- package/dist/cjs/ui/use_records.js +7 -2
- package/dist/cjs/ui/use_session.js +2 -1
- package/dist/cjs/ui/use_settings_button.js +2 -1
- package/dist/cjs/ui/use_styled_system.js +2 -1
- package/dist/cjs/ui/use_synced.js +2 -1
- package/dist/cjs/ui/use_text_color_for_background_color.js +2 -1
- package/dist/cjs/ui/use_view_metadata.js +2 -1
- package/dist/cjs/ui/use_viewport.js +2 -1
- package/dist/cjs/ui/use_watchable.js +2 -1
- package/dist/cjs/ui/view_picker.js +2 -1
- package/dist/cjs/ui/view_picker_synced.js +2 -1
- package/dist/cjs/ui/viewport_constraint.js +2 -1
- package/dist/cjs/ui/with_hooks.js +2 -1
- package/dist/cjs/ui/with_styled_system.js +2 -1
- package/dist/cjs/undo_redo.js +2 -1
- package/dist/cjs/unstable_private_utils.js +2 -1
- package/dist/cjs/unstable_testing_utils.js +2 -1
- package/dist/cjs/viewport.js +2 -1
- package/dist/cjs/warning.js +2 -1
- package/dist/cjs/watchable.js +17 -2
- package/dist/types/src/models/base.d.ts +2 -1
- package/dist/types/src/models/base.d.ts.map +1 -1
- package/dist/types/src/models/cursor.d.ts +2 -0
- package/dist/types/src/models/cursor.d.ts.map +1 -1
- package/dist/types/src/models/field.d.ts +3 -13
- package/dist/types/src/models/field.d.ts.map +1 -1
- package/dist/types/src/models/grouped_record_query_result.d.ts +3 -3
- package/dist/types/src/models/grouped_record_query_result.d.ts.map +1 -1
- package/dist/types/src/models/linked_records_query_result.d.ts.map +1 -1
- package/dist/types/src/models/mutations.d.ts.map +1 -1
- package/dist/types/src/models/query_manager.d.ts +2 -0
- package/dist/types/src/models/query_manager.d.ts.map +1 -0
- package/dist/types/src/models/record.d.ts +12 -3
- package/dist/types/src/models/record.d.ts.map +1 -1
- package/dist/types/src/models/record_query_result.d.ts +3 -2
- package/dist/types/src/models/record_query_result.d.ts.map +1 -1
- package/dist/types/src/models/record_store.d.ts.map +1 -1
- package/dist/types/src/models/table.d.ts +2 -1
- package/dist/types/src/models/table.d.ts.map +1 -1
- package/dist/types/src/models/table_or_view_query_result.d.ts +3 -5
- package/dist/types/src/models/table_or_view_query_result.d.ts.map +1 -1
- package/dist/types/src/models/view_data_store.d.ts +0 -1
- package/dist/types/src/models/view_data_store.d.ts.map +1 -1
- package/dist/types/src/models/view_metadata_query_result.d.ts +1 -1
- package/dist/types/src/models/view_metadata_query_result.d.ts.map +1 -1
- package/dist/types/src/private_utils.d.ts +24 -1
- package/dist/types/src/private_utils.d.ts.map +1 -1
- package/dist/types/src/sdk.d.ts.map +1 -1
- package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts +11 -11
- package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -1
- package/dist/types/src/types/airtable_interface.d.ts +48 -20
- package/dist/types/src/types/airtable_interface.d.ts.map +1 -1
- package/dist/types/src/types/block_query_spec.d.ts +139 -0
- package/dist/types/src/types/block_query_spec.d.ts.map +1 -0
- package/dist/types/src/types/field.d.ts +7 -1
- package/dist/types/src/types/field.d.ts.map +1 -1
- package/dist/types/src/types/table.d.ts +0 -2
- package/dist/types/src/types/table.d.ts.map +1 -1
- package/dist/types/src/types/view.d.ts +3 -8
- package/dist/types/src/types/view.d.ts.map +1 -1
- package/dist/types/src/ui/cell_renderer.d.ts +1 -1
- package/dist/types/src/ui/color_palette.d.ts +1 -1
- package/dist/types/src/ui/control_sizes.d.ts +1 -1
- package/dist/types/src/ui/field_icon.d.ts +1 -1
- package/dist/types/src/ui/heading.d.ts +1 -1
- package/dist/types/src/ui/icon.d.ts +1 -1
- package/dist/types/src/ui/icon_config.d.ts +33 -31
- package/dist/types/src/ui/icon_config.d.ts.map +1 -1
- package/dist/types/src/ui/input.d.ts +10 -10
- package/dist/types/src/ui/link.d.ts +1 -1
- package/dist/types/src/ui/link.d.ts.map +1 -1
- package/dist/types/src/ui/record_card.d.ts +1 -1
- package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts +1 -1
- package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts.map +1 -1
- package/dist/types/src/ui/text.d.ts +1 -1
- package/dist/types/src/ui/theme/default_theme/index.d.ts +1 -1
- package/dist/types/src/ui/theme/theme_context.d.ts +1 -1
- package/dist/types/src/ui/theme/use_theme.d.ts +1 -1
- package/dist/types/src/ui/use_global_config.d.ts +1 -1
- package/dist/types/src/watchable.d.ts.map +1 -1
- package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts +7 -5
- package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +1 -1
- package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts +18 -11
- package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -1
- package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts +51 -0
- package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts.map +1 -0
- package/dist/types/test/test_helpers.d.ts +2 -0
- package/dist/types/test/test_helpers.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -6,18 +6,12 @@ require("core-js/modules/es.symbol");
|
|
|
6
6
|
|
|
7
7
|
require("core-js/modules/es.symbol.description");
|
|
8
8
|
|
|
9
|
-
require("core-js/modules/es.array.filter");
|
|
10
|
-
|
|
11
|
-
require("core-js/modules/es.array.flat-map");
|
|
12
|
-
|
|
13
9
|
require("core-js/modules/es.array.includes");
|
|
14
10
|
|
|
15
11
|
require("core-js/modules/es.array.iterator");
|
|
16
12
|
|
|
17
13
|
require("core-js/modules/es.array.map");
|
|
18
14
|
|
|
19
|
-
require("core-js/modules/es.array.unscopables.flat-map");
|
|
20
|
-
|
|
21
15
|
require("core-js/modules/es.object.to-string");
|
|
22
16
|
|
|
23
17
|
require("core-js/modules/es.promise");
|
|
@@ -28,15 +22,11 @@ require("core-js/modules/es.string.includes");
|
|
|
28
22
|
|
|
29
23
|
require("core-js/modules/web.dom-collections.iterator");
|
|
30
24
|
|
|
31
|
-
require("core-js/modules/web.url.to-json");
|
|
32
|
-
|
|
33
25
|
Object.defineProperty(exports, "__esModule", {
|
|
34
26
|
value: true
|
|
35
27
|
});
|
|
36
28
|
exports.default = void 0;
|
|
37
29
|
|
|
38
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
39
|
-
|
|
40
30
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
41
31
|
|
|
42
32
|
require("regenerator-runtime/runtime");
|
|
@@ -51,8 +41,6 @@ var _airtable_interface = require("../types/airtable_interface");
|
|
|
51
41
|
|
|
52
42
|
var _mutations = require("../types/mutations");
|
|
53
43
|
|
|
54
|
-
var _private_utils = require("../private_utils");
|
|
55
|
-
|
|
56
44
|
var _error_utils = require("../error_utils");
|
|
57
45
|
|
|
58
46
|
var _mutation_constants = require("./mutation_constants");
|
|
@@ -81,22 +69,18 @@ function () {
|
|
|
81
69
|
|
|
82
70
|
/** @internal */
|
|
83
71
|
|
|
84
|
-
/** @internal */
|
|
85
|
-
|
|
86
72
|
/** @hidden */
|
|
87
|
-
function Mutations(sdk, session, base,
|
|
73
|
+
function Mutations(sdk, session, base, applyGlobalConfigUpdates) {
|
|
88
74
|
(0, _classCallCheck2.default)(this, Mutations);
|
|
89
75
|
(0, _defineProperty2.default)(this, "_airtableInterface", void 0);
|
|
90
76
|
(0, _defineProperty2.default)(this, "_session", void 0);
|
|
91
77
|
(0, _defineProperty2.default)(this, "_sdk", void 0);
|
|
92
78
|
(0, _defineProperty2.default)(this, "_base", void 0);
|
|
93
|
-
(0, _defineProperty2.default)(this, "_applyModelChanges", void 0);
|
|
94
79
|
(0, _defineProperty2.default)(this, "_applyGlobalConfigUpdates", void 0);
|
|
95
80
|
this._airtableInterface = sdk.__airtableInterface;
|
|
96
81
|
this._session = session;
|
|
97
82
|
this._sdk = sdk;
|
|
98
83
|
this._base = base;
|
|
99
|
-
this._applyModelChanges = applyModelChanges;
|
|
100
84
|
this._applyGlobalConfigUpdates = applyGlobalConfigUpdates;
|
|
101
85
|
}
|
|
102
86
|
/** @hidden */
|
|
@@ -270,9 +254,12 @@ function () {
|
|
|
270
254
|
try {
|
|
271
255
|
for (var _iterator = records[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
272
256
|
var record = _step.value;
|
|
273
|
-
var existingRecord = null;
|
|
257
|
+
var existingRecord = null; // Note - if isSubscribedToAllRecordsInTable is true then we know the record
|
|
258
|
+
// doesn't exist (or is deleted) but otherwise we can issue a mutation to a record
|
|
259
|
+
// that does not exist, having to deal with the error thrown by PublicAirtableInterfaceFrontend
|
|
260
|
+
// TODO: (#proj-blocks-sdk-record-limits) Write tests around this behavior
|
|
274
261
|
|
|
275
|
-
if (recordStore.
|
|
262
|
+
if (recordStore.isSubscribedToAllRecordsInTable || recordStore.isRecordLoaded(record.id)) {
|
|
276
263
|
existingRecord = recordStore.getRecordByIdIfExists(record.id);
|
|
277
264
|
|
|
278
265
|
if (!existingRecord) {
|
|
@@ -294,7 +281,7 @@ function () {
|
|
|
294
281
|
checkedFieldIds.add(fieldId);
|
|
295
282
|
}
|
|
296
283
|
|
|
297
|
-
if (existingRecord && recordStore.
|
|
284
|
+
if (existingRecord && recordStore.isRecordCellValueLoadedForFieldId(record.id, fieldId)) {
|
|
298
285
|
var validationResult = this._airtableInterface.fieldTypeProvider.validateCellValueForUpdate(appInterface, record.cellValuesByFieldId[fieldId], existingRecord._getRawCellValue(field), field._data);
|
|
299
286
|
|
|
300
287
|
if (!validationResult.isValid) {
|
|
@@ -332,9 +319,15 @@ function () {
|
|
|
332
319
|
throw (0, _error_utils.spawnError)("Can't delete records: No table with id %s exists", _tableId);
|
|
333
320
|
}
|
|
334
321
|
|
|
335
|
-
var _recordStore = this._base.__getRecordStore(_tableId);
|
|
322
|
+
var _recordStore = this._base.__getRecordStore(_tableId); // TODO: (#proj-blocks-sdk-record-limits) We substantially weaken our check here
|
|
323
|
+
// because we can only be sure if the record exists inside the SDK if we've loaded
|
|
324
|
+
// all records. It is possible to change this logic to ensure we don't double-delete
|
|
325
|
+
// records by caching previously deleted records (if the delete is undone, but
|
|
326
|
+
// we're not watching the record be re-created from the undo we would have to fail
|
|
327
|
+
// the delete if we detect double deletion). TODO to add tests around this behavior.
|
|
328
|
+
|
|
336
329
|
|
|
337
|
-
if (_recordStore.
|
|
330
|
+
if (_recordStore.isSubscribedToAllRecordsInTable) {
|
|
338
331
|
var _iteratorNormalCompletion2 = true;
|
|
339
332
|
var _didIteratorError2 = false;
|
|
340
333
|
var _iteratorError2 = undefined;
|
|
@@ -672,153 +665,17 @@ function () {
|
|
|
672
665
|
this._applyGlobalConfigUpdates(mutation.updates);
|
|
673
666
|
|
|
674
667
|
return true;
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
|
|
668
|
+
} // https://airtable.com/appahuJQw7qfQTBBU/tblSbpimM8Spp9txp/viweAFIus3MhU9Gxa/recHOckY4V9QmM6JV?blocks=hide
|
|
669
|
+
// TODO: (#proj-blocks-sdk-record-limits) Fix this in a future stacked diff where optimistic
|
|
670
|
+
// updates are re-enabled https://docs.google.com/document/d/1CVZ4ZoPWEtpzKq_9cRLASGwgY71WI4nl6RVvs8S7Ubw/edit#
|
|
678
671
|
|
|
679
|
-
if (modelChanges.length > 0) {
|
|
680
|
-
this._applyModelChanges(modelChanges);
|
|
681
|
-
|
|
682
|
-
return true;
|
|
683
|
-
}
|
|
684
672
|
|
|
685
673
|
return false;
|
|
686
674
|
}
|
|
687
|
-
/** @internal */
|
|
688
|
-
|
|
689
|
-
}, {
|
|
690
|
-
key: "_getOptimisticModelChangesForMutation",
|
|
691
|
-
value: function _getOptimisticModelChangesForMutation(mutation) {
|
|
692
|
-
switch (mutation.type) {
|
|
693
|
-
case _mutations.MutationTypes.SET_MULTIPLE_RECORDS_CELL_VALUES:
|
|
694
|
-
{
|
|
695
|
-
var tableId = mutation.tableId,
|
|
696
|
-
records = mutation.records;
|
|
697
|
-
|
|
698
|
-
var recordStore = this._base.__getRecordStore(tableId);
|
|
699
|
-
|
|
700
|
-
return records.flatMap(record => Object.keys(record.cellValuesByFieldId).filter(fieldId => recordStore.areCellValuesLoadedForFieldId(fieldId)).map(fieldId => ({
|
|
701
|
-
path: ['tablesById', tableId, 'recordsById', record.id, 'cellValuesByFieldId', fieldId],
|
|
702
|
-
value: record.cellValuesByFieldId[fieldId]
|
|
703
|
-
})));
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
case _mutations.MutationTypes.DELETE_MULTIPLE_RECORDS:
|
|
707
|
-
{
|
|
708
|
-
var _tableId7 = mutation.tableId,
|
|
709
|
-
recordIds = mutation.recordIds;
|
|
710
|
-
|
|
711
|
-
var _recordStore2 = this._base.__getRecordStore(_tableId7);
|
|
712
|
-
|
|
713
|
-
if (!_recordStore2.isRecordMetadataLoaded) {
|
|
714
|
-
return [];
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
return [...recordIds.map(recordId => ({
|
|
718
|
-
path: ['tablesById', _tableId7, 'recordsById', recordId],
|
|
719
|
-
value: undefined
|
|
720
|
-
})), ...this._base.getTableById(_tableId7).views.flatMap(view => {
|
|
721
|
-
var viewDataStore = _recordStore2.getViewDataStore(view.id);
|
|
722
|
-
|
|
723
|
-
if (!viewDataStore.isDataLoaded) {
|
|
724
|
-
return [];
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
return viewDataStore.__generateChangesForParentTableDeleteMultipleRecords(recordIds);
|
|
728
|
-
})];
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
case _mutations.MutationTypes.CREATE_MULTIPLE_RECORDS:
|
|
732
|
-
{
|
|
733
|
-
var _tableId8 = mutation.tableId,
|
|
734
|
-
_records2 = mutation.records;
|
|
735
|
-
|
|
736
|
-
var _recordStore3 = this._base.__getRecordStore(_tableId8);
|
|
737
|
-
|
|
738
|
-
if (!_recordStore3.isRecordMetadataLoaded) {
|
|
739
|
-
return [];
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
return [..._records2.map(record => {
|
|
743
|
-
// Only apply optimistic changes for fields that are loaded
|
|
744
|
-
var filteredCellValuesByFieldId = {};
|
|
745
|
-
var _iteratorNormalCompletion5 = true;
|
|
746
|
-
var _didIteratorError5 = false;
|
|
747
|
-
var _iteratorError5 = undefined;
|
|
748
|
-
|
|
749
|
-
try {
|
|
750
|
-
for (var _iterator5 = (0, _private_utils.entries)(record.cellValuesByFieldId)[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
|
|
751
|
-
var _step5$value = (0, _slicedToArray2.default)(_step5.value, 2),
|
|
752
|
-
fieldId = _step5$value[0],
|
|
753
|
-
cellValue = _step5$value[1];
|
|
754
|
-
|
|
755
|
-
if (_recordStore3.areCellValuesLoadedForFieldId(fieldId)) {
|
|
756
|
-
filteredCellValuesByFieldId[fieldId] = cellValue;
|
|
757
|
-
}
|
|
758
|
-
}
|
|
759
|
-
} catch (err) {
|
|
760
|
-
_didIteratorError5 = true;
|
|
761
|
-
_iteratorError5 = err;
|
|
762
|
-
} finally {
|
|
763
|
-
try {
|
|
764
|
-
if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
|
|
765
|
-
_iterator5.return();
|
|
766
|
-
}
|
|
767
|
-
} finally {
|
|
768
|
-
if (_didIteratorError5) {
|
|
769
|
-
throw _iteratorError5;
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
return {
|
|
775
|
-
path: ['tablesById', _tableId8, 'recordsById', record.id],
|
|
776
|
-
value: {
|
|
777
|
-
id: record.id,
|
|
778
|
-
cellValuesByFieldId: filteredCellValuesByFieldId,
|
|
779
|
-
commentCount: 0,
|
|
780
|
-
createdTime: new Date().toJSON()
|
|
781
|
-
}
|
|
782
|
-
};
|
|
783
|
-
}), ...this._base.getTableById(_tableId8).views.flatMap(view => {
|
|
784
|
-
var viewDataStore = _recordStore3.getViewDataStore(view.id);
|
|
785
|
-
|
|
786
|
-
if (!viewDataStore.isDataLoaded) {
|
|
787
|
-
return [];
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
return viewDataStore.__generateChangesForParentTableAddMultipleRecords(_records2.map(record => record.id));
|
|
791
|
-
})];
|
|
792
|
-
}
|
|
793
|
-
// The following branch is unreachable because this method's only
|
|
794
|
-
// call site is preceded by an explicit guard for this condition.
|
|
795
|
-
// istanbul ignore next
|
|
796
|
-
|
|
797
|
-
case _mutations.MutationTypes.SET_MULTIPLE_GLOBAL_CONFIG_PATHS:
|
|
798
|
-
{
|
|
799
|
-
throw (0, _error_utils.spawnError)('attempting to generate model updates for SET_MULTIPLE_GLOBAL_CONFIG_PATH');
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
case _mutations.MutationTypes.CREATE_SINGLE_FIELD:
|
|
803
|
-
case _mutations.MutationTypes.UPDATE_SINGLE_FIELD_CONFIG:
|
|
804
|
-
case _mutations.MutationTypes.UPDATE_SINGLE_FIELD_DESCRIPTION:
|
|
805
|
-
case _mutations.MutationTypes.UPDATE_VIEW_METADATA:
|
|
806
|
-
case _mutations.MutationTypes.CREATE_SINGLE_TABLE:
|
|
807
|
-
{
|
|
808
|
-
// No optimistic updates for field, view metadata, or table mutations.
|
|
809
|
-
return [];
|
|
810
|
-
}
|
|
811
|
-
// The following branch is unreachable because this method's only
|
|
812
|
-
// call site is preceded by an explicit guard for this condition.
|
|
813
|
-
// istanbul ignore next
|
|
814
|
-
|
|
815
|
-
default:
|
|
816
|
-
throw (0, _error_utils.spawnUnknownSwitchCaseError)('mutation type', mutation, 'type');
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
675
|
}]);
|
|
820
676
|
return Mutations;
|
|
821
677
|
}();
|
|
822
678
|
|
|
823
679
|
var _default = Mutations;
|
|
824
|
-
exports.default = _default;
|
|
680
|
+
exports.default = _default;
|
|
681
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvbXV0YXRpb25zLnRzIl0sIm5hbWVzIjpbIk1VVEFUSU9OU19NQVhfQkFUQ0hfU0laRSIsIk1VVEFUSU9OU19NQVhfQk9EWV9TSVpFIiwiTVVUQVRJT05fSE9MRF9GT1JfTVMiLCJNdXRhdGlvbnMiLCJzZGsiLCJzZXNzaW9uIiwiYmFzZSIsImFwcGx5R2xvYmFsQ29uZmlnVXBkYXRlcyIsIl9haXJ0YWJsZUludGVyZmFjZSIsIl9fYWlydGFibGVJbnRlcmZhY2UiLCJfc2Vzc2lvbiIsIl9zZGsiLCJfYmFzZSIsIl9hcHBseUdsb2JhbENvbmZpZ1VwZGF0ZXMiLCJtdXRhdGlvbiIsIl9hc3NlcnRNdXRhdGlvbklzVmFsaWQiLCJfYXNzZXJ0TXV0YXRpb25VbmRlckxpbWl0cyIsInBlcm1pc3Npb25DaGVjayIsImNoZWNrUGVybWlzc2lvbnNGb3JNdXRhdGlvbiIsImhhc1Blcm1pc3Npb24iLCJ0eXBlIiwicmVhc29uRGlzcGxheVN0cmluZyIsImRpZEFwcGx5T3B0aW1pc3RpY1VwZGF0ZXMiLCJfYXBwbHlPcHRpbWlzdGljVXBkYXRlc0Zvck11dGF0aW9uIiwiYXBwbHlNdXRhdGlvbkFzeW5jIiwiaG9sZEZvck1zIiwic2V0VGltZW91dCIsIlByb21pc2UiLCJfX2dldEJhc2VEYXRhIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsIl9kb2VzTXV0YXRpb25FeGNlZWRCYXRjaFNpemVMaW1pdCIsIk11dGF0aW9uVHlwZXMiLCJTRVRfTVVMVElQTEVfUkVDT1JEU19DRUxMX1ZBTFVFUyIsIkNSRUFURV9NVUxUSVBMRV9SRUNPUkRTIiwicmVjb3JkcyIsIkRFTEVURV9NVUxUSVBMRV9SRUNPUkRTIiwicmVjb3JkSWRzIiwiU0VUX01VTFRJUExFX0dMT0JBTF9DT05GSUdfUEFUSFMiLCJ1cGRhdGVzIiwiZmllbGQiLCJpc0NvbXB1dGVkIiwibmFtZSIsImFwcEludGVyZmFjZSIsIl9fYXBwSW50ZXJmYWNlIiwiYmlsbGluZ1BsYW5Hcm91cGluZyIsIl9fYmlsbGluZ1BsYW5Hcm91cGluZyIsInRhYmxlSWQiLCJ0YWJsZSIsImdldFRhYmxlQnlJZElmRXhpc3RzIiwicmVjb3JkU3RvcmUiLCJfX2dldFJlY29yZFN0b3JlIiwiY2hlY2tlZEZpZWxkSWRzIiwiU2V0IiwicmVjb3JkIiwiZXhpc3RpbmdSZWNvcmQiLCJpc1N1YnNjcmliZWRUb0FsbFJlY29yZHNJblRhYmxlIiwiaXNSZWNvcmRMb2FkZWQiLCJpZCIsImdldFJlY29yZEJ5SWRJZkV4aXN0cyIsIk9iamVjdCIsImtleXMiLCJjZWxsVmFsdWVzQnlGaWVsZElkIiwiZmllbGRJZCIsImdldEZpZWxkQnlJZElmRXhpc3RzIiwiaGFzIiwiX2Fzc2VydEZpZWxkSXNWYWxpZEZvck11dGF0aW9uIiwiYWRkIiwiaXNSZWNvcmRDZWxsVmFsdWVMb2FkZWRGb3JGaWVsZElkIiwidmFsaWRhdGlvblJlc3VsdCIsImZpZWxkVHlwZVByb3ZpZGVyIiwidmFsaWRhdGVDZWxsVmFsdWVGb3JVcGRhdGUiLCJfZ2V0UmF3Q2VsbFZhbHVlIiwiX2RhdGEiLCJpc1ZhbGlkIiwicmVhc29uIiwicmVjb3JkSWQiLCJDUkVBVEVfU0lOR0xFX0ZJRUxEIiwiY29uZmlnIiwiZGVzY3JpcHRpb24iLCJmaWVsZHMiLCJNQVhfTlVNX0ZJRUxEU19QRVJfVEFCTEUiLCJNQVhfRklFTERfTkFNRV9MRU5HVEgiLCJleGlzdGluZ0xvd2VyY2FzZUZpZWxkTmFtZXMiLCJtYXAiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwidmFsaWRhdGVDb25maWdGb3JVcGRhdGUiLCJNQVhfRklFTERfREVTQ1JJUFRJT05fTEVOR1RIIiwiVVBEQVRFX1NJTkdMRV9GSUVMRF9DT05GSUciLCJvcHRzIiwiY3VycmVudENvbmZpZyIsImdldENvbmZpZyIsInBhcmVudFRhYmxlIiwiX19nZXRGaWVsZE5hbWVzQnlJZCIsIlVQREFURV9TSU5HTEVfRklFTERfREVTQ1JJUFRJT04iLCJDUkVBVEVfU0lOR0xFX1RBQkxFIiwiTUFYX1RBQkxFX05BTUVfTEVOR1RIIiwiZXhpc3RpbmdMb3dlcmNhc2VUYWJsZU5hbWVzIiwidGFibGVzIiwibG93ZXJjYXNlRmllbGROYW1lcyIsImxvd2VyY2FzZUZpZWxkTmFtZSIsInByaW1hcnlGaWVsZCIsImNhbkJlUHJpbWFyeSIsIlVQREFURV9WSUVXX01FVEFEQVRBIiwidmlld0lkIiwicnVuQ29udGV4dCIsInNka0luaXREYXRhIiwiQmxvY2tSdW5Db250ZXh0VHlwZSIsIlZJRVciLCJ2aWV3IiwiZ2V0Vmlld0J5SWRJZkV4aXN0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBTUE7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQSx3QkFBd0IsR0FBRyxFQUFqQyxDLENBRUE7QUFDQTs7QUFDQSxJQUFNQyx1QkFBdUIsR0FBRyxNQUFNLElBQU4sR0FBYSxJQUE3QztBQUVBLElBQU1DLG9CQUFvQixHQUFHLEdBQTdCO0FBRUE7O0lBQ01DLFM7OztBQUNGOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUdBO0FBQ0EscUJBQ0lDLEdBREosRUFFSUMsT0FGSixFQUdJQyxJQUhKLEVBSUlDLHdCQUpKLEVBS0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDRSxTQUFLQyxrQkFBTCxHQUEwQkosR0FBRyxDQUFDSyxtQkFBOUI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCTCxPQUFoQjtBQUNBLFNBQUtNLElBQUwsR0FBWVAsR0FBWjtBQUNBLFNBQUtRLEtBQUwsR0FBYU4sSUFBYjtBQUNBLFNBQUtPLHlCQUFMLEdBQWlDTix3QkFBakM7QUFDSDtBQUVEOzs7Ozt1Q0FDeUJPLFE7Ozs7OztBQUNyQixtQkFBS0Msc0JBQUwsQ0FBNEJELFFBQTVCLEUsQ0FDQTtBQUNBO0FBQ0E7OztBQUNBLG1CQUFLRSwwQkFBTCxDQUFnQ0YsUUFBaEM7O0FBRU1HLGNBQUFB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Q0FBQ00sSUFBVCxLQUFrQmMseUJBQWNNLGdDQUFwQyxFQUFzRTtBQUNsRSxhQUFLM0IseUJBQUwsQ0FBK0JDLFFBQVEsQ0FBQzJCLE9BQXhDOztBQUNBLGVBQU8sSUFBUDtBQUNILE9BUDJELENBUzVEO0FBQ0E7QUFDQTs7O0FBQ0EsYUFBTyxLQUFQO0FBQ0g7Ozs7O2VBR1V0QyxTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBaXJ0YWJsZUludGVyZmFjZSwgQmxvY2tSdW5Db250ZXh0VHlwZX0gZnJvbSAnLi4vdHlwZXMvYWlydGFibGVfaW50ZXJmYWNlJztcbmltcG9ydCB7TXV0YXRpb24sIFBhcnRpYWxNdXRhdGlvbiwgUGVybWlzc2lvbkNoZWNrUmVzdWx0LCBNdXRhdGlvblR5cGVzfSBmcm9tICcuLi90eXBlcy9tdXRhdGlvbnMnO1xuaW1wb3J0IHtzcGF3bkVycm9yLCBzcGF3blVua25vd25Td2l0Y2hDYXNlRXJyb3J9IGZyb20gJy4uL2Vycm9yX3V0aWxzJztcbmltcG9ydCB7R2xvYmFsQ29uZmlnVXBkYXRlfSBmcm9tICcuLi90eXBlcy9nbG9iYWxfY29uZmlnJztcbmltcG9ydCBTZGsgZnJvbSAnLi4vc2RrJztcbmltcG9ydCBTZXNzaW9uIGZyb20gJy4vc2Vzc2lvbic7XG5pbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IEZpZWxkIGZyb20gJy4vZmllbGQnO1xuaW1wb3J0IHtcbiAgICBNQVhfRklFTERfTkFNRV9MRU5HVEgsXG4gICAgTUFYX0ZJRUxEX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICBNQVhfVEFCTEVfTkFNRV9MRU5HVEgsXG4gICAgTUFYX05VTV9GSUVMRFNfUEVSX1RBQkxFLFxufSBmcm9tICcuL211dGF0aW9uX2NvbnN0YW50cyc7XG5cbi8vIExpbWl0IGZvciBob3cgbWFueSBpdGVtcyBjYW4gYmUgdXBkYXRlZCBmcm9tIGEgc2luZ2xlIGJhdGNoIG11dGF0aW9uLlxuLy8gVGhpcyBpcyBudW1iZXIgb2YgcmVjb3JkcyBmb3IgTVVMVElQTEVfUkVDT1JEUyB0eXBlIG11dGF0aW9ucywgYW5kIG51bWJlciBvZiBnbG9iYWwgY29uZmlnIHBhdGhzXG4vLyBmb3IgU0VUX01VTFRJUExFX0dMT0JBTF9DT05GSUdfUEFUSFMuXG4vLyBTYW1lIGxpbWl0IGlzIGVuZm9yY2VkIGxpdmVhcHAtc2lkZVxuY29uc3QgTVVUQVRJT05TX01BWF9CQVRDSF9TSVpFID0gNTA7XG5cbi8vIExpdmVhcHAgcmVxdWVzdHMgbXVzdCBiZSB1bmRlciAybWIgaW4gc2l6ZTogd2UgZW5mb3JjZSBhIDEuOW1iIGxpbWl0IGhlcmUgdG8gYWxsb3cgc3BhY2UgZm9yXG4vLyB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIHJlcXVlc3RcbmNvbnN0IE1VVEFUSU9OU19NQVhfQk9EWV9TSVpFID0gMS45ICogMTAyNCAqIDEwMjQ7XG5cbmNvbnN0IE1VVEFUSU9OX0hPTERfRk9SX01TID0gMTAwO1xuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBNdXRhdGlvbnMge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYWlydGFibGVJbnRlcmZhY2U6IEFpcnRhYmxlSW50ZXJmYWNlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfc2Vzc2lvbjogU2Vzc2lvbjtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3NkazogU2RrO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYmFzZTogQmFzZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2FwcGx5R2xvYmFsQ29uZmlnVXBkYXRlczogKGFyZzE6IFJlYWRvbmx5QXJyYXk8R2xvYmFsQ29uZmlnVXBkYXRlPikgPT4gdm9pZDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHNkazogU2RrLFxuICAgICAgICBzZXNzaW9uOiBTZXNzaW9uLFxuICAgICAgICBiYXNlOiBCYXNlLFxuICAgICAgICBhcHBseUdsb2JhbENvbmZpZ1VwZGF0ZXM6IChhcmcxOiBSZWFkb25seUFycmF5PEdsb2JhbENvbmZpZ1VwZGF0ZT4pID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX2FpcnRhYmxlSW50ZXJmYWNlID0gc2RrLl9fYWlydGFibGVJbnRlcmZhY2U7XG4gICAgICAgIHRoaXMuX3Nlc3Npb24gPSBzZXNzaW9uO1xuICAgICAgICB0aGlzLl9zZGsgPSBzZGs7XG4gICAgICAgIHRoaXMuX2Jhc2UgPSBiYXNlO1xuICAgICAgICB0aGlzLl9hcHBseUdsb2JhbENvbmZpZ1VwZGF0ZXMgPSBhcHBseUdsb2JhbENvbmZpZ1VwZGF0ZXM7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBhc3luYyBhcHBseU11dGF0aW9uQXN5bmMobXV0YXRpb246IE11dGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuX2Fzc2VydE11dGF0aW9uSXNWYWxpZChtdXRhdGlvbik7XG4gICAgICAgIC8vIExpbWl0IGNoZWNrIGlzIGFmdGVyIHZhbGlkaXR5IGNoZWNrIHNvIHRoYXQgd2UgZGlzcGxheSBlcnJvcnMgZm9yIHdoZW4gdXNlcnMgcGFzcyBpblxuICAgICAgICAvLyBvYmplY3RzIGNvcnJlY3RseSAoZWcgdXBkYXRpbmcgbGlua2VkIHJlY29yZHMgY2VsbCB2YWx1ZSB0byBiZSBhIHJlY29yZCBvYmplY3QpIC1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBsaW1pdCBjaGVjayB3aWxsIGZhaWwgZHVlIHRvIGNpcmN1bGFyIG9iamVjdHMgYmVpbmcgY29udmVydGVkIHRvIEpTT04gZmlyc3RcbiAgICAgICAgdGhpcy5fYXNzZXJ0TXV0YXRpb25VbmRlckxpbWl0cyhtdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgcGVybWlzc2lvbkNoZWNrID0gdGhpcy5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24obXV0YXRpb24pO1xuICAgICAgICBpZiAoIXBlcm1pc3Npb25DaGVjay5oYXNQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgYXBwbHkgJXMgbXV0YXRpb246ICVzJyxcbiAgICAgICAgICAgICAgICBtdXRhdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25DaGVjay5yZWFzb25EaXNwbGF5U3RyaW5nLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpZEFwcGx5T3B0aW1pc3RpY1VwZGF0ZXMgPSB0aGlzLl9hcHBseU9wdGltaXN0aWNVcGRhdGVzRm9yTXV0YXRpb24obXV0YXRpb24pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5hcHBseU11dGF0aW9uQXN5bmMobXV0YXRpb24sIHtcbiAgICAgICAgICAgICAgICBob2xkRm9yTXM6IE1VVEFUSU9OX0hPTERfRk9SX01TLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGRpZEFwcGx5T3B0aW1pc3RpY1VwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcHBsaWVkIG9wdGltaXN0aWMgdXBkYXRlcywgd2UgY2FuJ3QgZ3JhY2VmdWxseSBoYW5kbGUgYSBwcm9taXNlIHJlamVjdGlvblxuICAgICAgICAgICAgICAgIC8vIGhlcmUgLSB3ZSBjYW4ndCB1bi1hcHBseSBvcHRpbWlzdGljIHVwZGF0ZXMsIHNvIHRoZSBTREsncyBpbnRlcm5hbCBkYXRhIG1vZGVsIGlzXG4gICAgICAgICAgICAgICAgLy8gaW4gYW4gdW5leHBlY3RlZCBzdGF0ZS4gSW5zdGVhZCBvZiBsZXR0aW5nIHRoaXMgcHJvbWlzZSBnZXQgcmVqZWN0ZWQsIHRocm93IGFuXG4gICAgICAgICAgICAgICAgLy8gZXJyb3IgYWZ0ZXIgYW4gYXN5bmMgZ2FwIHRvIGNyYXNoIHRoZSBibG9jaywgYW5kIG1ha2UgdGhpcyBwcm9taXNlIGF3YWl0XG4gICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIHRoYXQgd2lsbCBuZXZlciByZXNvbHZlIHNvIHdlIGRvbid0IHJ1biBhbnkgb2YgdGhlIGRldmVsb3BlcnMgZXJyb3ItXG4gICAgICAgICAgICAgICAgLy8gaGFuZGxpbmcgY29kZS5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKCgpID0+IHt9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24obXV0YXRpb246IFBhcnRpYWxNdXRhdGlvbik6IFBlcm1pc3Npb25DaGVja1Jlc3VsdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24oXG4gICAgICAgICAgICBtdXRhdGlvbixcbiAgICAgICAgICAgIHRoaXMuX2Jhc2UuX19nZXRCYXNlRGF0YSgpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYXNzZXJ0TXV0YXRpb25VbmRlckxpbWl0cyhtdXRhdGlvbjogTXV0YXRpb24pIHtcbiAgICAgICAgLy8gVHdvIGxpbWl0cyB0byBjaGVjayBoZXJlOlxuICAgICAgICAvLyAtIGZvciByZWNvcmQtcmVsYXRlZCBtdXRhdGlvbnMsIGl0IGlzbid0IGFib3ZlIE1VVEFUSU9OU19NQVhfQkFUQ0hfU0laRVxuICAgICAgICAvLyAtIG11dGF0aW9uIHBheWxvYWQgc2l6ZSB3b24ndCBleGNlZWQgbGl2ZWFwcCByZXF1ZXN0IHBheWxvYWQgc2l6ZSBsaW1pdFxuICAgICAgICAvLyBSZXF1ZXN0cyBhcmUgc2VudCBhcyBmb3JtLWVuY29kZWQgdXRmLTggKDEgYnl0ZSBjaGFyYWN0ZXJzKVxuICAgICAgICBpZiAoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG11dGF0aW9uKSkubGVuZ3RoID4gTVVUQVRJT05TX01BWF9CT0RZX1NJWkUpIHtcbiAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1JlcXVlc3QgZXhjZWVkcyBtYXhpbXVtIHNpemUgbGltaXQgb2YgJXMgYnl0ZXMnLFxuICAgICAgICAgICAgICAgIE1VVEFUSU9OU19NQVhfQk9EWV9TSVpFLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9kb2VzTXV0YXRpb25FeGNlZWRCYXRjaFNpemVMaW1pdChtdXRhdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1JlcXVlc3QgZXhjZWVkcyBtYXhpbXVtIGJhdGNoIHNpemUgbGltaXQgb2YgJXMgaXRlbXMnLFxuICAgICAgICAgICAgICAgIE1VVEFUSU9OU19NQVhfQkFUQ0hfU0laRSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2RvZXNNdXRhdGlvbkV4Y2VlZEJhdGNoU2l6ZUxpbWl0KG11dGF0aW9uOiBNdXRhdGlvbikge1xuICAgICAgICBzd2l0Y2ggKG11dGF0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgTXV0YXRpb25UeXBlcy5TRVRfTVVMVElQTEVfUkVDT1JEU19DRUxMX1ZBTFVFUzpcbiAgICAgICAgICAgIGNhc2UgTXV0YXRpb25UeXBlcy5DUkVBVEVfTVVMVElQTEVfUkVDT1JEUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbXV0YXRpb24ucmVjb3Jkcy5sZW5ndGggPiBNVVRBVElPTlNfTUFYX0JBVENIX1NJWkU7XG4gICAgICAgICAgICBjYXNlIE11dGF0aW9uVHlwZXMuREVMRVRFX01VTFRJUExFX1JFQ09SRFM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG11dGF0aW9uLnJlY29yZElkcy5sZW5ndGggPiBNVVRBVElPTlNfTUFYX0JBVENIX1NJWkU7XG4gICAgICAgICAgICBjYXNlIE11dGF0aW9uVHlwZXMuU0VUX01VTFRJUExFX0dMT0JBTF9DT05GSUdfUEFUSFM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG11dGF0aW9uLnVwZGF0ZXMubGVuZ3RoID4gTVVUQVRJT05TX01BWF9CQVRDSF9TSVpFO1xuICAgICAgICAgICAgLy8gVGhlIFwiZGVmYXVsdFwiIGNhc2UgY2Fubm90IGJlIHJlYWNoZWQgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBvbmx5XG4gICAgICAgICAgICAvLyBpbnZva2VkIGFmdGVyIHRoZSBtdXRhdGlvbiB0eXBlIGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYXNzZXJ0RmllbGRJc1ZhbGlkRm9yTXV0YXRpb24oZmllbGQ6IEZpZWxkKSB7XG4gICAgICAgIGlmIChmaWVsZC5pc0NvbXB1dGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ2FuJ3Qgc2V0IGNlbGwgdmFsdWVzOiBGaWVsZCAnJXMnIGlzIGNvbXB1dGVkIGFuZCBjYW5ub3QgYmUgc2V0XCIsXG4gICAgICAgICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2Fzc2VydE11dGF0aW9uSXNWYWxpZChtdXRhdGlvbjogTXV0YXRpb24pIHtcbiAgICAgICAgLy8gV2UgY2FsbCB2YWxpZGF0ZSB0aGUgZGF0YSAoaW5jbHVkaW5nIGFueSBjZWxsIHZhbHVlcykgYmVjYXVzZSBpZiB0aGUgZGF0YSByZXF1aXJlZCBmb3JcbiAgICAgICAgLy8gdXMgdG8gZG8gdGhhdCBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgYmxvY2ssIHdlIGNhbiBlcnJvciBvdXQgYmVmb3JlIGFwcGx5aW5nXG4gICAgICAgIC8vIG9wdGltaXN0aWMgdXBkYXRlcyBvciBzZW5kaW5nIHRoZSB1cGRhdGUgdG8gbGl2ZWFwcC4gVGhhdCBtZWFucyB0aGF0IHRoZSBlcnJvciBpc1xuICAgICAgICAvLyByZWNvdmVyYWJsZS4gT25jZSB3ZSBhcHBseSBvcHRpbWlzdGljIHVwZGF0ZXMsIGlmIGxpdmVhcHAgcmVqZWN0cyB0aGUgdXBkYXRlIHRoZW4gd2VcbiAgICAgICAgLy8gY2FuJ3QgcmVjb3ZlciBmcm9tIHRoYXQgLSB3ZSBoYXZlIHRvIGNyYXNoIHRoZSBibG9jay4gV2UgX2NvdWxkXyBza2lwIG92ZXIgdGhlc2VcbiAgICAgICAgLy8gdmFsaWRhdGlvbnMgLSBpdCB3b3VsZG4ndCBjYXVzZSBpc3N1ZXMgb3V0c2lkZSBvZiB0aGUgYmxvY2sgZnJhbWUuIEJ1dCBydW5uaW5nIHRoZW1cbiAgICAgICAgLy8gZ2l2ZXMgdXMgc2xpZ2h0bHkgbW9yZSBjb25maWRlbmNlIHRoYXQgd2UgY2FuIGRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGNvbXBsZXRlbHkgY3Jhc2hcbiAgICAgICAgLy8gdGhlIGJsb2NrIGluIHRoZSBldmVudCBvZiBhbiBpbnZhbGlkIG11dGF0aW9uLlxuXG4gICAgICAgIGNvbnN0IGFwcEludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FwcEludGVyZmFjZTtcbiAgICAgICAgY29uc3QgYmlsbGluZ1BsYW5Hcm91cGluZyA9IHRoaXMuX2Jhc2UuX19iaWxsaW5nUGxhbkdyb3VwaW5nO1xuXG4gICAgICAgIHN3aXRjaCAobXV0YXRpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSBNdXRhdGlvblR5cGVzLlNFVF9NVUxUSVBMRV9SRUNPUkRTX0NFTExfVkFMVUVTOiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge3RhYmxlSWQsIHJlY29yZHN9ID0gbXV0YXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLl9iYXNlLmdldFRhYmxlQnlJZElmRXhpc3RzKHRhYmxlSWQpO1xuICAgICAgICAgICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIkNhbid0IHNldCBjZWxsIHZhbHVlczogTm8gdGFibGUgd2l0aCBpZCAlcyBleGlzdHNcIiwgdGFibGVJZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGV2ZXJ5IG11dGF0aW9uLCB3ZSBjaGVjayB0aGF0IHdlJ3JlIG5vdCB0cnlpbmcgdG8gc2V0IGZpZWxkcyB0aGF0IHdlIGRvbid0IHN1cHBvcnRcbiAgICAgICAgICAgICAgICAvLyBtdXRhdGlvbnMgZm9yIHlldC4gV2hlbiByZWNvcmQgZGF0YSBpcyBsb2FkZWQsIHdlIGFsc28gY2hlY2sgdGhhdCB0aGUgcmVjb3JkIHdlJ3JlXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRpbmcgYWN0dWFsbHkgZXhpc3RzIGFuZCB0aGF0IHRoZSBjZWxsIHZhbHVlcyBhcmUgdmFsaWQuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkU3RvcmUgPSB0aGlzLl9iYXNlLl9fZ2V0UmVjb3JkU3RvcmUodGFibGVJZCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkRmllbGRJZHMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZ1JlY29yZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgLSBpZiBpc1N1YnNjcmliZWRUb0FsbFJlY29yZHNJblRhYmxlIGlzIHRydWUgdGhlbiB3ZSBrbm93IHRoZSByZWNvcmRcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBleGlzdCAob3IgaXMgZGVsZXRlZCkgYnV0IG90aGVyd2lzZSB3ZSBjYW4gaXNzdWUgYSBtdXRhdGlvbiB0byBhIHJlY29yZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0LCBoYXZpbmcgdG8gZGVhbCB3aXRoIHRoZSBlcnJvciB0aHJvd24gYnkgUHVibGljQWlydGFibGVJbnRlcmZhY2VGcm9udGVuZFxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAoI3Byb2otYmxvY2tzLXNkay1yZWNvcmQtbGltaXRzKSBXcml0ZSB0ZXN0cyBhcm91bmQgdGhpcyBiZWhhdmlvclxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRTdG9yZS5pc1N1YnNjcmliZWRUb0FsbFJlY29yZHNJblRhYmxlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRTdG9yZS5pc1JlY29yZExvYWRlZChyZWNvcmQuaWQpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSZWNvcmQgPSByZWNvcmRTdG9yZS5nZXRSZWNvcmRCeUlkSWZFeGlzdHMocmVjb3JkLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IHNldCBjZWxsIHZhbHVlczogTm8gcmVjb3JkIHdpdGggaWQgJXMgZXhpc3RzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZElkIG9mIE9iamVjdC5rZXlzKHJlY29yZC5jZWxsVmFsdWVzQnlGaWVsZElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0YWJsZS5nZXRGaWVsZEJ5SWRJZkV4aXN0cyhmaWVsZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IHNldCBjZWxsIHZhbHVlczogTm8gZmllbGQgd2l0aCBpZCAlcyBleGlzdHMgaW4gdGFibGUgJyVzJ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZEZpZWxkSWRzLmhhcyhmaWVsZElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Fzc2VydEZpZWxkSXNWYWxpZEZvck11dGF0aW9uKGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkRmllbGRJZHMuYWRkKGZpZWxkSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSZWNvcmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRTdG9yZS5pc1JlY29yZENlbGxWYWx1ZUxvYWRlZEZvckZpZWxkSWQocmVjb3JkLmlkLCBmaWVsZElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuX2FpcnRhYmxlSW50ZXJmYWNlLmZpZWxkVHlwZVByb3ZpZGVyLnZhbGlkYXRlQ2VsbFZhbHVlRm9yVXBkYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5jZWxsVmFsdWVzQnlGaWVsZElkW2ZpZWxkSWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1JlY29yZC5fZ2V0UmF3Q2VsbFZhbHVlKGZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuX2RhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBzZXQgY2VsbCB2YWx1ZXM6IGludmFsaWQgY2VsbCB2YWx1ZSBmb3IgZmllbGQgJyVzJy5cXG4lc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQucmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgTXV0YXRpb25UeXBlcy5ERUxFVEVfTVVMVElQTEVfUkVDT1JEUzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHt0YWJsZUlkLCByZWNvcmRJZHN9ID0gbXV0YXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLl9iYXNlLmdldFRhYmxlQnlJZElmRXhpc3RzKHRhYmxlSWQpO1xuICAgICAgICAgICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIkNhbid0IGRlbGV0ZSByZWNvcmRzOiBObyB0YWJsZSB3aXRoIGlkICVzIGV4aXN0c1wiLCB0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRTdG9yZSA9IHRoaXMuX2Jhc2UuX19nZXRSZWNvcmRTdG9yZSh0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiAoI3Byb2otYmxvY2tzLXNkay1yZWNvcmQtbGltaXRzKSBXZSBzdWJzdGFudGlhbGx5IHdlYWtlbiBvdXIgY2hlY2sgaGVyZVxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UgY2FuIG9ubHkgYmUgc3VyZSBpZiB0aGUgcmVjb3JkIGV4aXN0cyBpbnNpZGUgdGhlIFNESyBpZiB3ZSd2ZSBsb2FkZWRcbiAgICAgICAgICAgICAgICAvLyBhbGwgcmVjb3Jkcy4gSXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIHRoaXMgbG9naWMgdG8gZW5zdXJlIHdlIGRvbid0IGRvdWJsZS1kZWxldGVcbiAgICAgICAgICAgICAgICAvLyByZWNvcmRzIGJ5IGNhY2hpbmcgcHJldmlvdXNseSBkZWxldGVkIHJlY29yZHMgKGlmIHRoZSBkZWxldGUgaXMgdW5kb25lLCBidXRcbiAgICAgICAgICAgICAgICAvLyB3ZSdyZSBub3Qgd2F0Y2hpbmcgdGhlIHJlY29yZCBiZSByZS1jcmVhdGVkIGZyb20gdGhlIHVuZG8gd2Ugd291bGQgaGF2ZSB0byBmYWlsXG4gICAgICAgICAgICAgICAgLy8gdGhlIGRlbGV0ZSBpZiB3ZSBkZXRlY3QgZG91YmxlIGRlbGV0aW9uKS4gVE9ETyB0byBhZGQgdGVzdHMgYXJvdW5kIHRoaXMgYmVoYXZpb3IuXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZFN0b3JlLmlzU3Vic2NyaWJlZFRvQWxsUmVjb3Jkc0luVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmRJZCBvZiByZWNvcmRJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZFN0b3JlLmdldFJlY29yZEJ5SWRJZkV4aXN0cyhyZWNvcmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgZGVsZXRlIHJlY29yZHM6IE5vIHJlY29yZCB3aXRoIGlkICVzIGV4aXN0cyBpbiB0YWJsZSAnJXMnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIE11dGF0aW9uVHlwZXMuQ1JFQVRFX01VTFRJUExFX1JFQ09SRFM6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7dGFibGVJZCwgcmVjb3Jkc30gPSBtdXRhdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkRmllbGRJZHMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuX2Jhc2UuZ2V0VGFibGVCeUlkSWZFeGlzdHModGFibGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgY3JlYXRlIHJlY29yZHM6IE5vIHRhYmxlIHdpdGggaWQgJXMgZXhpc3RzXCIsIHRhYmxlSWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZElkIG9mIE9iamVjdC5rZXlzKHJlY29yZC5jZWxsVmFsdWVzQnlGaWVsZElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0YWJsZS5nZXRGaWVsZEJ5SWRJZkV4aXN0cyhmaWVsZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSByZWNvcmRzOiBObyBmaWVsZCB3aXRoIGlkICVzIGV4aXN0cyBpbiB0YWJsZSAnJXMnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja2VkRmllbGRJZHMuaGFzKGZpZWxkSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXNzZXJ0RmllbGRJc1ZhbGlkRm9yTXV0YXRpb24oZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRGaWVsZElkcy5hZGQoZmllbGRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY2VsbCB2YWx1ZSBpcyBudWxsIHNpbmNlIHRoZSByZWNvcmQgZG9lc24ndCBleGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5maWVsZFR5cGVQcm92aWRlci52YWxpZGF0ZUNlbGxWYWx1ZUZvclVwZGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLmNlbGxWYWx1ZXNCeUZpZWxkSWRbZmllbGRJZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5fZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgY3JlYXRlIHJlY29yZHM6IGludmFsaWQgY2VsbCB2YWx1ZSBmb3IgZmllbGQgJyVzJy5cXG4lc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBNdXRhdGlvblR5cGVzLlNFVF9NVUxUSVBMRV9HTE9CQUxfQ09ORklHX1BBVEhTOiB7XG4gICAgICAgICAgICAgICAgLy8gZ2xvYmFsQ29uZmlnIHVwZGF0ZSBpcyBhIHNwZWNpYWwgY2FzZTogZ2xvYmFsQ29uZmlnIGhhbmRsZXMgdmFsaWRhdGlvbiBiZWZvcmVcbiAgICAgICAgICAgICAgICAvLyBpbnZva2luZyB0aGlzIG11dGF0aW9uLCBzaW5jZSBpdCByZWxpZXMgb24gaW50ZXJuYWwgc3RhdGUgdG8gdmFsaWRhdGUgdGhlXG4gICAgICAgICAgICAgICAgLy8gcGF0aHMgYmVpbmcgc2V0LlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBNdXRhdGlvblR5cGVzLkNSRUFURV9TSU5HTEVfRklFTEQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7dGFibGVJZCwgbmFtZSwgY29uZmlnLCBkZXNjcmlwdGlvbn0gPSBtdXRhdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuX2Jhc2UuZ2V0VGFibGVCeUlkSWZFeGlzdHModGFibGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgY3JlYXRlIGZpZWxkOiBObyB0YWJsZSB3aXRoIGlkICVzIGV4aXN0c1wiLCB0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFibGUuZmllbGRzLmxlbmd0aCA+PSBNQVhfTlVNX0ZJRUxEU19QRVJfVEFCTEUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgY3JlYXRlIGZpZWxkOiB0YWJsZSBhbHJlYWR5IGhhcyB0aGUgbWF4aW11bSBvZiAlcyBmaWVsZHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9OVU1fRklFTERTX1BFUl9UQUJMRSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIkNhbid0IGNyZWF0ZSBmaWVsZDogbXVzdCBwcm92aWRlIG5vbi1lbXB0eSBuYW1lXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IE1BWF9GSUVMRF9OQU1FX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBjcmVhdGUgZmllbGQ6IG5hbWUgJyVzJyBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICVzIGNoYXJhY3RlcnNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBNQVhfRklFTERfTkFNRV9MRU5HVEgsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdMb3dlcmNhc2VGaWVsZE5hbWVzID0gdGFibGUuZmllbGRzLm1hcChmaWVsZCA9PlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0xvd2VyY2FzZUZpZWxkTmFtZXMuaW5jbHVkZXMobmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBjcmVhdGUgZmllbGQ6IGZpZWxkIHdpdGggbmFtZSAnJXMnIGFscmVhZHkgZXhpc3RzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY29uZmlnIC8gZmllbGQgZGF0YSBpcyBudWxsIHNpbmNlIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0LlxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5maWVsZFR5cGVQcm92aWRlci52YWxpZGF0ZUNvbmZpZ0ZvclVwZGF0ZShcbiAgICAgICAgICAgICAgICAgICAgYXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGJpbGxpbmdQbGFuR3JvdXBpbmcsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSBmaWVsZDogaW52YWxpZCBmaWVsZCBjb25maWcuXFxuJXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQucmVhc29uLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi5sZW5ndGggPiBNQVhfRklFTERfREVTQ1JJUFRJT05fTEVOR1RIKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSBmaWVsZDogZGVzY3JpcHRpb24gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAlcyBjaGFyYWN0ZXJzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBNQVhfRklFTERfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgTXV0YXRpb25UeXBlcy5VUERBVEVfU0lOR0xFX0ZJRUxEX0NPTkZJRzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHt0YWJsZUlkLCBpZCwgY29uZmlnLCBvcHRzfSA9IG11dGF0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fYmFzZS5nZXRUYWJsZUJ5SWRJZkV4aXN0cyh0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXCJDYW4ndCB1cGRhdGUgZmllbGQ6IE5vIHRhYmxlIHdpdGggaWQgJXMgZXhpc3RzXCIsIHRhYmxlSWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGFibGUuZ2V0RmllbGRCeUlkSWZFeGlzdHMoaWQpO1xuICAgICAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIkNhbid0IHVwZGF0ZSBmaWVsZDogTm8gZmllbGQgd2l0aCBpZCAlcyBleGlzdHNcIiwgaWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHdlIGdldCB0aGUgY29uZmlnIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgZmllbGQudHlwZS9maWVsZC5vcHRpb25zIHRvIGdldCBpdFxuICAgICAgICAgICAgICAgIC8vIGluIG9uZSBjYWxsIGFuZCBiZWNhdXNlIGZpZWxkLm9wdGlvbnMgcmV0dXJucyBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkIHdoZW5cbiAgICAgICAgICAgICAgICAvLyBhIGZpZWxkIGRvZXMgbm90IGhhdmUgb3B0aW9ucywgd2hpbHN0IHdlIG5lZWQgdG8gcGFzcyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gdGhpcy5fYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIuZ2V0Q29uZmlnKFxuICAgICAgICAgICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLl9kYXRhLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5wYXJlbnRUYWJsZS5fX2dldEZpZWxkTmFtZXNCeUlkKCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5fYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIudmFsaWRhdGVDb25maWdGb3JVcGRhdGUoXG4gICAgICAgICAgICAgICAgICAgIGFwcEludGVyZmFjZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5fZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgYmlsbGluZ1BsYW5Hcm91cGluZyxcbiAgICAgICAgICAgICAgICAgICAgb3B0cyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgdXBkYXRlIGZpZWxkOiBpbnZhbGlkIGZpZWxkIGNvbmZpZy5cXG4lc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC5yZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBNdXRhdGlvblR5cGVzLlVQREFURV9TSU5HTEVfRklFTERfREVTQ1JJUFRJT046IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7dGFibGVJZCwgaWQsIGRlc2NyaXB0aW9ufSA9IG11dGF0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fYmFzZS5nZXRUYWJsZUJ5SWRJZkV4aXN0cyh0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXCJDYW4ndCB1cGRhdGUgZmllbGQ6IE5vIHRhYmxlIHdpdGggaWQgJXMgZXhpc3RzXCIsIHRhYmxlSWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGFibGUuZ2V0RmllbGRCeUlkSWZFeGlzdHMoaWQpO1xuICAgICAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIkNhbid0IHVwZGF0ZSBmaWVsZDogTm8gZmllbGQgd2l0aCBpZCAlcyBleGlzdHNcIiwgaWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi5sZW5ndGggPiBNQVhfRklFTERfREVTQ1JJUFRJT05fTEVOR1RIKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IHVwZGF0ZSBmaWVsZDogZGVzY3JpcHRpb24gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAlcyBjaGFyYWN0ZXJzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBNQVhfRklFTERfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgTXV0YXRpb25UeXBlcy5DUkVBVEVfU0lOR0xFX1RBQkxFOiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge25hbWUsIGZpZWxkc30gPSBtdXRhdGlvbjtcblxuICAgICAgICAgICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgY3JlYXRlIHRhYmxlOiBtdXN0IHByb3ZpZGUgbm9uLWVtcHR5IG5hbWVcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gTUFYX1RBQkxFX05BTUVfTEVOR1RIKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSB0YWJsZTogbmFtZSAnJXMnIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJXMgY2hhcmFjdGVyc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9UQUJMRV9OQU1FX0xFTkdUSCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0xvd2VyY2FzZVRhYmxlTmFtZXMgPSB0aGlzLl9iYXNlLnRhYmxlcy5tYXAodGFibGUgPT5cbiAgICAgICAgICAgICAgICAgICAgdGFibGUubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdMb3dlcmNhc2VUYWJsZU5hbWVzLmluY2x1ZGVzKG5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgY3JlYXRlIHRhYmxlOiB0YWJsZSB3aXRoIG5hbWUgJyVzJyBhbHJlYWR5IGV4aXN0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgY3JlYXRlIHRhYmxlOiBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGZpZWxkXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gTUFYX05VTV9GSUVMRFNfUEVSX1RBQkxFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSB0YWJsZTogbnVtYmVyIG9mIGZpZWxkcyBleGNlZWRzIG1heGltdW0gb2YgJXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9OVU1fRklFTERTX1BFUl9UQUJMRSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlcmNhc2VGaWVsZE5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSB0YWJsZTogbXVzdCBwcm92aWRlIG5vbi1lbXB0eSBuYW1lIGZvciBldmVyeSBmaWVsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5uYW1lLmxlbmd0aCA+IE1BWF9GSUVMRF9OQU1FX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSB0YWJsZTogZmllbGQgbmFtZSAnJXMnIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJXMgY2hhcmFjdGVyc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0ZJRUxEX05BTUVfTEVOR1RILFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyY2FzZUZpZWxkTmFtZSA9IGZpZWxkLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvd2VyY2FzZUZpZWxkTmFtZXMuaGFzKGxvd2VyY2FzZUZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBjcmVhdGUgdGFibGU6IGR1cGxpY2F0ZSBmaWVsZCBuYW1lICclcydcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsb3dlcmNhc2VGaWVsZE5hbWVzLmFkZChsb3dlcmNhc2VGaWVsZE5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY29uZmlnIC8gZmllbGQgZGF0YSBpcyBudWxsIHNpbmNlIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5fYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIudmFsaWRhdGVDb25maWdGb3JVcGRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5jb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbGxpbmdQbGFuR3JvdXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBjcmVhdGUgdGFibGU6IGludmFsaWQgZmllbGQgY29uZmlnIGZvciBmaWVsZCAnJXMnLlxcbiVzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGVzY3JpcHRpb24ubGVuZ3RoID4gTUFYX0ZJRUxEX0RFU0NSSVBUSU9OX0xFTkdUSFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBjcmVhdGUgdGFibGU6IGRlc2NyaXB0aW9uIGZvciBmaWVsZCAnJXMnIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJXMgY2hhcmFjdGVyc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0ZJRUxEX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmltYXJ5RmllbGQgPSBmaWVsZHNbMF07XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5fYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIuY2FuQmVQcmltYXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUZpZWxkLmNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbGxpbmdQbGFuR3JvdXBpbmcsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgY3JlYXRlIHRhYmxlOiBmaXJzdCBmaWVsZCAnJXMnIGhhcyB0eXBlICclcycgd2hpY2ggY2Fubm90IGJlIGEgcHJpbWFyeSBmaWVsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUZpZWxkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5RmllbGQuY29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBNdXRhdGlvblR5cGVzLlVQREFURV9WSUVXX01FVEFEQVRBOiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge3RhYmxlSWQsIHZpZXdJZH0gPSBtdXRhdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCB7cnVuQ29udGV4dH0gPSB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5zZGtJbml0RGF0YTtcblxuICAgICAgICAgICAgICAgIGlmIChydW5Db250ZXh0LnR5cGUgIT09IEJsb2NrUnVuQ29udGV4dFR5cGUuVklFVykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKCdTZXR0aW5nIHZpZXcgbWV0YWRhdGEgaXMgb25seSB2YWxpZCBmb3Igdmlld3MnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocnVuQ29udGV4dC52aWV3SWQgIT09IHZpZXdJZCB8fCBydW5Db250ZXh0LnRhYmxlSWQgIT09IHRhYmxlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcignQ3VzdG9tIHZpZXdzIGNhbiBvbmx5IHNldCB2aWV3IG1ldGFkYXRhIG9uIHRoZW1zZWx2ZXMnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuX2Jhc2UuZ2V0VGFibGVCeUlkSWZFeGlzdHModGFibGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgdXBkYXRlIG1ldGFkYXRhOiBObyB0YWJsZSB3aXRoIGlkICVzIGV4aXN0c1wiLCB0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gdGFibGUuZ2V0Vmlld0J5SWRJZkV4aXN0cyh2aWV3SWQpO1xuICAgICAgICAgICAgICAgIGlmICghdmlldykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgdXBkYXRlIG1ldGFkYXRhOiBObyB2aWV3IHdpdGggaWQgJXMgZXhpc3RzXCIsIHZpZXdJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBzcGF3blVua25vd25Td2l0Y2hDYXNlRXJyb3IoJ211dGF0aW9uIHR5cGUnLCBtdXRhdGlvbiwgJ3R5cGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYXBwbHlPcHRpbWlzdGljVXBkYXRlc0Zvck11dGF0aW9uKG11dGF0aW9uOiBNdXRhdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICAvLyBHbG9iYWxDb25maWcgdXBkYXRlcyBhcmUgZGlmZmVyZW50IHRvIG90aGVyIG11dGF0aW9ucyAob24gbW9kZWxzKTogZm9yIG1vZGVscywgd2VcbiAgICAgICAgLy8gb25seSBhcHBseSBvcHRpbWlzdGljIHVwZGF0ZXMgaWYgdGhlIHJlbGV2YW50IG1vZGVscyBhcmUgbG9hZGVkLCB3aGVyZWFzIGZvclxuICAgICAgICAvLyBTRVRfTVVMVElQTEVfR0xPQkFMX0NPTkZJR19QQVRIUyB3ZSBhbHdheXMgYXBwbHkgb3B0aW1pc3RpYyB1cGRhdGVzLlxuICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gTXV0YXRpb25UeXBlcy5TRVRfTVVMVElQTEVfR0xPQkFMX0NPTkZJR19QQVRIUykge1xuICAgICAgICAgICAgdGhpcy5fYXBwbHlHbG9iYWxDb25maWdVcGRhdGVzKG11dGF0aW9uLnVwZGF0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBodHRwczovL2FpcnRhYmxlLmNvbS9hcHBhaHVKUXc3cWZRVEJCVS90YmxTYnBpbU04U3BwOXR4cC92aXdlQUZJdXMzTWhVOUd4YS9yZWNIT2NrWTRWOVFtTTZKVj9ibG9ja3M9aGlkZVxuICAgICAgICAvLyBUT0RPOiAoI3Byb2otYmxvY2tzLXNkay1yZWNvcmQtbGltaXRzKSBGaXggdGhpcyBpbiBhIGZ1dHVyZSBzdGFja2VkIGRpZmYgd2hlcmUgb3B0aW1pc3RpY1xuICAgICAgICAvLyB1cGRhdGVzIGFyZSByZS1lbmFibGVkIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMUNWWjRab1BXRXRwektxXzljUkxBU0d3Z1k3MVdJNG5sNlJWdnM4UzdVYncvZWRpdCNcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTXV0YXRpb25zO1xuIl19
|
|
@@ -238,4 +238,5 @@ function () {
|
|
|
238
238
|
}();
|
|
239
239
|
|
|
240
240
|
var _default = ObjectPool;
|
|
241
|
-
exports.default = _default;
|
|
241
|
+
exports.default = _default;
|
|
242
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvb2JqZWN0X3Bvb2wudHMiXSwibmFtZXMiOlsiV0VBS19SRVRBSU5fVElNRV9NUyIsIk9iamVjdFBvb2wiLCJjdG9yIiwiX0N0b3IiLCJvYmplY3QiLCJfdW5yZWdpc3Rlck9iamVjdEZvclJldXNlV2Vha0lmRXhpc3RzIiwib2JqZWN0S2V5IiwiX19wb29sS2V5IiwicG9vbGVkT2JqZWN0cyIsIl9vYmplY3RzQnlLZXkiLCJwdXNoIiwiaW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiX3dlYWtPYmplY3RzQnlLZXkiLCJ0b1N0b3JlIiwidGltZW91dElkIiwic2V0VGltZW91dCIsImZpbmRJbmRleCIsInN0b3JlZCIsImNsZWFyVGltZW91dCIsImtleSIsImZpbmQiLCJhcmdzIiwibmV3T2JqZWN0IiwiZXhpc3RpbmdPYmplY3QiLCJfZ2V0T2JqZWN0Rm9yUmV1c2VTdHJvbmciLCJfZ2V0T2JqZWN0Rm9yUmV1c2VXZWFrIiwiX3JlZ2lzdGVyT2JqZWN0Rm9yUmV1c2VXZWFrIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFEQTs7QUFBZTtBQUlmLElBQU1BLG1CQUFtQixHQUFHLEtBQTVCOztJQU1NQyxVOzs7QUFDRjs7QUFFQTs7QUFFQTs7QUFHQTtBQUNBLHNCQUFZQyxJQUFaLEVBQXdCO0FBQUE7QUFBQSx5REFQMEIsRUFPMUI7QUFBQSw2REFMOEQsRUFLOUQ7QUFBQTtBQUNwQixTQUFLQyxLQUFMLEdBQWFELElBQWI7QUFDSCxHLENBRUQ7QUFDQTs7QUFDQTs7Ozs7aURBQzZCRSxNLEVBQVc7QUFDcEMsV0FBS0MscUNBQUwsQ0FBMkNELE1BQTNDOztBQUNBLFVBQU1FLFNBQVMsR0FBR0YsTUFBTSxDQUFDRyxTQUF6QjtBQUNBLFVBQU1DLGFBQWEsR0FBRyxLQUFLQyxhQUFMLENBQW1CSCxTQUFuQixDQUF0Qjs7QUFDQSxVQUFJ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SSxjQUFKLEVBQW9CO0FBQ2hCLGVBQU9BLGNBQVA7QUFDSDs7QUFFRCxXQUFLRywyQkFBTCxDQUFpQ0osU0FBakM7O0FBRUEsYUFBT0EsU0FBUDtBQUNIOzs7OztlQUdVekIsVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAaGlkZGVuICovIC8qKiAqL1xuaW1wb3J0IHtpbnZhcmlhbnR9IGZyb20gJy4uL2Vycm9yX3V0aWxzJztcbmltcG9ydCB7VGltZW91dElkfSBmcm9tICcuLi9wcml2YXRlX3V0aWxzJztcblxuY29uc3QgV0VBS19SRVRBSU5fVElNRV9NUyA9IDEwMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvb2xhYmxlIHtcbiAgICBfX3Bvb2xLZXk6IHN0cmluZztcbn1cblxuY2xhc3MgT2JqZWN0UG9vbDxUIGV4dGVuZHMgUG9vbGFibGUsIEN0b3IgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUPiB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vYmplY3RzQnlLZXk6IHtba2V5OiBzdHJpbmddOiBBcnJheTxUPiB8IHZvaWR9ID0ge307XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF93ZWFrT2JqZWN0c0J5S2V5OiB7W2tleTogc3RyaW5nXTogQXJyYXk8e29iamVjdDogVDsgdGltZW91dElkOiBUaW1lb3V0SWR9PiB8IHZvaWR9ID0ge307XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9DdG9yOiBDdG9yO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihjdG9yOiBDdG9yKSB7XG4gICAgICAgIHRoaXMuX0N0b3IgPSBjdG9yO1xuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgdHdvIGRpZmZlcmVudCB3YXlzIHdlIGNhbiByZWdpc3RlciBhbiBvYmplY3QgZm9yIHJldXNlIC0gd2VhayBhbmQgc3Ryb25nLiBUaGlzIG9uZSxcbiAgICAvLyBzdHJvbmcsIHdpbGwgbWFrZSBzdXJlIHRoYXQgdGhlIG9iamVjdCBpcyBrZXB0IGluIHRoZSBwb29sIHVudGlsIGl0IGlzIGV4cGxpY2l0bHkgcmVtb3ZlZC5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT2JqZWN0Rm9yUmV1c2VTdHJvbmcob2JqZWN0OiBUKSB7XG4gICAgICAgIHRoaXMuX3VucmVnaXN0ZXJPYmplY3RGb3JSZXVzZVdlYWtJZkV4aXN0cyhvYmplY3QpO1xuICAgICAgICBjb25zdCBvYmplY3RLZXkgPSBvYmplY3QuX19wb29sS2V5O1xuICAgICAgICBjb25zdCBwb29sZWRPYmplY3RzID0gdGhpcy5fb2JqZWN0c0J5S2V5W29iamVjdEtleV07XG4gICAgICAgIGlmIChwb29sZWRPYmplY3RzKSB7XG4gICAgICAgICAgICBwb29sZWRPYmplY3RzLnB1c2gob2JqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX29iamVjdHNCeUtleVtvYmplY3RLZXldID0gW29iamVjdF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB1bnJlZ2lzdGVyT2JqZWN0Rm9yUmV1c2VTdHJvbmcob2JqZWN0OiBUKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdEtleSA9IG9iamVjdC5fX3Bvb2xLZXk7XG4gICAgICAgIGNvbnN0IHBvb2xlZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzQnlLZXlbb2JqZWN0S2V5XTtcbiAgICAgICAgaW52YXJpYW50KHBvb2xlZE9iamVjdHMsICdwb29sZWRPYmplY3RzJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcG9vbGVkT2JqZWN0cy5pbmRleE9mKG9iamVjdCk7XG4gICAgICAgIGludmFyaWFudChpbmRleCAhPT0gLTEsICdvYmplY3Qgbm90IHJlZ2lzdGVyZWQnKTtcbiAgICAgICAgcG9vbGVkT2JqZWN0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpZiAocG9vbGVkT2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGBkZWxldGVgIGNhdXNlcyBkZS1vcHRzLCB3aGljaCBzbG93cyBkb3duIHN1YnNlcXVlbnQgcmVhZHMsXG4gICAgICAgICAgICAvLyBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWQgKHVudmVyaWZpZWQgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGZhc3RlcikuXG4gICAgICAgICAgICB0aGlzLl9vYmplY3RzQnlLZXlbb2JqZWN0S2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgdHdvIGRpZmZlcmVudCB3YXlzIHdlIGNhbiByZWdpc3RlciBhbiBvYmplY3QgZm9yIHJldXNlIC0gd2VhayBhbmQgc3Ryb25nLiBUaGlzIG9uZSxcbiAgICAvLyB3ZWFrLCB3aWxsIGF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlciB0aGUgb2JqZWN0IGFmdGVyIGEgZmV3IHNlY29uZHMgZ28gYnkgd2l0aG91dCBpdCBiZWluZ1xuICAgIC8vIHVzZWQuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcmVnaXN0ZXJPYmplY3RGb3JSZXVzZVdlYWsob2JqZWN0OiBUKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdEtleSA9IG9iamVjdC5fX3Bvb2xLZXk7XG4gICAgICAgIGNvbnN0IHBvb2xlZE9iamVjdHMgPSB0aGlzLl93ZWFrT2JqZWN0c0J5S2V5W29iamVjdEtleV07XG5cbiAgICAgICAgY29uc3QgdG9TdG9yZSA9IHtcbiAgICAgICAgICAgIG9iamVjdCxcbiAgICAgICAgICAgIHRpbWVvdXRJZDogc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLl91bnJlZ2lzdGVyT2JqZWN0Rm9yUmV1c2VXZWFrSWZFeGlzdHMob2JqZWN0KSxcbiAgICAgICAgICAgICAgICBXRUFLX1JFVEFJTl9USU1FX01TLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocG9vbGVkT2JqZWN0cykge1xuICAgICAgICAgICAgcG9vbGVkT2JqZWN0cy5wdXNoKHRvU3RvcmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd2Vha09iamVjdHNCeUtleVtvYmplY3RLZXldID0gW3RvU3RvcmVdO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfdW5yZWdpc3Rlck9iamVjdEZvclJldXNlV2Vha0lmRXhpc3RzKG9iamVjdDogVCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBvYmplY3RLZXkgPSBvYmplY3QuX19wb29sS2V5O1xuICAgICAgICBjb25zdCBwb29sZWRPYmplY3RzID0gdGhpcy5fd2Vha09iamVjdHNCeUtleVtvYmplY3RLZXldO1xuICAgICAgICBpZiAoIXBvb2xlZE9iamVjdHMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IHBvb2xlZE9iamVjdHMuZmluZEluZGV4KHN0b3JlZCA9PiBzdG9yZWQub2JqZWN0ID09PSBvYmplY3QpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZWQgPSBwb29sZWRPYmplY3RzW2luZGV4XTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHN0b3JlZC50aW1lb3V0SWQpO1xuXG4gICAgICAgIHBvb2xlZE9iamVjdHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaWYgKHBvb2xlZE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBgZGVsZXRlYCBjYXVzZXMgZGUtb3B0cywgd2hpY2ggc2xvd3MgZG93biBzdWJzZXF1ZW50IHJlYWRzLFxuICAgICAgICAgICAgLy8gc28gc2V0IHRvIHVuZGVmaW5lZCBpbnN0ZWFkICh1bnZlcmlmaWVkIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBmYXN0ZXIpLlxuICAgICAgICAgICAgdGhpcy5fd2Vha09iamVjdHNCeUtleVtvYmplY3RLZXldID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRPYmplY3RGb3JSZXVzZVN0cm9uZyhrZXk6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcG9vbGVkT2JqZWN0cyA9IHRoaXMuX29iamVjdHNCeUtleVtrZXldO1xuICAgICAgICBpZiAocG9vbGVkT2JqZWN0cykge1xuICAgICAgICAgICAgLy8gV2UgZXhwZWN0IHRoYXQgdGhlcmUgd29uJ3QgYmUgdG9vIG1hbnkgUXVlcnlSZXN1bHRzIGZvciBhIGdpdmVuXG4gICAgICAgICAgICAvLyBtb2RlbCwgc28gaXRlcmF0aW5nIG92ZXIgdGhlbSBzaG91bGQgYmUgb2theS4gSWYgdGhpcyBhc3N1bXB0aW9uXG4gICAgICAgICAgICAvLyBlbmRzIHVwIGJlaW5nIHdyb25nLCB3ZSBjYW4gaGFzaCB0aGUgb3B0cyBvciBzb21ldGhpbmcuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBwb29sZWRPYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdC5fX3Bvb2xLZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRPYmplY3RGb3JSZXVzZVdlYWsoa2V5OiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBvb2xlZE9iamVjdHMgPSB0aGlzLl93ZWFrT2JqZWN0c0J5S2V5W2tleV07XG4gICAgICAgIGlmICghcG9vbGVkT2JqZWN0cykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZWQgPSBwb29sZWRPYmplY3RzLmZpbmQoKHtvYmplY3R9KSA9PiBvYmplY3QuX19wb29sS2V5ID09PSBrZXkpO1xuICAgICAgICBpZiAoIXN0b3JlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7b2JqZWN0LCB0aW1lb3V0SWR9ID0gc3RvcmVkO1xuXG4gICAgICAgIC8vIHJlc2V0IHRoZSB0aW1lciBvbiB0aGlzIG9iamVjdCBpZiBpdCdzIHJldXNlZFxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgc3RvcmVkLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLl91bnJlZ2lzdGVyT2JqZWN0Rm9yUmV1c2VXZWFrSWZFeGlzdHMob2JqZWN0KSxcbiAgICAgICAgICAgIFdFQUtfUkVUQUlOX1RJTUVfTVMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXRPYmplY3RGb3JSZXVzZSguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8Q3Rvcj4pOiBUIHtcbiAgICAgICAgY29uc3QgbmV3T2JqZWN0ID0gbmV3IHRoaXMuX0N0b3IoLi4uYXJncyk7XG4gICAgICAgIGNvbnN0IGtleSA9IG5ld09iamVjdC5fX3Bvb2xLZXk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nT2JqZWN0ID1cbiAgICAgICAgICAgIHRoaXMuX2dldE9iamVjdEZvclJldXNlU3Ryb25nKGtleSkgfHwgdGhpcy5fZ2V0T2JqZWN0Rm9yUmV1c2VXZWFrKGtleSk7XG5cbiAgICAgICAgaWYgKGV4aXN0aW5nT2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdPYmplY3Q7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZWdpc3Rlck9iamVjdEZvclJldXNlV2VhayhuZXdPYmplY3QpO1xuXG4gICAgICAgIHJldHVybiBuZXdPYmplY3Q7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3RQb29sO1xuIl19
|