@airtable/blocks 1.8.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 +20 -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 +18 -6
- package/dist/cjs/models/create_aggregators.js +2 -1
- package/dist/cjs/models/cursor.js +4 -1
- package/dist/cjs/models/field.js +148 -28
- 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 +5 -2
- package/dist/cjs/models/mutations.js +69 -177
- 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 +24 -14
- 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 +52 -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 +367 -0
- 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 +3 -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 +3 -2
- package/dist/cjs/viewport.js +2 -1
- package/dist/cjs/warning.js +2 -1
- package/dist/cjs/watchable.js +125 -72
- package/dist/types/src/models/base.d.ts +10 -3
- 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 +65 -1
- 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/mutation_constants.d.ts +1 -0
- package/dist/types/src/models/mutation_constants.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 +8 -4
- 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 +30 -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/{mock_airtable_interface.d.ts → abstract_mock_airtable_interface.d.ts} +20 -15
- package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -0
- 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 +80 -44
- package/dist/types/src/types/field.d.ts.map +1 -1
- package/dist/types/src/types/mutations.d.ts +31 -3
- package/dist/types/src/types/mutations.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/unstable_testing_utils.d.ts +1 -1
- package/dist/types/src/unstable_testing_utils.d.ts.map +1 -1
- package/dist/types/src/watchable.d.ts.map +1 -1
- package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts +121 -0
- package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +1 -0
- package/dist/types/test/airtable_interface_mocks/linked_records.d.ts +2 -2
- package/dist/types/test/airtable_interface_mocks/linked_records.d.ts.map +1 -1
- package/dist/types/test/airtable_interface_mocks/{mock_airtable_interface_internal.d.ts → mock_airtable_interface.d.ts} +26 -18
- package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -0
- 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/airtable_interface_mocks/project_tracker.d.ts +2 -2
- package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts.map +1 -1
- 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
- package/dist/cjs/testing/mock_airtable_interface.js +0 -317
- package/dist/types/src/testing/mock_airtable_interface.d.ts.map +0 -1
- package/dist/types/test/airtable_interface_mocks/mock_airtable_interface_internal.d.ts.map +0 -1
|
@@ -424,4 +424,5 @@ function (_AbstractModel) {
|
|
|
424
424
|
|
|
425
425
|
(0, _defineProperty2.default)(Session, "_className", 'Session');
|
|
426
426
|
var _default = Session;
|
|
427
|
-
exports.default = _default;
|
|
427
|
+
exports.default = _default;
|
|
428
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvc2Vzc2lvbi50cyJdLCJuYW1lcyI6WyJXYXRjaGFibGVTZXNzaW9uS2V5cyIsIk9iamVjdCIsImZyZWV6ZSIsInBlcm1pc3Npb25MZXZlbCIsImN1cnJlbnRVc2VyIiwiU2Vzc2lvbiIsImtleSIsInNkayIsIl9haXJ0YWJsZUludGVyZmFjZSIsIl9fYWlydGFibGVJbnRlcmZhY2UiLCJzZGtJbml0RGF0YSIsImJhc2VEYXRhIiwiY3VycmVudFVzZXJJZCIsImVuYWJsZWRGZWF0dXJlTmFtZXMiLCJfc2Vzc2lvbkRhdGEiLCJzZWFsIiwiX3NkayIsIl9fbXV0YXRpb25zIiwiY2hlY2tQZXJtaXNzaW9uc0Zvck11dGF0aW9uIiwidHlwZSIsIk11dGF0aW9uVHlwZXMiLCJTRVRfTVVMVElQTEVfUkVDT1JEU19DRUxMX1ZBTFVFUyIsInRhYmxlSWQiLCJ1bmRlZmluZWQiLCJyZWNvcmRzIiwiY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZVJlY29yZHMiLCJoYXNQZXJtaXNzaW9uIiwiQ1JFQVRFX01VTFRJUExFX1JFQ09SRFMiLCJjaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlUmVjb3JkcyIsIkRFTEVURV9NVUxUSVBMRV9SRUNPUkRTIiwicmVjb3JkSWRzIiwiY2hlY2tQZXJtaXNzaW9uc0ZvckRlbGV0ZVJlY29yZHMiLCJmZWF0dXJlTmFtZSIsInRyYWNrRXhwb3N1cmUiLCJfX3BlZWtJZkZlYXR1cmVJc0VuYWJsZWQiLCJpbmNsdWRlcyIsImNoYW5nZXMiLCJjaGFuZ2VkS2V5cyIsInBhdGgiLCJ2YWx1ZSIsImxlbmd0aCIsImRpZENoYW5nZSIsIl9vbkNoYW5nZSIsInVzZXJJZCIsImJhc2UiLCJnZXRDb2xsYWJvcmF0b3JCeUlkSWZFeGlzdHMiLCJBYnN0cmFjdE1vZGVsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFNQTs7QUFDQTs7QUFDQTs7QUFUQTs7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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNckY7Ozt3QkExTnVDO0FBQ3BDLGFBQU8sS0FBS1EsWUFBWjtBQUNIO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7d0JBc0IyQztBQUN2QyxVQUFNNkIsTUFBTSxHQUFHLEtBQUs3QixZQUFMLENBQWtCRixhQUFqQzs7QUFDQSxVQUFJLENBQUMrQixNQUFMLEVBQWE7QUFDVCxlQUFPLElBQVA7QUFDSCxPQUZELE1BRU87QUFBQSxZQUNJQyxJQURKLEdBQ1ksS0FBSzVCLElBRGpCLENBQ0k0QixJQURKO0FBRUgsZUFBT0EsSUFBSSxDQUFDQywyQkFBTCxDQUFpQ0YsTUFBakMsQ0FBUDtBQUNIO0FBQ0o7OztFQXRFaUJHLHVCOzs4QkFBaEJ6QyxPLGdCQUVrQixTO2VBK1BUQSxPIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGFpcnRhYmxlL2Jsb2Nrcy9tb2RlbHM6IFNlc3Npb24gKi8gLyoqICovXG5pbXBvcnQge2ludmFyaWFudH0gZnJvbSAnLi4vZXJyb3JfdXRpbHMnO1xuaW1wb3J0IFNkayBmcm9tICcuLi9zZGsnO1xuaW1wb3J0IHtBaXJ0YWJsZUludGVyZmFjZX0gZnJvbSAnLi4vdHlwZXMvYWlydGFibGVfaW50ZXJmYWNlJztcbmltcG9ydCB7TW9kZWxDaGFuZ2V9IGZyb20gJy4uL3R5cGVzL2Jhc2UnO1xuaW1wb3J0IHtDb2xsYWJvcmF0b3JEYXRhLCBVc2VySWR9IGZyb20gJy4uL3R5cGVzL2NvbGxhYm9yYXRvcic7XG5pbXBvcnQge1Blcm1pc3Npb25MZXZlbH0gZnJvbSAnLi4vdHlwZXMvcGVybWlzc2lvbl9sZXZlbHMnO1xuaW1wb3J0IHtpc0VudW1WYWx1ZSwgZW50cmllcywgT2JqZWN0VmFsdWVzLCBPYmplY3RNYXB9IGZyb20gJy4uL3ByaXZhdGVfdXRpbHMnO1xuaW1wb3J0IHtQZXJtaXNzaW9uQ2hlY2tSZXN1bHQsIE11dGF0aW9uVHlwZXN9IGZyb20gJy4uL3R5cGVzL211dGF0aW9ucyc7XG5pbXBvcnQgQWJzdHJhY3RNb2RlbCBmcm9tICcuL2Fic3RyYWN0X21vZGVsJztcblxuLyoqIEBoaWRkZW4gKi9cbmludGVyZmFjZSBTZXNzaW9uRGF0YSB7XG4gICAgLy8gY3VycmVudFVzZXJJZCB3aWxsIGJlIG51bGwgZm9yIGJhY2tlbmQgYmxvY2sgcmVxdWVzdHMgYW5kIHB1YmxpY2x5IHNoYXJlZCBiYXNlcy5cbiAgICBjdXJyZW50VXNlcklkOiBVc2VySWQgfCBudWxsO1xuICAgIHBlcm1pc3Npb25MZXZlbDogUGVybWlzc2lvbkxldmVsO1xuICAgIGVuYWJsZWRGZWF0dXJlTmFtZXM6IEFycmF5PHN0cmluZz47XG59XG5cbmNvbnN0IFdhdGNoYWJsZVNlc3Npb25LZXlzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgcGVybWlzc2lvbkxldmVsOiAncGVybWlzc2lvbkxldmVsJyBhcyBjb25zdCxcblxuICAgIC8vIE5PVEU6IHRoZSBjdXJyZW50IHVzZXIncyBpZGVudGl0eSB3aWxsIG5ldmVyIGNoYW5nZSwgYnV0IHRoZWlyIG5hbWUvZW1haWwvcHJvZmlsZSBwaWMvZXRjLiBjYW4uXG4gICAgY3VycmVudFVzZXI6ICdjdXJyZW50VXNlcicgYXMgY29uc3QsXG59KTtcblxuLyoqXG4gKiBXYXRjaGFibGUga2V5cyBpbiB7QGxpbmsgU2Vzc2lvbn0uXG4gKiAtIGBjdXJyZW50VXNlcmBcbiAqIC0gYHBlcm1pc3Npb25MZXZlbGBcbiAqL1xudHlwZSBXYXRjaGFibGVTZXNzaW9uS2V5ID0gT2JqZWN0VmFsdWVzPHR5cGVvZiBXYXRjaGFibGVTZXNzaW9uS2V5cz47XG5cbi8qKlxuICogTW9kZWwgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHVzZXIncyBzZXNzaW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogaW1wb3J0IHt1c2VTZXNzaW9ufSBmcm9tICdAYWlydGFibGUvYmxvY2tzL3VpJztcbiAqXG4gKiBmdW5jdGlvbiBVc2VybmFtZSgpIHtcbiAqICAgICBjb25zdCBzZXNzaW9uID0gdXNlU2Vzc2lvbigpO1xuICpcbiAqICAgICBpZiAoc2Vzc2lvbi5jdXJyZW50VXNlciAhPT0gbnVsbCkge1xuICogICAgICAgICByZXR1cm4gPHNwYW4+VGhlIGN1cnJlbnQgdXNlcidzIG5hbWUgaXMge3Nlc3Npb24uY3VycmVudFVzZXIubmFtZX08L3NwYW4+O1xuICogICAgIH0gZWxzZSB7XG4gKiAgICAgICAgIHJldHVybiA8c3Bhbj5UaGlzIGFwcCBpcyBiZWluZyB2aWV3ZWQgaW4gYSBwdWJsaWMgc2hhcmU8L3NwYW4+O1xuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICogQGRvY3NQYXRoIG1vZGVscy9TZXNzaW9uXG4gKi9cbmNsYXNzIFNlc3Npb24gZXh0ZW5kcyBBYnN0cmFjdE1vZGVsPFNlc3Npb25EYXRhLCBXYXRjaGFibGVTZXNzaW9uS2V5PiB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfY2xhc3NOYW1lID0gJ1Nlc3Npb24nO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX2lzV2F0Y2hhYmxlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc0VudW1WYWx1ZShXYXRjaGFibGVTZXNzaW9uS2V5cywga2V5KTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9haXJ0YWJsZUludGVyZmFjZTogQWlydGFibGVJbnRlcmZhY2U7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9zZXNzaW9uRGF0YTogU2Vzc2lvbkRhdGE7XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzZGs6IFNkaykge1xuICAgICAgICBzdXBlcihzZGssICdzZXNzaW9uJyk7XG4gICAgICAgIHRoaXMuX2FpcnRhYmxlSW50ZXJmYWNlID0gc2RrLl9fYWlydGFibGVJbnRlcmZhY2U7XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcGVybWlzc2lvbkxldmVsLFxuICAgICAgICAgICAgY3VycmVudFVzZXJJZCxcbiAgICAgICAgICAgIGVuYWJsZWRGZWF0dXJlTmFtZXMsXG4gICAgICAgIH0gPSB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5zZGtJbml0RGF0YS5iYXNlRGF0YTtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkRhdGEgPSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9uTGV2ZWwsXG4gICAgICAgICAgICBjdXJyZW50VXNlcklkLFxuICAgICAgICAgICAgZW5hYmxlZEZlYXR1cmVOYW1lcyxcbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3Quc2VhbCh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgX2RhdGFPck51bGxJZkRlbGV0ZWQoKTogU2Vzc2lvbkRhdGEge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbkRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdXNlciwgb3IgYG51bGxgIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiBhIHB1YmxpY2x5IHNoYXJlZCBiYXNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7dXNlU2Vzc2lvbn0gZnJvbSAnQGFpcnRhYmxlL2Jsb2Nrcy91aSc7XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBDdXJyZW50VXNlcigpIHtcbiAgICAgKiAgICAgY29uc3Qgc2Vzc2lvbiA9IHVzZVNlc3Npb24oKTtcbiAgICAgKlxuICAgICAqICAgICBpZiAoIXNlc3Npb24uY3VycmVudFVzZXIpIHtcbiAgICAgKiAgICAgICAgIHJldHVybiA8ZGl2PlRoaXMgYXBwIGlzIGJlaW5nIHVzZWQgaW4gYSBwdWJsaWMgc2hhcmUuPC9kaXY+O1xuICAgICAqICAgICB9XG4gICAgICpcbiAgICAgKiAgICAgcmV0dXJuIDx1bD5cbiAgICAgKiAgICAgICAgIDxsaT5JRDoge3Nlc3Npb24uY3VycmVudFVzZXIuaWR9PC9saT5cbiAgICAgKiAgICAgICAgIDxsaT5FLW1haWw6IHtzZXNzaW9uLmN1cnJlbnRVc2VyLmVtYWlsfTwvbGk+XG4gICAgICogICAgICAgICA8bGk+TmFtZToge3Nlc3Npb24uY3VycmVudFVzZXIubmFtZX08L2xpPlxuICAgICAqICAgICA8L3VsPjtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRVc2VyKCk6IENvbGxhYm9yYXRvckRhdGEgfCBudWxsIHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gdGhpcy5fc2Vzc2lvbkRhdGEuY3VycmVudFVzZXJJZDtcbiAgICAgICAgaWYgKCF1c2VySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qge2Jhc2V9ID0gdGhpcy5fc2RrO1xuICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0Q29sbGFib3JhdG9yQnlJZElmRXhpc3RzKHVzZXJJZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXNlciBoYXMgcGVybWlzc2lvbiB0byB1cGRhdGUgYW55IHJlY29yZHMgaW4gdGhlIGN1cnJlbnQgYmFzZS4gRm9yXG4gICAgICogbW9yZSBncmFudWxhciBwZXJtaXNzaW9uIGNoZWNrcywgc2VlIHtAbGluayBUYWJsZS5jaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3Jkc30uXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGB7aGFzUGVybWlzc2lvbjogdHJ1ZX1gIGlmIHRoZSBjdXJyZW50IHVzZXIgY2FuIHVwZGF0ZSByZWNvcmRzLFxuICAgICAqIGB7aGFzUGVybWlzc2lvbjogZmFsc2UsIHJlYXNvbkRpc3BsYXlTdHJpbmc6IHN0cmluZ31gIG90aGVyd2lzZS4gYHJlYXNvbkRpc3BsYXlTdHJpbmdgIG1heVxuICAgICAqIGJlIHVzZWQgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7dXNlU2Vzc2lvbn0gZnJvbSAnQGFpcnRhYmxlL2Jsb2Nrcy91aSc7XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBVcGRhdGVCdXR0b24oe29uQ2xpY2t9KSB7XG4gICAgICogICAgIGNvbnN0IHNlc3Npb24gPSB1c2VTZXNzaW9uKCk7XG4gICAgICogICAgIGNvbnN0IHVwZGF0ZVJlY29yZHNDaGVja1Jlc3VsdCA9IHNlc3Npb24uY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZVJlY29yZHMoKTtcbiAgICAgKiAgICAgY29uc3QgZGVuaWVkUmVhc29uID0gdXBkYXRlUmVjb3Jkc0NoZWNrUmVzdWx0Lmhhc1Blcm1pc3Npb25cbiAgICAgKiAgICAgICAgID8gPHNwYW4+e3VwZGF0ZVJlY29yZHNDaGVja1Jlc3VsdC5yZWFzb25EaXNwbGF5U3RyaW5nfTwvc3Bhbj5cbiAgICAgKiAgICAgICAgIDogbnVsbDtcbiAgICAgKlxuICAgICAqICAgICByZXR1cm4gPGRpdj5cbiAgICAgKiAgICAgICAgIHtkZW5pZWRSZWFzb259XG4gICAgICogICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e29uQ2xpY2t9IGRpc2FibGVkPXshIWRlbmllZFJlYXNvbn0+XG4gICAgICogICAgICAgICAgICAgVXBkYXRlXG4gICAgICogICAgICAgICA8L2J1dHRvbj5cbiAgICAgKiAgICAgPC9kaXY+O1xuICAgICAqIH1cbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3JkcygpOiBQZXJtaXNzaW9uQ2hlY2tSZXN1bHQge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2RrLl9fbXV0YXRpb25zLmNoZWNrUGVybWlzc2lvbnNGb3JNdXRhdGlvbih7XG4gICAgICAgICAgICB0eXBlOiBNdXRhdGlvblR5cGVzLlNFVF9NVUxUSVBMRV9SRUNPUkRTX0NFTExfVkFMVUVTLFxuICAgICAgICAgICAgdGFibGVJZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVjb3JkczogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYWxpYXMgZm9yIGBzZXNzaW9uLmNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVSZWNvcmRzKCkuaGFzUGVybWlzc2lvbmAuIEZvciBtb3JlIGdyYW51bGFyXG4gICAgICogcGVybWlzc2lvbiBjaGVja3MsIHNlZSB7QGxpbmsgVGFibGUuaGFzUGVybWlzc2lvblRvVXBkYXRlUmVjb3Jkc30uXG4gICAgICovXG4gICAgaGFzUGVybWlzc2lvblRvVXBkYXRlUmVjb3JkcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZVJlY29yZHMoKS5oYXNQZXJtaXNzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbnkgcmVjb3JkcyBpbiB0aGUgY3VycmVudCBiYXNlLiBGb3JcbiAgICAgKiBtb3JlIGdyYW51bGFyIHBlcm1pc3Npb24gY2hlY2tzLCBzZWUge0BsaW5rIFRhYmxlLmNoZWNrUGVybWlzc2lvbnNGb3JDcmVhdGVSZWNvcmRzfS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gY3JlYXRlIHJlY29yZHMsXG4gICAgICogYHtoYXNQZXJtaXNzaW9uOiBmYWxzZSwgcmVhc29uRGlzcGxheVN0cmluZzogc3RyaW5nfWAgb3RoZXJ3aXNlLiBgcmVhc29uRGlzcGxheVN0cmluZ2AgbWF5IGJlXG4gICAgICogdXNlZCB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHt1c2VTZXNzaW9ufSBmcm9tICdAYWlydGFibGUvYmxvY2tzL3VpJztcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIENyZWF0ZUJ1dHRvbih7b25DbGlja30pIHtcbiAgICAgKiAgICAgY29uc3Qgc2Vzc2lvbiA9IHVzZVNlc3Npb24oKTtcbiAgICAgKiAgICAgY29uc3QgdXBkYXRlUmVjb3Jkc0NoZWNrUmVzdWx0ID0gc2Vzc2lvbi5jaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlUmVjb3JkcygpO1xuICAgICAqICAgICBjb25zdCBkZW5pZWRSZWFzb24gPSB1cGRhdGVSZWNvcmRzQ2hlY2tSZXN1bHQuaGFzUGVybWlzc2lvblxuICAgICAqICAgICAgICAgPyA8c3Bhbj57dXBkYXRlUmVjb3Jkc0NoZWNrUmVzdWx0LnJlYXNvbkRpc3BsYXlTdHJpbmd9PC9zcGFuPlxuICAgICAqICAgICAgICAgOiBudWxsO1xuICAgICAqXG4gICAgICogICAgIHJldHVybiA8ZGl2PlxuICAgICAqICAgICAgICAge2RlbmllZFJlYXNvbn1cbiAgICAgKiAgICAgICAgIDxidXR0b24gb25DbGljaz17b25DbGlja30gZGlzYWJsZWQ9eyEhZGVuaWVkUmVhc29ufT5cbiAgICAgKiAgICAgICAgICAgICBDcmVhdGVcbiAgICAgKiAgICAgICAgIDwvYnV0dG9uPlxuICAgICAqICAgICA8L2Rpdj47XG4gICAgICogfVxuICAgICAqL1xuICAgIGNoZWNrUGVybWlzc2lvbnNGb3JDcmVhdGVSZWNvcmRzKCk6IFBlcm1pc3Npb25DaGVja1Jlc3VsdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZGsuX19tdXRhdGlvbnMuY2hlY2tQZXJtaXNzaW9uc0Zvck11dGF0aW9uKHtcbiAgICAgICAgICAgIHR5cGU6IE11dGF0aW9uVHlwZXMuQ1JFQVRFX01VTFRJUExFX1JFQ09SRFMsXG4gICAgICAgICAgICB0YWJsZUlkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByZWNvcmRzOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhbGlhcyBmb3IgYHNlc3Npb24uY2hlY2tQZXJtaXNzaW9uc0ZvckNyZWF0ZVJlY29yZHMoKS5oYXNQZXJtaXNzaW9uYC4gRm9yIG1vcmUgZ3JhbnVsYXJcbiAgICAgKiBwZXJtaXNzaW9uIGNoZWNrcywgc2VlIHtAbGluayBUYWJsZS5oYXNQZXJtaXNzaW9uVG9DcmVhdGVSZWNvcmRzfS5cbiAgICAgKi9cbiAgICBoYXNQZXJtaXNzaW9uVG9DcmVhdGVSZWNvcmRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlUmVjb3JkcygpLmhhc1Blcm1pc3Npb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGFueSByZWNvcmRzIGluIHRoZSBjdXJyZW50IGJhc2UuIEZvclxuICAgICAqIG1vcmUgZ3JhbnVsYXIgcGVybWlzc2lvbiBjaGVja3MsIHNlZSB7QGxpbmsgVGFibGUuY2hlY2tQZXJtaXNzaW9uc0ZvckRlbGV0ZVJlY29yZHN9LlxuICAgICAqXG4gICAgICogUmV0dXJucyBge2hhc1Blcm1pc3Npb246IHRydWV9YCBpZiB0aGUgY3VycmVudCB1c2VyIGNhbiBkZWxldGUgcmVjb3JkcyxcbiAgICAgKiBge2hhc1Blcm1pc3Npb246IGZhbHNlLCByZWFzb25EaXNwbGF5U3RyaW5nOiBzdHJpbmd9YCBvdGhlcndpc2UuIGByZWFzb25EaXNwbGF5U3RyaW5nYCBtYXkgYmVcbiAgICAgKiB1c2VkIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQge3VzZVNlc3Npb259IGZyb20gJ0BhaXJ0YWJsZS9ibG9ja3MvdWknO1xuICAgICAqXG4gICAgICogZnVuY3Rpb24gRGVsZXRlQnV0dG9uKHtvbkNsaWNrfSkge1xuICAgICAqICAgICBjb25zdCBzZXNzaW9uID0gdXNlU2Vzc2lvbigpO1xuICAgICAqICAgICBjb25zdCB1cGRhdGVSZWNvcmRzQ2hlY2tSZXN1bHQgPSBzZXNzaW9uLmNoZWNrUGVybWlzc2lvbnNGb3JEZWxldGVSZWNvcmRzKCk7XG4gICAgICogICAgIGNvbnN0IGRlbmllZFJlYXNvbiA9IHVwZGF0ZVJlY29yZHNDaGVja1Jlc3VsdC5oYXNQZXJtaXNzaW9uXG4gICAgICogICAgICAgICA/IDxzcGFuPnt1cGRhdGVSZWNvcmRzQ2hlY2tSZXN1bHQucmVhc29uRGlzcGxheVN0cmluZ308L3NwYW4+XG4gICAgICogICAgICAgICA6IG51bGw7XG4gICAgICpcbiAgICAgKiAgICAgcmV0dXJuIDxkaXY+XG4gICAgICogICAgICAgICB7ZGVuaWVkUmVhc29ufVxuICAgICAqICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtvbkNsaWNrfSBkaXNhYmxlZD17ISFkZW5pZWRSZWFzb259PlxuICAgICAqICAgICAgICAgICAgIERlbGV0ZVxuICAgICAqICAgICAgICAgPC9idXR0b24+XG4gICAgICogICAgIDwvZGl2PjtcbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yRGVsZXRlUmVjb3JkcygpOiBQZXJtaXNzaW9uQ2hlY2tSZXN1bHQge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2RrLl9fbXV0YXRpb25zLmNoZWNrUGVybWlzc2lvbnNGb3JNdXRhdGlvbih7XG4gICAgICAgICAgICB0eXBlOiBNdXRhdGlvblR5cGVzLkRFTEVURV9NVUxUSVBMRV9SRUNPUkRTLFxuICAgICAgICAgICAgdGFibGVJZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVjb3JkSWRzOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhbGlhcyBmb3IgYHNlc3Npb24uY2hlY2tQZXJtaXNzaW9uc0ZvckRlbGV0ZVJlY29yZHMoKS5oYXNQZXJtaXNzaW9uYC4gRm9yIG1vcmUgZ3JhbnVsYXJcbiAgICAgKiBwZXJtaXNzaW9uIGNoZWNrcywgc2VlIHtAbGluayBUYWJsZS5oYXNQZXJtaXNzaW9uVG9EZWxldGVSZWNvcmRzfS5cbiAgICAgKi9cbiAgICBoYXNQZXJtaXNzaW9uVG9EZWxldGVSZWNvcmRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1Blcm1pc3Npb25zRm9yRGVsZXRlUmVjb3JkcygpLmhhc1Blcm1pc3Npb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBgZmVhdHVyZU5hbWVgIGlzIGVuYWJsZWQgYW5kIGF1dG9tYXRpY2FsbHkgdHJhY2tzIGFuIGV4cG9zdXJlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX19pc0ZlYXR1cmVFbmFibGVkKGZlYXR1cmVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5fYWlydGFibGVJbnRlcmZhY2UudHJhY2tFeHBvc3VyZShmZWF0dXJlTmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9fcGVla0lmRmVhdHVyZUlzRW5hYmxlZChmZWF0dXJlTmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGBmZWF0dXJlTmFtZWAgaXMgZW5hYmxlZDsgZG9lcyBub3QgdHJhY2sgYW4gZXhwb3N1cmUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfX3BlZWtJZkZlYXR1cmVJc0VuYWJsZWQoZmVhdHVyZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbkRhdGEuZW5hYmxlZEZlYXR1cmVOYW1lcy5pbmNsdWRlcyhmZWF0dXJlTmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX19hcHBseUNoYW5nZXNXaXRob3V0VHJpZ2dlcmluZ0V2ZW50cyhcbiAgICAgICAgY2hhbmdlczogUmVhZG9ubHlBcnJheTxNb2RlbENoYW5nZT4sXG4gICAgKTogT2JqZWN0TWFwPFdhdGNoYWJsZVNlc3Npb25LZXksIGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlZEtleXMgPSB7XG4gICAgICAgICAgICBbV2F0Y2hhYmxlU2Vzc2lvbktleXMucGVybWlzc2lvbkxldmVsXTogZmFsc2UsXG4gICAgICAgICAgICBbV2F0Y2hhYmxlU2Vzc2lvbktleXMuY3VycmVudFVzZXJdOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB7cGF0aCwgdmFsdWV9IG9mIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGlmIChwYXRoWzBdID09PSAncGVybWlzc2lvbkxldmVsJykge1xuICAgICAgICAgICAgICAgIGludmFyaWFudChwYXRoLmxlbmd0aCA9PT0gMSwgJ2Nhbm5vdCBzZXQgd2l0aGluIHBlcm1pc3Npb25MZXZlbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gTk9URToganVzdCB2ZXJpZnkgdGhhdCB0aGUgcGVybWlzc2lvbiBsZXZlbCBpcyBhIHN0cmluZyAocmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAvLyBjaGVja2luZyBpc0VudW1WYWx1ZSBhZ2FpbnN0IFBlcm1pc3Npb25MZXZlbHMpIGluIGNhc2UgbmV3IHBlcm1pc3Npb25cbiAgICAgICAgICAgICAgICAvLyBsZXZlbHMgYXJlIGFkZGVkIG9uIHRoZSBsaXZlYXBwIHNpZGUuIFBlcm1pc3Npb25zIGJlaGF2aW9yIGdldHMgcm91dGVkXG4gICAgICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgY2hlY2tQZXJtaXNzaW9uc0Zvck11dGF0aW9uIEFpcnRhYmxlSW50ZXJmYWNlIGhlbHBlciwgc28gd2VcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byBoYW5kbGUgdW5rbm93biBwZXJtaXNzaW9uIGxldmVscy5cbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJywgJ3Blcm1pc3Npb25MZXZlbCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9zZXNzaW9uRGF0YS5wZXJtaXNzaW9uTGV2ZWwgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgY2hhbmdlZEtleXNbV2F0Y2hhYmxlU2Vzc2lvbktleXMucGVybWlzc2lvbkxldmVsXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE8oZW1tYSk6IGZpcmUgY2hhbmdlIG9ubHkgd2hlbiB0aGUgY3VycmVudCB1c2VyJ3MgaW5mbyBjaGFuZ2VzXG4gICAgICAgICAgICBpZiAocGF0aFswXSA9PT0gJ2NvbGxhYm9yYXRvcnNCeUlkJykge1xuICAgICAgICAgICAgICAgIGNoYW5nZWRLZXlzW1dhdGNoYWJsZVNlc3Npb25LZXlzLmN1cnJlbnRVc2VyXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hhbmdlZEtleXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9fdHJpZ2dlck9uQ2hhbmdlRm9yQ2hhbmdlZEtleXMoY2hhbmdlZEtleXM6IE9iamVjdE1hcDxXYXRjaGFibGVTZXNzaW9uS2V5LCBib29sZWFuPikge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpZENoYW5nZV0gb2YgZW50cmllcyhjaGFuZ2VkS2V5cykpIHtcbiAgICAgICAgICAgIGlmIChkaWRDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZXNzaW9uO1xuIl19
|
package/dist/cjs/models/table.js
CHANGED
|
@@ -1735,6 +1735,7 @@ function (_AbstractModel) {
|
|
|
1735
1735
|
* @param name name for the field. must be case-insensitive unique for the table
|
|
1736
1736
|
* @param type type for the field
|
|
1737
1737
|
* @param options options for the field. omit for fields without writable options
|
|
1738
|
+
* @param description description for the field. omit to leave blank
|
|
1738
1739
|
*
|
|
1739
1740
|
* @example
|
|
1740
1741
|
* ```js
|
|
@@ -1748,7 +1749,7 @@ function (_AbstractModel) {
|
|
|
1748
1749
|
|
|
1749
1750
|
}, {
|
|
1750
1751
|
key: "checkPermissionsForCreateField",
|
|
1751
|
-
value: function checkPermissionsForCreateField(name, type, options) {
|
|
1752
|
+
value: function checkPermissionsForCreateField(name, type, options, description) {
|
|
1752
1753
|
return this._sdk.__mutations.checkPermissionsForMutation({
|
|
1753
1754
|
type: _mutations.MutationTypes.CREATE_SINGLE_FIELD,
|
|
1754
1755
|
tableId: this.id,
|
|
@@ -1759,11 +1760,12 @@ function (_AbstractModel) {
|
|
|
1759
1760
|
type: type
|
|
1760
1761
|
}, options ? {
|
|
1761
1762
|
options
|
|
1762
|
-
} : null) : undefined
|
|
1763
|
+
} : null) : undefined,
|
|
1764
|
+
description
|
|
1763
1765
|
});
|
|
1764
1766
|
}
|
|
1765
1767
|
/**
|
|
1766
|
-
* An alias for `checkPermissionsForCreateField(name, type, options).hasPermission`.
|
|
1768
|
+
* An alias for `checkPermissionsForCreateField(name, type, options, description).hasPermission`.
|
|
1767
1769
|
*
|
|
1768
1770
|
* Checks whether the current user has permission to create a field in this table.
|
|
1769
1771
|
*
|
|
@@ -1772,6 +1774,7 @@ function (_AbstractModel) {
|
|
|
1772
1774
|
* @param name name for the field. must be case-insensitive unique for the table
|
|
1773
1775
|
* @param type type for the field
|
|
1774
1776
|
* @param options options for the field. omit for fields without writable options
|
|
1777
|
+
* @param description description for the field. omit to leave blank
|
|
1775
1778
|
*
|
|
1776
1779
|
* @example
|
|
1777
1780
|
* ```js
|
|
@@ -1785,8 +1788,8 @@ function (_AbstractModel) {
|
|
|
1785
1788
|
|
|
1786
1789
|
}, {
|
|
1787
1790
|
key: "hasPermissionToCreateField",
|
|
1788
|
-
value: function hasPermissionToCreateField(name, type, options) {
|
|
1789
|
-
return this.checkPermissionsForCreateField(name, type, options).hasPermission;
|
|
1791
|
+
value: function hasPermissionToCreateField(name, type, options, description) {
|
|
1792
|
+
return this.checkPermissionsForCreateField(name, type, options, description).hasPermission;
|
|
1790
1793
|
}
|
|
1791
1794
|
/**
|
|
1792
1795
|
* Creates a new field.
|
|
@@ -1807,6 +1810,8 @@ function (_AbstractModel) {
|
|
|
1807
1810
|
* @param name name for the field. must be case-insensitive unique
|
|
1808
1811
|
* @param type type for the field
|
|
1809
1812
|
* @param options options for the field. omit for fields without writable options
|
|
1813
|
+
* @param description description for the field. is optional and will be `''` if not specified
|
|
1814
|
+
* or if specified as `null`.
|
|
1810
1815
|
*
|
|
1811
1816
|
* @example
|
|
1812
1817
|
* ```js
|
|
@@ -1841,7 +1846,7 @@ function (_AbstractModel) {
|
|
|
1841
1846
|
|
|
1842
1847
|
}, {
|
|
1843
1848
|
key: "createFieldAsync",
|
|
1844
|
-
value: function createFieldAsync(name, type, options) {
|
|
1849
|
+
value: function createFieldAsync(name, type, options, description) {
|
|
1845
1850
|
var fieldId;
|
|
1846
1851
|
return _regenerator.default.async(function createFieldAsync$(_context9) {
|
|
1847
1852
|
while (1) {
|
|
@@ -1858,7 +1863,11 @@ function (_AbstractModel) {
|
|
|
1858
1863
|
type: type
|
|
1859
1864
|
}, options ? {
|
|
1860
1865
|
options
|
|
1861
|
-
} : null)
|
|
1866
|
+
} : null),
|
|
1867
|
+
// Coerce undefined to null so that only old SDKs pass "undefined" for description
|
|
1868
|
+
// '' is permitted, as we already set empty descriptions to '' when editing descriptions
|
|
1869
|
+
// from the UI
|
|
1870
|
+
description: description !== null && description !== void 0 ? description : null
|
|
1862
1871
|
}));
|
|
1863
1872
|
|
|
1864
1873
|
case 3:
|
|
@@ -2015,7 +2024,11 @@ function (_AbstractModel) {
|
|
|
2015
2024
|
if (didViewSchemaChange) {
|
|
2016
2025
|
didTableSchemaChange = true;
|
|
2017
2026
|
}
|
|
2018
|
-
}
|
|
2027
|
+
} // We must directly trigger deletions on the recordStore.viewDataStore
|
|
2028
|
+
// because the viewModel might not have been created. (See above comment)
|
|
2029
|
+
|
|
2030
|
+
|
|
2031
|
+
this._recordStore.sendViewDataDeletionIfViewIsDeleted(_viewId);
|
|
2019
2032
|
}
|
|
2020
2033
|
} catch (err) {
|
|
2021
2034
|
_didIteratorError4 = true;
|
|
@@ -2100,11 +2113,7 @@ function (_AbstractModel) {
|
|
|
2100
2113
|
|
|
2101
2114
|
|
|
2102
2115
|
this._cachedFieldNamesById = null;
|
|
2103
|
-
}
|
|
2104
|
-
// ensure the column type providers are not stale.
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
this._recordStore.triggerOnChangeForDirtyPaths(dirtyPaths);
|
|
2116
|
+
}
|
|
2108
2117
|
|
|
2109
2118
|
return didTableSchemaChange;
|
|
2110
2119
|
}
|
|
@@ -2283,4 +2292,5 @@ function (_AbstractModel) {
|
|
|
2283
2292
|
|
|
2284
2293
|
(0, _defineProperty2.default)(Table, "_className", 'Table');
|
|
2285
2294
|
var _default = Table;
|
|
2286
|
-
exports.default = _default;
|
|
2295
|
+
exports.default = _default;
|
|
2296
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvdGFibGUudHMiXSwibmFtZXMiOlsiV2F0Y2hhYmxlVGFibGVLZXlzIiwiT2JqZWN0IiwiZnJlZXplIiwibmFtZSIsImRlc2NyaXB0aW9uIiwidmlld3MiLCJmaWVsZHMiLCJUYWJsZSIsImtleSIsInBhcmVudEJhc2UiLCJyZWNvcmRTdG9yZSIsInRhYmxlSWQiLCJzZGsiLCJfcGFyZW50QmFzZSIsIl9yZWNvcmRTdG9yZSIsIl92aWV3TW9kZWxzQnlJZCIsIl9maWVsZE1vZGVsc0J5SWQiLCJfY2FjaGVkRmllbGROYW1lc0J5SWQiLCJfX3RhYmxlT3JWaWV3UXVlcnlSZXN1bHRQb29sIiwiT2JqZWN0UG9vbCIsIlRhYmxlT3JWaWV3UXVlcnlSZXN1bHQiLCJmaWVsZElkIiwiX2RhdGEiLCJmaWVsZHNCeUlkIiwiRmllbGQiLCJfc2RrIiwiZmllbGQiLCJnZXRGaWVsZEJ5SWRJZkV4aXN0cyIsImZpZWxkTmFtZSIsImZpZWxkRGF0YSIsImdldEZpZWxkQnlOYW1lSWZFeGlzdHMiLCJmaWVsZElkT3JOYW1lIiwiZ2V0RmllbGRJZkV4aXN0cyIsInZpZXdJZCIsInZpZXdzQnlJZCIsIlZpZXciLCJnZXRWaWV3RGF0YVN0b3JlIiwidmlldyIsImdldFZpZXdCeUlkSWZFeGlzdHMiLCJ2aWV3TmFtZSIsInZpZXdEYXRhIiwiZ2V0Vmlld0J5TmFtZUlmRXhpc3RzIiwidmlld0lkT3JOYW1lIiwiZ2V0Vmlld0lmRXhpc3RzIiwib3B0cyIsIm5vcm1hbGl6ZWRPcHRzIiwiUmVjb3JkUXVlcnlSZXN1bHQiLCJfbm9ybWFsaXplT3B0cyIsImdldE9iamVjdEZvclJldXNlIiwicXVlcnlSZXN1bHQiLCJzZWxlY3RSZWNvcmRzIiwibG9hZERhdGFBc3luYyIsImFsbG93ZWRWaWV3VHlwZXMiLCJwcmVmZXJyZWRWaWV3T3JWaWV3SWQiLCJBcnJheSIsImlzQXJyYXkiLCJwcmVmZXJyZWRWaWV3IiwiaWQiLCJpbmNsdWRlcyIsInR5cGUiLCJmaW5kIiwiX19haXJ0YWJsZUludGVyZmFjZSIsImZldGNoRGVmYXVsdENlbGxWYWx1ZXNCeUZpZWxkSWRBc3luYyIsIl9pZCIsImNlbGxWYWx1ZXNCeUZpZWxkSWQiLCJyZWNvcmRPclJlY29yZElkIiwicmVjb3JkSWQiLCJ1cGRhdGVSZWNvcmRzQXN5bmMiLCJjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3JkcyIsImNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVSZWNvcmQiLCJoYXNQZXJtaXNzaW9uIiwicmVjb3JkcyIsInJlY29yZHNXaXRoQ2VsbFZhbHVlc0J5RmllbGRJZCIsIm1hcCIsInJlY29yZCIsIl9jZWxsVmFsdWVzQnlGaWVsZElkT3JOYW1lVG9DZWxsVmFsdWVzQnlGaWVsZElkIiwiX19tdXRhdGlvbnMiLCJhcHBseU11dGF0aW9uQXN5bmMiLCJNdXRhdGlvblR5cGVzIiwiU0VUX01VTFRJUExFX1JFQ09SRFNfQ0VMTF9WQUxVRVMiLCJjaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24iLCJ1bmRlZmluZWQiLCJkZWxldGVSZWNvcmRzQXN5bmMiLCJjaGVja1Blcm1pc3Npb25zRm9yRGVsZXRlUmVjb3JkcyIsImNoZWNrUGVybWlzc2lvbnNGb3JEZWxldGVSZWNvcmQiLCJyZWNvcmRzT3JSZWNvcmRJZHMiLCJyZWNvcmRJZHMiLCJERUxFVEVfTVVMVElQTEVfUkVDT1JEUyIsImNyZWF0ZVJlY29yZHNBc3luYyIsImNoZWNrUGVybWlzc2lvbnNGb3JDcmVhdGVSZWNvcmRzIiwiY2hlY2tQZXJtaXNzaW9uc0ZvckNyZWF0ZVJlY29yZCIsInJlY29yZHNUb0NyZWF0ZSIsInJlY29yZERlZiIsInJlY29yZERlZktleXMiLCJsZW5ndGgiLCJpZEdlbmVyYXRvciIsImdlbmVyYXRlUmVjb3JkSWQiLCJDUkVBVEVfTVVMVElQTEVfUkVDT1JEUyIsImNlbGxWYWx1ZXNCeUZpZWxkSWRPck5hbWUiLCJmcm9tRW50cmllcyIsImNlbGxWYWx1ZSIsIl9fZ2V0RmllbGRNYXRjaGluZyIsIm9wdGlvbnMiLCJDUkVBVEVfU0lOR0xFX0ZJRUxEIiwiY29uZmlnIiwiY2hlY2tQZXJtaXNzaW9uc0ZvckNyZWF0ZUZpZWxkIiwiZ2VuZXJhdGVGaWVsZElkIiwiZ2V0RmllbGRCeUlkIiwiZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZSIsInBhcmVudFRhYmxlIiwiaXNEZWxldGVkIiwidmlld09yVmlld0lkT3JWaWV3TmFtZSIsImRpcnR5UGF0aHMiLCJkaWRUYWJsZVNjaGVtYUNoYW5nZSIsIl9vbkNoYW5nZSIsInZpZXdPcmRlciIsInZpZXdNb2RlbCIsImxvY2siLCJleHRlcm5hbFN5bmNCeUlkIiwiZGlydHlWaWV3UGF0aHMiLCJkaWRWaWV3U2NoZW1hQ2hhbmdlIiwiX190cmlnZ2VyT25DaGFuZ2VGb3JEaXJ0eVBhdGhzIiwic2VuZFZpZXdEYXRhRGVsZXRpb25JZlZpZXdJc0RlbGV0ZWQiLCJhZGRlZEZpZWxkSWRzIiwicmVtb3ZlZEZpZWxkSWRzIiwiZGlydHlGaWVsZFBhdGhzIiwiX2lzRGlydHkiLCJwdXNoIiwiZmllbGRNb2RlbCIsImZpZWxkTmFtZXNCeUlkIiwiX2Jhc2VEYXRhIiwidGFibGVzQnlJZCIsInVybENvbnN0cnVjdG9yIiwiZ2V0VGFibGVVcmwiLCJwcmltYXJ5RmllbGQiLCJwcmltYXJ5RmllbGRJZCIsImtleXMiLCJmb3JFYWNoIiwiZ2V0Vmlld0J5SWQiLCJBYnN0cmFjdE1vZGVsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFDQTs7Ozs7O0FBR0E7QUFDQTtBQUNPLElBQU1BLGtCQUFrQixHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUM1Q0MsRUFBQUEsSUFBSSxFQUFFLE1BRHNDO0FBRTVDQyxFQUFBQSxXQUFXLEVBQUUsYUFGK0I7QUFHNUNDLEVBQUFBLEtBQUssRUFBRSxPQUhxQztBQUk1Q0MsRUFBQUEsTUFBTSxFQUFFO0FBSm9DLENBQWQsQ0FBM0I7QUFPUDs7Ozs7Ozs7OztBQVNBOzs7OztJQUtNQyxLOzs7Ozs7O0FBQ0Y7O0FBRUE7b0NBQ3VCQyxHLEVBQXNCO0FBQ3pDLGFBQU8sZ0NBQVlSLGtCQUFaLEVBQWdDUSxHQUFoQyxDQUFQO0FBQ0g7QUFDRDs7OztBQWFBOzs7QUFHQSxpQkFBWUMsVUFBWixFQUE4QkMsV0FBOUIsRUFBd0RDLE9BQXhELEVBQXlFQyxHQUF6RSxFQUFtRjtBQUFBOztBQUFBO0FBQy9FLDJHQUFNQSxHQUFOLEVBQVdELE9BQVg7QUFEK0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRS9FLFVBQUtFLFdBQUwsR0FBbUJKLFVBQW5CO0FBQ0EsVUFBS0ssWUFBTCxHQUFvQkosV0FBcEI7QUFDQSxVQUFLSyxlQUFMLEdBQXVCLEVBQXZCLENBSitFLENBSXBEOztBQUMzQixVQUFLQyxnQkFBTCxHQUF3QixFQUF4QixDQUwrRSxDQUtuRDs7QUFDNUIsVUFBS0MscUJBQUwsR0FBNkIsSUFBN0I7QUFFQSxVQUFLQyw0QkFBTCxHQUFvQyxJQUFJQyxvQkFBSixDQUFlQyxtQ0FBZixDQUFwQztBQVIrRTtBQVNsRjtBQUVEOzs7Ozs7OztBQTZGQTs7Ozs7Ozs7Ozs7Ozs7eUNBZXFCQyxPLEVBQWdDO0FBQ2pELFVBQUksQ0FBQyxLQUFLQyxLQUFMLENBQVdDLFVBQVgsQ0FBc0JGLE9BQXRCLENBQUwsRUFBcUM7QUFDakMsZUFBTyxJQUFQO0FBQ0gsT0FGRCxNQUVPO0FBQ0gsWUFBSSxDQUFDLEtBQUtMLGdCQUFMLENBQXNCSyxPQUF0QixDQUFMLEVBQXFDO0FBQ2pDLGVBQUtMLGdCQUFMLENBQXNCSyxPQUF0QixJQUFpQyxJQUFJRyxjQUFKLENBQVUsS0FBS0MsSUFBZixFQUFxQixJQUFyQixFQUEyQkosT0FBM0IsQ0FBakM7QUFDSDs7QUFDRCxlQUFPLEtBQUtMLGdCQUFMLENBQXNCSyxPQUF0QixDQUFQO0FBQ0g7QUFDSjtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7OztpQ0FjYUEsTyxFQUF5QjtBQUNsQyxVQUFNSyxLQUFLLEdBQUcsS0FBS0Msb0JBQUwsQ0FBMEJOLE9BQTFCLENBQWQ7O0FBQ0EsVUFBSSxDQUFDSyxLQUFMLEVBQVk7QUFDUixjQUFNLDZCQUFXLG1DQUFYLEVBQWdETCxPQUFoRCxFQUF5RCxLQUFLbEIsSUFBOUQsQ0FBTjtBQUNIOztBQUNELGFBQU91QixLQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJDQWV1QkUsUyxFQUFpQztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUNwRCw2QkFBbUMsNEJBQVEsS0FBS04sS0FBTCxDQUFXQyxVQUFuQixDQUFuQyw4SEFBbUU7QUFBQTtBQUFBLGNBQXZERixPQUF1RDtBQUFBLGNBQTlDUSxTQUE4Qzs7QUFDL0QsY0FBSUEsU0FBUyxDQUFDMUIsSUFBVixLQUFtQnlCLFNBQXZCLEVBQWtDO0FBQzlCLG1CQUFPLEtBQUtELG9CQUFMLENBQTBCTixPQUExQixDQUFQO0FBQ0g7QUFDSjtBQUxtRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQU1wRCxhQUFPLElBQVA7QUFDSDtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7O21DQWFlTyxTLEVBQTBCO0FBQ3JDLFVBQU1GLEtBQUssR0FBRyxLQUFLSSxzQkFBTCxDQUE0QkYsU0FBNUIsQ0FBZDs7QUFDQSxVQUFJLENBQUNGLEtBQUwsRUFBWTtBQUNSLGNBQU0sNkJBQVcsbUNBQVgsRUFBZ0RFLFNBQWhELEVBQTJELEtBQUt6QixJQUFoRSxDQUFOO0FBQ0g7O0FBQ0QsYUFBT3VCLEtBQVA7QUFDSDtBQUNEOzs7Ozs7Ozs7Ozs7O3FDQVVpQkssYSxFQUErQztBQUFBOztBQUM1RCxzQ0FDSSxLQUFLSixvQkFBTCxDQUEwQkksYUFBMUIsQ0FESix5RUFDZ0QsS0FBS0Qsc0JBQUwsQ0FBNEJDLGFBQTVCLENBRGhEO0FBR0g7QUFDRDs7Ozs7Ozs7Ozs7Ozs7NkJBV1NBLGEsRUFBd0M7QUFDN0MsVUFBTUwsS0FBSyxHQUFHLEtBQUtNLGdCQUFMLENBQXNCRCxhQUF0QixDQUFkOztBQUNBLFVBQUksQ0FBQ0wsS0FBTCxFQUFZO0FBQ1IsY0FBTSw2QkFDRiw2Q0FERSxFQUVGSyxhQUZFLEVBR0YsS0FBSzVCLElBSEgsQ0FBTjtBQUtIOztBQUNELGFBQU91QixLQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7OztBQWtCQTs7Ozs7Ozs7Ozs7Ozs7O3dDQWVvQk8sTSxFQUE2QjtBQUM3QyxVQUFJLENBQUMsS0FBS1gsS0FBTCxDQUFXWSxTQUFYLENBQXFCRCxNQUFyQixDQUFMLEVBQW1DO0FBQy9CLGVBQU8sSUFBUDtBQUNILE9BRkQsTUFFTztBQUNILFlBQUksQ0FBQyxLQUFLbEIsZUFBTCxDQUFxQmtCLE1BQXJCLENBQUwsRUFBbUM7QUFDL0IsZUFBS2xCLGVBQUwsQ0FBcUJrQixNQUFyQixJQUErQixJQUFJRSxhQUFKLENBQzNCLEtBQUtWLElBRHNCLEVBRTNCLElBRjJCLEVBRzNCLEtBQUtYLFlBQUwsQ0FBa0JzQixnQkFBbEIsQ0FBbUNILE1BQW5DLENBSDJCLEVBSTNCQSxNQUoyQixDQUEvQjtBQU1IOztBQUNELGVBQU8sS0FBS2xCLGVBQUwsQ0FBcUJrQixNQUFyQixDQUFQO0FBQ0g7QUFDSjtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7OztnQ0FjWUEsTSxFQUFzQjtBQUM5QixVQUFNSSxJQUFJLEdBQUcsS0FBS0MsbUJBQUwsQ0FBeUJMLE1BQXpCLENBQWI7O0FBQ0EsVUFBSSxDQUFDSSxJQUFMLEVBQVc7QUFDUCxjQUFNLDZCQUFXLGtDQUFYLEVBQStDSixNQUEvQyxFQUF1RCxLQUFLOUIsSUFBNUQsQ0FBTjtBQUNIOztBQUNELGFBQU9rQyxJQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBDQWVzQkUsUSxFQUErQjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUNqRCw4QkFBaUMsNEJBQVEsS0FBS2pCLEtBQUwsQ0FBV1ksU0FBbkIsQ0FBakMsbUlBQWdFO0FBQUE7QUFBQSxjQUFwREQsTUFBb0Q7QUFBQSxjQUE1Q08sUUFBNEM7O0FBQzVELGNBQUlBLFFBQVEsQ0FBQ3JDLElBQVQsS0FBa0JvQyxRQUF0QixFQUFnQztBQUM1QixtQkFBTyxLQUFLRCxtQkFBTCxDQUF5QkwsTUFBekIsQ0FBUDtBQUNIO0FBQ0o7QUFMZ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFNakQsYUFBTyxJQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7Ozs7OztrQ0FhY00sUSxFQUF3QjtBQUNsQyxVQUFNRixJQUFJLEdBQUcsS0FBS0kscUJBQUwsQ0FBMkJGLFFBQTNCLENBQWI7O0FBQ0EsVUFBSSxDQUFDRixJQUFMLEVBQVc7QUFDUCxjQUFNLDZCQUFXLGtDQUFYLEVBQStDRSxRQUEvQyxFQUF5RCxLQUFLcEMsSUFBOUQsQ0FBTjtBQUNIOztBQUNELGFBQU9rQyxJQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7OztvQ0FVZ0JLLFksRUFBNEM7QUFBQTs7QUFDeEQsc0NBQU8sS0FBS0osbUJBQUwsQ0FBeUJJLFlBQXpCLENBQVAseUVBQWlELEtBQUtELHFCQUFMLENBQTJCQyxZQUEzQixDQUFqRDtBQUNIO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7OzRCQVdRQSxZLEVBQXFDO0FBQ3pDLFVBQU1MLElBQUksR0FBRyxLQUFLTSxlQUFMLENBQXFCRCxZQUFyQixDQUFiOztBQUNBLFVBQUksQ0FBQ0wsSUFBTCxFQUFXO0FBQ1AsY0FBTSw2QkFBVyw0Q0FBWCxFQUF5REssWUFBekQsRUFBdUUsS0FBS3ZDLElBQTVFLENBQU47QUFDSDs7QUFDRCxhQUFPa0MsSUFBUDtBQUNIO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQ0FpQ2NPLEksRUFBc0Q7QUFDaEUsVUFBTUMsY0FBYyxHQUFHQyw2QkFBa0JDLGNBQWxCLENBQ25CLElBRG1CLEVBRW5CLEtBQUtqQyxZQUZjLEVBR25COEIsSUFBSSxJQUFJLEVBSFcsQ0FBdkI7O0FBS0EsYUFBTyxLQUFLMUIsNEJBQUwsQ0FBa0M4QixpQkFBbEMsQ0FBb0QsS0FBS3ZCLElBQXpELEVBQStELElBQS9ELEVBQXFFb0IsY0FBckUsQ0FBUDtBQUNIO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt1Q0FxQnlCRCxJOzs7Ozs7QUFDZkssY0FBQUEsVyxHQUFjLEtBQUtDLGFBQUwsQ0FBbUJOLElBQW5CLEM7O2dEQUNkSyxXQUFXLENBQUNFLGFBQVosRTs7OytDQUNDRixXOzs7Ozs7Ozs7QUFFWDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3VDQW1CSUcsZ0IsRUFDQUMscUIsRUFDVztBQUFBOztBQUNYLFVBQUksQ0FBQ0MsS0FBSyxDQUFDQyxPQUFOLENBQWNILGdCQUFkLENBQUwsRUFBc0M7QUFDbENBLFFBQUFBLGdCQUFnQixHQUFHLHlCQUFzQixDQUFDQSxnQkFBRCxDQUF0QixDQUFuQjtBQUNIOztBQUVELFVBQUlDLHFCQUFKLEVBQTJCO0FBQ3ZCLFlBQU1HLGFBQWEsR0FBRyxLQUFLbEIsbUJBQUwsQ0FDbEIsT0FBT2UscUJBQVAsS0FBaUMsUUFBakMsR0FDTUEscUJBRE4sR0FFTUEscUJBQXFCLENBQUNJLEVBSFYsQ0FBdEI7O0FBS0EsWUFBSUQsYUFBYSxJQUFJSixnQkFBZ0IsQ0FBQ00sUUFBakIsQ0FBMEJGLGFBQWEsQ0FBQ0csSUFBeEMsQ0FBckIsRUFBb0U7QUFDaEUsaUJBQU9ILGFBQVA7QUFDSDtBQUNKOztBQUVELGlDQUNJLEtBQUtuRCxLQUFMLENBQVd1RCxJQUFYLENBQWdCdkIsSUFBSSxJQUFJO0FBQ3BCLGVBQU9lLGdCQUFnQixDQUFDTSxRQUFqQixDQUEwQnJCLElBQUksQ0FBQ3NCLElBQS9CLENBQVA7QUFDSCxPQUZELENBREosK0RBR1UsSUFIVjtBQUtILEssQ0FDRDtBQUNBOztBQUNBOzs7QUFHQTs7Ozt1REFDeUNmLEk7Ozs7OztBQUcvQlgsY0FBQUEsTSxHQUFTVyxJQUFJLElBQUlBLElBQUksQ0FBQ1AsSUFBYixHQUFvQk8sSUFBSSxDQUFDUCxJQUFMLENBQVVvQixFQUE5QixHQUFtQyxJOztnREFDaEIsS0FBS2hDLElBQUwsQ0FBVW9DLG1CQUFWLENBQThCQyxvQ0FBOUIsQ0FDOUIsS0FBS0MsR0FEeUIsRUFFOUI5QixNQUY4QixDOzs7QUFBNUIrQixjQUFBQSxtQjtnREFJQ0EsbUI7Ozs7Ozs7OztBQUVYOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0NBdURJQyxnQixFQUNBM0QsTTs7Ozs7O0FBRU00RCxjQUFBQSxRLEdBQ0YsT0FBT0QsZ0JBQVAsS0FBNEIsUUFBNUIsR0FBdUNBLGdCQUF2QyxHQUEwREEsZ0JBQWdCLENBQUNSLEU7O2dEQUV6RSxLQUFLVSxrQkFBTCxDQUF3QixDQUMxQjtBQUNJVixnQkFBQUEsRUFBRSxFQUFFUyxRQURSO0FBRUk1RCxnQkFBQUE7QUFGSixlQUQwQixDQUF4QixDOzs7Ozs7Ozs7QUFPVjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvREF3REkyRCxnQixFQUNBM0QsTSxFQUNxQjtBQUNyQixVQUFNNEQsUUFBUSxHQUNWLE9BQU9ELGdCQUFQLEtBQTRCLFFBQTVCLElBQXdDQSxnQkFBZ0IsS0FBSyxJQUE3RCxHQUNNQSxnQkFBZ0IsQ0FBQ1IsRUFEdkIsR0FFTVEsZ0JBSFY7QUFLQSxhQUFPLEtBQUtHLGdDQUFMLENBQXNDLENBQ3pDO0FBQ0lYLFFBQUFBLEVBQUUsRUFBRVMsUUFEUjtBQUVJNUQsUUFBQUE7QUFGSixPQUR5QyxDQUF0QyxDQUFQO0FBTUg7QUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0RBbURJMkQsZ0IsRUFDQTNELE0sRUFDTztBQUNQLGFBQU8sS0FBSytELCtCQUFMLENBQXFDSixnQkFBckMsRUFBdUQzRCxNQUF2RCxFQUErRGdFLGFBQXRFO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3VDQTRFSUMsTzs7Ozs7O0FBS01DLGNBQUFBLDhCLEdBQWlDRCxPQUFPLENBQUNFLEdBQVIsQ0FBWUMsTUFBTSxLQUFLO0FBQzFEakIsZ0JBQUFBLEVBQUUsRUFBRWlCLE1BQU0sQ0FBQ2pCLEVBRCtDO0FBRTFETyxnQkFBQUEsbUJBQW1CLEVBQUUsS0FBS1csK0NBQUwsQ0FDakJELE1BQU0sQ0FBQ3BFLE1BRFU7QUFGcUMsZUFBTCxDQUFsQixDOztnREFPakMsS0FBS21CLElBQUwsQ0FBVW1ELFdBQVYsQ0FBc0JDLGtCQUF0QixDQUF5QztBQUMzQ2xCLGdCQUFBQSxJQUFJLEVBQUVtQix5QkFBY0MsZ0NBRHVCO0FBRTNDcEUsZ0JBQUFBLE9BQU8sRUFBRSxLQUFLOEMsRUFGNkI7QUFHM0NjLGdCQUFBQSxPQUFPLEVBQUVDO0FBSGtDLGVBQXpDLEM7Ozs7Ozs7OztBQU1WOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztxREE0RElELE8sRUFJcUI7QUFDckIsYUFBTyxLQUFLOUMsSUFBTCxDQUFVbUQsV0FBVixDQUFzQkksMkJBQXRCLENBQWtEO0FBQ3JEckIsUUFBQUEsSUFBSSxFQUFFbUIseUJBQWNDLGdDQURpQztBQUVyRHBFLFFBQUFBLE9BQU8sRUFBRSxLQUFLOEMsRUFGdUM7QUFHckRjLFFBQUFBLE9BQU8sRUFBRUEsT0FBTyxHQUNWQSxPQUFPLENBQUNFLEdBQVIsQ0FBWUMsTUFBTSxLQUFLO0FBQ25CakIsVUFBQUEsRUFBRSxFQUFFaUIsTUFBTSxDQUFDakIsRUFBUCxJQUFhd0IsU0FERTtBQUVuQmpCLFVBQUFBLG1CQUFtQixFQUFFVSxNQUFNLENBQUNwRSxNQUFQLEdBQ2YsS0FBS3FFLCtDQUFMLENBQXFERCxNQUFNLENBQUNwRSxNQUE1RCxDQURlLEdBRWYyRTtBQUphLFNBQUwsQ0FBbEIsQ0FEVSxHQU9WQTtBQVYrQyxPQUFsRCxDQUFQO0FBWUg7QUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aURBeURJVixPLEVBSU87QUFDUCxhQUFPLEtBQUtILGdDQUFMLENBQXNDRyxPQUF0QyxFQUErQ0QsYUFBdEQ7QUFDSDtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NDQStCd0JMLGdCOzs7Ozs7Z0RBQ2QsS0FBS2lCLGtCQUFMLENBQXdCLENBQUNqQixnQkFBRCxDQUF4QixDOzs7Ozs7Ozs7QUFFVjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29EQTJCZ0NBLGdCLEVBQTZEO0FBQ3pGLGFBQU8sS0FBS2tCLGdDQUFMLENBQ0hsQixnQkFBZ0IsR0FBRyxDQUFDQSxnQkFBRCxDQUFILEdBQXdCZ0IsU0FEckMsQ0FBUDtBQUdIO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dEQXVCNEJoQixnQixFQUErQztBQUN2RSxhQUFPLEtBQUttQiwrQkFBTCxDQUFxQ25CLGdCQUFyQyxFQUF1REssYUFBOUQ7QUFDSDtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dUNBb0N5QmUsa0I7Ozs7OztBQUNmQyxjQUFBQSxTLEdBQVlELGtCQUFrQixDQUFDWixHQUFuQixDQUF1QlIsZ0JBQWdCLElBQ3JELE9BQU9BLGdCQUFQLEtBQTRCLFFBQTVCLEdBQXVDQSxnQkFBdkMsR0FBMERBLGdCQUFnQixDQUFDUixFQUQ3RCxDOztnREFJWixLQUFLaEMsSUFBTCxDQUFVbUQsV0FBVixDQUFzQkMsa0JBQXRCLENBQXlDO0FBQzNDbEIsZ0JBQUFBLElBQUksRUFBRW1CLHlCQUFjUyx1QkFEdUI7QUFFM0M1RSxnQkFBQUEsT0FBTyxFQUFFLEtBQUs4QyxFQUY2QjtBQUczQzZCLGdCQUFBQTtBQUgyQyxlQUF6QyxDOzs7Ozs7Ozs7QUFNVjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztxREE2QklELGtCLEVBQ3FCO0FBQ3JCLGFBQU8sS0FBSzVELElBQUwsQ0FBVW1ELFdBQVYsQ0FBc0JJLDJCQUF0QixDQUFrRDtBQUNyRHJCLFFBQUFBLElBQUksRUFBRW1CLHlCQUFjUyx1QkFEaUM7QUFFckQ1RSxRQUFBQSxPQUFPLEVBQUUsS0FBSzhDLEVBRnVDO0FBR3JENkIsUUFBQUEsU0FBUyxFQUFFRCxrQkFBa0IsR0FDdkJBLGtCQUFrQixDQUFDWixHQUFuQixDQUF1QlIsZ0JBQWdCLElBQ25DLE9BQU9BLGdCQUFQLEtBQTRCLFFBQTVCLEdBQXVDQSxnQkFBdkMsR0FBMERBLGdCQUFnQixDQUFDUixFQUQvRSxDQUR1QixHQUl2QndCO0FBUCtDLE9BQWxELENBQVA7QUFTSDtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lEQXlCNkJJLGtCLEVBQWdFO0FBQ3pGLGFBQU8sS0FBS0YsZ0NBQUwsQ0FBc0NFLGtCQUF0QyxFQUEwRGYsYUFBakU7QUFDSDtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0R3QmhFLGNBQUFBLE0sOERBQStDLEU7O2dEQUMzQyxLQUFLa0Ysa0JBQUwsQ0FBd0IsQ0FBQztBQUFDbEYsZ0JBQUFBO0FBQUQsZUFBRCxDQUF4QixDOzs7QUFBbEJnRixjQUFBQSxTO2dEQUNDQSxTQUFTLENBQUMsQ0FBRCxDOzs7Ozs7Ozs7QUFHcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvREFxQ0loRixNLEVBQ3FCO0FBQ3JCLGFBQU8sS0FBS21GLGdDQUFMLENBQXNDLENBQ3pDO0FBQ0luRixRQUFBQSxNQUFNLEVBQUVBLE1BQU0sSUFBSTJFO0FBRHRCLE9BRHlDLENBQXRDLENBQVA7QUFLSDtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0RBaUM0QjNFLE0sRUFBK0Q7QUFDdkYsYUFBTyxLQUFLb0YsK0JBQUwsQ0FBcUNwRixNQUFyQyxFQUE2Q2dFLGFBQXBEO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3VDQXlFSUMsTzs7Ozs7O0FBRU1vQixjQUFBQSxlLEdBQWtCcEIsT0FBTyxDQUFDRSxHQUFSLENBQVltQixTQUFTLElBQUk7QUFDN0Msb0JBQU1DLGFBQWEsR0FBRyx5QkFBS0QsU0FBTCxDQUF0QjtBQUNBLG9CQUFJdEYsTUFBSjs7QUFDQSxvQkFBSXVGLGFBQWEsQ0FBQ0MsTUFBZCxLQUF5QixDQUF6QixJQUE4QkQsYUFBYSxDQUFDLENBQUQsQ0FBYixLQUFxQixRQUF2RCxFQUFpRTtBQUM3RHZGLGtCQUFBQSxNQUFNLEdBQUdzRixTQUFTLENBQUN0RixNQUFuQjtBQUNILGlCQUZELE1BRU87QUFDSCx3QkFBTSw2QkFDRiw0R0FERSxDQUFOO0FBR0g7O0FBQ0QsdUJBQU87QUFDSG1ELGtCQUFBQSxFQUFFLEVBQUUsS0FBS2hDLElBQUwsQ0FBVW9DLG1CQUFWLENBQThCa0MsV0FBOUIsQ0FBMENDLGdCQUExQyxFQUREO0FBRUhoQyxrQkFBQUEsbUJBQW1CLEVBQUUsS0FBS1csK0NBQUwsQ0FBcURyRSxNQUFyRDtBQUZsQixpQkFBUDtBQUlILGVBZHVCLEM7O2dEQWdCbEIsS0FBS21CLElBQUwsQ0FBVW1ELFdBQVYsQ0FBc0JDLGtCQUF0QixDQUF5QztBQUMzQ2xCLGdCQUFBQSxJQUFJLEVBQUVtQix5QkFBY21CLHVCQUR1QjtBQUUzQ3RGLGdCQUFBQSxPQUFPLEVBQUUsS0FBSzhDLEVBRjZCO0FBRzNDYyxnQkFBQUEsT0FBTyxFQUFFb0I7QUFIa0MsZUFBekMsQzs7O2dEQU1DQSxlQUFlLENBQUNsQixHQUFoQixDQUFvQkMsTUFBTSxJQUFJQSxNQUFNLENBQUNqQixFQUFyQyxDOzs7Ozs7Ozs7QUFFWDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztxREE0Q0ljLE8sRUFHcUI7QUFDckIsYUFBTyxLQUFLOUMsSUFBTCxDQUFVbUQsV0FBVixDQUFzQkksMkJBQXRCLENBQWtEO0FBQ3JEckIsUUFBQUEsSUFBSSxFQUFFbUIseUJBQWNtQix1QkFEaUM7QUFFckR0RixRQUFBQSxPQUFPLEVBQUUsS0FBSzhDLEVBRnVDO0FBR3JEYyxRQUFBQSxPQUFPLEVBQUVBLE9BQU8sR0FDVkEsT0FBTyxDQUFDRSxHQUFSLENBQVlDLE1BQU0sS0FBSztBQUNuQmpCLFVBQUFBLEVBQUUsRUFBRXdCLFNBRGU7QUFFbkJqQixVQUFBQSxtQkFBbUIsRUFBRVUsTUFBTSxDQUFDcEUsTUFBUCxHQUNmLEtBQUtxRSwrQ0FBTCxDQUFxREQsTUFBTSxDQUFDcEUsTUFBNUQsQ0FEZSxHQUVmMkU7QUFKYSxTQUFMLENBQWxCLENBRFUsR0FPVkE7QUFWK0MsT0FBbEQsQ0FBUDtBQVlIO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aURBeUNJVixPLEVBR087QUFDUCxhQUFPLEtBQUtrQixnQ0FBTCxDQUFzQ2xCLE9BQXRDLEVBQStDRCxhQUF0RDtBQUNIO0FBQ0Q7Ozs7b0VBRUk0Qix5QixFQUMyQjtBQUMzQixhQUFPakcsTUFBTSxDQUFDa0csV0FBUCxDQUNILDRCQUFRRCx5QkFBUixFQUFtQ3pCLEdBQW5DLENBQXVDLFVBQWdDO0FBQUE7QUFBQSxZQUE5QjFDLGFBQThCO0FBQUEsWUFBZnFFLFNBQWU7O0FBQ25FLFlBQU0xRSxLQUFLLEdBQUcsS0FBSzJFLGtCQUFMLENBQXdCdEUsYUFBeEIsQ0FBZDs7QUFDQSxlQUFPLENBQUNMLEtBQUssQ0FBQytCLEVBQVAsRUFBVzJDLFNBQVgsQ0FBUDtBQUNILE9BSEQsQ0FERyxDQUFQO0FBTUg7QUFDRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7bURBd0JJakcsSSxFQUNBd0QsSSxFQUNBMkMsTyxFQUNBbEcsVyxFQUNxQjtBQUNyQixhQUFPLEtBQUtxQixJQUFMLENBQVVtRCxXQUFWLENBQXNCSSwyQkFBdEIsQ0FBa0Q7QUFDckRyQixRQUFBQSxJQUFJLEVBQUVtQix5QkFBY3lCLG1CQURpQztBQUVyRDVGLFFBQUFBLE9BQU8sRUFBRSxLQUFLOEMsRUFGdUM7QUFHckRBLFFBQUFBLEVBQUUsRUFBRXdCLFNBSGlEO0FBR3RDO0FBQ2Y5RSxRQUFBQSxJQUpxRDtBQUtyRHFHLFFBQUFBLE1BQU0sRUFBRTdDLElBQUk7QUFFRkEsVUFBQUEsSUFBSSxFQUFFQTtBQUZKLFdBTUUyQyxPQUFPLEdBQUc7QUFBQ0EsVUFBQUE7QUFBRCxTQUFILEdBQWUsSUFOeEIsSUFRTnJCLFNBYitDO0FBY3JEN0UsUUFBQUE7QUFkcUQsT0FBbEQsQ0FBUDtBQWdCSDtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0NBc0JJRCxJLEVBQ0F3RCxJLEVBQ0EyQyxPLEVBQ0FsRyxXLEVBQ087QUFDUCxhQUFPLEtBQUtxRyw4QkFBTCxDQUFvQ3RHLElBQXBDLEVBQTBDd0QsSUFBMUMsRUFBZ0QyQyxPQUFoRCxFQUF5RGxHLFdBQXpELEVBQXNFa0UsYUFBN0U7QUFDSDtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3FDQXFESW5FLEksRUFDQXdELEksRUFDQTJDLE8sRUFDQWxHLFc7Ozs7OztBQUVNaUIsY0FBQUEsTyxHQUFVLEtBQUtJLElBQUwsQ0FBVW9DLG1CQUFWLENBQThCa0MsV0FBOUIsQ0FBMENXLGVBQTFDLEU7O2dEQUVWLEtBQUtqRixJQUFMLENBQVVtRCxXQUFWLENBQXNCQyxrQkFBdEIsQ0FBeUM7QUFDM0NsQixnQkFBQUEsSUFBSSxFQUFFbUIseUJBQWN5QixtQkFEdUI7QUFFM0M1RixnQkFBQUEsT0FBTyxFQUFFLEtBQUs4QyxFQUY2QjtBQUczQ0EsZ0JBQUFBLEVBQUUsRUFBRXBDLE9BSHVDO0FBSTNDbEIsZ0JBQUFBLElBSjJDO0FBSzNDcUcsZ0JBQUFBLE1BQU07QUFDRjdDLGtCQUFBQSxJQUFJLEVBQUVBO0FBREosbUJBS0UyQyxPQUFPLEdBQUc7QUFBQ0Esa0JBQUFBO0FBQUQsaUJBQUgsR0FBZSxJQUx4QixDQUxxQztBQVkzQztBQUNBO0FBQ0E7QUFDQWxHLGdCQUFBQSxXQUFXLEVBQUVBLFdBQUYsYUFBRUEsV0FBRixjQUFFQSxXQUFGLEdBQWlCO0FBZmUsZUFBekMsQzs7O2dEQWtCQyxLQUFLdUcsWUFBTCxDQUFrQnRGLE9BQWxCLEM7Ozs7Ozs7OztBQUVYOzs7Ozs7dUNBR21CdUYseUIsRUFBa0Q7QUFDakUsVUFBSWxGLEtBQUo7O0FBQ0EsVUFBSWtGLHlCQUF5QixZQUFZcEYsY0FBekMsRUFBZ0Q7QUFDNUMsWUFBSW9GLHlCQUF5QixDQUFDQyxXQUExQixDQUFzQ3BELEVBQXRDLEtBQTZDLEtBQUtBLEVBQXRELEVBQTBEO0FBQ3RELGdCQUFNLDZCQUNGLHNEQURFLEVBRUZtRCx5QkFBeUIsQ0FBQ3pHLElBRnhCLEVBR0YsS0FBS0EsSUFISCxDQUFOO0FBS0g7O0FBQ0R1QixRQUFBQSxLQUFLLEdBQUdrRix5QkFBUjtBQUNILE9BVEQsTUFTTztBQUNIbEYsUUFBQUEsS0FBSyxHQUNELEtBQUtDLG9CQUFMLENBQTBCaUYseUJBQTFCLEtBQ0EsS0FBSzlFLHNCQUFMLENBQTRCOEUseUJBQTVCLENBRko7O0FBSUEsWUFBSWxGLEtBQUssS0FBSyxJQUFkLEVBQW9CO0FBQ2hCLGdCQUFNLDZCQUNGLHlDQURFLEVBRUZrRix5QkFGRSxFQUdGLEtBQUt6RyxJQUhILENBQU47QUFLSDtBQUNKOztBQUVELFVBQUl1QixLQUFLLENBQUNvRixTQUFWLEVBQXFCO0FBQ2pCLGNBQU0sNkJBQVcsd0NBQVgsRUFBcURwRixLQUFLLENBQUN2QixJQUEzRCxFQUFpRSxLQUFLQSxJQUF0RSxDQUFOO0FBQ0g7O0FBQ0QsYUFBT3VCLEtBQVA7QUFDSDtBQUNEOzs7Ozs7c0NBR2tCcUYsc0IsRUFBNkM7QUFDM0QsVUFBSTFFLElBQUo7O0FBQ0EsVUFBSTBFLHNCQUFzQixZQUFZNUUsYUFBdEMsRUFBNEM7QUFDeEMsWUFBSTRFLHNCQUFzQixDQUFDRixXQUF2QixDQUFtQ3BELEVBQW5DLEtBQTBDLEtBQUtBLEVBQW5ELEVBQXVEO0FBQ25ELGdCQUFNLDZCQUNGLHFEQURFLEVBRUZzRCxzQkFBc0IsQ0FBQzVHLElBRnJCLEVBR0YsS0FBS0EsSUFISCxDQUFOO0FBS0g7O0FBQ0RrQyxRQUFBQSxJQUFJLEdBQUcwRSxzQkFBUDtBQUNILE9BVEQsTUFTTztBQUNIMUUsUUFBQUEsSUFBSSxHQUNBLEtBQUtDLG1CQUFMLENBQXlCeUUsc0JBQXpCLEtBQ0EsS0FBS3RFLHFCQUFMLENBQTJCc0Usc0JBQTNCLENBRko7O0FBSUEsWUFBSTFFLElBQUksS0FBSyxJQUFiLEVBQW1CO0FBQ2YsZ0JBQU0sNkJBQ0Ysd0NBREUsRUFFRjBFLHNCQUZFLEVBR0YsS0FBSzVHLElBSEgsQ0FBTjtBQUtIO0FBQ0o7O0FBRUQsVUFBSWtDLElBQUksQ0FBQ3lFLFNBQVQsRUFBb0I7QUFDaEIsY0FBTSw2QkFBVyx1Q0FBWCxFQUFvRHpFLElBQUksQ0FBQ2xDLElBQXpELEVBQStELEtBQUtBLElBQXBFLENBQU47QUFDSDs7QUFDRCxhQUFPa0MsSUFBUDtBQUNIO0FBQ0Q7Ozs7OzttREFHK0IyRSxVLEVBQXFEO0FBQ2hGLFVBQUlDLG9CQUFvQixHQUFHLEtBQTNCOztBQUNBLFVBQUlELFVBQVUsQ0FBQzdHLElBQWYsRUFBcUI7QUFDakIsYUFBSytHLFNBQUwsQ0FBZWxILGtCQUFrQixDQUFDRyxJQUFsQzs7QUFDQThHLFFBQUFBLG9CQUFvQixHQUFHLElBQXZCO0FBQ0g7O0FBQ0QsVUFBSUQsVUFBVSxDQUFDRyxTQUFmLEVBQTBCO0FBQ3RCLGFBQUtELFNBQUwsQ0FBZWxILGtCQUFrQixDQUFDSyxLQUFsQzs7QUFDQTRHLFFBQUFBLG9CQUFvQixHQUFHLElBQXZCLENBRnNCLENBSXRCOztBQUpzQjtBQUFBO0FBQUE7O0FBQUE7QUFLdEIsZ0NBQWtDLDRCQUFRLEtBQUtsRyxlQUFiLENBQWxDLG1JQUFpRTtBQUFBO0FBQUEsZ0JBQXJEa0IsTUFBcUQ7QUFBQSxnQkFBN0NtRixTQUE2Qzs7QUFDN0QsZ0JBQUlBLFNBQVMsQ0FBQ04sU0FBZCxFQUF5QjtBQUNyQixxQkFBTyxLQUFLL0YsZUFBTCxDQUFxQmtCLE1BQXJCLENBQVA7QUFDSDtBQUNKO0FBVHFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVekI7O0FBQ0QsVUFBSStFLFVBQVUsQ0FBQ0ssSUFBZixFQUFxQjtBQUNqQkosUUFBQUEsb0JBQW9CLEdBQUcsSUFBdkI7QUFDSDs7QUFDRCxVQUFJRCxVQUFVLENBQUNNLGdCQUFmLEVBQWlDO0FBQzdCTCxRQUFBQSxvQkFBb0IsR0FBRyxJQUF2QjtBQUNIOztBQUNELFVBQUlELFVBQVUsQ0FBQzVHLFdBQWYsRUFBNEI7QUFDeEIsYUFBSzhHLFNBQUwsQ0FBZWxILGtCQUFrQixDQUFDSSxXQUFsQzs7QUFDQTZHLFFBQUFBLG9CQUFvQixHQUFHLElBQXZCO0FBQ0g7O0FBQ0QsVUFBSUQsVUFBVSxDQUFDOUUsU0FBZixFQUEwQjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUN0QixnQ0FBdUMsNEJBQVE4RSxVQUFVLENBQUM5RSxTQUFuQixDQUF2QyxtSUFBc0U7QUFBQTtBQUFBLGdCQUExREQsT0FBMEQ7QUFBQSxnQkFBbERzRixjQUFrRDs7QUFDbEU7QUFDQTtBQUNBO0FBQ0EsZ0JBQU1sRixJQUFJLEdBQUcsS0FBS3RCLGVBQUwsQ0FBcUJrQixPQUFyQixDQUFiOztBQUNBLGdCQUFJSSxJQUFKLEVBQVU7QUFDTixrQkFBTW1GLG1CQUFtQixHQUFHbkYsSUFBSSxDQUFDb0YsOEJBQUwsQ0FBb0NGLGNBQXBDLENBQTVCOztBQUNBLGtCQUFJQyxtQkFBSixFQUF5QjtBQUNyQlAsZ0JBQUFBLG9CQUFvQixHQUFHLElBQXZCO0FBQ0g7QUFDSixhQVZpRSxDQVdsRTtBQUNBOzs7QUFDQSxpQkFBS25HLFlBQUwsQ0FBa0I0RyxtQ0FBbEIsQ0FBc0R6RixPQUF0RDtBQUNIO0FBZnFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQnpCOztBQUNELFVBQUkrRSxVQUFVLENBQUN6RixVQUFmLEVBQTJCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBMEYsUUFBQUEsb0JBQW9CLEdBQUcsSUFBdkIsQ0FKdUIsQ0FNdkI7QUFDQTs7QUFDQSxZQUFNVSxhQUE2QixHQUFHLEVBQXRDO0FBQ0EsWUFBTUMsZUFBK0IsR0FBRyxFQUF4QztBQVR1QjtBQUFBO0FBQUE7O0FBQUE7QUFVdkIsZ0NBQXlDLDRCQUFRWixVQUFVLENBQUN6RixVQUFuQixDQUF6QyxtSUFBeUU7QUFBQTtBQUFBLGdCQUE3REYsT0FBNkQ7QUFBQSxnQkFBcER3RyxlQUFvRDs7QUFDckUsZ0JBQUlBLGVBQWUsSUFBSUEsZUFBZSxDQUFDQyxRQUF2QyxFQUFpRDtBQUM3QztBQUNBLGtCQUFJLHdCQUFJLEtBQUt4RyxLQUFMLENBQVdDLFVBQWYsRUFBMkJGLE9BQTNCLENBQUosRUFBeUM7QUFDckNzRyxnQkFBQUEsYUFBYSxDQUFDSSxJQUFkLENBQW1CMUcsT0FBbkI7QUFDSCxlQUZELE1BRU87QUFDSHVHLGdCQUFBQSxlQUFlLENBQUNHLElBQWhCLENBQXFCMUcsT0FBckI7QUFFQSxvQkFBTTJHLFVBQVUsR0FBRyxLQUFLaEgsZ0JBQUwsQ0FBc0JLLE9BQXRCLENBQW5COztBQUNBLG9CQUFJMkcsVUFBSixFQUFnQjtBQUNaO0FBQ0EseUJBQU8sS0FBS2hILGdCQUFMLENBQXNCSyxPQUF0QixDQUFQO0FBQ0g7QUFDSjtBQUNKLGFBYkQsTUFhTztBQUNIO0FBQ0E7QUFDQTtBQUNBLGtCQUFNSyxLQUFLLEdBQUcsS0FBS1YsZ0JBQUwsQ0FBc0JLLE9BQXRCLENBQWQ7O0FBQ0Esa0JBQUlLLEtBQUosRUFBVztBQUNQQSxnQkFBQUEsS0FBSyxDQUFDK0YsOEJBQU4sQ0FBcUNJLGVBQXJDO0FBQ0g7QUFDSjtBQUNKO0FBakNzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQW1DdkIsWUFBSUYsYUFBYSxDQUFDN0IsTUFBZCxHQUF1QixDQUF2QixJQUE0QjhCLGVBQWUsQ0FBQzlCLE1BQWhCLEdBQXlCLENBQXpELEVBQTREO0FBQ3hELGVBQUtvQixTQUFMLENBQWVsSCxrQkFBa0IsQ0FBQ00sTUFBbEMsRUFBMEM7QUFDdENxSCxZQUFBQSxhQURzQztBQUV0Q0MsWUFBQUE7QUFGc0MsV0FBMUM7QUFJSCxTQXhDc0IsQ0EwQ3ZCOzs7QUFDQSxhQUFLM0cscUJBQUwsR0FBNkIsSUFBN0I7QUFDSDs7QUFDRCxhQUFPZ0csb0JBQVA7QUFDSDtBQUNEOzs7Ozs7MENBRytDO0FBQzNDLFVBQUksQ0FBQyxLQUFLaEcscUJBQVYsRUFBaUM7QUFDN0IsWUFBTWdILGNBQTBDLEdBQUcsRUFBbkQ7QUFENkI7QUFBQTtBQUFBOztBQUFBO0FBRTdCLGdDQUFtQyw0QkFBUSxLQUFLM0csS0FBTCxDQUFXQyxVQUFuQixDQUFuQyxtSUFBbUU7QUFBQTtBQUFBLGdCQUF2REYsT0FBdUQ7QUFBQSxnQkFBOUNRLFNBQThDOztBQUMvRG9HLFlBQUFBLGNBQWMsQ0FBQzVHLE9BQUQsQ0FBZCxHQUEwQlEsU0FBUyxDQUFDMUIsSUFBcEM7QUFDSDtBQUo0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUs3QixhQUFLYyxxQkFBTCxHQUE2QmdILGNBQTdCO0FBQ0g7O0FBQ0QsYUFBTyxLQUFLaEgscUJBQVo7QUFDSDs7O3dCQXR4RDRDO0FBQUE7O0FBQ3pDLHNDQUFPLEtBQUtpSCxTQUFMLENBQWVDLFVBQWYsQ0FBMEIsS0FBS3BFLEdBQS9CLENBQVAseUVBQThDLElBQTlDO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7Ozs7O3dCQVl1QjtBQUNuQixhQUFPLEtBQUtsRCxXQUFaO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7O3dCQVNtQjtBQUNmLGFBQU8sS0FBS1MsS0FBTCxDQUFXbkIsSUFBbEI7QUFDSDtBQUNEOzs7Ozs7Ozs7Ozs7d0JBU2lDO0FBQzdCLGFBQU8sS0FBS21CLEtBQUwsQ0FBV2xCLFdBQWxCO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7O3dCQVNrQjtBQUNkLGFBQU8sS0FBS3FCLElBQUwsQ0FBVW9DLG1CQUFWLENBQThCdUUsY0FBOUIsQ0FBNkNDLFdBQTdDLENBQXlELEtBQUs1RSxFQUE5RCxDQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7Ozt3QkFVMEI7QUFDdEIsVUFBTTZFLFlBQVksR0FBRyxLQUFLM0IsWUFBTCxDQUFrQixLQUFLckYsS0FBTCxDQUFXaUgsY0FBN0IsQ0FBckI7QUFDQSxhQUFPRCxZQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7Ozs7d0JBVzJCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLFVBQU1oSSxNQUFNLEdBQUcsRUFBZjs7QUFDQSxzQ0FBc0JMLE1BQU0sQ0FBQ3VJLElBQVAsQ0FBWSxLQUFLbEgsS0FBTCxDQUFXQyxVQUF2QixDQUF0QixrQ0FBMEQ7QUFBckQsWUFBTUYsT0FBTyxtQkFBYjtBQUNELFlBQU1LLEtBQUssR0FBRyxLQUFLaUYsWUFBTCxDQUFrQnRGLE9BQWxCLENBQWQ7QUFDQWYsUUFBQUEsTUFBTSxDQUFDeUgsSUFBUCxDQUFZckcsS0FBWjtBQUNIOztBQUNELGFBQU9wQixNQUFQO0FBQ0g7Ozt3QkF3SXdCO0FBQ3JCO0FBQ0EsVUFBTUQsS0FBa0IsR0FBRyxFQUEzQjs7QUFDQSxXQUFLaUIsS0FBTCxDQUFXNkYsU0FBWCxDQUFxQnNCLE9BQXJCLENBQTZCeEcsTUFBTSxJQUFJO0FBQ25DLFlBQU1JLElBQUksR0FBRyxLQUFLcUcsV0FBTCxDQUFpQnpHLE1BQWpCLENBQWI7QUFDQTVCLFFBQUFBLEtBQUssQ0FBQzBILElBQU4sQ0FBVzFGLElBQVg7QUFDSCxPQUhEOztBQUlBLGFBQU9oQyxLQUFQO0FBQ0g7OztFQTlRZXNJLHVCOzs4QkFBZHBJLEssZ0JBRWtCLE87ZUE0ekRUQSxLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGFpcnRhYmxlL2Jsb2Nrcy9tb2RlbHM6IFRhYmxlICovIC8qKiAqL1xuaW1wb3J0IFNkayBmcm9tICcuLi9zZGsnO1xuaW1wb3J0IHtUYWJsZURhdGF9IGZyb20gJy4uL3R5cGVzL3RhYmxlJztcbmltcG9ydCB7Vmlld1R5cGUsIFZpZXdJZH0gZnJvbSAnLi4vdHlwZXMvdmlldyc7XG5pbXBvcnQge0ZpZWxkSWQsIEZpZWxkVHlwZSwgRmllbGRPcHRpb25zfSBmcm9tICcuLi90eXBlcy9maWVsZCc7XG5pbXBvcnQge1JlY29yZElkfSBmcm9tICcuLi90eXBlcy9yZWNvcmQnO1xuaW1wb3J0IHtNdXRhdGlvblR5cGVzLCBQZXJtaXNzaW9uQ2hlY2tSZXN1bHR9IGZyb20gJy4uL3R5cGVzL211dGF0aW9ucyc7XG5pbXBvcnQge2lzRW51bVZhbHVlLCBlbnRyaWVzLCBoYXMsIE9iamVjdFZhbHVlcywgY2FzdCwgT2JqZWN0TWFwLCBrZXlzfSBmcm9tICcuLi9wcml2YXRlX3V0aWxzJztcbmltcG9ydCB7c3Bhd25FcnJvcn0gZnJvbSAnLi4vZXJyb3JfdXRpbHMnO1xuaW1wb3J0IEFic3RyYWN0TW9kZWwgZnJvbSAnLi9hYnN0cmFjdF9tb2RlbCc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IEZpZWxkIGZyb20gJy4vZmllbGQnO1xuaW1wb3J0IEJhc2UsIHtDaGFuZ2VkUGF0aHNGb3JUeXBlfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IE9iamVjdFBvb2wgZnJvbSAnLi9vYmplY3RfcG9vbCc7XG5pbXBvcnQgUmVjb3JkIGZyb20gJy4vcmVjb3JkJztcbmltcG9ydCBSZWNvcmRRdWVyeVJlc3VsdCwge1JlY29yZFF1ZXJ5UmVzdWx0T3B0c30gZnJvbSAnLi9yZWNvcmRfcXVlcnlfcmVzdWx0JztcbmltcG9ydCBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0IGZyb20gJy4vdGFibGVfb3Jfdmlld19xdWVyeV9yZXN1bHQnO1xuaW1wb3J0IFJlY29yZFN0b3JlIGZyb20gJy4vcmVjb3JkX3N0b3JlJztcblxuLy8gVGhpcyBkb2Vzbid0IGZvbGxvdyBvdXIgZW51bSBuYW1pbmcgY29udmVudGlvbnMgYmVjYXVzZSB3ZSB3YW50IHRoZSBrZXlzXG4vLyB0byBtaXJyb3IgdGhlIG1ldGhvZC9nZXR0ZXIgbmFtZXMgb24gdGhlIG1vZGVsIGNsYXNzLlxuZXhwb3J0IGNvbnN0IFdhdGNoYWJsZVRhYmxlS2V5cyA9IE9iamVjdC5mcmVlemUoe1xuICAgIG5hbWU6ICduYW1lJyBhcyBjb25zdCxcbiAgICBkZXNjcmlwdGlvbjogJ2Rlc2NyaXB0aW9uJyBhcyBjb25zdCxcbiAgICB2aWV3czogJ3ZpZXdzJyBhcyBjb25zdCxcbiAgICBmaWVsZHM6ICdmaWVsZHMnIGFzIGNvbnN0LFxufSk7XG5cbi8qKlxuICogQSBrZXkgaW4ge0BsaW5rIFRhYmxlfSB0aGF0IGNhbiBiZSB3YXRjaGVkLlxuICogLSBgbmFtZWBcbiAqIC0gYGRlc2NyaXB0aW9uYFxuICogLSBgdmlld3NgXG4gKiAtIGBmaWVsZHNgXG4gKi9cbmV4cG9ydCB0eXBlIFdhdGNoYWJsZVRhYmxlS2V5ID0gT2JqZWN0VmFsdWVzPHR5cGVvZiBXYXRjaGFibGVUYWJsZUtleXM+O1xuXG4vKipcbiAqIE1vZGVsIGNsYXNzIHJlcHJlc2VudGluZyBhIHRhYmxlLiBFdmVyeSB7QGxpbmsgQmFzZX0gaGFzIG9uZSBvciBtb3JlIHRhYmxlcy5cbiAqXG4gKiBAZG9jc1BhdGggbW9kZWxzL1RhYmxlXG4gKi9cbmNsYXNzIFRhYmxlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbDxUYWJsZURhdGEsIFdhdGNoYWJsZVRhYmxlS2V5PiB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfY2xhc3NOYW1lID0gJ1RhYmxlJztcbiAgICAvKiogQGludGVybmFsICovXG4gICAgc3RhdGljIF9pc1dhdGNoYWJsZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNFbnVtVmFsdWUoV2F0Y2hhYmxlVGFibGVLZXlzLCBrZXkpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3BhcmVudEJhc2U6IEJhc2U7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF92aWV3TW9kZWxzQnlJZDoge1trZXk6IHN0cmluZ106IFZpZXd9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfZmllbGRNb2RlbHNCeUlkOiB7W2tleTogc3RyaW5nXTogRmllbGR9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfY2FjaGVkRmllbGROYW1lc0J5SWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9IHwgbnVsbDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3JlY29yZFN0b3JlOiBSZWNvcmRTdG9yZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX190YWJsZU9yVmlld1F1ZXJ5UmVzdWx0UG9vbDogT2JqZWN0UG9vbDxUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0LCB0eXBlb2YgVGFibGVPclZpZXdRdWVyeVJlc3VsdD47XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJlbnRCYXNlOiBCYXNlLCByZWNvcmRTdG9yZTogUmVjb3JkU3RvcmUsIHRhYmxlSWQ6IHN0cmluZywgc2RrOiBTZGspIHtcbiAgICAgICAgc3VwZXIoc2RrLCB0YWJsZUlkKTtcbiAgICAgICAgdGhpcy5fcGFyZW50QmFzZSA9IHBhcmVudEJhc2U7XG4gICAgICAgIHRoaXMuX3JlY29yZFN0b3JlID0gcmVjb3JkU3RvcmU7XG4gICAgICAgIHRoaXMuX3ZpZXdNb2RlbHNCeUlkID0ge307IC8vIFZpZXcgaW5zdGFuY2VzIGFyZSBsYXppbHkgY3JlYXRlZCBieSBnZXRWaWV3QnlJZC5cbiAgICAgICAgdGhpcy5fZmllbGRNb2RlbHNCeUlkID0ge307IC8vIEZpZWxkIGluc3RhbmNlcyBhcmUgbGF6aWx5IGNyZWF0ZWQgYnkgZ2V0RmllbGRCeUlkLlxuICAgICAgICB0aGlzLl9jYWNoZWRGaWVsZE5hbWVzQnlJZCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fX3RhYmxlT3JWaWV3UXVlcnlSZXN1bHRQb29sID0gbmV3IE9iamVjdFBvb2woVGFibGVPclZpZXdRdWVyeVJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0IF9kYXRhT3JOdWxsSWZEZWxldGVkKCk6IFRhYmxlRGF0YSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZURhdGEudGFibGVzQnlJZFt0aGlzLl9pZF0gPz8gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgdGhhdCB0aGlzIHRhYmxlIGJlbG9uZ3MgdG8uXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWwgKHNpbmNlIHdlIG1heSBub3QgYmUgYWJsZSB0byByZXR1cm4gcGFyZW50IG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgaW1tdXRhYmxlIG1vZGVscyB3b3JsZClcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHtiYXNlfSBmcm9tICdAYWlydGFibGUvYmxvY2tzJztcbiAgICAgKiBjb25zdCB0YWJsZSA9IGJhc2UuZ2V0VGFibGVCeU5hbWUoJ1RhYmxlIDEnKTtcbiAgICAgKiBjb25zb2xlLmxvZyh0YWJsZS5wYXJlbnRCYXNlLmlkID09PSBiYXNlLmlkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IHBhcmVudEJhc2UoKTogQmFzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRCYXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdGFibGUuIENhbiBiZSB3YXRjaGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnNvbGUubG9nKG15VGFibGUubmFtZSk7XG4gICAgICogLy8gPT4gJ1RhYmxlIDEnXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEubmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZSwgaWYgaXQgaGFzIG9uZS4gQ2FuIGJlIHdhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlUYWJsZS5kZXNjcmlwdGlvbik7XG4gICAgICogLy8gPT4gJ1RoaXMgaXMgbXkgdGFibGUnXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIHRhYmxlLiBZb3UgY2FuIHZpc2l0IHRoaXMgVVJMIGluIHRoZSBicm93c2VyIHRvIGJlIHRha2VuIHRvIHRoZSB0YWJsZSBpbiB0aGUgQWlydGFibGUgVUkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlUYWJsZS51cmwpO1xuICAgICAqIC8vID0+ICdodHRwczovL2FpcnRhYmxlLmNvbS90Ymx4eHh4eHh4eHh4eHh4eCdcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS51cmxDb25zdHJ1Y3Rvci5nZXRUYWJsZVVybCh0aGlzLmlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHRhYmxlJ3MgcHJpbWFyeSBmaWVsZC4gRXZlcnkgdGFibGUgaGFzIGV4YWN0bHkgb25lIHByaW1hcnlcbiAgICAgKiBmaWVsZC4gVGhlIHByaW1hcnkgZmllbGQgb2YgYSB0YWJsZSB3aWxsIG5vdCBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlUYWJsZS5wcmltYXJ5RmllbGQubmFtZSk7XG4gICAgICogLy8gPT4gJ05hbWUnXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IHByaW1hcnlGaWVsZCgpOiBGaWVsZCB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlGaWVsZCA9IHRoaXMuZ2V0RmllbGRCeUlkKHRoaXMuX2RhdGEucHJpbWFyeUZpZWxkSWQpO1xuICAgICAgICByZXR1cm4gcHJpbWFyeUZpZWxkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGRzIGluIHRoaXMgdGFibGUuIFRoZSBvcmRlciBpcyBhcmJpdHJhcnksIHNpbmNlIGZpZWxkcyBhcmVcbiAgICAgKiBvbmx5IG9yZGVyZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBzcGVjaWZpYyB2aWV3LlxuICAgICAqXG4gICAgICogQ2FuIGJlIHdhdGNoZWQgdG8ga25vdyB3aGVuIGZpZWxkcyBhcmUgY3JlYXRlZCBvciBkZWxldGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnNvbGUubG9nKGBUaGlzIHRhYmxlIGhhcyAke215VGFibGUuZmllbGRzLmxlbmd0aH0gZmllbGRzYCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGZpZWxkcygpOiBBcnJheTxGaWVsZD4ge1xuICAgICAgICAvLyBUT0RPKGthc3JhKTogaXMgaXQgY29uZnVzaW5nIHRoYXQgdGhpcyByZXR1cm5zIGFuIGFycmF5LCBzaW5jZSB0aGUgb3JkZXJcbiAgICAgICAgLy8gaXMgYXJiaXRyYXJ5P1xuICAgICAgICAvLyBUT0RPKGthc3JhKTogY2FjaGUgYW5kIGZyZWV6ZSB0aGlzIHNvIGl0IGlzbid0IE8obilcbiAgICAgICAgY29uc3QgZmllbGRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZmllbGRJZCBvZiBPYmplY3Qua2V5cyh0aGlzLl9kYXRhLmZpZWxkc0J5SWQpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2V0RmllbGRCeUlkKGZpZWxkSWQpO1xuICAgICAgICAgICAgZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpZWxkIG1hdGNoaW5nIHRoZSBnaXZlbiBJRCwgb3IgYG51bGxgIGlmIHRoYXQgZmllbGQgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyB0YWJsZS5cblxuICAgICAqIEBwYXJhbSBmaWVsZElkIFRoZSBJRCBvZiB0aGUgZmllbGQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkSWQgPSAnZmxkeHh4eHh4eHh4eHh4eHgnO1xuICAgICAqIGNvbnN0IGZpZWxkID0gbXlUYWJsZS5nZXRGaWVsZEJ5SWRJZkV4aXN0cyhmaWVsZElkKTtcbiAgICAgKiBpZiAoZmllbGQgIT09IG51bGwpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZmllbGQubmFtZSk7XG4gICAgICogfSBlbHNlIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ05vIGZpZWxkIGV4aXN0cyB3aXRoIHRoYXQgSUQnKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0RmllbGRCeUlkSWZFeGlzdHMoZmllbGRJZDogRmllbGRJZCk6IEZpZWxkIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5fZGF0YS5maWVsZHNCeUlkW2ZpZWxkSWRdKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZmllbGRNb2RlbHNCeUlkW2ZpZWxkSWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRNb2RlbHNCeUlkW2ZpZWxkSWRdID0gbmV3IEZpZWxkKHRoaXMuX3NkaywgdGhpcywgZmllbGRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRNb2RlbHNCeUlkW2ZpZWxkSWRdO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpZWxkIG1hdGNoaW5nIHRoZSBnaXZlbiBJRC4gVGhyb3dzIGlmIHRoYXQgZmllbGQgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyB0YWJsZS4gVXNlXG4gICAgICoge0BsaW5rIGdldEZpZWxkQnlJZElmRXhpc3RzfSBpbnN0ZWFkIGlmIHlvdSBhcmUgdW5zdXJlIHdoZXRoZXIgYSBmaWVsZCBleGlzdHMgd2l0aCB0aGUgZ2l2ZW5cbiAgICAgKiBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZElkIFRoZSBJRCBvZiB0aGUgZmllbGQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkSWQgPSAnZmxkeHh4eHh4eHh4eHh4eHgnO1xuICAgICAqIGNvbnN0IGZpZWxkID0gbXlUYWJsZS5nZXRGaWVsZEJ5SWQoZmllbGRJZCk7XG4gICAgICogY29uc29sZS5sb2coZmllbGQubmFtZSk7XG4gICAgICogLy8gPT4gJ05hbWUnXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0RmllbGRCeUlkKGZpZWxkSWQ6IEZpZWxkSWQpOiBGaWVsZCB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5nZXRGaWVsZEJ5SWRJZkV4aXN0cyhmaWVsZElkKTtcbiAgICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIk5vIGZpZWxkIHdpdGggSUQgJXMgaW4gdGFibGUgJyVzJ1wiLCBmaWVsZElkLCB0aGlzLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmllbGQgbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWUsIG9yIGBudWxsYCBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGF0IG5hbWUgaW4gdGhpc1xuICAgICAqIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgeW91J3JlIGxvb2tpbmcgZm9yLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IG15VGFibGUuZ2V0RmllbGRCeU5hbWVJZkV4aXN0cygnTmFtZScpO1xuICAgICAqIGlmIChmaWVsZCAhPT0gbnVsbCkge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhmaWVsZC5pZCk7XG4gICAgICogfSBlbHNlIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ05vIGZpZWxkIGV4aXN0cyB3aXRoIHRoYXQgbmFtZScpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRGaWVsZEJ5TmFtZUlmRXhpc3RzKGZpZWxkTmFtZTogc3RyaW5nKTogRmllbGQgfCBudWxsIHtcbiAgICAgICAgZm9yIChjb25zdCBbZmllbGRJZCwgZmllbGREYXRhXSBvZiBlbnRyaWVzKHRoaXMuX2RhdGEuZmllbGRzQnlJZCkpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZERhdGEubmFtZSA9PT0gZmllbGROYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRCeUlkSWZFeGlzdHMoZmllbGRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpZWxkIG1hdGNoaW5nIHRoZSBnaXZlbiBuYW1lLiBUaHJvd3MgaWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhhdCBuYW1lIGluIHRoaXNcbiAgICAgKiB0YWJsZS4gVXNlIHtAbGluayBnZXRGaWVsZEJ5TmFtZUlmRXhpc3RzfSBpbnN0ZWFkIGlmIHlvdSBhcmUgdW5zdXJlIHdoZXRoZXIgYSBmaWVsZCBleGlzdHNcbiAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgeW91J3JlIGxvb2tpbmcgZm9yLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IG15VGFibGUuZ2V0RmllbGRCeU5hbWUoJ05hbWUnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhmaWVsZC5pZCk7XG4gICAgICogLy8gPT4gJ2ZsZHh4eHh4eHh4eHh4eHh4J1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldEZpZWxkQnlOYW1lKGZpZWxkTmFtZTogc3RyaW5nKTogRmllbGQge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2V0RmllbGRCeU5hbWVJZkV4aXN0cyhmaWVsZE5hbWUpO1xuICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiTm8gZmllbGQgbmFtZWQgJyVzJyBpbiB0YWJsZSAnJXMnXCIsIGZpZWxkTmFtZSwgdGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCBtYXRjaGluZyB0aGUgZ2l2ZW4gSUQgb3IgbmFtZS4gUmV0dXJucyBgbnVsbGAgaWYgbm8gbWF0Y2hpbmcgZmllbGQgZXhpc3RzIHdpdGhpblxuICAgICAqIHRoaXMgdGFibGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjb252ZW5pZW50IHdoZW4gYnVpbGRpbmcgYW4gYXBwIGZvciBhIHNwZWNpZmljIGJhc2UsIGJ1dCBmb3IgbW9yZSBnZW5lcmljXG4gICAgICogYXBwcyB0aGUgYmVzdCBwcmFjdGljZSBpcyB0byB1c2UgdGhlIHtAbGluayBnZXRGaWVsZEJ5SWRJZkV4aXN0c30gb3JcbiAgICAgKiB7QGxpbmsgZ2V0RmllbGRCeU5hbWVJZkV4aXN0c30gbWV0aG9kcyBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkSWRPck5hbWUgVGhlIElEIG9yIG5hbWUgb2YgdGhlIGZpZWxkIHlvdSdyZSBsb29raW5nIGZvci5cbiAgICAgKi9cbiAgICBnZXRGaWVsZElmRXhpc3RzKGZpZWxkSWRPck5hbWU6IEZpZWxkSWQgfCBzdHJpbmcpOiBGaWVsZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEJ5SWRJZkV4aXN0cyhmaWVsZElkT3JOYW1lKSA/PyB0aGlzLmdldEZpZWxkQnlOYW1lSWZFeGlzdHMoZmllbGRJZE9yTmFtZSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIG1hdGNoaW5nIHRoZSBnaXZlbiBJRCBvciBuYW1lLiBUaHJvd3MgaWYgbm8gbWF0Y2hpbmcgZmllbGQgZXhpc3RzIHdpdGhpbiB0aGlzIHRhYmxlLlxuICAgICAqIFVzZSB7QGxpbmsgZ2V0RmllbGRJZkV4aXN0c30gaW5zdGVhZCBpZiB5b3UgYXJlIHVuc3VyZSB3aGV0aGVyIGEgZmllbGQgZXhpc3RzIHdpdGggdGhlIGdpdmVuXG4gICAgICogbmFtZS9JRC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNvbnZlbmllbnQgd2hlbiBidWlsZGluZyBhbiBhcHAgZm9yIGEgc3BlY2lmaWMgYmFzZSwgYnV0IGZvciBtb3JlIGdlbmVyaWNcbiAgICAgKiBhcHBzIHRoZSBiZXN0IHByYWN0aWNlIGlzIHRvIHVzZSB0aGUge0BsaW5rIGdldEZpZWxkQnlJZH0gb3Ige0BsaW5rIGdldEZpZWxkQnlOYW1lfSBtZXRob2RzXG4gICAgICogaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZElkT3JOYW1lIFRoZSBJRCBvciBuYW1lIG9mIHRoZSBmaWVsZCB5b3UncmUgbG9va2luZyBmb3IuXG4gICAgICovXG4gICAgZ2V0RmllbGQoZmllbGRJZE9yTmFtZTogRmllbGRJZCB8IHN0cmluZyk6IEZpZWxkIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdldEZpZWxkSWZFeGlzdHMoZmllbGRJZE9yTmFtZSk7XG4gICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJObyBmaWVsZCB3aXRoIElEIG9yIG5hbWUgJyVzJyBpbiB0YWJsZSAnJXMnXCIsXG4gICAgICAgICAgICAgICAgZmllbGRJZE9yTmFtZSxcbiAgICAgICAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHZpZXdzIGluIHRoaXMgdGFibGUuIENhbiBiZSB3YXRjaGVkIHRvIGtub3cgd2hlbiB2aWV3cyBhcmUgY3JlYXRlZCxcbiAgICAgKiBkZWxldGVkLCBvciByZW9yZGVyZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2coYFRoaXMgdGFibGUgaGFzICR7bXlUYWJsZS52aWV3cy5sZW5ndGh9IHZpZXdzYCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IHZpZXdzKCk6IEFycmF5PFZpZXc+IHtcbiAgICAgICAgLy8gVE9ETyhrYXNyYSk6IGNhY2hlIGFuZCBmcmVlemUgdGhpcyBzbyBpdCBpc24ndCBPKG4pXG4gICAgICAgIGNvbnN0IHZpZXdzOiBBcnJheTxWaWV3PiA9IFtdO1xuICAgICAgICB0aGlzLl9kYXRhLnZpZXdPcmRlci5mb3JFYWNoKHZpZXdJZCA9PiB7XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xuICAgICAgICAgICAgdmlld3MucHVzaCh2aWV3KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2aWV3cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmlldyBtYXRjaGluZyB0aGUgZ2l2ZW4gSUQsIG9yIGBudWxsYCBpZiB0aGF0IHZpZXcgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIElEIG9mIHRoZSB2aWV3LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB2aWV3SWQgPSAndml3eHh4eHh4eHh4eHh4eHgnO1xuICAgICAqIGNvbnN0IHZpZXcgPSBteVRhYmxlLmdldFZpZXdCeUlkSWZFeGlzdHModmlld0lkKTtcbiAgICAgKiBpZiAodmlldyAhPT0gbnVsbCkge1xuICAgICAqICAgICBjb25zb2xlLmxvZyh2aWV3Lm5hbWUpO1xuICAgICAqIH0gZWxzZSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdObyB2aWV3IGV4aXN0cyB3aXRoIHRoYXQgSUQnKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0Vmlld0J5SWRJZkV4aXN0cyh2aWV3SWQ6IFZpZXdJZCk6IFZpZXcgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kYXRhLnZpZXdzQnlJZFt2aWV3SWRdKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fdmlld01vZGVsc0J5SWRbdmlld0lkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdNb2RlbHNCeUlkW3ZpZXdJZF0gPSBuZXcgVmlldyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2RrLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWNvcmRTdG9yZS5nZXRWaWV3RGF0YVN0b3JlKHZpZXdJZCksXG4gICAgICAgICAgICAgICAgICAgIHZpZXdJZCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdNb2RlbHNCeUlkW3ZpZXdJZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmlldyBtYXRjaGluZyB0aGUgZ2l2ZW4gSUQuIFRocm93cyBpZiB0aGF0IHZpZXcgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyB0YWJsZS4gVXNlXG4gICAgICoge0BsaW5rIGdldFZpZXdCeUlkSWZFeGlzdHN9IGluc3RlYWQgaWYgeW91IGFyZSB1bnN1cmUgd2hldGhlciBhIHZpZXcgZXhpc3RzIHdpdGggdGhlIGdpdmVuXG4gICAgICogSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBJRCBvZiB0aGUgdmlldy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgdmlld0lkID0gJ3Zpd3h4eHh4eHh4eHh4eHh4JztcbiAgICAgKiBjb25zdCB2aWV3ID0gbXlUYWJsZS5nZXRWaWV3QnlJZCh2aWV3SWQpO1xuICAgICAqIGNvbnNvbGUubG9nKHZpZXcubmFtZSk7XG4gICAgICogLy8gPT4gJ0dyaWQgdmlldydcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRWaWV3QnlJZCh2aWV3SWQ6IFZpZXdJZCk6IFZpZXcge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZElmRXhpc3RzKHZpZXdJZCk7XG4gICAgICAgIGlmICghdmlldykge1xuICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIk5vIHZpZXcgd2l0aCBJRCAlcyBpbiB0YWJsZSAnJXMnXCIsIHZpZXdJZCwgdGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlldztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmlldyBtYXRjaGluZyB0aGUgZ2l2ZW4gbmFtZSwgb3IgYG51bGxgIGlmIG5vIHZpZXcgZXhpc3RzIHdpdGggdGhhdCBuYW1lIGluIHRoaXNcbiAgICAgKiB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aWV3TmFtZSBUaGUgbmFtZSBvZiB0aGUgdmlldyB5b3UncmUgbG9va2luZyBmb3IuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHZpZXcgPSBteVRhYmxlLmdldFZpZXdCeU5hbWVJZkV4aXN0cygnTmFtZScpO1xuICAgICAqIGlmICh2aWV3ICE9PSBudWxsKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHZpZXcuaWQpO1xuICAgICAqIH0gZWxzZSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdObyB2aWV3IGV4aXN0cyB3aXRoIHRoYXQgbmFtZScpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRWaWV3QnlOYW1lSWZFeGlzdHModmlld05hbWU6IHN0cmluZyk6IFZpZXcgfCBudWxsIHtcbiAgICAgICAgZm9yIChjb25zdCBbdmlld0lkLCB2aWV3RGF0YV0gb2YgZW50cmllcyh0aGlzLl9kYXRhLnZpZXdzQnlJZCkpIHtcbiAgICAgICAgICAgIGlmICh2aWV3RGF0YS5uYW1lID09PSB2aWV3TmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZpZXdCeUlkSWZFeGlzdHModmlld0lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmlldyBtYXRjaGluZyB0aGUgZ2l2ZW4gbmFtZS4gVGhyb3dzIGlmIG5vIHZpZXcgZXhpc3RzIHdpdGggdGhhdCBuYW1lIGluIHRoaXMgdGFibGUuXG4gICAgICogVXNlIHtAbGluayBnZXRWaWV3QnlOYW1lSWZFeGlzdHN9IGluc3RlYWQgaWYgeW91IGFyZSB1bnN1cmUgd2hldGhlciBhIHZpZXcgZXhpc3RzIHdpdGggdGhlXG4gICAgICogZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aWV3TmFtZSBUaGUgbmFtZSBvZiB0aGUgdmlldyB5b3UncmUgbG9va2luZyBmb3IuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHZpZXcgPSBteVRhYmxlLmdldFZpZXdCeU5hbWUoJ05hbWUnKTtcbiAgICAgKiBjb25zb2xlLmxvZyh2aWV3LmlkKTtcbiAgICAgKiAvLyA9PiAndml3eHh4eHh4eHh4eHh4eHgnXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0Vmlld0J5TmFtZSh2aWV3TmFtZTogc3RyaW5nKTogVmlldyB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXdCeU5hbWVJZkV4aXN0cyh2aWV3TmFtZSk7XG4gICAgICAgIGlmICghdmlldykge1xuICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIk5vIHZpZXcgbmFtZWQgJyVzJyBpbiB0YWJsZSAnJXMnXCIsIHZpZXdOYW1lLCB0aGlzLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aWV3O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdmlldyBtYXRjaGluZyB0aGUgZ2l2ZW4gSUQgb3IgbmFtZS4gUmV0dXJucyBgbnVsbGAgaWYgbm8gbWF0Y2hpbmcgdmlldyBleGlzdHMgd2l0aGluXG4gICAgICogdGhpcyB0YWJsZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNvbnZlbmllbnQgd2hlbiBidWlsZGluZyBhbiBhcHAgZm9yIGEgc3BlY2lmaWMgYmFzZSwgYnV0IGZvciBtb3JlIGdlbmVyaWNcbiAgICAgKiBhcHBzIHRoZSBiZXN0IHByYWN0aWNlIGlzIHRvIHVzZSB0aGUge0BsaW5rIGdldFZpZXdCeUlkSWZFeGlzdHN9IG9yXG4gICAgICoge0BsaW5rIGdldFZpZXdCeU5hbWVJZkV4aXN0c30gbWV0aG9kcyBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZpZXdJZE9yTmFtZSBUaGUgSUQgb3IgbmFtZSBvZiB0aGUgdmlldyB5b3UncmUgbG9va2luZyBmb3IuXG4gICAgICovXG4gICAgZ2V0Vmlld0lmRXhpc3RzKHZpZXdJZE9yTmFtZTogVmlld0lkIHwgc3RyaW5nKTogVmlldyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRWaWV3QnlJZElmRXhpc3RzKHZpZXdJZE9yTmFtZSkgPz8gdGhpcy5nZXRWaWV3QnlOYW1lSWZFeGlzdHModmlld0lkT3JOYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHZpZXcgbWF0Y2hpbmcgdGhlIGdpdmVuIElEIG9yIG5hbWUuIFRocm93cyBpZiBubyBtYXRjaGluZyB2aWV3IGV4aXN0cyB3aXRoaW4gdGhpcyB0YWJsZS5cbiAgICAgKiBVc2Uge0BsaW5rIGdldFZpZXdJZkV4aXN0c30gaW5zdGVhZCBpZiB5b3UgYXJlIHVuc3VyZSB3aGV0aGVyIGEgdmlldyBleGlzdHMgd2l0aCB0aGUgZ2l2ZW5cbiAgICAgKiBuYW1lL0lELlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY29udmVuaWVudCB3aGVuIGJ1aWxkaW5nIGFuIGFwcCBmb3IgYSBzcGVjaWZpYyBiYXNlLCBidXQgZm9yIG1vcmUgZ2VuZXJpY1xuICAgICAqIGFwcHMgdGhlIGJlc3QgcHJhY3RpY2UgaXMgdG8gdXNlIHRoZSB7QGxpbmsgZ2V0Vmlld0J5SWR9IG9yIHtAbGluayBnZXRWaWV3QnlOYW1lfSBtZXRob2RzXG4gICAgICogaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aWV3SWRPck5hbWUgVGhlIElEIG9yIG5hbWUgb2YgdGhlIHZpZXcgeW91J3JlIGxvb2tpbmcgZm9yLlxuICAgICAqL1xuICAgIGdldFZpZXcodmlld0lkT3JOYW1lOiBWaWV3SWQgfCBzdHJpbmcpOiBWaWV3IHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0Vmlld0lmRXhpc3RzKHZpZXdJZE9yTmFtZSk7XG4gICAgICAgIGlmICghdmlldykge1xuICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIk5vIHZpZXcgd2l0aCBJRCBvciBuYW1lICclcycgaW4gdGFibGUgJyVzJ1wiLCB2aWV3SWRPck5hbWUsIHRoaXMubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbGVjdCByZWNvcmRzIGZyb20gdGhlIHRhYmxlLiBSZXR1cm5zIGEge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fS5cbiAgICAgKlxuICAgICAqIENvbnNpZGVyIHVzaW5nIHtAbGluayB1c2VSZWNvcmRzfSBvciB7QGxpbmsgdXNlUmVjb3JkSWRzfSBpbnN0ZWFkLCB1bmxlc3MgeW91IG5lZWQgdGhlXG4gICAgICogZmVhdHVyZXMgb2YgYSBRdWVyeVJlc3VsdCAoZS5nLiBgcXVlcnlSZXN1bHQuZ2V0UmVjb3JkQnlJZGApLiBSZWNvcmQgaG9va3MgaGFuZGxlXG4gICAgICogbG9hZGluZy91bmxvYWRpbmcgYW5kIHVwZGF0aW5nIHlvdXIgVUkgYXV0b21hdGljYWxseSwgYnV0IG1hbnVhbGx5IGBzZWxlY3RgaW5nIHJlY29yZHMgaXNcbiAgICAgKiB1c2VmdWwgZm9yIG9uZS1vZmYgZGF0YSBwcm9jZXNzaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBmb3IgdGhlIHF1ZXJ5LCBzdWNoIGFzIHNvcnRzIGFuZCBmaWVsZHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7dXNlQmFzZSwgdXNlUmVjb3Jkc30gZnJvbSAnQGFpcnRhYmxlL2Jsb2Nrcy91aSc7XG4gICAgICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIFRvZG9MaXN0KCkge1xuICAgICAqICAgICBjb25zdCBiYXNlID0gdXNlQmFzZSgpO1xuICAgICAqICAgICBjb25zdCB0YWJsZSA9IGJhc2UuZ2V0VGFibGVCeU5hbWUoJ1Rhc2tzJyk7XG4gICAgICpcbiAgICAgKiAgICAgY29uc3QgcXVlcnlSZXN1bHQgPSB0YWJsZS5zZWxlY3RSZWNvcmRzKCk7XG4gICAgICogICAgIGNvbnN0IHJlY29yZHMgPSB1c2VSZWNvcmRzKHF1ZXJ5UmVzdWx0KTtcbiAgICAgKlxuICAgICAqICAgICByZXR1cm4gKFxuICAgICAqICAgICAgICAgPHVsPlxuICAgICAqICAgICAgICAgICAgIHtyZWNvcmRzLm1hcChyZWNvcmQgPT4gKFxuICAgICAqICAgICAgICAgICAgICAgICA8bGkga2V5PXtyZWNvcmQuaWR9PlxuICAgICAqICAgICAgICAgICAgICAgICAgICAge3JlY29yZC5uYW1lIHx8ICdVbm5hbWVkIHJlY29yZCd9XG4gICAgICogICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICogICAgICAgICAgICAgKSl9XG4gICAgICogICAgICAgICA8L3VsPlxuICAgICAqICAgICApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzZWxlY3RSZWNvcmRzKG9wdHM/OiBSZWNvcmRRdWVyeVJlc3VsdE9wdHMpOiBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE9wdHMgPSBSZWNvcmRRdWVyeVJlc3VsdC5fbm9ybWFsaXplT3B0cyhcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLl9yZWNvcmRTdG9yZSxcbiAgICAgICAgICAgIG9wdHMgfHwge30sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLl9fdGFibGVPclZpZXdRdWVyeVJlc3VsdFBvb2wuZ2V0T2JqZWN0Rm9yUmV1c2UodGhpcy5fc2RrLCB0aGlzLCBub3JtYWxpemVkT3B0cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBhbmQgbG9hZCByZWNvcmRzIGZyb20gdGhlIHRhYmxlLiBSZXR1cm5zIGEge0BsaW5rIFJlY29yZFF1ZXJ5UmVzdWx0fSBwcm9taXNlIHdoZXJlXG4gICAgICogcmVjb3JkIGRhdGEgaGFzIGJlZW4gbG9hZGVkLlxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdXNpbmcge0BsaW5rIHVzZVJlY29yZHN9IG9yIHtAbGluayB1c2VSZWNvcmRJZHN9IGluc3RlYWQsIHVubGVzcyB5b3UgbmVlZCB0aGVcbiAgICAgKiBmZWF0dXJlcyBvZiBhIFF1ZXJ5UmVzdWx0IChlLmcuIGBxdWVyeVJlc3VsdC5nZXRSZWNvcmRCeUlkYCkuIFJlY29yZCBob29rcyBoYW5kbGVcbiAgICAgKiBsb2FkaW5nL3VubG9hZGluZyBhbmQgdXBkYXRpbmcgeW91ciBVSSBhdXRvbWF0aWNhbGx5LCBidXQgbWFudWFsbHkgYHNlbGVjdGBpbmcgcmVjb3JkcyBpc1xuICAgICAqIHVzZWZ1bCBmb3Igb25lLW9mZiBkYXRhIHByb2Nlc3NpbmcuXG4gICAgICpcbiAgICAgKiBPbmNlIHlvdSd2ZSBmaW5pc2hlZCB3aXRoIHlvdXIgcXVlcnksIHJlbWVtYmVyIHRvIGNhbGwgYHF1ZXJ5UmVzdWx0LnVubG9hZERhdGEoKWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIGZvciB0aGUgcXVlcnksIHN1Y2ggYXMgc29ydHMgYW5kIGZpZWxkcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogYXN5bmMgZnVuY3Rpb24gbG9nUmVjb3JkQ291bnRBc3luYyh0YWJsZSkge1xuICAgICAqICAgICBjb25zdCBxdWVyeSA9IGF3YWl0IHRhYmxlLnNlbGVjdFJlY29yZHNBc3luYygpO1xuICAgICAqICAgICBjb25zb2xlLmxvZyhxdWVyeS5yZWNvcmRJZHMubGVuZ3RoKTtcbiAgICAgKiAgICAgcXVlcnkudW5sb2FkRGF0YSgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyBzZWxlY3RSZWNvcmRzQXN5bmMob3B0cz86IFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyk6IFByb21pc2U8VGFibGVPclZpZXdRdWVyeVJlc3VsdD4ge1xuICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IHRoaXMuc2VsZWN0UmVjb3JkcyhvcHRzKTtcbiAgICAgICAgYXdhaXQgcXVlcnlSZXN1bHQubG9hZERhdGFBc3luYygpO1xuICAgICAgICByZXR1cm4gcXVlcnlSZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHZpZXcgaW4gdGhlIHRhYmxlIHdoZXJlIHRoZSB0eXBlIGlzIG9uZSBvZiBgYWxsb3dlZFZpZXdUeXBlc2AsIG9yIGBudWxsYCBpZlxuICAgICAqIG5vIHN1Y2ggdmlldyBleGlzdHMgaW4gdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFsbG93ZWRWaWV3VHlwZXMgQW4gYXJyYXkgb2YgdmlldyB0eXBlcyBvciBhIHNpbmdsZSB2aWV3IHR5cGUgdG8gbWF0Y2ggYWdhaW5zdC5cbiAgICAgKiBAcGFyYW0gcHJlZmVycmVkVmlld09yVmlld0lkIElmIGEgdmlldyBvciB2aWV3IElEIGlzIHN1cHBsaWVkIGFuZCB0aGF0IHZpZXcgZXhpc3RzICYgaGFzIHRoZVxuICAgICAqIGNvcnJlY3QgdHlwZSwgdGhhdCB2aWV3IHdpbGwgYmUgcmV0dXJuZWQgYmVmb3JlIGNoZWNraW5nIHRoZSBvdGhlciB2aWV3cyBpbiB0aGUgdGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7Vmlld1R5cGV9IGZyb20gJ0BhaXJ0YWJsZS9ibG9ja3MvbW9kZWxzJztcbiAgICAgKiBjb25zdCBmaXJzdENhbGVuZGFyVmlldyA9IG15VGFibGUuZ2V0Rmlyc3RWaWV3T2ZUeXBlKFZpZXdUeXBlLkNBTEVOREFSKTtcbiAgICAgKiBpZiAoZmlyc3RDYWxlbmRhclZpZXcgIT09IG51bGwpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZmlyc3RDYWxlbmRhclZpZXcubmFtZSk7XG4gICAgICogfSBlbHNlIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ05vIGNhbGVuZGFyIHZpZXdzIGV4aXN0IGluIHRoZSB0YWJsZScpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRGaXJzdFZpZXdPZlR5cGUoXG4gICAgICAgIGFsbG93ZWRWaWV3VHlwZXM6IEFycmF5PFZpZXdUeXBlPiB8IFZpZXdUeXBlLFxuICAgICAgICBwcmVmZXJyZWRWaWV3T3JWaWV3SWQ/OiBWaWV3IHwgVmlld0lkIHwgbnVsbCxcbiAgICApOiBWaWV3IHwgbnVsbCB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhbGxvd2VkVmlld1R5cGVzKSkge1xuICAgICAgICAgICAgYWxsb3dlZFZpZXdUeXBlcyA9IGNhc3Q8QXJyYXk8Vmlld1R5cGU+PihbYWxsb3dlZFZpZXdUeXBlc10pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZWZlcnJlZFZpZXdPclZpZXdJZCkge1xuICAgICAgICAgICAgY29uc3QgcHJlZmVycmVkVmlldyA9IHRoaXMuZ2V0Vmlld0J5SWRJZkV4aXN0cyhcbiAgICAgICAgICAgICAgICB0eXBlb2YgcHJlZmVycmVkVmlld09yVmlld0lkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHByZWZlcnJlZFZpZXdPclZpZXdJZFxuICAgICAgICAgICAgICAgICAgICA6IHByZWZlcnJlZFZpZXdPclZpZXdJZC5pZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocHJlZmVycmVkVmlldyAmJiBhbGxvd2VkVmlld1R5cGVzLmluY2x1ZGVzKHByZWZlcnJlZFZpZXcudHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZmVycmVkVmlldztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnZpZXdzLmZpbmQodmlldyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWRWaWV3VHlwZXMuaW5jbHVkZXModmlldy50eXBlKTtcbiAgICAgICAgICAgIH0pID8/IG51bGxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLy8gRXhwZXJpbWVudGFsLCBkbyBub3QgZG9jdW1lbnQgeWV0LiBBbGxvd3MgZmV0Y2hpbmcgZGVmYXVsdCBjZWxsIHZhbHVlcyBmb3JcbiAgICAvLyBhIHRhYmxlIG9yIHZpZXcuIEJlZm9yZSBkb2N1bWVudGluZywgd2Ugc2hvdWxkIGV4cGxvcmUgbWFraW5nIHRoaXMgc3luY2hyb25vdXMuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICBhc3luYyBnZXREZWZhdWx0Q2VsbFZhbHVlc0J5RmllbGRJZEFzeW5jKG9wdHM/OiB7XG4gICAgICAgIHZpZXc/OiBWaWV3IHwgbnVsbDtcbiAgICB9KTogUHJvbWlzZTx7W2tleTogc3RyaW5nXTogdW5rbm93bn0+IHtcbiAgICAgICAgY29uc3Qgdmlld0lkID0gb3B0cyAmJiBvcHRzLnZpZXcgPyBvcHRzLnZpZXcuaWQgOiBudWxsO1xuICAgICAgICBjb25zdCBjZWxsVmFsdWVzQnlGaWVsZElkID0gYXdhaXQgdGhpcy5fc2RrLl9fYWlydGFibGVJbnRlcmZhY2UuZmV0Y2hEZWZhdWx0Q2VsbFZhbHVlc0J5RmllbGRJZEFzeW5jKFxuICAgICAgICAgICAgdGhpcy5faWQsXG4gICAgICAgICAgICB2aWV3SWQsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBjZWxsVmFsdWVzQnlGaWVsZElkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGNlbGwgdmFsdWVzIGZvciBhIHJlY29yZC5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBnaXZlbiBjZWxsIHZhbHVlcyBpblxuICAgICAqIHRoZSByZWNvcmQsIG9yIGlmIGludmFsaWQgaW5wdXQgaXMgcHJvdmlkZWQgKGVnLiBpbnZhbGlkIGNlbGwgdmFsdWVzKS5cbiAgICAgKlxuICAgICAqIFJlZmVyIHRvIHtAbGluayBGaWVsZFR5cGV9IGZvciBjZWxsIHZhbHVlIHdyaXRlIGZvcm1hdHMuXG4gICAgICpcbiAgICAgKiBUaGlzIGFjdGlvbiBpcyBhc3luY2hyb25vdXM6IGBhd2FpdGAgdGhlIHJldHVybmVkIHByb21pc2UgaWYgeW91IHdpc2ggdG8gd2FpdCBmb3IgdGhlIHVwZGF0ZWRcbiAgICAgKiBjZWxsIHZhbHVlcyB0byBiZSBwZXJzaXN0ZWQgdG8gQWlydGFibGUgc2VydmVycy5cbiAgICAgKiBVcGRhdGVzIGFyZSBhcHBsaWVkIG9wdGltaXN0aWNhbGx5IGxvY2FsbHksIHNvIHlvdXIgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB5b3VyIGFwcFxuICAgICAqIGJlZm9yZSB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWNvcmRPclJlY29yZElkIHRoZSByZWNvcmQgdG8gdXBkYXRlXG4gICAgICogQHBhcmFtIGZpZWxkcyBjZWxsIHZhbHVlcyB0byB1cGRhdGUgaW4gdGhhdCByZWNvcmQsIHNwZWNpZmllZCBhcyBvYmplY3QgbWFwcGluZyBgRmllbGRJZGAgb3IgZmllbGQgbmFtZSB0byB2YWx1ZSBmb3IgdGhhdCBmaWVsZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogZnVuY3Rpb24gdXBkYXRlUmVjb3JkKHJlY29yZCwgcmVjb3JkRmllbGRzKSB7XG4gICAgICogICAgIGlmICh0YWJsZS5oYXNQZXJtaXNzaW9uVG9VcGRhdGVSZWNvcmQocmVjb3JkLCByZWNvcmRGaWVsZHMpKSB7XG4gICAgICogICAgICAgICB0YWJsZS51cGRhdGVSZWNvcmRBc3luYyhyZWNvcmQsIHJlY29yZEZpZWxkcyk7XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgLy8gVGhlIHVwZGF0ZWQgdmFsdWVzIHdpbGwgbm93IHNob3cgaW4geW91ciBhcHAgKGVnIGluXG4gICAgICogICAgIC8vIGB0YWJsZS5zZWxlY3RSZWNvcmRzKClgIHJlc3VsdCkgYnV0IGFyZSBzdGlsbCBiZWluZyBzYXZlZCB0byBBaXJ0YWJsZVxuICAgICAqICAgICAvLyBzZXJ2ZXJzIChlLmcuIG90aGVyIHVzZXJzIG1heSBub3QgYmUgYWJsZSB0byBzZWUgdGhlbSB5ZXQpLlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVJlY29yZEFzeW5jKHJlY29yZCwgcmVjb3JkRmllbGRzKSB7XG4gICAgICogICAgIGlmICh0YWJsZS5oYXNQZXJtaXNzaW9uVG9VcGRhdGVSZWNvcmQocmVjb3JkLCByZWNvcmRGaWVsZHMpKSB7XG4gICAgICogICAgICAgICBhd2FpdCB0YWJsZS51cGRhdGVSZWNvcmRBc3luYyhyZWNvcmQsIHJlY29yZEZpZWxkcyk7XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgLy8gTmV3IHJlY29yZCBoYXMgYmVlbiBzYXZlZCB0byBBaXJ0YWJsZSBzZXJ2ZXJzLlxuICAgICAqICAgICBhbGVydChgcmVjb3JkIHdpdGggSUQgJHtyZWNvcmQuaWR9IGhhcyBiZWVuIHVwZGF0ZWRgKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBGaWVsZHMgY2FuIGJlIHNwZWNpZmllZCBieSBuYW1lIG9yIElEXG4gICAgICogdXBkYXRlUmVjb3JkKHJlY29yZDEsIHtcbiAgICAgKiAgICAgJ1Bvc3QgVGl0bGUnOiAnSG93IHRvIG1ha2U6IG9yYW5nZS1tYW5nbyBwb3VuZCBjYWtlJyxcbiAgICAgKiAgICAgJ1B1YmxpY2F0aW9uIERhdGUnOiAnMjAyMC0wMS0wMScsXG4gICAgICogfSk7XG4gICAgICogdXBkYXRlUmVjb3JkKHJlY29yZDIsIHtcbiAgICAgKiAgICAgW3Bvc3RUaXRsZUZpZWxkLmlkXTogJ0Nha2UgZGVjb3JhdGluZyB0aXBzICYgdHJpY2tzJyxcbiAgICAgKiAgICAgW3B1YmxpY2F0aW9uRGF0ZUZpZWxkLmlkXTogJzIwMjAtMDItMDInLFxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gQ2VsbCB2YWx1ZXMgc2hvdWxkIGdlbmVyYWxseSBoYXZlIGZvcm1hdCBtYXRjaGluZyB0aGUgb3V0cHV0IG9mXG4gICAgICogLy8gcmVjb3JkLmdldENlbGxWYWx1ZSgpIGZvciB0aGUgZmllbGQgYmVpbmcgdXBkYXRlZFxuICAgICAqIHVwZGF0ZVJlY29yZChyZWNvcmQxLCB7XG4gICAgICogICAgICdDYXRlZ29yeSAoc2luZ2xlIHNlbGVjdCknOiB7bmFtZTogJ1JlY2lwZSd9LFxuICAgICAqICAgICAnVGFncyAobXVsdGlwbGUgc2VsZWN0KSc6IFt7bmFtZTogJ0Rlc3NlcnRzJ30sIHtpZDogJ3NvbWVDaG9pY2VJZCd9XSxcbiAgICAgKiAgICAgJ0ltYWdlcyAoYXR0YWNobWVudCknOiBbe3VybDogJ2h0dHA6Ly9teXdlYnNpdGUuY29tL2Nha2UucG5nJ31dLFxuICAgICAqICAgICAnUmVsYXRlZCBwb3N0cyAobGlua2VkIHJlY29yZHMpJzogW3tpZDogJ3NvbWVSZWNvcmRJZCd9XSxcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVSZWNvcmRBc3luYyhcbiAgICAgICAgcmVjb3JkT3JSZWNvcmRJZDogUmVjb3JkIHwgUmVjb3JkSWQsXG4gICAgICAgIGZpZWxkczogT2JqZWN0TWFwPEZpZWxkSWQgfCBzdHJpbmcsIHVua25vd24+LFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCByZWNvcmRJZCA9XG4gICAgICAgICAgICB0eXBlb2YgcmVjb3JkT3JSZWNvcmRJZCA9PT0gJ3N0cmluZycgPyByZWNvcmRPclJlY29yZElkIDogcmVjb3JkT3JSZWNvcmRJZC5pZDtcblxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVJlY29yZHNBc3luYyhbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IHJlY29yZElkLFxuICAgICAgICAgICAgICAgIGZpZWxkcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhlIGdpdmVuIHJlY29yZCB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlUmVjb3JkQXN5bmN9LlxuICAgICAqIFRoZSBtb3JlIGluZm9ybWF0aW9uIHByb3ZpZGVkLCB0aGUgbW9yZSBhY2N1cmF0ZSB0aGUgcGVybWlzc2lvbnMgY2hlY2sgd2lsbCBiZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gdXBkYXRlIHRoZSBzcGVjaWZpZWQgcmVjb3JkLFxuICAgICAqIGB7aGFzUGVybWlzc2lvbjogZmFsc2UsIHJlYXNvbkRpc3BsYXlTdHJpbmc6IHN0cmluZ31gIG90aGVyd2lzZS4gYHJlYXNvbkRpc3BsYXlTdHJpbmdgIG1heSBiZVxuICAgICAqIHVzZWQgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlY29yZE9yUmVjb3JkSWQgdGhlIHJlY29yZCB0byB1cGRhdGVcbiAgICAgKiBAcGFyYW0gZmllbGRzIGNlbGwgdmFsdWVzIHRvIHVwZGF0ZSBpbiB0aGF0IHJlY29yZCwgc3BlY2lmaWVkIGFzIG9iamVjdCBtYXBwaW5nIGBGaWVsZElkYCBvciBmaWVsZCBuYW1lIHRvIHZhbHVlIGZvciB0aGF0IGZpZWxkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiAvLyBDaGVjayBpZiB1c2VyIGNhbiB1cGRhdGUgc3BlY2lmaWMgZmllbGRzIGZvciBhIHNwZWNpZmljIHJlY29yZC5cbiAgICAgKiBjb25zdCB1cGRhdGVSZWNvcmRDaGVja1Jlc3VsdCA9XG4gICAgICogICAgIHRhYmxlLmNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVSZWNvcmQocmVjb3JkLCB7XG4gICAgICogICAgICAgICAnUG9zdCBUaXRsZSc6ICdIb3cgdG8gbWFrZTogb3JhbmdlLW1hbmdvIHBvdW5kIGNha2UnLFxuICAgICAqICAgICAgICAgJ1B1YmxpY2F0aW9uIERhdGUnOiAnMjAyMC0wMS0wMScsXG4gICAgICogICAgIH0pO1xuICAgICAqIGlmICghdXBkYXRlUmVjb3JkQ2hlY2tSZXN1bHQuaGFzUGVybWlzc2lvbikge1xuICAgICAqICAgICBhbGVydCh1cGRhdGVSZWNvcmRDaGVja1Jlc3VsdC5yZWFzb25EaXNwbGF5U3RyaW5nKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBMaWtlIHVwZGF0ZVJlY29yZEFzeW5jLCB5b3UgY2FuIHVzZSBlaXRoZXIgZmllbGQgbmFtZXMgb3IgZmllbGQgSURzLlxuICAgICAqIGNvbnN0IHVwZGF0ZVJlY29yZENoZWNrUmVzdWx0V2l0aEZpZWxkSWRzID1cbiAgICAgKiAgICAgdGFibGUuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZVJlY29yZChyZWNvcmQsIHtcbiAgICAgKiAgICAgICAgIFtwb3N0VGl0bGVGaWVsZC5pZF06ICdDYWtlIGRlY29yYXRpbmcgdGlwcyAmIHRyaWNrcycsXG4gICAgICogICAgICAgICBbcHVibGljYXRpb25EYXRlRmllbGQuaWRdOiAnMjAyMC0wMi0wMicsXG4gICAgICogICAgIH0pO1xuICAgICAqXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjb3VsZCB1cGRhdGUgYSBnaXZlbiByZWNvcmQsIHdoZW4geW91IGRvbid0IGtub3cgdGhlXG4gICAgICogLy8gc3BlY2lmaWMgZmllbGRzIHRoYXQgd2lsbCBiZSB1cGRhdGVkIHlldCAoZS5nLiB0byBjaGVjayB3aGV0aGVyIHlvdSBzaG91bGRcbiAgICAgKiAvLyBhbGxvdyBhIHVzZXIgdG8gc2VsZWN0IGEgY2VydGFpbiByZWNvcmQgdG8gdXBkYXRlKS5cbiAgICAgKiBjb25zdCB1cGRhdGVVbmtub3duRmllbGRzQ2hlY2tSZXN1bHQgPVxuICAgICAqICAgICB0YWJsZS5jaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3JkKHJlY29yZCk7XG4gICAgICpcbiAgICAgKiAvLyBDaGVjayBpZiB1c2VyIGNvdWxkIHVwZGF0ZSBzcGVjaWZpYyBmaWVsZHMsIHdoZW4geW91IGRvbid0IGtub3cgdGhlXG4gICAgICogLy8gc3BlY2lmaWMgcmVjb3JkIHRoYXQgd2lsbCBiZSB1cGRhdGVkIHlldC4gKGZvciBleGFtcGxlLCBpZiB0aGUgZmllbGQgaXNcbiAgICAgKiAvLyBzZWxlY3RlZCBieSB0aGUgdXNlciBhbmQgeW91IHdhbnQgdG8gY2hlY2sgaWYgeW91ciBhcHAgY2FuIHdyaXRlIHRvIGl0KS5cbiAgICAgKiBjb25zdCB1cGRhdGVVbmtub3duUmVjb3JkQ2hlY2tSZXN1bHQgPVxuICAgICAqICAgICB0YWJsZS5jaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3JkKHVuZGVmaW5lZCwge1xuICAgICAqICAgICAgICAgJ015IGZpZWxkIG5hbWUnOiAndXBkYXRlZCB2YWx1ZScsXG4gICAgICogICAgICAgICAvLyBZb3UgY2FuIHVzZSB1bmRlZmluZWQgaWYgeW91IGtub3cgeW91J3JlIGdvaW5nIHRvIHVwZGF0ZSBhIGZpZWxkLFxuICAgICAqICAgICAgICAgLy8gYnV0IGRvbid0IGtub3cgdGhlIG5ldyBjZWxsIHZhbHVlIHlldC5cbiAgICAgKiAgICAgICAgICdBbm90aGVyIGZpZWxkIG5hbWUnOiB1bmRlZmluZWQsXG4gICAgICogICAgIH0pO1xuICAgICAqXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjb3VsZCBwZXJmb3JtIHVwZGF0ZXMgd2l0aGluIHRoZSB0YWJsZSwgd2l0aG91dCBrbm93aW5nIHRoZVxuICAgICAqIC8vIHNwZWNpZmljIHJlY29yZCBvciBmaWVsZHMgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgeWV0IChlLmcuLCB0byByZW5kZXIgeW91clxuICAgICAqIC8vIGFwcCBpbiBcInJlYWQgb25seVwiIG1vZGUpLlxuICAgICAqIGNvbnN0IHVwZGF0ZVVua25vd25SZWNvcmRBbmRGaWVsZHNDaGVja1Jlc3VsdCA9XG4gICAgICogICAgIHRhYmxlLmNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVSZWNvcmQoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3JkKFxuICAgICAgICByZWNvcmRPclJlY29yZElkPzogUmVjb3JkIHwgUmVjb3JkSWQsXG4gICAgICAgIGZpZWxkcz86IE9iamVjdE1hcDxGaWVsZElkIHwgc3RyaW5nLCB1bmtub3duIHwgdm9pZD4sXG4gICAgKTogUGVybWlzc2lvbkNoZWNrUmVzdWx0IHtcbiAgICAgICAgY29uc3QgcmVjb3JkSWQgPVxuICAgICAgICAgICAgdHlwZW9mIHJlY29yZE9yUmVjb3JkSWQgPT09ICdvYmplY3QnICYmIHJlY29yZE9yUmVjb3JkSWQgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IHJlY29yZE9yUmVjb3JkSWQuaWRcbiAgICAgICAgICAgICAgICA6IHJlY29yZE9yUmVjb3JkSWQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZVJlY29yZHMoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiByZWNvcmRJZCxcbiAgICAgICAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYWxpYXMgZm9yIGBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3JkKHJlY29yZE9yUmVjb3JkSWQsIGZpZWxkcykuaGFzUGVybWlzc2lvbmAuXG4gICAgICpcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhlIGdpdmVuIHJlY29yZCB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlUmVjb3JkQXN5bmN9LlxuICAgICAqIFRoZSBtb3JlIGluZm9ybWF0aW9uIHByb3ZpZGVkLCB0aGUgbW9yZSBhY2N1cmF0ZSB0aGUgcGVybWlzc2lvbnMgY2hlY2sgd2lsbCBiZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWNvcmRPclJlY29yZElkIHRoZSByZWNvcmQgdG8gdXBkYXRlXG4gICAgICogQHBhcmFtIGZpZWxkcyBjZWxsIHZhbHVlcyB0byB1cGRhdGUgaW4gdGhhdCByZWNvcmQsIHNwZWNpZmllZCBhcyBvYmplY3QgbWFwcGluZyBgRmllbGRJZGAgb3IgZmllbGQgbmFtZSB0byB2YWx1ZSBmb3IgdGhhdCBmaWVsZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjYW4gdXBkYXRlIHNwZWNpZmljIGZpZWxkcyBmb3IgYSBzcGVjaWZpYyByZWNvcmQuXG4gICAgICogY29uc3QgY2FuVXBkYXRlUmVjb3JkID0gdGFibGUuaGFzUGVybWlzc2lvblRvVXBkYXRlUmVjb3JkKHJlY29yZCwge1xuICAgICAqICAgICAnUG9zdCBUaXRsZSc6ICdIb3cgdG8gbWFrZTogb3JhbmdlLW1hbmdvIHBvdW5kIGNha2UnLFxuICAgICAqICAgICAnUHVibGljYXRpb24gRGF0ZSc6ICcyMDIwLTAxLTAxJyxcbiAgICAgKiB9KTtcbiAgICAgKiBpZiAoIWNhblVwZGF0ZVJlY29yZCkge1xuICAgICAqICAgICBhbGVydCgnbm90IGFsbG93ZWQhJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gTGlrZSB1cGRhdGVSZWNvcmRBc3luYywgeW91IGNhbiB1c2UgZWl0aGVyIGZpZWxkIG5hbWVzIG9yIGZpZWxkIElEcy5cbiAgICAgKiBjb25zdCBjYW5VcGRhdGVSZWNvcmRXaXRoRmllbGRJZHMgPVxuICAgICAqICAgICB0YWJsZS5oYXNQZXJtaXNzaW9uVG9VcGRhdGVSZWNvcmQocmVjb3JkLCB7XG4gICAgICogICAgICAgICBbcG9zdFRpdGxlRmllbGQuaWRdOiAnQ2FrZSBkZWNvcmF0aW5nIHRpcHMgJiB0cmlja3MnLFxuICAgICAqICAgICAgICAgW3B1YmxpY2F0aW9uRGF0ZUZpZWxkLmlkXTogJzIwMjAtMDItMDInLFxuICAgICAqICAgICB9KTtcbiAgICAgKlxuICAgICAqIC8vIENoZWNrIGlmIHVzZXIgY291bGQgdXBkYXRlIGEgZ2l2ZW4gcmVjb3JkLCB3aGVuIHlvdSBkb24ndCBrbm93IHRoZVxuICAgICAqIC8vIHNwZWNpZmljIGZpZWxkcyB0aGF0IHdpbGwgYmUgdXBkYXRlZCB5ZXQgKGUuZy4gdG8gY2hlY2sgd2hldGhlciB5b3Ugc2hvdWxkXG4gICAgICogLy8gYWxsb3cgYSB1c2VyIHRvIHNlbGVjdCBhIGNlcnRhaW4gcmVjb3JkIHRvIHVwZGF0ZSkuXG4gICAgICogY29uc3QgY2FuVXBkYXRlVW5rbm93bkZpZWxkcyA9IHRhYmxlLmhhc1Blcm1pc3Npb25Ub1VwZGF0ZVJlY29yZChyZWNvcmQpO1xuICAgICAqXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjb3VsZCB1cGRhdGUgc3BlY2lmaWMgZmllbGRzLCB3aGVuIHlvdSBkb24ndCBrbm93IHRoZVxuICAgICAqIC8vIHNwZWNpZmljIHJlY29yZCB0aGF0IHdpbGwgYmUgdXBkYXRlZCB5ZXQgKGUuZy4gaWYgdGhlIGZpZWxkIGlzIHNlbGVjdGVkXG4gICAgICogLy8gYnkgdGhlIHVzZXIgYW5kIHlvdSB3YW50IHRvIGNoZWNrIGlmIHlvdXIgYXBwIGNhbiB3cml0ZSB0byBpdCkuXG4gICAgICogY29uc3QgY2FuVXBkYXRlVW5rbm93blJlY29yZCA9XG4gICAgICogICAgIHRhYmxlLmhhc1Blcm1pc3Npb25Ub1VwZGF0ZVJlY29yZCh1bmRlZmluZWQsIHtcbiAgICAgKiAgICAgICAgICdNeSBmaWVsZCBuYW1lJzogJ3VwZGF0ZWQgdmFsdWUnLFxuICAgICAqICAgICAgICAgLy8gWW91IGNhbiB1c2UgdW5kZWZpbmVkIGlmIHlvdSBrbm93IHlvdSdyZSBnb2luZyB0byB1cGRhdGUgYSBmaWVsZCxcbiAgICAgKiAgICAgICAgIC8vIGJ1dCBkb24ndCBrbm93IHRoZSBuZXcgY2VsbCB2YWx1ZSB5ZXQuXG4gICAgICogICAgICAgICAnQW5vdGhlciBmaWVsZCBuYW1lJzogdW5kZWZpbmVkLFxuICAgICAqICAgICB9KTtcbiAgICAgKlxuICAgICAqIC8vIENoZWNrIGlmIHVzZXIgY291bGQgcGVyZm9ybSB1cGRhdGVzIHdpdGhpbiB0aGUgdGFibGUsIHdpdGhvdXQga25vd2luZyB0aGVcbiAgICAgKiAvLyBzcGVjaWZpYyByZWNvcmQgb3IgZmllbGRzIHRoYXQgd2lsbCBiZSB1cGRhdGVkIHlldC4gKGZvciBleGFtcGxlLCB0b1xuICAgICAqIC8vIHJlbmRlciB5b3VyIGFwcCBpbiBcInJlYWQgb25seVwiIG1vZGUpXG4gICAgICogY29uc3QgY2FuVXBkYXRlVW5rbm93blJlY29yZEFuZEZpZWxkcyA9IHRhYmxlLmhhc1Blcm1pc3Npb25Ub1VwZGF0ZVJlY29yZCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGhhc1Blcm1pc3Npb25Ub1VwZGF0ZVJlY29yZChcbiAgICAgICAgcmVjb3JkT3JSZWNvcmRJZD86IFJlY29yZCB8IFJlY29yZElkLFxuICAgICAgICBmaWVsZHM/OiBPYmplY3RNYXA8RmllbGRJZCB8IHN0cmluZywgdW5rbm93biB8IHZvaWQ+LFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3JkKHJlY29yZE9yUmVjb3JkSWQsIGZpZWxkcykuaGFzUGVybWlzc2lvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBjZWxsIHZhbHVlcyBmb3IgcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBnaXZlbiBjZWxsIHZhbHVlcyBpblxuICAgICAqIHRoZSByZWNvcmRzLCBvciBpZiBpbnZhbGlkIGlucHV0IGlzIHByb3ZpZGVkIChlZy4gaW52YWxpZCBjZWxsIHZhbHVlcykuXG4gICAgICpcbiAgICAgKiBSZWZlciB0byB7QGxpbmsgRmllbGRUeXBlfSBmb3IgY2VsbCB2YWx1ZSB3cml0ZSBmb3JtYXRzLlxuICAgICAqXG4gICAgICogWW91IG1heSBvbmx5IHVwZGF0ZSB1cCB0byA1MCByZWNvcmRzIGluIG9uZSBjYWxsIHRvIGB1cGRhdGVSZWNvcmRzQXN5bmNgLlxuICAgICAqIFNlZSBbV3JpdGUgYmFjayB0byBBaXJ0YWJsZV0oL2d1aWRlcy93cml0ZS1iYWNrLXRvLWFpcnRhYmxlKSBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICAgICAqIGFib3V0IHdyaXRlIGxpbWl0cy5cbiAgICAgKlxuICAgICAqIFRoaXMgYWN0aW9uIGlzIGFzeW5jaHJvbm91czogYGF3YWl0YCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpZiB5b3Ugd2lzaCB0byB3YWl0IGZvciB0aGVcbiAgICAgKiB1cGRhdGVzIHRvIGJlIHBlcnNpc3RlZCB0byBBaXJ0YWJsZSBzZXJ2ZXJzLlxuICAgICAqIFVwZGF0ZXMgYXJlIGFwcGxpZWQgb3B0aW1pc3RpY2FsbHkgbG9jYWxseSwgc28geW91ciBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHlvdXIgYXBwXG4gICAgICogYmVmb3JlIHRoZSBwcm9taXNlIHJlc29sdmVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlY29yZHMgQXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHJlY29yZElkIGFuZCBmaWVsZHMvY2VsbFZhbHVlcyB0byB1cGRhdGUgZm9yIHRoYXQgcmVjb3JkIChzcGVjaWZpZWQgYXMgYW4gb2JqZWN0IG1hcHBpbmcgYEZpZWxkSWRgIG9yIGZpZWxkIG5hbWUgdG8gY2VsbCB2YWx1ZSlcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmVjb3Jkc1RvVXBkYXRlID0gW1xuICAgICAqICAgICAvLyBGaWVsZHMgY2FuIGJlIHNwZWNpZmllZCBieSBuYW1lIG9yIElEXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgIGlkOiByZWNvcmQxLmlkLFxuICAgICAqICAgICAgICAgZmllbGRzOiB7XG4gICAgICogICAgICAgICAgICAgJ1Bvc3QgVGl0bGUnOiAnSG93IHRvIG1ha2U6IG9yYW5nZS1tYW5nbyBwb3VuZCBjYWtlJyxcbiAgICAgKiAgICAgICAgICAgICAnUHVibGljYXRpb24gRGF0ZSc6ICcyMDIwLTAxLTAxJyxcbiAgICAgKiAgICAgICAgIH0sXG4gICAgICogICAgIH0sXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgIGlkOiByZWNvcmQyLmlkLFxuICAgICAqICAgICAgICAgZmllbGRzOiB7XG4gICAgICogICAgICAgICAgICAgLy8gU2V0cyB0aGUgY2VsbCB2YWx1ZXMgdG8gYmUgZW1wdHkuXG4gICAgICogICAgICAgICAgICAgJ1Bvc3QgVGl0bGUnOiAnJyxcbiAgICAgKiAgICAgICAgICAgICAnUHVibGljYXRpb24gRGF0ZSc6ICcnLFxuICAgICAqICAgICAgICAgfSxcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgaWQ6IHJlY29yZDMuaWQsXG4gICAgICogICAgICAgICBmaWVsZHM6IHtcbiAgICAgKiAgICAgICAgICAgICBbcG9zdFRpdGxlRmllbGQuaWRdOiAnQ2FrZSBkZWNvcmF0aW5nIHRpcHMgJiB0cmlja3MnLFxuICAgICAqICAgICAgICAgICAgIFtwdWJsaWNhdGlvbkRhdGVGaWVsZC5pZF06ICcyMDIwLTAyLTAyJyxcbiAgICAgKiAgICAgICAgIH0sXG4gICAgICogICAgIH0sXG4gICAgICogICAgIC8vIENlbGwgdmFsdWVzIHNob3VsZCBnZW5lcmFsbHkgaGF2ZSBmb3JtYXQgbWF0Y2hpbmcgdGhlIG91dHB1dCBvZlxuICAgICAqICAgICAvLyByZWNvcmQuZ2V0Q2VsbFZhbHVlKCkgZm9yIHRoZSBmaWVsZCBiZWluZyB1cGRhdGVkXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgIGlkOiByZWNvcmQ0LmlkLFxuICAgICAqICAgICAgICAgZmllbGRzOiB7XG4gICAgICogICAgICAgICAgICAgJ0NhdGVnb3J5IChzaW5nbGUgc2VsZWN0KSc6IHtuYW1lOiAnUmVjaXBlJ30sXG4gICAgICogICAgICAgICAgICAgJ1RhZ3MgKG11bHRpcGxlIHNlbGVjdCknOiBbe25hbWU6ICdEZXNzZXJ0cyd9LCB7aWQ6ICdjaG9pY2VJZCd9XSxcbiAgICAgKiAgICAgICAgICAgICAnSW1hZ2VzIChhdHRhY2htZW50KSc6IFt7dXJsOiAnaHR0cDovL215d2Vic2l0ZS5jb20vY2FrZS5wbmcnfV0sXG4gICAgICogICAgICAgICAgICAgJ1JlbGF0ZWQgcG9zdHMgKGxpbmtlZCByZWNvcmRzKSc6IFt7aWQ6ICdzb21lUmVjb3JkSWQnfV0sXG4gICAgICogICAgICAgICB9LFxuICAgICAqICAgICB9LFxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiB1cGRhdGVSZWNvcmRzKCkge1xuICAgICAqICAgICBpZiAodGFibGUuaGFzUGVybWlzc2lvblRvVXBkYXRlUmVjb3JkcyhyZWNvcmRzVG9VcGRhdGUpKSB7XG4gICAgICogICAgICAgICB0YWJsZS51cGRhdGVSZWNvcmRzQXN5bmMocmVjb3Jkc1RvVXBkYXRlKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgICAvLyBUaGUgcmVjb3JkcyBhcmUgbm93IHVwZGF0ZWQgd2l0aGluIHlvdXIgYXBwIChlZyB3aWxsIGJlIHJlZmxlY3RlZCBpblxuICAgICAqICAgICAvLyBgdGFibGUuc2VsZWN0UmVjb3JkcygpYCkgYnV0IGFyZSBzdGlsbCBiZWluZyBzYXZlZCB0byBBaXJ0YWJsZSBzZXJ2ZXJzXG4gICAgICogICAgIC8vIChlLmcuIHRoZXkgbWF5IG5vdCBiZSB1cGRhdGVkIGZvciBvdGhlciB1c2VycyB5ZXQpLlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVJlY29yZHNBc3luYygpIHtcbiAgICAgKiAgICAgaWYgKHRhYmxlLmhhc1Blcm1pc3Npb25Ub1VwZGF0ZVJlY29yZHMocmVjb3Jkc1RvVXBkYXRlKSkge1xuICAgICAqICAgICAgICAgYXdhaXQgdGFibGUudXBkYXRlUmVjb3Jkc0FzeW5jKHJlY29yZHNUb1VwZGF0ZSk7XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgLy8gUmVjb3JkIHVwZGF0ZXMgaGF2ZSBiZWVuIHNhdmVkIHRvIEFpcnRhYmxlIHNlcnZlcnMuXG4gICAgICogICAgIGFsZXJ0KCdyZWNvcmRzIGhhdmUgYmVlbiB1cGRhdGVkJyk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVJlY29yZHNBc3luYyhcbiAgICAgICAgcmVjb3JkczogUmVhZG9ubHlBcnJheTx7XG4gICAgICAgICAgICByZWFkb25seSBpZDogUmVjb3JkSWQ7XG4gICAgICAgICAgICByZWFkb25seSBmaWVsZHM6IE9iamVjdE1hcDxGaWVsZElkIHwgc3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfT4sXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlY29yZHNXaXRoQ2VsbFZhbHVlc0J5RmllbGRJZCA9IHJlY29yZHMubWFwKHJlY29yZCA9PiAoe1xuICAgICAgICAgICAgaWQ6IHJlY29yZC5pZCxcbiAgICAgICAgICAgIGNlbGxWYWx1ZXNCeUZpZWxkSWQ6IHRoaXMuX2NlbGxWYWx1ZXNCeUZpZWxkSWRPck5hbWVUb0NlbGxWYWx1ZXNCeUZpZWxkSWQoXG4gICAgICAgICAgICAgICAgcmVjb3JkLmZpZWxkcyxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0pKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9zZGsuX19tdXRhdGlvbnMuYXBwbHlNdXRhdGlvbkFzeW5jKHtcbiAgICAgICAgICAgIHR5cGU6IE11dGF0aW9uVHlwZXMuU0VUX01VTFRJUExFX1JFQ09SRFNfQ0VMTF9WQUxVRVMsXG4gICAgICAgICAgICB0YWJsZUlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgcmVjb3JkczogcmVjb3Jkc1dpdGhDZWxsVmFsdWVzQnlGaWVsZElkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXNlciBoYXMgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoZSBnaXZlbiByZWNvcmQgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEFjY2VwdHMgcGFydGlhbCBpbnB1dCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHtAbGluayB1cGRhdGVSZWNvcmRzQXN5bmN9LlxuICAgICAqIFRoZSBtb3JlIGluZm9ybWF0aW9uIHByb3ZpZGVkLCB0aGUgbW9yZSBhY2N1cmF0ZSB0aGUgcGVybWlzc2lvbnMgY2hlY2sgd2lsbCBiZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gdXBkYXRlIHRoZSBzcGVjaWZpZWQgcmVjb3JkcyxcbiAgICAgKiBge2hhc1Blcm1pc3Npb246IGZhbHNlLCByZWFzb25EaXNwbGF5U3RyaW5nOiBzdHJpbmd9YCBvdGhlcndpc2UuIGByZWFzb25EaXNwbGF5U3RyaW5nYCBtYXkgYmVcbiAgICAgKiB1c2VkIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWNvcmRzIEFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyByZWNvcmRJZCBhbmQgZmllbGRzL2NlbGxWYWx1ZXMgdG8gdXBkYXRlIGZvciB0aGF0IHJlY29yZCAoc3BlY2lmaWVkIGFzIGFuIG9iamVjdCBtYXBwaW5nIGBGaWVsZElkYCBvciBmaWVsZCBuYW1lIHRvIGNlbGwgdmFsdWUpXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJlY29yZHNUb1VwZGF0ZSA9IFtcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgLy8gVmFsaWRhdGluZyBhIGNvbXBsZXRlIHJlY29yZCB1cGRhdGVcbiAgICAgKiAgICAgICAgIGlkOiByZWNvcmQxLmlkLFxuICAgICAqICAgICAgICAgZmllbGRzOiB7XG4gICAgICogICAgICAgICAgICAgJ1Bvc3QgVGl0bGUnOiAnSG93IHRvIG1ha2U6IG9yYW5nZS1tYW5nbyBwb3VuZCBjYWtlJyxcbiAgICAgKiAgICAgICAgICAgICAnUHVibGljYXRpb24gRGF0ZSc6ICcyMDIwLTAxLTAxJyxcbiAgICAgKiAgICAgICAgIH0sXG4gICAgICogICAgIH0sXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgIC8vIExpa2UgdXBkYXRlUmVjb3Jkc0FzeW5jLCBmaWVsZHMgY2FuIGJlIHNwZWNpZmllZCBieSBuYW1lIG9yIElEXG4gICAgICogICAgICAgICBpZDogcmVjb3JkMi5pZCxcbiAgICAgKiAgICAgICAgIGZpZWxkczoge1xuICAgICAqICAgICAgICAgICAgIFtwb3N0VGl0bGVGaWVsZC5pZF06ICdDYWtlIGRlY29yYXRpbmcgdGlwcyAmIHRyaWNrcycsXG4gICAgICogICAgICAgICAgICAgW3B1YmxpY2F0aW9uRGF0ZUZpZWxkLmlkXTogJzIwMjAtMDItMDInLFxuICAgICAqICAgICAgICAgfSxcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgLy8gVmFsaWRhdGluZyBhbiB1cGRhdGUgdG8gYSBzcGVjaWZpYyByZWNvcmQsIG5vdCBrbm93aW5nIHdoYXRcbiAgICAgKiAgICAgICAgIC8vIGZpZWxkcyB3aWxsIGJlIHVwZGF0ZWRcbiAgICAgKiAgICAgICAgIGlkOiByZWNvcmQzLmlkLFxuICAgICAqICAgICB9LFxuICAgICAqICAgICB7XG4gICAgICogICAgICAgICAvLyBWYWxpZGF0aW5nIGFuIHVwZGF0ZSB0byBzcGVjaWZpYyBjZWxsIHZhbHVlcywgbm90IGtub3dpbmcgd2hhdFxuICAgICAqICAgICAgICAgLy8gcmVjb3JkIHdpbGwgYmUgdXBkYXRlZFxuICAgICAqICAgICAgICAgZmllbGRzOiB7XG4gICAgICogICAgICAgICAgICAgJ015IGZpZWxkIG5hbWUnOiAndXBkYXRlZCB2YWx1ZSBmb3IgdW5rbm93biByZWNvcmQnLFxuICAgICAqICAgICAgICAgICAgIC8vIFlvdSBjYW4gdXNlIHVuZGVmaW5lZCBpZiB5b3Uga25vdyB5b3UncmUgZ29pbmcgdG8gdXBkYXRlIGFcbiAgICAgKiAgICAgICAgICAgICAvLyBmaWVsZCwgYnV0IGRvbid0IGtub3cgdGhlIG5ldyBjZWxsIHZhbHVlIHlldC5cbiAgICAgKiAgICAgICAgICAgICAnQW5vdGhlciBmaWVsZCBuYW1lJzogdW5kZWZpbmVkLFxuICAgICAqICAgICAgICAgfSxcbiAgICAgKiAgICAgfSxcbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogY29uc3QgdXBkYXRlUmVjb3Jkc0NoZWNrUmVzdWx0ID1cbiAgICAgKiAgICAgdGFibGUuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZVJlY29yZHMocmVjb3Jkc1RvVXBkYXRlKTtcbiAgICAgKiBpZiAoIXVwZGF0ZVJlY29yZHNDaGVja1Jlc3VsdC5oYXNQZXJtaXNzaW9uKSB7XG4gICAgICogICAgIGFsZXJ0KHVwZGF0ZVJlY29yZHNDaGVja1Jlc3VsdC5yZWFzb25EaXNwbGF5U3RyaW5nKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBDaGVjayBpZiB1c2VyIGNvdWxkIHBvdGVudGlhbGx5IHVwZGF0ZSByZWNvcmRzLlxuICAgICAqIC8vIEVxdWl2YWxlbnQgdG8gdGFibGUuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZVJlY29yZCgpXG4gICAgICogY29uc3QgdXBkYXRlVW5rbm93blJlY29yZEFuZEZpZWxkc0NoZWNrUmVzdWx0ID1cbiAgICAgKiAgICAgdGFibGUuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZVJlY29yZHMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3JkcyhcbiAgICAgICAgcmVjb3Jkcz86IFJlYWRvbmx5QXJyYXk8e1xuICAgICAgICAgICAgcmVhZG9ubHkgaWQ/OiBSZWNvcmRJZCB8IHZvaWQ7XG4gICAgICAgICAgICByZWFkb25seSBmaWVsZHM/OiBPYmplY3RNYXA8RmllbGRJZCB8IHN0cmluZywgdW5rbm93biB8IHZvaWQ+IHwgdm9pZDtcbiAgICAgICAgfT4sXG4gICAgKTogUGVybWlzc2lvbkNoZWNrUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nkay5fX211dGF0aW9ucy5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24oe1xuICAgICAgICAgICAgdHlwZTogTXV0YXRpb25UeXBlcy5TRVRfTVVMVElQTEVfUkVDT1JEU19DRUxMX1ZBTFVFUyxcbiAgICAgICAgICAgIHRhYmxlSWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICByZWNvcmRzOiByZWNvcmRzXG4gICAgICAgICAgICAgICAgPyByZWNvcmRzLm1hcChyZWNvcmQgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICBpZDogcmVjb3JkLmlkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICBjZWxsVmFsdWVzQnlGaWVsZElkOiByZWNvcmQuZmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5fY2VsbFZhbHVlc0J5RmllbGRJZE9yTmFtZVRvQ2VsbFZhbHVlc0J5RmllbGRJZChyZWNvcmQuZmllbGRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYWxpYXMgZm9yIGBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3JkcyhyZWNvcmRzKS5oYXNQZXJtaXNzaW9uYC5cbiAgICAgKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGUgZ2l2ZW4gcmVjb3JkIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlUmVjb3Jkc0FzeW5jfS5cbiAgICAgKiBUaGUgbW9yZSBpbmZvcm1hdGlvbiBwcm92aWRlZCwgdGhlIG1vcmUgYWNjdXJhdGUgdGhlIHBlcm1pc3Npb25zIGNoZWNrIHdpbGwgYmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVjb3JkcyBBcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgcmVjb3JkSWQgYW5kIGZpZWxkcy9jZWxsVmFsdWVzIHRvIHVwZGF0ZSBmb3IgdGhhdCByZWNvcmQgKHNwZWNpZmllZCBhcyBhbiBvYmplY3QgbWFwcGluZyBgRmllbGRJZGAgb3IgZmllbGQgbmFtZSB0byBjZWxsIHZhbHVlKVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByZWNvcmRzVG9VcGRhdGUgPSBbXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgIC8vIFZhbGlkYXRpbmcgYSBjb21wbGV0ZSByZWNvcmQgdXBkYXRlXG4gICAgICogICAgICAgICBpZDogcmVjb3JkMS5pZCxcbiAgICAgKiAgICAgICAgIGZpZWxkczoge1xuICAgICAqICAgICAgICAgICAgICdQb3N0IFRpdGxlJzogJ0hvdyB0byBtYWtlOiBvcmFuZ2UtbWFuZ28gcG91bmQgY2FrZScsXG4gICAgICogICAgICAgICAgICAgJ1B1YmxpY2F0aW9uIERhdGUnOiAnMjAyMC0wMS0wMScsXG4gICAgICogICAgICAgICB9LFxuICAgICAqICAgICB9LFxuICAgICAqICAgICB7XG4gICAgICogICAgICAgICAvLyBMaWtlIHVwZGF0ZVJlY29yZHNBc3luYywgZmllbGRzIGNhbiBiZSBzcGVjaWZpZWQgYnkgbmFtZSBvciBJRFxuICAgICAqICAgICAgICAgaWQ6IHJlY29yZDIuaWQsXG4gICAgICogICAgICAgICBmaWVsZHM6IHtcbiAgICAgKiAgICAgICAgICAgICBbcG9zdFRpdGxlRmllbGQuaWRdOiAnQ2FrZSBkZWNvcmF0aW5nIHRpcHMgJiB0cmlja3MnLFxuICAgICAqICAgICAgICAgICAgIFtwdWJsaWNhdGlvbkRhdGVGaWVsZC5pZF06ICcyMDIwLTAyLTAyJyxcbiAgICAgKiAgICAgICAgIH0sXG4gICAgICogICAgIH0sXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgIC8vIFZhbGlkYXRpbmcgYW4gdXBkYXRlIHRvIGEgc3BlY2lmaWMgcmVjb3JkLCBub3Qga25vd2luZyB3aGF0XG4gICAgICogICAgICAgICAvLyBmaWVsZHMgd2lsbCBiZSB1cGRhdGVkXG4gICAgICogICAgICAgICBpZDogcmVjb3JkMy5pZCxcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgLy8gVmFsaWRhdGluZyBhbiB1cGRhdGUgdG8gc3BlY2lmaWMgY2VsbCB2YWx1ZXMsIG5vdCBrbm93aW5nIHdoYXRcbiAgICAgKiAgICAgICAgIC8vIHJlY29yZCB3aWxsIGJlIHVwZGF0ZWRcbiAgICAgKiAgICAgICAgIGZpZWxkczoge1xuICAgICAqICAgICAgICAgICAgICdNeSBmaWVsZCBuYW1lJzogJ3VwZGF0ZWQgdmFsdWUgZm9yIHVua25vd24gcmVjb3JkJyxcbiAgICAgKiAgICAgICAgICAgICAvLyBZb3UgY2FuIHVzZSB1bmRlZmluZWQgaWYgeW91IGtub3cgeW91J3JlIGdvaW5nIHRvIHVwZGF0ZSBhXG4gICAgICogICAgICAgICAgICAgLy8gZmllbGQsIGJ1dCBkb24ndCBrbm93IHRoZSBuZXcgY2VsbCB2YWx1ZSB5ZXQuXG4gICAgICogICAgICAgICAgICAgJ0Fub3RoZXIgZmllbGQgbmFtZSc6IHVuZGVmaW5lZCxcbiAgICAgKiAgICAgICAgIH0sXG4gICAgICogICAgIH0sXG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIGNvbnN0IGNhblVwZGF0ZVJlY29yZHMgPSB0YWJsZS5oYXNQZXJtaXNzaW9uVG9VcGRhdGVSZWNvcmRzKHJlY29yZHNUb1VwZGF0ZSk7XG4gICAgICogaWYgKCFjYW5VcGRhdGVSZWNvcmRzKSB7XG4gICAgICogICAgIGFsZXJ0KCdub3QgYWxsb3dlZCcpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIENoZWNrIGlmIHVzZXIgY291bGQgcG90ZW50aWFsbHkgdXBkYXRlIHJlY29yZHMuXG4gICAgICogLy8gRXF1aXZhbGVudCB0byB0YWJsZS5oYXNQZXJtaXNzaW9uVG9VcGRhdGVSZWNvcmQoKVxuICAgICAqIGNvbnN0IGNhblVwZGF0ZVVua25vd25SZWNvcmRzQW5kRmllbGRzID1cbiAgICAgKiAgICAgdGFibGUuaGFzUGVybWlzc2lvblRvVXBkYXRlUmVjb3JkcygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGhhc1Blcm1pc3Npb25Ub1VwZGF0ZVJlY29yZHMoXG4gICAgICAgIHJlY29yZHM/OiBSZWFkb25seUFycmF5PHtcbiAgICAgICAgICAgIHJlYWRvbmx5IGlkPzogUmVjb3JkSWQgfCB2b2lkO1xuICAgICAgICAgICAgcmVhZG9ubHkgZmllbGRzPzogT2JqZWN0TWFwPEZpZWxkSWQgfCBzdHJpbmcsIHVua25vd24gfCB2b2lkPiB8IHZvaWQ7XG4gICAgICAgIH0+LFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlUmVjb3JkcyhyZWNvcmRzKS5oYXNQZXJtaXNzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhlIGdpdmVuIHJlY29yZC5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBnaXZlbiByZWNvcmQuXG4gICAgICpcbiAgICAgKiBUaGlzIGFjdGlvbiBpcyBhc3luY2hyb25vdXM6IGBhd2FpdGAgdGhlIHJldHVybmVkIHByb21pc2UgaWYgeW91IHdpc2ggdG8gd2FpdCBmb3IgdGhlXG4gICAgICogZGVsZXRlIHRvIGJlIHBlcnNpc3RlZCB0byBBaXJ0YWJsZSBzZXJ2ZXJzLlxuICAgICAqIFVwZGF0ZXMgYXJlIGFwcGxpZWQgb3B0aW1pc3RpY2FsbHkgbG9jYWxseSwgc28geW91ciBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHlvdXIgYXBwXG4gICAgICogYmVmb3JlIHRoZSBwcm9taXNlIHJlc29sdmVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlY29yZE9yUmVjb3JkSWQgdGhlIHJlY29yZCB0byBiZSBkZWxldGVkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGZ1bmN0aW9uIGRlbGV0ZVJlY29yZChyZWNvcmQpIHtcbiAgICAgKiAgICAgaWYgKHRhYmxlLmhhc1Blcm1pc3Npb25Ub0RlbGV0ZVJlY29yZChyZWNvcmQpKSB7XG4gICAgICogICAgICAgICB0YWJsZS5kZWxldGVSZWNvcmRBc3luYyhyZWNvcmQpO1xuICAgICAqICAgICB9XG4gICAgICogICAgIC8vIFRoZSByZWNvcmQgaXMgbm93IGRlbGV0ZWQgd2l0aGluIHlvdXIgYXBwIChlZyB3aWxsIG5vdCBiZSByZXR1cm5lZFxuICAgICAqICAgICAvLyBpbiBgdGFibGUuc2VsZWN0UmVjb3Jkc2ApIGJ1dCBpdCBpcyBzdGlsbCBiZWluZyBzYXZlZCB0byBBaXJ0YWJsZVxuICAgICAqICAgICAvLyBzZXJ2ZXJzIChlLmcuIGl0IG1heSBub3QgbG9vayBkZWxldGVkIHRvIG90aGVyIHVzZXJzIHlldCkuXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZGVsZXRlUmVjb3JkQXN5bmMocmVjb3JkKSB7XG4gICAgICogICAgIGlmICh0YWJsZS5oYXNQZXJtaXNzaW9uVG9EZWxldGVSZWNvcmQocmVjb3JkKSkge1xuICAgICAqICAgICAgICAgYXdhaXQgdGFibGUuZGVsZXRlUmVjb3JkQXN5bmMocmVjb3JkKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgICAvLyBSZWNvcmQgZGVsZXRpb24gaGFzIGJlZW4gc2F2ZWQgdG8gQWlydGFibGUgc2VydmVycy5cbiAgICAgKiAgICAgYWxlcnQoJ3JlY29yZCBoYXMgYmVlbiBkZWxldGVkJyk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZVJlY29yZEFzeW5jKHJlY29yZE9yUmVjb3JkSWQ6IFJlY29yZCB8IFJlY29yZElkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlUmVjb3Jkc0FzeW5jKFtyZWNvcmRPclJlY29yZElkXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBzcGVjaWZpZWQgcmVjb3JkLlxuICAgICAqXG4gICAgICogQWNjZXB0cyBvcHRpb25hbCBpbnB1dCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHtAbGluayBkZWxldGVSZWNvcmRBc3luY30uXG4gICAgICogVGhlIG1vcmUgaW5mb3JtYXRpb24gcHJvdmlkZWQsIHRoZSBtb3JlIGFjY3VyYXRlIHRoZSBwZXJtaXNzaW9ucyBjaGVjayB3aWxsIGJlLlxuICAgICAqXG4gICAgICogUmV0dXJucyBge2hhc1Blcm1pc3Npb246IHRydWV9YCBpZiB0aGUgY3VycmVudCB1c2VyIGNhbiBkZWxldGUgdGhlIHNwZWNpZmllZCByZWNvcmQsXG4gICAgICogYHtoYXNQZXJtaXNzaW9uOiBmYWxzZSwgcmVhc29uRGlzcGxheVN0cmluZzogc3RyaW5nfWAgb3RoZXJ3aXNlLiBgcmVhc29uRGlzcGxheVN0cmluZ2AgbWF5IGJlXG4gICAgICogdXNlZCB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVjb3JkT3JSZWNvcmRJZCB0aGUgcmVjb3JkIHRvIGJlIGRlbGV0ZWRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjYW4gZGVsZXRlIGEgc3BlY2lmaWMgcmVjb3JkXG4gICAgICogY29uc3QgZGVsZXRlUmVjb3JkQ2hlY2tSZXN1bHQgPVxuICAgICAqICAgICB0YWJsZS5jaGVja1Blcm1pc3Npb25zRm9yRGVsZXRlUmVjb3JkKHJlY29yZCk7XG4gICAgICogaWYgKCFkZWxldGVSZWNvcmRDaGVja1Jlc3VsdC5oYXNQZXJtaXNzaW9uKSB7XG4gICAgICogICAgIGFsZXJ0KGRlbGV0ZVJlY29yZENoZWNrUmVzdWx0LnJlYXNvbkRpc3BsYXlTdHJpbmcpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIENoZWNrIGlmIHVzZXIgY291bGQgcG90ZW50aWFsbHkgZGVsZXRlIGEgcmVjb3JkLlxuICAgICAqIC8vIFVzZSB3aGVuIHlvdSBkb24ndCBrbm93IHRoZSBzcGVjaWZpYyByZWNvcmQgeW91IHdhbnQgdG8gZGVsZXRlIHlldCAoZm9yXG4gICAgICogLy8gZXhhbXBsZSwgdG8gc2hvdy9oaWRlIFVJIGNvbnRyb2xzIHRoYXQgbGV0IHlvdSBzZWxlY3QgYSByZWNvcmQgdG8gZGVsZXRlKS5cbiAgICAgKiBjb25zdCBkZWxldGVVbmtub3duUmVjb3JkQ2hlY2tSZXN1bHQgPVxuICAgICAqICAgICB0YWJsZS5jaGVja1Blcm1pc3Npb25zRm9yRGVsZXRlUmVjb3JkKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgY2hlY2tQZXJtaXNzaW9uc0ZvckRlbGV0ZVJlY29yZChyZWNvcmRPclJlY29yZElkPzogUmVjb3JkIHwgUmVjb3JkSWQpOiBQZXJtaXNzaW9uQ2hlY2tSZXN1bHQge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1Blcm1pc3Npb25zRm9yRGVsZXRlUmVjb3JkcyhcbiAgICAgICAgICAgIHJlY29yZE9yUmVjb3JkSWQgPyBbcmVjb3JkT3JSZWNvcmRJZF0gOiB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGFsaWFzIGZvciBgY2hlY2tQZXJtaXNzaW9uc0ZvckRlbGV0ZVJlY29yZChyZWNvcmRPclJlY29yZElkKS5oYXNQZXJtaXNzaW9uYC5cbiAgICAgKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBzcGVjaWZpZWQgcmVjb3JkLlxuICAgICAqXG4gICAgICogQWNjZXB0cyBvcHRpb25hbCBpbnB1dCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHtAbGluayBkZWxldGVSZWNvcmRBc3luY30uXG4gICAgICogVGhlIG1vcmUgaW5mb3JtYXRpb24gcHJvdmlkZWQsIHRoZSBtb3JlIGFjY3VyYXRlIHRoZSBwZXJtaXNzaW9ucyBjaGVjayB3aWxsIGJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlY29yZE9yUmVjb3JkSWQgdGhlIHJlY29yZCB0byBiZSBkZWxldGVkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIENoZWNrIGlmIHVzZXIgY2FuIGRlbGV0ZSBhIHNwZWNpZmljIHJlY29yZFxuICAgICAqIGNvbnN0IGNhbkRlbGV0ZVJlY29yZCA9IHRhYmxlLmhhc1Blcm1pc3Npb25Ub0RlbGV0ZVJlY29yZChyZWNvcmQpO1xuICAgICAqIGlmICghY2FuRGVsZXRlUmVjb3JkKSB7XG4gICAgICogICAgIGFsZXJ0KCdub3QgYWxsb3dlZCcpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIENoZWNrIGlmIHVzZXIgY291bGQgcG90ZW50aWFsbHkgZGVsZXRlIGEgcmVjb3JkLlxuICAgICAqIC8vIFVzZSB3aGVuIHlvdSBkb24ndCBrbm93IHRoZSBzcGVjaWZpYyByZWNvcmQgeW91IHdhbnQgdG8gZGVsZXRlIHlldCAoZm9yXG4gICAgICogLy8gZXhhbXBsZSwgdG8gc2hvdy9oaWRlIFVJIGNvbnRyb2xzIHRoYXQgbGV0IHlvdSBzZWxlY3QgYSByZWNvcmQgdG8gZGVsZXRlKS5cbiAgICAgKiBjb25zdCBjYW5EZWxldGVVbmtub3duUmVjb3JkID0gdGFibGUuaGFzUGVybWlzc2lvblRvRGVsZXRlUmVjb3JkKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgaGFzUGVybWlzc2lvblRvRGVsZXRlUmVjb3JkKHJlY29yZE9yUmVjb3JkSWQ/OiBSZWNvcmQgfCBSZWNvcmRJZCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1Blcm1pc3Npb25zRm9yRGVsZXRlUmVjb3JkKHJlY29yZE9yUmVjb3JkSWQpLmhhc1Blcm1pc3Npb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSB0aGUgZ2l2ZW4gcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBnaXZlbiByZWNvcmRzLlxuICAgICAqXG4gICAgICogWW91IG1heSBvbmx5IGRlbGV0ZSB1cCB0byA1MCByZWNvcmRzIGluIG9uZSBjYWxsIHRvIGBkZWxldGVSZWNvcmRzQXN5bmNgLlxuICAgICAqIFNlZSBbV3JpdGUgYmFjayB0byBBaXJ0YWJsZV0oL2d1aWRlcy93cml0ZS1iYWNrLXRvLWFpcnRhYmxlI3NpemUtbGltaXRzLXJhdGUtbGltaXRzKSBmb3JcbiAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdyaXRlIGxpbWl0cy5cbiAgICAgKlxuICAgICAqIFRoaXMgYWN0aW9uIGlzIGFzeW5jaHJvbm91czogYGF3YWl0YCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpZiB5b3Ugd2lzaCB0byB3YWl0IGZvciB0aGVcbiAgICAgKiBkZWxldGUgdG8gYmUgcGVyc2lzdGVkIHRvIEFpcnRhYmxlIHNlcnZlcnMuXG4gICAgICogVXBkYXRlcyBhcmUgYXBwbGllZCBvcHRpbWlzdGljYWxseSBsb2NhbGx5LCBzbyB5b3VyIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4geW91ciBhcHBcbiAgICAgKiBiZWZvcmUgdGhlIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVjb3Jkc09yUmVjb3JkSWRzIEFycmF5IG9mIFJlY29yZHMgYW5kIFJlY29yZElkc1xuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGRlbGV0ZVJlY29yZHMocmVjb3Jkcykge1xuICAgICAqICAgICBpZiAodGFibGUuaGFzUGVybWlzc2lvblRvRGVsZXRlUmVjb3JkcyhyZWNvcmRzKSkge1xuICAgICAqICAgICAgICAgdGFibGUuZGVsZXRlUmVjb3Jkc0FzeW5jKHJlY29yZHMpO1xuICAgICAqICAgICB9XG4gICAgICogICAgIC8vIFRoZSByZWNvcmRzIGFyZSBub3cgZGVsZXRlZCB3aXRoaW4geW91ciBhcHAgKGVnIHdpbGwgbm90IGJlXG4gICAgICogICAgIC8vIHJldHVybmVkIGluIGB0YWJsZS5zZWxlY3RSZWNvcmRzKClgKSBidXQgYXJlIHN0aWxsIGJlaW5nIHNhdmVkIHRvXG4gICAgICogICAgIC8vIEFpcnRhYmxlIHNlcnZlcnMgKGUuZy4gdGhleSBtYXkgbm90IGxvb2sgZGVsZXRlZCB0byBvdGhlciB1c2VycyB5ZXQpLlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVJlY29yZHNBc3luYyhyZWNvcmRzKSB7XG4gICAgICogICAgIGlmICh0YWJsZS5oYXNQZXJtaXNzaW9uVG9EZWxldGVSZWNvcmRzKHJlY29yZHMpKSB7XG4gICAgICogICAgICAgICBhd2FpdCB0YWJsZS5kZWxldGVSZWNvcmRzQXN5bmMocmVjb3Jkcyk7XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgLy8gUmVjb3JkIGRlbGV0aW9ucyBoYXZlIGJlZW4gc2F2ZWQgdG8gQWlydGFibGUgc2VydmVycy5cbiAgICAgKiAgICAgYWxlcnQoJ3JlY29yZHMgaGF2ZSBiZWVuIGRlbGV0ZWQnKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlUmVjb3Jkc0FzeW5jKHJlY29yZHNPclJlY29yZElkczogUmVhZG9ubHlBcnJheTxSZWNvcmQgfCBSZWNvcmRJZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkSWRzID0gcmVjb3Jkc09yUmVjb3JkSWRzLm1hcChyZWNvcmRPclJlY29yZElkID0+XG4gICAgICAgICAgICB0eXBlb2YgcmVjb3JkT3JSZWNvcmRJZCA9PT0gJ3N0cmluZycgPyByZWNvcmRPclJlY29yZElkIDogcmVjb3JkT3JSZWNvcmRJZC5pZCxcbiAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9zZGsuX19tdXRhdGlvbnMuYXBwbHlNdXRhdGlvbkFzeW5jKHtcbiAgICAgICAgICAgIHR5cGU6IE11dGF0aW9uVHlwZXMuREVMRVRFX01VTFRJUExFX1JFQ09SRFMsXG4gICAgICAgICAgICB0YWJsZUlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgcmVjb3JkSWRzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXNlciBoYXMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHNwZWNpZmllZCByZWNvcmRzLlxuICAgICAqXG4gICAgICogQWNjZXB0cyBvcHRpb25hbCBpbnB1dCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHtAbGluayBkZWxldGVSZWNvcmRzQXN5bmN9LlxuICAgICAqIFRoZSBtb3JlIGluZm9ybWF0aW9uIHByb3ZpZGVkLCB0aGUgbW9yZSBhY2N1cmF0ZSB0aGUgcGVybWlzc2lvbnMgY2hlY2sgd2lsbCBiZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gZGVsZXRlIHRoZSBzcGVjaWZpZWQgcmVjb3JkcyxcbiAgICAgKiBge2hhc1Blcm1pc3Npb246IGZhbHNlLCByZWFzb25EaXNwbGF5U3RyaW5nOiBzdHJpbmd9YCBvdGhlcndpc2UuIGByZWFzb25EaXNwbGF5U3RyaW5nYCBtYXkgYmVcbiAgICAgKiB1c2VkIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWNvcmRzT3JSZWNvcmRJZHMgdGhlIHJlY29yZHMgdG8gYmUgZGVsZXRlZFxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiAvLyBDaGVjayBpZiB1c2VyIGNhbiBkZWxldGUgc3BlY2lmaWMgcmVjb3Jkc1xuICAgICAqIGNvbnN0IGRlbGV0ZVJlY29yZHNDaGVja1Jlc3VsdCA9XG4gICAgICogICAgIHRhYmxlLmNoZWNrUGVybWlzc2lvbnNGb3JEZWxldGVSZWNvcmRzKFtyZWNvcmQxLCByZWNvcmQyXSk7XG4gICAgICogaWYgKCFkZWxldGVSZWNvcmRzQ2hlY2tSZXN1bHQuaGFzUGVybWlzc2lvbikge1xuICAgICAqICAgICBhbGVydChkZWxldGVSZWNvcmRzQ2hlY2tSZXN1bHQucmVhc29uRGlzcGxheVN0cmluZyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjb3VsZCBwb3RlbnRpYWxseSBkZWxldGUgcmVjb3Jkcy5cbiAgICAgKiAvLyBVc2Ugd2hlbiB5b3UgZG9uJ3Qga25vdyB0aGUgc3BlY2lmaWMgcmVjb3JkcyB5b3Ugd2FudCB0byBkZWxldGUgeWV0IChmb3JcbiAgICAgKiAvLyBleGFtcGxlLCB0byBzaG93L2hpZGUgVUkgY29udHJvbHMgdGhhdCBsZXQgeW91IHNlbGVjdCByZWNvcmRzIHRvIGRlbGV0ZSkuXG4gICAgICogLy8gRXF1aXZhbGVudCB0byB0YWJsZS5oYXNQZXJtaXNzaW9uVG9EZWxldGVSZWNvcmQoKVxuICAgICAqIGNvbnN0IGRlbGV0ZVVua25vd25SZWNvcmRzQ2hlY2tSZXN1bHQgPVxuICAgICAqICAgICB0YWJsZS5jaGVja1Blcm1pc3Npb25zRm9yRGVsZXRlUmVjb3JkcygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNoZWNrUGVybWlzc2lvbnNGb3JEZWxldGVSZWNvcmRzKFxuICAgICAgICByZWNvcmRzT3JSZWNvcmRJZHM/OiBSZWFkb25seUFycmF5PFJlY29yZCB8IFJlY29yZElkPixcbiAgICApOiBQZXJtaXNzaW9uQ2hlY2tSZXN1bHQge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2RrLl9fbXV0YXRpb25zLmNoZWNrUGVybWlzc2lvbnNGb3JNdXRhdGlvbih7XG4gICAgICAgICAgICB0eXBlOiBNdXRhdGlvblR5cGVzLkRFTEVURV9NVUxUSVBMRV9SRUNPUkRTLFxuICAgICAgICAgICAgdGFibGVJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHJlY29yZElkczogcmVjb3Jkc09yUmVjb3JkSWRzXG4gICAgICAgICAgICAgICAgPyByZWNvcmRzT3JSZWNvcmRJZHMubWFwKHJlY29yZE9yUmVjb3JkSWQgPT5cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVjb3JkT3JSZWNvcmRJZCA9PT0gJ3N0cmluZycgPyByZWNvcmRPclJlY29yZElkIDogcmVjb3JkT3JSZWNvcmRJZC5pZCxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGFsaWFzIGZvciBgY2hlY2tQZXJtaXNzaW9uc0ZvckRlbGV0ZVJlY29yZHMocmVjb3Jkc09yUmVjb3JkSWRzKS5oYXNQZXJtaXNzaW9uYC5cbiAgICAgKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBzcGVjaWZpZWQgcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIEFjY2VwdHMgb3B0aW9uYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgZGVsZXRlUmVjb3Jkc0FzeW5jfS5cbiAgICAgKiBUaGUgbW9yZSBpbmZvcm1hdGlvbiBwcm92aWRlZCwgdGhlIG1vcmUgYWNjdXJhdGUgdGhlIHBlcm1pc3Npb25zIGNoZWNrIHdpbGwgYmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVjb3Jkc09yUmVjb3JkSWRzIHRoZSByZWNvcmRzIHRvIGJlIGRlbGV0ZWRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjYW4gZGVsZXRlIHNwZWNpZmljIHJlY29yZHNcbiAgICAgKiBjb25zdCBjYW5EZWxldGVSZWNvcmRzID1cbiAgICAgKiAgICAgdGFibGUuaGFzUGVybWlzc2lvblRvRGVsZXRlUmVjb3JkcyhbcmVjb3JkMSwgcmVjb3JkMl0pO1xuICAgICAqIGlmICghY2FuRGVsZXRlUmVjb3Jkcykge1xuICAgICAqICAgICBhbGVydCgnbm90IGFsbG93ZWQhJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjb3VsZCBwb3RlbnRpYWxseSBkZWxldGUgcmVjb3Jkcy5cbiAgICAgKiAvLyBVc2Ugd2hlbiB5b3UgZG9uJ3Qga25vdyB0aGUgc3BlY2lmaWMgcmVjb3JkcyB5b3Ugd2FudCB0byBkZWxldGUgeWV0IChmb3JcbiAgICAgKiAvLyBleGFtcGxlLCB0byBzaG93L2hpZGUgVUkgY29udHJvbHMgdGhhdCBsZXQgeW91IHNlbGVjdCByZWNvcmRzIHRvIGRlbGV0ZSkuXG4gICAgICogLy8gRXF1aXZhbGVudCB0byB0YWJsZS5oYXNQZXJtaXNzaW9uVG9EZWxldGVSZWNvcmQoKVxuICAgICAqIGNvbnN0IGNhbkRlbGV0ZVVua25vd25SZWNvcmRzID0gdGFibGUuaGFzUGVybWlzc2lvblRvRGVsZXRlUmVjb3JkcygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGhhc1Blcm1pc3Npb25Ub0RlbGV0ZVJlY29yZHMocmVjb3Jkc09yUmVjb3JkSWRzPzogUmVhZG9ubHlBcnJheTxSZWNvcmQgfCBSZWNvcmRJZD4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tQZXJtaXNzaW9uc0ZvckRlbGV0ZVJlY29yZHMocmVjb3Jkc09yUmVjb3JkSWRzKS5oYXNQZXJtaXNzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBjZWxsIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY3JlYXRlIHRoZSBnaXZlbiByZWNvcmRzLCBvclxuICAgICAqIGlmIGludmFsaWQgaW5wdXQgaXMgcHJvdmlkZWQgKGVnLiBpbnZhbGlkIGNlbGwgdmFsdWVzKS5cbiAgICAgKlxuICAgICAqIFJlZmVyIHRvIHtAbGluayBGaWVsZFR5cGV9IGZvciBjZWxsIHZhbHVlIHdyaXRlIGZvcm1hdHMuXG4gICAgICpcbiAgICAgKiBUaGlzIGFjdGlvbiBpcyBhc3luY2hyb25vdXM6IGBhd2FpdGAgdGhlIHJldHVybmVkIHByb21pc2UgaWYgeW91IHdpc2ggdG8gd2FpdCBmb3IgdGhlIG5ld1xuICAgICAqIHJlY29yZCB0byBiZSBwZXJzaXN0ZWQgdG8gQWlydGFibGUgc2VydmVycy5cbiAgICAgKiBVcGRhdGVzIGFyZSBhcHBsaWVkIG9wdGltaXN0aWNhbGx5IGxvY2FsbHksIHNvIHlvdXIgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB5b3VyIGFwcFxuICAgICAqIGJlZm9yZSB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVzb2x2ZSB0byB0aGUgUmVjb3JkSWQgb2YgdGhlIG5ldyByZWNvcmQgb25jZSBpdCBpcyBwZXJzaXN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGRzIG9iamVjdCBtYXBwaW5nIGBGaWVsZElkYCBvciBmaWVsZCBuYW1lIHRvIHZhbHVlIGZvciB0aGF0IGZpZWxkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBmdW5jdGlvbiBjcmVhdGVOZXdSZWNvcmQocmVjb3JkRmllbGRzKSB7XG4gICAgICogICAgIGlmICh0YWJsZS5oYXNQZXJtaXNzaW9uVG9DcmVhdGVSZWNvcmQocmVjb3JkRmllbGRzKSkge1xuICAgICAqICAgICAgICAgdGFibGUuY3JlYXRlUmVjb3JkQXN5bmMocmVjb3JkRmllbGRzKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgICAvLyBZb3UgY2FuIG5vdyBhY2Nlc3MgdGhlIG5ldyByZWNvcmQgaW4geW91ciBhcHAgKGVnXG4gICAgICogICAgIC8vIGB0YWJsZS5zZWxlY3RSZWNvcmRzKClgKSBidXQgaXQgaXMgc3RpbGwgYmVpbmcgc2F2ZWQgdG8gQWlydGFibGVcbiAgICAgKiAgICAgLy8gc2VydmVycyAoZS5nLiBvdGhlciB1c2VycyBtYXkgbm90IGJlIGFibGUgdG8gc2VlIGl0IHlldCkuXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gY3JlYXRlTmV3UmVjb3JkQXN5bmMocmVjb3JkRmllbGRzKSB7XG4gICAgICogICAgIGlmICh0YWJsZS5oYXNQZXJtaXNzaW9uVG9DcmVhdGVSZWNvcmQocmVjb3JkRmllbGRzKSkge1xuICAgICAqICAgICAgICAgY29uc3QgbmV3UmVjb3JkSWQgPSBhd2FpdCB0YWJsZS5jcmVhdGVSZWNvcmRBc3luYyhyZWNvcmRGaWVsZHMpO1xuICAgICAqICAgICB9XG4gICAgICogICAgIC8vIE5ldyByZWNvcmQgaGFzIGJlZW4gc2F2ZWQgdG8gQWlydGFibGUgc2VydmVycy5cbiAgICAgKiAgICAgYWxlcnQoYG5ldyByZWNvcmQgd2l0aCBJRCAke25ld1JlY29yZElkfSBoYXMgYmVlbiBjcmVhdGVkYCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gRmllbGRzIGNhbiBiZSBzcGVjaWZpZWQgYnkgbmFtZSBvciBJRFxuICAgICAqIGNyZWF0ZU5ld1JlY29yZCh7XG4gICAgICogICAgICdQcm9qZWN0IE5hbWUnOiAnQWR2ZXJ0aXNpbmcgY2FtcGFpZ24nLFxuICAgICAqICAgICAnQnVkZ2V0JzogMTAwLFxuICAgICAqIH0pO1xuICAgICAqIGNyZWF0ZU5ld1JlY29yZCh7XG4gICAgICogICAgIFtwcm9qZWN0TmFtZUZpZWxkLmlkXTogJ0NhdCB2aWRlbycsXG4gICAgICogICAgIFtidWRnZXRGaWVsZC5pZF06IDIwMCxcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIENlbGwgdmFsdWVzIHNob3VsZCBnZW5lcmFsbHkgaGF2ZSBmb3JtYXQgbWF0Y2hpbmcgdGhlIG91dHB1dCBvZlxuICAgICAqIC8vIHJlY29yZC5nZXRDZWxsVmFsdWUoKSBmb3IgdGhlIGZpZWxkIGJlaW5nIHVwZGF0ZWRcbiAgICAgKiBjcmVhdGVOZXdSZWNvcmQoe1xuICAgICAqICAgICAnUHJvamVjdCBOYW1lJzogJ0NhdCB2aWRlbyAyJ1xuICAgICAqICAgICAnQ2F0ZWdvcnkgKHNpbmdsZSBzZWxlY3QpJzoge25hbWU6ICdWaWRlbyd9LFxuICAgICAqICAgICAnVGFncyAobXVsdGlwbGUgc2VsZWN0KSc6IFt7bmFtZTogJ0NhdHMnfSwge2lkOiAnc29tZUNob2ljZUlkJ31dLFxuICAgICAqICAgICAnQXNzZXRzIChhdHRhY2htZW50KSc6IFt7dXJsOiAnaHR0cDovL215d2Vic2l0ZS5jb20vY2F0cy5tcDQnfV0sXG4gICAgICogICAgICdSZWxhdGVkIHByb2plY3RzIChsaW5rZWQgcmVjb3JkcyknOiBbe2lkOiAnc29tZVJlY29yZElkJ31dLFxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVJlY29yZEFzeW5jKGZpZWxkczogT2JqZWN0TWFwPEZpZWxkSWQgfCBzdHJpbmcsIHVua25vd24+ID0ge30pOiBQcm9taXNlPFJlY29yZElkPiB7XG4gICAgICAgIGNvbnN0IHJlY29yZElkcyA9IGF3YWl0IHRoaXMuY3JlYXRlUmVjb3Jkc0FzeW5jKFt7ZmllbGRzfV0pO1xuICAgICAgICByZXR1cm4gcmVjb3JkSWRzWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gY3JlYXRlIHRoZSBzcGVjaWZpZWQgcmVjb3JkLlxuICAgICAqXG4gICAgICogQWNjZXB0cyBwYXJ0aWFsIGlucHV0LCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMge0BsaW5rIGNyZWF0ZVJlY29yZEFzeW5jfS5cbiAgICAgKiBUaGUgbW9yZSBpbmZvcm1hdGlvbiBwcm92aWRlZCwgdGhlIG1vcmUgYWNjdXJhdGUgdGhlIHBlcm1pc3Npb25zIGNoZWNrIHdpbGwgYmUuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGB7aGFzUGVybWlzc2lvbjogdHJ1ZX1gIGlmIHRoZSBjdXJyZW50IHVzZXIgY2FuIGNyZWF0ZSB0aGUgc3BlY2lmaWVkIHJlY29yZCxcbiAgICAgKiBge2hhc1Blcm1pc3Npb246IGZhbHNlLCByZWFzb25EaXNwbGF5U3RyaW5nOiBzdHJpbmd9YCBvdGhlcndpc2UuIGByZWFzb25EaXNwbGF5U3RyaW5nYCBtYXkgYmVcbiAgICAgKiB1c2VkIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZHMgb2JqZWN0IG1hcHBpbmcgYEZpZWxkSWRgIG9yIGZpZWxkIG5hbWUgdG8gdmFsdWUgZm9yIHRoYXQgZmllbGQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIENoZWNrIGlmIHVzZXIgY2FuIGNyZWF0ZSBhIHNwZWNpZmljIHJlY29yZCwgd2hlbiB5b3UgYWxyZWFkeSBrbm93IHdoYXRcbiAgICAgKiAvLyBmaWVsZHMvY2VsbCB2YWx1ZXMgd2lsbCBiZSBzZXQgZm9yIHRoZSByZWNvcmQuXG4gICAgICogY29uc3QgY3JlYXRlUmVjb3JkQ2hlY2tSZXN1bHQgPSB0YWJsZS5jaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlUmVjb3JkKHtcbiAgICAgKiAgICAgJ1Byb2plY3QgTmFtZSc6ICdBZHZlcnRpc2luZyBjYW1wYWlnbicsXG4gICAgICogICAgICdCdWRnZXQnOiAxMDAsXG4gICAgICogfSk7XG4gICAgICogaWYgKCFjcmVhdGVSZWNvcmRDaGVja1Jlc3VsdC5oYXNQZXJtaXNzaW9uKSB7XG4gICAgICogICAgIGFsZXJ0KGNyZWF0ZVJlY29yZENoZWNrUmVzdWx0LnJlYXNvbkRpc3BsYXlTdHJpbmcpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIExpa2UgY3JlYXRlUmVjb3JkQXN5bmMsIHlvdSBjYW4gdXNlIGVpdGhlciBmaWVsZCBuYW1lcyBvciBmaWVsZCBJRHMuXG4gICAgICogY29uc3QgY2hlY2tSZXN1bHRXaXRoRmllbGRJZHMgPSB0YWJsZS5jaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlUmVjb3JkKHtcbiAgICAgKiAgICAgW3Byb2plY3ROYW1lRmllbGQuaWRdOiAnQ2F0IHZpZGVvJyxcbiAgICAgKiAgICAgW2J1ZGdldEZpZWxkLmlkXTogMjAwLFxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjb3VsZCBwb3RlbnRpYWxseSBjcmVhdGUgYSByZWNvcmQuXG4gICAgICogLy8gVXNlIHdoZW4geW91IGRvbid0IGtub3cgdGhlIHNwZWNpZmljIGZpZWxkcy9jZWxsIHZhbHVlcyB5ZXQgKGZvciBleGFtcGxlLFxuICAgICAqIC8vIHRvIHNob3cgb3IgaGlkZSBVSSBjb250cm9scyB0aGF0IGxldCB5b3Ugc3RhcnQgY3JlYXRpbmcgYSByZWNvcmQuKVxuICAgICAqIGNvbnN0IGNyZWF0ZVVua25vd25SZWNvcmRDaGVja1Jlc3VsdCA9XG4gICAgICogICAgIHRhYmxlLmNoZWNrUGVybWlzc2lvbnNGb3JDcmVhdGVSZWNvcmQoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlUmVjb3JkKFxuICAgICAgICBmaWVsZHM/OiBPYmplY3RNYXA8RmllbGRJZCB8IHN0cmluZywgdW5rbm93biB8IHZvaWQ+LFxuICAgICk6IFBlcm1pc3Npb25DaGVja1Jlc3VsdCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrUGVybWlzc2lvbnNGb3JDcmVhdGVSZWNvcmRzKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGZpZWxkcyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYWxpYXMgZm9yIGBjaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlUmVjb3JkKGZpZWxkcykuaGFzUGVybWlzc2lvbmAuXG4gICAgICpcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSB0aGUgc3BlY2lmaWVkIHJlY29yZC5cbiAgICAgKlxuICAgICAqIEFjY2VwdHMgcGFydGlhbCBpbnB1dCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHtAbGluayBjcmVhdGVSZWNvcmRBc3luY30uXG4gICAgICogVGhlIG1vcmUgaW5mb3JtYXRpb24gcHJvdmlkZWQsIHRoZSBtb3JlIGFjY3VyYXRlIHRoZSBwZXJtaXNzaW9ucyBjaGVjayB3aWxsIGJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkcyBvYmplY3QgbWFwcGluZyBgRmllbGRJZGAgb3IgZmllbGQgbmFtZSB0byB2YWx1ZSBmb3IgdGhhdCBmaWVsZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjYW4gY3JlYXRlIGEgc3BlY2lmaWMgcmVjb3JkLCB3aGVuIHlvdSBhbHJlYWR5IGtub3cgd2hhdFxuICAgICAqIC8vIGZpZWxkcy9jZWxsIHZhbHVlcyB3aWxsIGJlIHNldCBmb3IgdGhlIHJlY29yZC5cbiAgICAgKiBjb25zdCBjYW5DcmVhdGVSZWNvcmQgPSB0YWJsZS5oYXNQZXJtaXNzaW9uVG9DcmVhdGVSZWNvcmQoe1xuICAgICAqICAgICAnUHJvamVjdCBOYW1lJzogJ0FkdmVydGlzaW5nIGNhbXBhaWduJyxcbiAgICAgKiAgICAgJ0J1ZGdldCc6IDEwMCxcbiAgICAgKiB9KTtcbiAgICAgKiBpZiAoIWNhbkNyZWF0ZVJlY29yZCkge1xuICAgICAqICAgICBhbGVydCgnbm90IGFsbG93ZWQhJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gTGlrZSBjcmVhdGVSZWNvcmRBc3luYywgeW91IGNhbiB1c2UgZWl0aGVyIGZpZWxkIG5hbWVzIG9yIGZpZWxkIElEcy5cbiAgICAgKiBjb25zdCBjYW5DcmVhdGVSZWNvcmRXaXRoRmllbGRJZHMgPSB0YWJsZS5oYXNQZXJtaXNzaW9uVG9DcmVhdGVSZWNvcmQoe1xuICAgICAqICAgICBbcHJvamVjdE5hbWVGaWVsZC5pZF06ICdDYXQgdmlkZW8nLFxuICAgICAqICAgICBbYnVkZ2V0RmllbGQuaWRdOiAyMDAsXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBDaGVjayBpZiB1c2VyIGNvdWxkIHBvdGVudGlhbGx5IGNyZWF0ZSBhIHJlY29yZC5cbiAgICAgKiAvLyBVc2Ugd2hlbiB5b3UgZG9uJ3Qga25vdyB0aGUgc3BlY2lmaWMgZmllbGRzL2NlbGwgdmFsdWVzIHlldCAoZm9yIGV4YW1wbGUsXG4gICAgICogLy8gdG8gc2hvdyBvciBoaWRlIFVJIGNvbnRyb2xzIHRoYXQgbGV0IHlvdSBzdGFydCBjcmVhdGluZyBhIHJlY29yZC4pXG4gICAgICogY29uc3QgY2FuQ3JlYXRlVW5rbm93blJlY29yZCA9IHRhYmxlLmhhc1Blcm1pc3Npb25Ub0NyZWF0ZVJlY29yZCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGhhc1Blcm1pc3Npb25Ub0NyZWF0ZVJlY29yZChmaWVsZHM/OiBPYmplY3RNYXA8RmllbGRJZCB8IHN0cmluZywgdW5rbm93biB8IHZvaWQ+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrUGVybWlzc2lvbnNGb3JDcmVhdGVSZWNvcmQoZmllbGRzKS5oYXNQZXJtaXNzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyByZWNvcmRzIHdpdGggdGhlIHNwZWNpZmllZCBjZWxsIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY3JlYXRlIHRoZSBnaXZlbiByZWNvcmRzLCBvclxuICAgICAqIGlmIGludmFsaWQgaW5wdXQgaXMgcHJvdmlkZWQgKGVnLiBpbnZhbGlkIGNlbGwgdmFsdWVzKS5cbiAgICAgKlxuICAgICAqIFJlZmVyIHRvIHtAbGluayBGaWVsZFR5cGV9IGZvciBjZWxsIHZhbHVlIHdyaXRlIGZvcm1hdHMuXG4gICAgICpcbiAgICAgKiBZb3UgbWF5IG9ubHkgY3JlYXRlIHVwIHRvIDUwIHJlY29yZHMgaW4gb25lIGNhbGwgdG8gYGNyZWF0ZVJlY29yZHNBc3luY2AuXG4gICAgICogU2VlIFtXcml0ZSBiYWNrIHRvIEFpcnRhYmxlXSgvZ3VpZGVzL3dyaXRlLWJhY2stdG8tYWlydGFibGUjc2l6ZS1saW1pdHMtcmF0ZS1saW1pdHMpIGZvclxuICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd3JpdGUgbGltaXRzLlxuICAgICAqXG4gICAgICogVGhpcyBhY3Rpb24gaXMgYXN5bmNocm9ub3VzOiBgYXdhaXRgIHRoZSByZXR1cm5lZCBwcm9taXNlIGlmIHlvdSB3aXNoIHRvIHdhaXQgZm9yIHRoZSBuZXdcbiAgICAgKiByZWNvcmQgdG8gYmUgcGVyc2lzdGVkIHRvIEFpcnRhYmxlIHNlcnZlcnMuXG4gICAgICogVXBkYXRlcyBhcmUgYXBwbGllZCBvcHRpbWlzdGljYWxseSBsb2NhbGx5LCBzbyB5b3VyIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4geW91ciBhcHBcbiAgICAgKiBiZWZvcmUgdGhlIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSB3aWxsIHJlc29sdmUgdG8gYW4gYXJyYXkgb2YgUmVjb3JkSWRzIG9mIHRoZSBuZXcgcmVjb3JkcyBvbmNlIHRoZSBuZXdcbiAgICAgKiByZWNvcmRzIGFyZSBwZXJzaXN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVjb3JkcyBBcnJheSBvZiBvYmplY3RzIHdpdGggYSBgZmllbGRzYCBrZXkgbWFwcGluZyBgRmllbGRJZGAgb3IgZmllbGQgbmFtZSB0byB2YWx1ZSBmb3IgdGhhdCBmaWVsZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmVjb3JkRGVmcyA9IFtcbiAgICAgKiAgICAgLy8gRmllbGRzIGNhbiBiZSBzcGVjaWZpZWQgYnkgbmFtZSBvciBJRFxuICAgICAqICAgICB7XG4gICAgICogICAgICAgICAgZmllbGRzOiB7XG4gICAgICogICAgICAgICAgICAgICdQcm9qZWN0IE5hbWUnOiAnQWR2ZXJ0aXNpbmcgY2FtcGFpZ24nLFxuICAgICAqICAgICAgICAgICAgICAnQnVkZ2V0JzogMTAwLFxuICAgICAqICAgICAgICAgIH0sXG4gICAgICogICAgIH0sXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgKiAgICAgICAgICAgICAgW3Byb2plY3ROYW1lRmllbGQuaWRdOiAnQ2F0IHZpZGVvJyxcbiAgICAgKiAgICAgICAgICAgICAgW2J1ZGdldEZpZWxkLmlkXTogMjAwLFxuICAgICAqICAgICAgICAgIH0sXG4gICAgICogICAgIH0sXG4gICAgICogICAgIC8vIFNwZWNpZnlpbmcgbm8gZmllbGRzIHdpbGwgY3JlYXRlIGEgbmV3IHJlY29yZCB3aXRoIG5vIGNlbGwgdmFsdWVzIHNldFxuICAgICAqICAgICB7XG4gICAgICogICAgICAgICAgZmllbGRzOiB7fSxcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgLy8gQ2VsbCB2YWx1ZXMgc2hvdWxkIGdlbmVyYWxseSBoYXZlIGZvcm1hdCBtYXRjaGluZyB0aGUgb3V0cHV0IG9mXG4gICAgICogICAgIC8vIHJlY29yZC5nZXRDZWxsVmFsdWUoKSBmb3IgdGhlIGZpZWxkIGJlaW5nIHVwZGF0ZWRcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgIGZpZWxkczoge1xuICAgICAqICAgICAgICAgICAgICAnUHJvamVjdCBOYW1lJzogJ0NhdCB2aWRlbyAyJ1xuICAgICAqICAgICAgICAgICAgICAnQ2F0ZWdvcnkgKHNpbmdsZSBzZWxlY3QpJzoge25hbWU6ICdWaWRlbyd9LFxuICAgICAqICAgICAgICAgICAgICAnVGFncyAobXVsdGlwbGUgc2VsZWN0KSc6IFt7bmFtZTogJ0NhdHMnfSwge2lkOiAnY2hvaWNlSWQnfV0sXG4gICAgICogICAgICAgICAgICAgICdBc3NldHMgKGF0dGFjaG1lbnQpJzogW3t1cmw6ICdodHRwOi8vbXl3ZWJzaXRlLmNvbS9jYXRzLm1wNCd9XSxcbiAgICAgKiAgICAgICAgICAgICAgJ1JlbGF0ZWQgcHJvamVjdHMgKGxpbmtlZCByZWNvcmRzKSc6IFt7aWQ6ICdzb21lUmVjb3JkSWQnfV0sXG4gICAgICogICAgICAgICAgfSxcbiAgICAgKiAgICAgfSxcbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3JlYXRlTmV3UmVjb3JkcygpIHtcbiAgICAgKiAgICAgaWYgKHRhYmxlLmhhc1Blcm1pc3Npb25Ub0NyZWF0ZVJlY29yZHMocmVjb3JkRGVmcykpIHtcbiAgICAgKiAgICAgICAgIHRhYmxlLmNyZWF0ZVJlY29yZHNBc3luYyhyZWNvcmREZWZzKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgICAvLyBZb3UgY2FuIG5vdyBhY2Nlc3MgdGhlIG5ldyByZWNvcmRzIGluIHlvdXIgYXBwIChlLmcuXG4gICAgICogICAgIC8vIGB0YWJsZS5zZWxlY3RSZWNvcmRzKClgKSBidXQgdGhleSBhcmUgc3RpbGwgYmVpbmcgc2F2ZWQgdG8gQWlydGFibGVcbiAgICAgKiAgICAgLy8gc2VydmVycyAoZS5nLiBvdGhlciB1c2VycyBtYXkgbm90IGJlIGFibGUgdG8gc2VlIHRoZW0geWV0LilcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdSZWNvcmRzQXN5bmMoKSB7XG4gICAgICogICAgIGlmICh0YWJsZS5oYXNQZXJtaXNzaW9uVG9DcmVhdGVSZWNvcmRzKHJlY29yZERlZnMpKSB7XG4gICAgICogICAgICAgICBjb25zdCBuZXdSZWNvcmRJZHMgPSBhd2FpdCB0YWJsZS5jcmVhdGVSZWNvcmRzQXN5bmMocmVjb3JkRGVmcyk7XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgLy8gTmV3IHJlY29yZHMgaGF2ZSBiZWVuIHNhdmVkIHRvIEFpcnRhYmxlIHNlcnZlcnMuXG4gICAgICogICAgIGFsZXJ0KGBuZXcgcmVjb3JkcyB3aXRoIElEcyAke25ld1JlY29yZElkc30gaGF2ZSBiZWVuIGNyZWF0ZWRgKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlUmVjb3Jkc0FzeW5jKFxuICAgICAgICByZWNvcmRzOiBSZWFkb25seUFycmF5PHtmaWVsZHM6IE9iamVjdE1hcDxGaWVsZElkIHwgc3RyaW5nLCB1bmtub3duPn0+LFxuICAgICk6IFByb21pc2U8QXJyYXk8UmVjb3JkSWQ+PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZHNUb0NyZWF0ZSA9IHJlY29yZHMubWFwKHJlY29yZERlZiA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWNvcmREZWZLZXlzID0ga2V5cyhyZWNvcmREZWYpO1xuICAgICAgICAgICAgbGV0IGZpZWxkczogT2JqZWN0TWFwPEZpZWxkSWQgfCBzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgaWYgKHJlY29yZERlZktleXMubGVuZ3RoID09PSAxICYmIHJlY29yZERlZktleXNbMF0gPT09ICdmaWVsZHMnKSB7XG4gICAgICAgICAgICAgICAgZmllbGRzID0gcmVjb3JkRGVmLmZpZWxkcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWQgcmVjb3JkIGZvcm1hdC4gUGxlYXNlIGRlZmluZSBmaWVsZCBtYXBwaW5ncyB1c2luZyBhIGBmaWVsZHNgIGtleSBmb3IgZWFjaCByZWNvcmQgZGVmaW5pdGlvbiBvYmplY3QnLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS5pZEdlbmVyYXRvci5nZW5lcmF0ZVJlY29yZElkKCksXG4gICAgICAgICAgICAgICAgY2VsbFZhbHVlc0J5RmllbGRJZDogdGhpcy5fY2VsbFZhbHVlc0J5RmllbGRJZE9yTmFtZVRvQ2VsbFZhbHVlc0J5RmllbGRJZChmaWVsZHMpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fc2RrLl9fbXV0YXRpb25zLmFwcGx5TXV0YXRpb25Bc3luYyh7XG4gICAgICAgICAgICB0eXBlOiBNdXRhdGlvblR5cGVzLkNSRUFURV9NVUxUSVBMRV9SRUNPUkRTLFxuICAgICAgICAgICAgdGFibGVJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHNUb0NyZWF0ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZHNUb0NyZWF0ZS5tYXAocmVjb3JkID0+IHJlY29yZC5pZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gY3JlYXRlIHRoZSBzcGVjaWZpZWQgcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIEFjY2VwdHMgcGFydGlhbCBpbnB1dCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHtAbGluayBjcmVhdGVSZWNvcmRzQXN5bmN9LlxuICAgICAqIFRoZSBtb3JlIGluZm9ybWF0aW9uIHByb3ZpZGVkLCB0aGUgbW9yZSBhY2N1cmF0ZSB0aGUgcGVybWlzc2lvbnMgY2hlY2sgd2lsbCBiZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gY3JlYXRlIHRoZSBzcGVjaWZpZWQgcmVjb3JkcyxcbiAgICAgKiBge2hhc1Blcm1pc3Npb246IGZhbHNlLCByZWFzb25EaXNwbGF5U3RyaW5nOiBzdHJpbmd9YCBvdGhlcndpc2UuIGByZWFzb25EaXNwbGF5U3RyaW5nYCBtYXkgYmVcbiAgICAgKiB1c2VkIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWNvcmRzIEFycmF5IG9mIG9iamVjdHMgbWFwcGluZyBgRmllbGRJZGAgb3IgZmllbGQgbmFtZSB0byB2YWx1ZSBmb3IgdGhhdCBmaWVsZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjYW4gY3JlYXRlIHNwZWNpZmljIHJlY29yZHMsIHdoZW4geW91IGFscmVhZHkga25vdyB3aGF0XG4gICAgICogLy8gZmllbGRzL2NlbGwgdmFsdWVzIHdpbGwgYmUgc2V0IGZvciB0aGUgcmVjb3Jkcy5cbiAgICAgKiBjb25zdCBjcmVhdGVSZWNvcmRzQ2hlY2tSZXN1bHQgPSB0YWJsZS5jaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlUmVjb3JkcyhbXG4gICAgICogICAgIC8vIExpa2UgY3JlYXRlUmVjb3Jkc0FzeW5jLCBmaWVsZHMgY2FuIGJlIHNwZWNpZmllZCBieSBuYW1lIG9yIElEXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgKiAgICAgICAgICAgICAgJ1Byb2plY3QgTmFtZSc6ICdBZHZlcnRpc2luZyBjYW1wYWlnbicsXG4gICAgICogICAgICAgICAgICAgICdCdWRnZXQnOiAxMDAsXG4gICAgICogICAgICAgICAgfSxcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgIGZpZWxkczoge1xuICAgICAqICAgICAgICAgICAgICBbcHJvamVjdE5hbWVGaWVsZC5pZF06ICdDYXQgdmlkZW8nLFxuICAgICAqICAgICAgICAgICAgICBbYnVkZ2V0RmllbGQuaWRdOiAyMDAsXG4gICAgICogICAgICAgICAgfSxcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAge30sXG4gICAgICogXSk7XG4gICAgICogaWYgKCFjcmVhdGVSZWNvcmRzQ2hlY2tSZXN1bHQuaGFzUGVybWlzc2lvbikge1xuICAgICAqICAgICBhbGVydChjcmVhdGVSZWNvcmRzQ2hlY2tSZXN1bHQucmVhc29uRGlzcGxheVN0cmluZyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjb3VsZCBwb3RlbnRpYWxseSBjcmVhdGUgcmVjb3Jkcy5cbiAgICAgKiAvLyBVc2Ugd2hlbiB5b3UgZG9uJ3Qga25vdyB0aGUgc3BlY2lmaWMgZmllbGRzL2NlbGwgdmFsdWVzIHlldCAoZm9yIGV4YW1wbGUsXG4gICAgICogLy8gdG8gc2hvdyBvciBoaWRlIFVJIGNvbnRyb2xzIHRoYXQgbGV0IHlvdSBzdGFydCBjcmVhdGluZyByZWNvcmRzLilcbiAgICAgKiAvLyBFcXVpdmFsZW50IHRvIHRhYmxlLmNoZWNrUGVybWlzc2lvbnNGb3JDcmVhdGVSZWNvcmQoKVxuICAgICAqIGNvbnN0IGNyZWF0ZVVua25vd25SZWNvcmRDaGVja1Jlc3VsdCA9XG4gICAgICogICAgIHRhYmxlLmNoZWNrUGVybWlzc2lvbnNGb3JDcmVhdGVSZWNvcmRzKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgY2hlY2tQZXJtaXNzaW9uc0ZvckNyZWF0ZVJlY29yZHMoXG4gICAgICAgIHJlY29yZHM/OiBSZWFkb25seUFycmF5PHtcbiAgICAgICAgICAgIHJlYWRvbmx5IGZpZWxkcz86IE9iamVjdE1hcDxGaWVsZElkIHwgc3RyaW5nLCB1bmtub3duIHwgdm9pZD4gfCB2b2lkO1xuICAgICAgICB9PixcbiAgICApOiBQZXJtaXNzaW9uQ2hlY2tSZXN1bHQge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2RrLl9fbXV0YXRpb25zLmNoZWNrUGVybWlzc2lvbnNGb3JNdXRhdGlvbih7XG4gICAgICAgICAgICB0eXBlOiBNdXRhdGlvblR5cGVzLkNSRUFURV9NVUxUSVBMRV9SRUNPUkRTLFxuICAgICAgICAgICAgdGFibGVJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHNcbiAgICAgICAgICAgICAgICA/IHJlY29yZHMubWFwKHJlY29yZCA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgIGlkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgY2VsbFZhbHVlc0J5RmllbGRJZDogcmVjb3JkLmZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX2NlbGxWYWx1ZXNCeUZpZWxkSWRPck5hbWVUb0NlbGxWYWx1ZXNCeUZpZWxkSWQocmVjb3JkLmZpZWxkcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGFsaWFzIGZvciBgY2hlY2tQZXJtaXNzaW9uc0ZvckNyZWF0ZVJlY29yZHMocmVjb3JkcykuaGFzUGVybWlzc2lvbmAuXG4gICAgICpcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSB0aGUgc3BlY2lmaWVkIHJlY29yZHMuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgY3JlYXRlUmVjb3Jkc0FzeW5jfS5cbiAgICAgKiBUaGUgbW9yZSBpbmZvcm1hdGlvbiBwcm92aWRlZCwgdGhlIG1vcmUgYWNjdXJhdGUgdGhlIHBlcm1pc3Npb25zIGNoZWNrIHdpbGwgYmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVjb3JkcyBBcnJheSBvZiBvYmplY3RzIG1hcHBpbmcgYEZpZWxkSWRgIG9yIGZpZWxkIG5hbWUgdG8gdmFsdWUgZm9yIHRoYXQgZmllbGQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIENoZWNrIGlmIHVzZXIgY2FuIGNyZWF0ZSBzcGVjaWZpYyByZWNvcmRzLCB3aGVuIHlvdSBhbHJlYWR5IGtub3cgd2hhdCBmaWVsZHMvY2VsbCB2YWx1ZXNcbiAgICAgKiAvLyB3aWxsIGJlIHNldCBmb3IgdGhlIHJlY29yZHMuXG4gICAgICogY29uc3QgY2FuQ3JlYXRlUmVjb3JkcyA9IHRhYmxlLmhhc1Blcm1pc3Npb25Ub0NyZWF0ZVJlY29yZHMoW1xuICAgICAqICAgICAvLyBMaWtlIGNyZWF0ZVJlY29yZHNBc3luYywgZmllbGRzIGNhbiBiZSBzcGVjaWZpZWQgYnkgbmFtZSBvciBJRFxuICAgICAqICAgICB7XG4gICAgICogICAgICAgICAgZmllbGRzOiB7XG4gICAgICogICAgICAgICAgICAgICdQcm9qZWN0IE5hbWUnOiAnQWR2ZXJ0aXNpbmcgY2FtcGFpZ24nLFxuICAgICAqICAgICAgICAgICAgICAnQnVkZ2V0JzogMTAwLFxuICAgICAqICAgICAgICAgIH1cbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgIGZpZWxkczoge1xuICAgICAqICAgICAgICAgICAgICBbcHJvamVjdE5hbWVGaWVsZC5pZF06ICdDYXQgdmlkZW8nLFxuICAgICAqICAgICAgICAgICAgICBbYnVkZ2V0RmllbGQuaWRdOiAyMDAsXG4gICAgICogICAgICAgICAgfVxuICAgICAqICAgICB9LFxuICAgICAqICAgICB7fSxcbiAgICAgKiBdKTtcbiAgICAgKiBpZiAoIWNhbkNyZWF0ZVJlY29yZHMpIHtcbiAgICAgKiAgICAgYWxlcnQoJ25vdCBhbGxvd2VkJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gQ2hlY2sgaWYgdXNlciBjb3VsZCBwb3RlbnRpYWxseSBjcmVhdGUgcmVjb3Jkcy5cbiAgICAgKiAvLyBVc2Ugd2hlbiB5b3UgZG9uJ3Qga25vdyB0aGUgc3BlY2lmaWMgZmllbGRzL2NlbGwgdmFsdWVzIHlldCAoZm9yIGV4YW1wbGUsXG4gICAgICogLy8gdG8gc2hvdyBvciBoaWRlIFVJIGNvbnRyb2xzIHRoYXQgbGV0IHlvdSBzdGFydCBjcmVhdGluZyByZWNvcmRzKS5cbiAgICAgKiAvLyBFcXVpdmFsZW50IHRvIHRhYmxlLmhhc1Blcm1pc3Npb25Ub0NyZWF0ZVJlY29yZCgpXG4gICAgICogY29uc3QgY2FuQ3JlYXRlVW5rbm93blJlY29yZHMgPSB0YWJsZS5oYXNQZXJtaXNzaW9uVG9DcmVhdGVSZWNvcmRzKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgaGFzUGVybWlzc2lvblRvQ3JlYXRlUmVjb3JkcyhcbiAgICAgICAgcmVjb3Jkcz86IFJlYWRvbmx5QXJyYXk8e1xuICAgICAgICAgICAgcmVhZG9ubHkgZmllbGRzPzogT2JqZWN0TWFwPEZpZWxkSWQgfCBzdHJpbmcsIHVua25vd24gfCB2b2lkPiB8IHZvaWQ7XG4gICAgICAgIH0+LFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlUmVjb3JkcyhyZWNvcmRzKS5oYXNQZXJtaXNzaW9uO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2NlbGxWYWx1ZXNCeUZpZWxkSWRPck5hbWVUb0NlbGxWYWx1ZXNCeUZpZWxkSWQoXG4gICAgICAgIGNlbGxWYWx1ZXNCeUZpZWxkSWRPck5hbWU6IE9iamVjdE1hcDxGaWVsZElkIHwgc3RyaW5nLCB1bmtub3duPixcbiAgICApOiBPYmplY3RNYXA8RmllbGRJZCwgdW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgZW50cmllcyhjZWxsVmFsdWVzQnlGaWVsZElkT3JOYW1lKS5tYXAoKFtmaWVsZElkT3JOYW1lLCBjZWxsVmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9fZ2V0RmllbGRNYXRjaGluZyhmaWVsZElkT3JOYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2ZpZWxkLmlkLCBjZWxsVmFsdWVdO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgZmllbGQgaW4gdGhpcyB0YWJsZS5cbiAgICAgKlxuICAgICAqIEFjY2VwdHMgcGFydGlhbCBpbnB1dCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHtAbGluayBjcmVhdGVGaWVsZEFzeW5jfS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gdXBkYXRlIHRoZSBzcGVjaWZpZWQgcmVjb3JkLFxuICAgICAqIGB7aGFzUGVybWlzc2lvbjogZmFsc2UsIHJlYXNvbkRpc3BsYXlTdHJpbmc6IHN0cmluZ31gIG90aGVyd2lzZS4gYHJlYXNvbkRpc3BsYXlTdHJpbmdgIG1heSBiZVxuICAgICAqIHVzZWQgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgbmFtZSBmb3IgdGhlIGZpZWxkLiBtdXN0IGJlIGNhc2UtaW5zZW5zaXRpdmUgdW5pcXVlIGZvciB0aGUgdGFibGVcbiAgICAgKiBAcGFyYW0gdHlwZSB0eXBlIGZvciB0aGUgZmllbGRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIGZvciB0aGUgZmllbGQuIG9taXQgZm9yIGZpZWxkcyB3aXRob3V0IHdyaXRhYmxlIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gZm9yIHRoZSBmaWVsZC4gb21pdCB0byBsZWF2ZSBibGFua1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNyZWF0ZUZpZWxkQ2hlY2tSZXN1bHQgPSB0YWJsZS5jaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlRmllbGQoKTtcbiAgICAgKlxuICAgICAqIGlmICghY3JlYXRlRmllbGRDaGVja1Jlc3VsdC5oYXNQZXJtaXNzaW9uKSB7XG4gICAgICogICAgIGFsZXJ0KGNyZWF0ZUZpZWxkQ2hlY2tSZXN1bHQucmVhc29uRGlzcGxheVN0cmluZyk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNoZWNrUGVybWlzc2lvbnNGb3JDcmVhdGVGaWVsZChcbiAgICAgICAgbmFtZT86IHN0cmluZyxcbiAgICAgICAgdHlwZT86IEZpZWxkVHlwZSxcbiAgICAgICAgb3B0aW9ucz86IEZpZWxkT3B0aW9ucyB8IG51bGwsXG4gICAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbCxcbiAgICApOiBQZXJtaXNzaW9uQ2hlY2tSZXN1bHQge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2RrLl9fbXV0YXRpb25zLmNoZWNrUGVybWlzc2lvbnNGb3JNdXRhdGlvbih7XG4gICAgICAgICAgICB0eXBlOiBNdXRhdGlvblR5cGVzLkNSRUFURV9TSU5HTEVfRklFTEQsXG4gICAgICAgICAgICB0YWJsZUlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgaWQ6IHVuZGVmaW5lZCwgLy8gR2VuZXJhdGVkIGluIGNyZWF0ZUZpZWxkQXN5bmMuXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgY29uZmlnOiB0eXBlXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBmaWVsZC5vcHRpb25zIHdlIHRyYW5zbGF0ZSBvcHRpb25zIHRvIG51bGwgd2hlbiBpdCdzIHVuZGVmaW5lZCAobm8gb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHRoZSBtdXRhdGlvbiBleHBlY3RzIGNvbmZpZyB0byBtYXRjaCB0aGUgUHVibGljQXBpQ29uZmlnLCB3aGVyZSBpdCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHByZXNlbnQgYXQgYWxsIChvcHRpb25zOiB1bmRlZmluZWQgd2lsbCBmYWlsIHZhbGlkYXRpb24pLlxuICAgICAgICAgICAgICAgICAgICAgIC4uLihvcHRpb25zID8ge29wdGlvbnN9IDogbnVsbCksXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWxpYXMgZm9yIGBjaGVja1Blcm1pc3Npb25zRm9yQ3JlYXRlRmllbGQobmFtZSwgdHlwZSwgb3B0aW9ucywgZGVzY3JpcHRpb24pLmhhc1Blcm1pc3Npb25gLlxuICAgICAqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXNlciBoYXMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBmaWVsZCBpbiB0aGlzIHRhYmxlLlxuICAgICAqXG4gICAgICogQWNjZXB0cyBwYXJ0aWFsIGlucHV0LCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMge0BsaW5rIGNyZWF0ZUZpZWxkQXN5bmN9LlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgbmFtZSBmb3IgdGhlIGZpZWxkLiBtdXN0IGJlIGNhc2UtaW5zZW5zaXRpdmUgdW5pcXVlIGZvciB0aGUgdGFibGVcbiAgICAgKiBAcGFyYW0gdHlwZSB0eXBlIGZvciB0aGUgZmllbGRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIGZvciB0aGUgZmllbGQuIG9taXQgZm9yIGZpZWxkcyB3aXRob3V0IHdyaXRhYmxlIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gZm9yIHRoZSBmaWVsZC4gb21pdCB0byBsZWF2ZSBibGFua1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNhbkNyZWF0ZUZpZWxkID0gdGFibGUuaGFzUGVybWlzc2lvblRvQ3JlYXRlRmllbGQoKTtcbiAgICAgKlxuICAgICAqIGlmICghY2FuQ3JlYXRlRmllbGQpIHtcbiAgICAgKiAgICAgYWxlcnQoJ25vdCBhbGxvd2VkIScpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBoYXNQZXJtaXNzaW9uVG9DcmVhdGVGaWVsZChcbiAgICAgICAgbmFtZT86IHN0cmluZyxcbiAgICAgICAgdHlwZT86IEZpZWxkVHlwZSxcbiAgICAgICAgb3B0aW9ucz86IEZpZWxkT3B0aW9ucyB8IG51bGwsXG4gICAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbCxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tQZXJtaXNzaW9uc0ZvckNyZWF0ZUZpZWxkKG5hbWUsIHR5cGUsIG9wdGlvbnMsIGRlc2NyaXB0aW9uKS5oYXNQZXJtaXNzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZmllbGQuXG4gICAgICpcbiAgICAgKiBTaW1pbGFyIHRvIGNyZWF0aW5nIGEgZmllbGQgZnJvbSB0aGUgQWlydGFibGUgVUksIHRoZSBuZXcgZmllbGQgd2lsbCBub3QgYmUgdmlzaWJsZVxuICAgICAqIGluIHZpZXdzIHRoYXQgaGF2ZSBvdGhlciBoaWRkZW4gZmllbGRzIGFuZCB2aWV3cyB0aGF0IGFyZSBwdWJsaWNseSBzaGFyZWQuXG4gICAgICpcbiAgICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGZpZWxkLCBpZiBpbnZhbGlkXG4gICAgICogbmFtZSwgdHlwZSBvciBvcHRpb25zIGFyZSBwcm92aWRlZCwgb3IgaWYgY3JlYXRpbmcgZmllbGRzIG9mIHRoaXMgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLlxuICAgICAqXG4gICAgICogUmVmZXIgdG8ge0BsaW5rIEZpZWxkVHlwZX0gZm9yIHN1cHBvcnRlZCBmaWVsZCB0eXBlcywgdGhlIHdyaXRlIGZvcm1hdCBmb3Igb3B0aW9ucywgYW5kXG4gICAgICogb3RoZXIgc3BlY2lmaWNzIGZvciBjZXJ0YWluIGZpZWxkIHR5cGVzLlxuICAgICAqXG4gICAgICogVGhpcyBhY3Rpb24gaXMgYXN5bmNocm9ub3VzLiBVbmxpa2UgbmV3IHJlY29yZHMsIG5ldyBmaWVsZHMgYXJlICoqbm90KiogY3JlYXRlZFxuICAgICAqIG9wdGltaXN0aWNhbGx5IGxvY2FsbHkuIFlvdSBtdXN0IGBhd2FpdGAgdGhlIHJldHVybmVkIHByb21pc2UgYmVmb3JlIHVzaW5nIHRoZSBuZXdcbiAgICAgKiBmaWVsZCBpbiB5b3VyIGFwcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgZm9yIHRoZSBmaWVsZC4gbXVzdCBiZSBjYXNlLWluc2Vuc2l0aXZlIHVuaXF1ZVxuICAgICAqIEBwYXJhbSB0eXBlIHR5cGUgZm9yIHRoZSBmaWVsZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbnMgZm9yIHRoZSBmaWVsZC4gb21pdCBmb3IgZmllbGRzIHdpdGhvdXQgd3JpdGFibGUgb3B0aW9uc1xuICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiBmb3IgdGhlIGZpZWxkLiBpcyBvcHRpb25hbCBhbmQgd2lsbCBiZSBgJydgIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgKiBvciBpZiBzcGVjaWZpZWQgYXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld1NpbmdsZUxpbmVUZXh0RmllbGQodGFibGUsIG5hbWUpIHtcbiAgICAgKiAgICAgaWYgKHRhYmxlLmhhc1Blcm1pc3Npb25Ub0NyZWF0ZUZpZWxkKG5hbWUsIEZpZWxkVHlwZS5TSU5HTEVfTElORV9URVhUKSkge1xuICAgICAqICAgICAgICAgYXdhaXQgdGFibGUuY3JlYXRlRmllbGRBc3luYyhuYW1lLCBGaWVsZFR5cGUuU0lOR0xFX0xJTkVfVEVYVCk7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdDaGVja2JveEZpZWxkKHRhYmxlLCBuYW1lKSB7XG4gICAgICogICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICogICAgICAgICBpY29uOiAnY2hlY2snLFxuICAgICAqICAgICAgICAgY29sb3I6ICdncmVlbkJyaWdodCcsXG4gICAgICogICAgIH07XG4gICAgICogICAgIGlmICh0YWJsZS5oYXNQZXJtaXNzaW9uVG9DcmVhdGVGaWVsZChuYW1lLCBGaWVsZFR5cGUuQ0hFQ0tCT1gsIG9wdGlvbnMpKSB7XG4gICAgICogICAgICAgICBhd2FpdCB0YWJsZS5jcmVhdGVGaWVsZEFzeW5jKG5hbWUsIEZpZWxkVHlwZS5DSEVDS0JPWCwgb3B0aW9ucyk7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdEYXRlRmllbGQodGFibGUsIG5hbWUpIHtcbiAgICAgKiAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgKiAgICAgICAgIGRhdGVGb3JtYXQ6IHtcbiAgICAgKiAgICAgICAgICAgICBuYW1lOiAnaXNvJyxcbiAgICAgKiAgICAgICAgIH0sXG4gICAgICogICAgIH07XG4gICAgICogICAgIGlmICh0YWJsZS5oYXNQZXJtaXNzaW9uVG9DcmVhdGVGaWVsZChuYW1lLCBGaWVsZFR5cGUuREFURSwgb3B0aW9ucykpIHtcbiAgICAgKiAgICAgICAgIGF3YWl0IHRhYmxlLmNyZWF0ZUZpZWxkQXN5bmMobmFtZSwgRmllbGRUeXBlLkRBVEUsIG9wdGlvbnMpO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUZpZWxkQXN5bmMoXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgdHlwZTogRmllbGRUeXBlLFxuICAgICAgICBvcHRpb25zPzogRmllbGRPcHRpb25zIHwgbnVsbCxcbiAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsLFxuICAgICk6IFByb21pc2U8RmllbGQ+IHtcbiAgICAgICAgY29uc3QgZmllbGRJZCA9IHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlLmlkR2VuZXJhdG9yLmdlbmVyYXRlRmllbGRJZCgpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX3Nkay5fX211dGF0aW9ucy5hcHBseU11dGF0aW9uQXN5bmMoe1xuICAgICAgICAgICAgdHlwZTogTXV0YXRpb25UeXBlcy5DUkVBVEVfU0lOR0xFX0ZJRUxELFxuICAgICAgICAgICAgdGFibGVJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGlkOiBmaWVsZElkLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgLy8gSW4gZmllbGQub3B0aW9ucyB3ZSB0cmFuc2xhdGUgb3B0aW9ucyB0byBudWxsIHdoZW4gaXQncyB1bmRlZmluZWQgKG5vIG9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGUgbXV0YXRpb24gZXhwZWN0cyBjb25maWcgdG8gbWF0Y2ggdGhlIFB1YmxpY0FwaUNvbmZpZywgd2hlcmUgaXQnc1xuICAgICAgICAgICAgICAgIC8vIG5vdCBwcmVzZW50IGF0IGFsbCAob3B0aW9uczogdW5kZWZpbmVkIHdpbGwgZmFpbCB2YWxpZGF0aW9uKS5cbiAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucyA/IHtvcHRpb25zfSA6IG51bGwpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIENvZXJjZSB1bmRlZmluZWQgdG8gbnVsbCBzbyB0aGF0IG9ubHkgb2xkIFNES3MgcGFzcyBcInVuZGVmaW5lZFwiIGZvciBkZXNjcmlwdGlvblxuICAgICAgICAgICAgLy8gJycgaXMgcGVybWl0dGVkLCBhcyB3ZSBhbHJlYWR5IHNldCBlbXB0eSBkZXNjcmlwdGlvbnMgdG8gJycgd2hlbiBlZGl0aW5nIGRlc2NyaXB0aW9uc1xuICAgICAgICAgICAgLy8gZnJvbSB0aGUgVUlcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZEJ5SWQoZmllbGRJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9fZ2V0RmllbGRNYXRjaGluZyhmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lOiBGaWVsZCB8IHN0cmluZyk6IEZpZWxkIHtcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCB8IG51bGw7XG4gICAgICAgIGlmIChmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lIGluc3RhbmNlb2YgRmllbGQpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lLnBhcmVudFRhYmxlLmlkICE9PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJGaWVsZCAnJXMnIGlzIGZyb20gYSBkaWZmZXJlbnQgdGFibGUgdGhhbiB0YWJsZSAnJXMnXCIsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZCA9IGZpZWxkT3JGaWVsZElkT3JGaWVsZE5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWVsZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRGaWVsZEJ5SWRJZkV4aXN0cyhmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RmllbGRCeU5hbWVJZkV4aXN0cyhmaWVsZE9yRmllbGRJZE9yRmllbGROYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZpZWxkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJGaWVsZCAnJXMnIGRvZXMgbm90IGV4aXN0IGluIHRhYmxlICclcydcIixcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPckZpZWxkSWRPckZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQuaXNEZWxldGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiRmllbGQgJyVzJyB3YXMgZGVsZXRlZCBmcm9tIHRhYmxlICclcydcIiwgZmllbGQubmFtZSwgdGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9fZ2V0Vmlld01hdGNoaW5nKHZpZXdPclZpZXdJZE9yVmlld05hbWU6IFZpZXcgfCBzdHJpbmcpOiBWaWV3IHtcbiAgICAgICAgbGV0IHZpZXc6IFZpZXcgfCBudWxsO1xuICAgICAgICBpZiAodmlld09yVmlld0lkT3JWaWV3TmFtZSBpbnN0YW5jZW9mIFZpZXcpIHtcbiAgICAgICAgICAgIGlmICh2aWV3T3JWaWV3SWRPclZpZXdOYW1lLnBhcmVudFRhYmxlLmlkICE9PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJWaWV3ICclcycgaXMgZnJvbSBhIGRpZmZlcmVudCB0YWJsZSB0aGFuIHRhYmxlICclcydcIixcbiAgICAgICAgICAgICAgICAgICAgdmlld09yVmlld0lkT3JWaWV3TmFtZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcgPSB2aWV3T3JWaWV3SWRPclZpZXdOYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmlldyA9XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRWaWV3QnlJZElmRXhpc3RzKHZpZXdPclZpZXdJZE9yVmlld05hbWUpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRWaWV3QnlOYW1lSWZFeGlzdHModmlld09yVmlld0lkT3JWaWV3TmFtZSk7XG5cbiAgICAgICAgICAgIGlmICh2aWV3ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJWaWV3ICclcycgZG9lcyBub3QgZXhpc3QgaW4gdGFibGUgJyVzJ1wiLFxuICAgICAgICAgICAgICAgICAgICB2aWV3T3JWaWV3SWRPclZpZXdOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aWV3LmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIlZpZXcgJyVzJyB3YXMgZGVsZXRlZCBmcm9tIHRhYmxlICclcydcIiwgdmlldy5uYW1lLCB0aGlzLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aWV3O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfX3RyaWdnZXJPbkNoYW5nZUZvckRpcnR5UGF0aHMoZGlydHlQYXRoczogQ2hhbmdlZFBhdGhzRm9yVHlwZTxUYWJsZURhdGE+KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBkaWRUYWJsZVNjaGVtYUNoYW5nZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZGlydHlQYXRocy5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShXYXRjaGFibGVUYWJsZUtleXMubmFtZSk7XG4gICAgICAgICAgICBkaWRUYWJsZVNjaGVtYUNoYW5nZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcnR5UGF0aHMudmlld09yZGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShXYXRjaGFibGVUYWJsZUtleXMudmlld3MpO1xuICAgICAgICAgICAgZGlkVGFibGVTY2hlbWFDaGFuZ2UgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBDbGVhbiB1cCBkZWxldGVkIHZpZXdzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFt2aWV3SWQsIHZpZXdNb2RlbF0gb2YgZW50cmllcyh0aGlzLl92aWV3TW9kZWxzQnlJZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodmlld01vZGVsLmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdmlld01vZGVsc0J5SWRbdmlld0lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcnR5UGF0aHMubG9jaykge1xuICAgICAgICAgICAgZGlkVGFibGVTY2hlbWFDaGFuZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJ0eVBhdGhzLmV4dGVybmFsU3luY0J5SWQpIHtcbiAgICAgICAgICAgIGRpZFRhYmxlU2NoZW1hQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlydHlQYXRocy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoV2F0Y2hhYmxlVGFibGVLZXlzLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIGRpZFRhYmxlU2NoZW1hQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlydHlQYXRocy52aWV3c0J5SWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3ZpZXdJZCwgZGlydHlWaWV3UGF0aHNdIG9mIGVudHJpZXMoZGlydHlQYXRocy52aWV3c0J5SWQpKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlyZWN0bHkgYWNjZXNzIGZyb20gX3ZpZXdNb2RlbHNCeUlkIHRvIGF2b2lkIGNyZWF0aW5nXG4gICAgICAgICAgICAgICAgLy8gYSB2aWV3IG1vZGVsIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gSWYgaXQgZG9lc24ndCBleGlzdCxcbiAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGNhbiBiZSBzdWJzY3JpYmVkIHRvIGFueSBldmVudHMgb24gaXQuXG4gICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuX3ZpZXdNb2RlbHNCeUlkW3ZpZXdJZF07XG4gICAgICAgICAgICAgICAgaWYgKHZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlkVmlld1NjaGVtYUNoYW5nZSA9IHZpZXcuX190cmlnZ2VyT25DaGFuZ2VGb3JEaXJ0eVBhdGhzKGRpcnR5Vmlld1BhdGhzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpZFZpZXdTY2hlbWFDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZFRhYmxlU2NoZW1hQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGRpcmVjdGx5IHRyaWdnZXIgZGVsZXRpb25zIG9uIHRoZSByZWNvcmRTdG9yZS52aWV3RGF0YVN0b3JlXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgdmlld01vZGVsIG1pZ2h0IG5vdCBoYXZlIGJlZW4gY3JlYXRlZC4gKFNlZSBhYm92ZSBjb21tZW50KVxuICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZFN0b3JlLnNlbmRWaWV3RGF0YURlbGV0aW9uSWZWaWV3SXNEZWxldGVkKHZpZXdJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcnR5UGF0aHMuZmllbGRzQnlJZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogZG9uJ3QgdHJpZ2dlciBzY2hlbWEgY2hhbmdlIHdoZW4gYXV0b251bWJlciB0eXBlT3B0aW9ucyBjaGFuZ2UuXG4gICAgICAgICAgICAvLyBUaGF0IGN1cnJlbnRseSBoYXBwZW5zIGV2ZXJ5IHRpbWUgeW91IGNyZWF0ZSBhIHJvdyBpbiBhIHRhYmxlIHdpdGggYW5cbiAgICAgICAgICAgIC8vIGF1dG9udW1iZXIgZmllbGQuXG4gICAgICAgICAgICBkaWRUYWJsZVNjaGVtYUNoYW5nZSA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIFNpbmNlIHRhYmxlcyBkb24ndCBoYXZlIGEgZmllbGQgb3JkZXIsIG5lZWQgdG8gZGV0ZWN0IGlmIGEgZmllbGRcbiAgICAgICAgICAgIC8vIHdhcyBjcmVhdGVkIG9yIGRlbGV0ZWQgYW5kIHRyaWdnZXIgb25DaGFuZ2UgZm9yIGZpZWxkcy5cbiAgICAgICAgICAgIGNvbnN0IGFkZGVkRmllbGRJZHM6IEFycmF5PEZpZWxkSWQ+ID0gW107XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkRmllbGRJZHM6IEFycmF5PEZpZWxkSWQ+ID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtmaWVsZElkLCBkaXJ0eUZpZWxkUGF0aHNdIG9mIGVudHJpZXMoZGlydHlQYXRocy5maWVsZHNCeUlkKSkge1xuICAgICAgICAgICAgICAgIGlmIChkaXJ0eUZpZWxkUGF0aHMgJiYgZGlydHlGaWVsZFBhdGhzLl9pc0RpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbnRpcmUgZmllbGQgaXMgZGlydHksIGl0IHdhcyBlaXRoZXIgY3JlYXRlZCBvciBkZWxldGVkLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzKHRoaXMuX2RhdGEuZmllbGRzQnlJZCwgZmllbGRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkRmllbGRJZHMucHVzaChmaWVsZElkKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRGaWVsZElkcy5wdXNoKGZpZWxkSWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZE1vZGVsID0gdGhpcy5fZmllbGRNb2RlbHNCeUlkW2ZpZWxkSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIEZpZWxkIG1vZGVsIGlmIGl0IHdhcyBkZWxldGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9maWVsZE1vZGVsc0J5SWRbZmllbGRJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3RseSBhY2Nlc3MgZnJvbSBfZmllbGRNb2RlbHNCeUlkIHRvIGF2b2lkIGNyZWF0aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgZmllbGQgbW9kZWwgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiBJZiBpdCBkb2Vzbid0IGV4aXN0LFxuICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGNhbiBiZSBzdWJzY3JpYmVkIHRvIGFueSBldmVudHMgb24gaXQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZmllbGRNb2RlbHNCeUlkW2ZpZWxkSWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLl9fdHJpZ2dlck9uQ2hhbmdlRm9yRGlydHlQYXRocyhkaXJ0eUZpZWxkUGF0aHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWRkZWRGaWVsZElkcy5sZW5ndGggPiAwIHx8IHJlbW92ZWRGaWVsZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoV2F0Y2hhYmxlVGFibGVLZXlzLmZpZWxkcywge1xuICAgICAgICAgICAgICAgICAgICBhZGRlZEZpZWxkSWRzLFxuICAgICAgICAgICAgICAgICAgICByZW1vdmVkRmllbGRJZHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENsZWFyIG91dCBjYWNoZWQgZmllbGQgbmFtZXMgaW4gY2FzZSBhIGZpZWxkIHdhcyBhZGRlZC9yZW1vdmVkL3JlbmFtZWQuXG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRGaWVsZE5hbWVzQnlJZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpZFRhYmxlU2NoZW1hQ2hhbmdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfX2dldEZpZWxkTmFtZXNCeUlkKCk6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9IHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZWRGaWVsZE5hbWVzQnlJZCkge1xuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lc0J5SWQ6IE9iamVjdE1hcDxGaWVsZElkLCBzdHJpbmc+ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtmaWVsZElkLCBmaWVsZERhdGFdIG9mIGVudHJpZXModGhpcy5fZGF0YS5maWVsZHNCeUlkKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkTmFtZXNCeUlkW2ZpZWxkSWRdID0gZmllbGREYXRhLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRGaWVsZE5hbWVzQnlJZCA9IGZpZWxkTmFtZXNCeUlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRGaWVsZE5hbWVzQnlJZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRhYmxlO1xuIl19
|